Socket
Socket
Sign inDemoInstall

4chan-full

Package Overview
Dependencies
140
Maintainers
1
Versions
16
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.1.1 to 1.2.0

src/parsers/parseCountry.js

39

package.json
{
"_from": "4chan-full",
"_id": "4chan-full@1.0.72",
"_inBundle": false,
"_integrity": "sha512-pwIjr/EC5gI28qjaxXyMHqI/qVoQuJc2wp8vM9lRrdtAG1waEJTRkclz0U9Cg374tOq/1F1oEUDCCnpazM51sw==",
"_location": "/4chan-full",
"_phantomChildren": {},
"_requested": {
"type": "tag",
"registry": true,
"raw": "4chan-full",
"name": "4chan-full",
"escapedName": "4chan-full",
"rawSpec": "",
"saveSpec": null,
"fetchSpec": "latest"
},
"_requiredBy": [
"#USER",
"/"
],
"_resolved": "https://registry.npmjs.org/4chan-full/-/4chan-full-1.0.72.tgz",
"_shasum": "0e3267f40a1af1fb47595a5e1556bccf47abfc6f",
"_spec": "4chan-full",
"_where": "D:\\BDT\\Desktop\\Projelerim\\JavaScript\\4chan-full",
"author": {

@@ -35,6 +11,7 @@ "name": "Kıraç Armağan Önal"

"got": "^11.4.0",
"jsdom": "^16.2.2"
"jsdom": "^16.2.2",
"stuffs": "^0.1.2"
},
"deprecated": false,
"description": "www.4chan.org non-official read only api",
"description": "www.4chan.org non-official read only api. That supports cool things!",
"devDependencies": {},

@@ -45,6 +22,10 @@ "homepage": "https://github.com/Armagann/4chan-full#readme",

"api",
"datapipe",
"full",
"readonly",
"4chan-full"
"4chan-full",
"easy",
"watcher",
"thread",
"board",
"archive"
],

@@ -61,3 +42,3 @@ "license": "GNU GPLv3",

},
"version": "1.1.1"
"version": "1.2.0"
}

@@ -20,2 +20,3 @@ > # 4CHAN-FULL 🎉

- [Get Thread](https://example.com/ "Example Result") (`.thread(boardCode, threadId)`)
- [Watching Thread for Updates](https://example.com/ "Example Result") (`.threadWatcher(boardCode, threadId, [options])`);
- [Get Board](https://example.com/ "Example Result") (`.board(boardCode, page)`)

@@ -27,4 +28,5 @@ - [Get Archive](https://example.com/ "Example Result") (`.archive(boardCode)`)

### Example Code
### Example Codes
That small script lists all files of the thread..

@@ -49,2 +51,28 @@

That small script watches the thread for new replies..
```js
const { fchf } = require("4chan-full");
(async () => {
let watcher = fchf.threadWatcher("vg", "337012489");
// Events: updated, nowUpdated, checked, error, #start, #stop
watcher.on("updated", (oldThread, newThread) => {
console.log({ oldThread, newThread });
});
watcher.on("notUpdated", () => {
console.log("there is no new replies..");
});
watcher.on("checked", (oldThread, newThread) => {
console.log("checked new checkInterval:", watcher.checkInterval);
});
watcher.start();
})();
```
## TODO

@@ -54,3 +82,3 @@

- [x] Parse Message Contents (Quotes etc.)
- [ ] Thread Update Watcher
- [x] Thread Update Watcher
- [ ] Board Update Watcher

@@ -75,2 +103,7 @@

## HUGE Update 1.2.0
- Thread Watcher
- Update Boards
- Bug fixes
### Update 1.1.1

@@ -77,0 +110,0 @@

const { JSDOM } = require("jsdom");
const { defaultRequest } = require("./utils/defaultRequest.js");
const { findBoard } = require("./utils/findBoard.js");
const { defaultRequest } = require("./utils/defaultRequest");
const { findBoard } = require("./utils/findBoard");
const { parseStats } = require("./parsers/parseStats");
const { parseThread } = require("./parsers/parseThread.js");
const { parsePopularThreads } = require("./parsers/parsePopularThreads.js");
const { parseBoard } = require("./parsers/parseBoard.js");
const { parseThread } = require("./parsers/parseThread");
const { parsePopularThreads } = require("./parsers/parsePopularThreads");
const { parseBoard } = require("./parsers/parseBoard");
const { SafetyType } = require("./other/SafetyType");
const boards = require("./other/boards");
const { PopularThread } = require("./types/PopularThread");
const { parseArchive } = require("./parsers/parseArchive.js");
const { parseArchive } = require("./parsers/parseArchive");
const { ThreadWatcher } = require("./watchers/ThreadWatcher");

@@ -16,5 +16,6 @@

class FourChanFull {
#request = defaultRequest;
_request = defaultRequest;
static boards = boards;
boards = boards;

@@ -26,6 +27,26 @@ /**

if (typeof request == "function") {
this.#request = request;
this._request = request;
}
}
/**
* @param {String} boardCode
* @param {String} threadId
* @param {{checkIntervalMin:number,checkIntervalMax:number,checkIntervalAdder:number}} options
*/
threadWatcher(boardCode, threadId, options={}) {
let watcher = new ThreadWatcher(this, {
boardCode,
threadId,
checkIntervalMin: options.checkIntervalMin,
checkIntervalMax: options.checkIntervalMax,
checkIntervalAdder: options.checkIntervalAdder
});
return watcher;
}
/**
* @param {String} boardCode
* @param {Number} pageNumber (1-10)
*/
async board(boardCode, pageNumber = 1) {

@@ -35,3 +56,3 @@ const board = findBoard(boardCode);

const href = `https://boards.4chan.org/${board.code}/${pageNumber == 1 ? "" : pageNumber}`;
const document = new JSDOM(await this.#request("GET", href), { url: href }).window.document;
const document = new JSDOM(await this._request("GET", href), { url: href }).window.document;

@@ -41,2 +62,5 @@ return parseBoard(document, { board, pageNumber, href });

/**
* @param {String} boardCode
*/
async archive(boardCode) {

@@ -47,3 +71,3 @@ const board = findBoard(boardCode);

const href = `https://boards.4chan.org/${board.code}/archive`;
const document = new JSDOM(await this.#request("GET", href), { url: href })
const document = new JSDOM(await this._request("GET", href), { url: href })
.window.document;

@@ -53,3 +77,7 @@

}
/**
* @param {String} boardCode
* @param {String} threadId
*/
async thread(boardCode, threadId) {

@@ -59,3 +87,3 @@ const board = findBoard(boardCode);

const href = `https://boards.4chan.org/${board.code}/thread/${threadId}`;
const document = new JSDOM(await this.#request("GET", href), { url: href }).window.document;
const document = new JSDOM(await this._request("GET", href), { url: href }).window.document;
return parseThread(document, board);

@@ -66,3 +94,2 @@ }

* @param {"WORKSAFE"|"NON_WORKSAFE"|"COMBINED"} safety
* @returns {Promise<Array<PopularThread>>}
*/

@@ -74,3 +101,3 @@ async popular(safety = "COMBINED") {

const document = new JSDOM(
await this.#request("GET", "https://www.4chan.org/", { cookie: `fpc=${safety}` }),
await this._request("GET", "https://www.4chan.org/", { cookie: `fpc=${safety}` }),
{ url: "https://www.4chan.org/" }

@@ -84,3 +111,3 @@ ).window.document;

const document = new JSDOM(
await this.#request("GET", "https://www.4chan.org/"),
await this._request("GET", "https://www.4chan.org/"),
{ url: "https://www.4chan.org/" }

@@ -87,0 +114,0 @@ ).window.document;

const boards = [
{ worksafe: true, name: "Anime & Manga", code: "a" },
{ worksafe: true, name: "Anime/Cute", code: "c" },
{ worksafe: true, name: "Anime/Wallpapers", code: "w" },
{ worksafe: true, name: "Mecha", code: "m" },
{ worksafe: true, name: "Cosplay & EGL", code: "cgl" },
{ worksafe: true, name: "Cute/Male", code: "cm" },
{ worksafe: true, name: "Transportation", code: "n" },
{ worksafe: true, name: "Otaku Culture", code: "jp" },
{ worksafe: true, name: "Video Games", code: "v" },
{ worksafe: true, name: "Video Game Generals", code: "vg" },
{ worksafe: true, name: "Video Games/RPG", code: "vrpg" },
{ worksafe: true, name: "Video Games/Mobile", code: "vmg" },
{ worksafe: true, name: "Video Games/Strategy", code: "vst" },
{ worksafe: true, name: "Video Games/Multiplayer", code: "vm" },
{ worksafe: true, name: "Pokémon", code: "vp" },
{ worksafe: true, name: "Retro Games", code: "vr" },
{ worksafe: true, name: "Comics & Cartoons", code: "co" },
{ worksafe: true, name: "Technology", code: "g" },
{ worksafe: true, name: "Television & Film", code: "tv" },
{ worksafe: true, name: "Weapons", code: "k" },
{ worksafe: true, name: "Auto", code: "o" },
{ worksafe: true, name: "Animals & Nature", code: "an" },
{ worksafe: true, name: "Traditional Games", code: "tg" },
{ worksafe: true, name: "Sports", code: "sp" },
{ worksafe: true, name: "Alternative Sports", code: "asp" },
{ worksafe: true, name: "Science & Math", code: "sci" },
{ worksafe: true, name: "History & Humanities", code: "his" },
{ worksafe: true, name: "International", code: "int" },
{ worksafe: true, name: "Outdoors", code: "out" },
{ worksafe: true, name: "Toys", code: "toy" },
{ worksafe: true, name: "Papercraft & Origami", code: "po" },
{ worksafe: true, name: "Photography", code: "p" },
{ worksafe: true, name: "Food & Cooking", code: "ck" },
{ worksafe: true, name: "Literature", code: "lit" },
{ worksafe: true, name: "Music", code: "mu" },
{ worksafe: true, name: "Fashion", code: "fa" },
{ worksafe: true, name: "3DCG", code: "3" },
{ worksafe: true, name: "Graphic Design", code: "gd" },
{ worksafe: true, name: "Do-It-Yourself", code: "diy" },
{ worksafe: true, name: "Worksafe GIF", code: "wsg" },
{ worksafe: true, name: "Quests", code: "qst" },
{ worksafe: true, name: "Business & Finance", code: "biz" },
{ worksafe: true, name: "Travel", code: "trv" },
{ worksafe: true, name: "Fitness", code: "fit" },
{ worksafe: true, name: "Paranormal", code: "x" },
{ worksafe: true, name: "Advice", code: "adv" },
{ worksafe: true, name: "LGBT", code: "lgbt" },
{ worksafe: true, name: "Pony", code: "mlp" },
{ worksafe: true, name: "Current News", code: "news" },
{ worksafe: true, name: "Worksafe Requests", code: "wsr" },
{ worksafe: true, name: "Very Important Posts", code: "vip" },
{ worksafe: false, name: "Flash", code: "f" },
{ worksafe: false, name: "Oekaki", code: "i" },
{ worksafe: false, name: "Artwork/Critique", code: "ic" },
{ worksafe: false, name: "Wallpapers/General", code: "wg" },
{ worksafe: false, name: "Random", code: "b" },
{ worksafe: false, name: "ROBOT9001", code: "r9k" },
{ worksafe: false, name: "Politically Incorrect", code: "pol" },
{ worksafe: false, name: "International/Random", code: "bant" },
{ worksafe: false, name: "Cams & Meetups", code: "soc" },
{ worksafe: false, name: "Shit 4chan Says", code: "s4s" },
{ worksafe: false, name: "Sexy Beautiful Women", code: "s" },
{ worksafe: false, name: "Hardcore", code: "hc" },
{ worksafe: false, name: "Handsome Men", code: "hm" },
{ worksafe: false, name: "Hentai", code: "h" },
{ worksafe: false, name: "Ecchi", code: "e" },
{ worksafe: false, name: "Yuri", code: "u" },
{ worksafe: false, name: "Hentai/Alternative", code: "d" },
{ worksafe: false, name: "Yaoi", code: "y" },
{ worksafe: false, name: "Torrents", code: "t" },
{ worksafe: false, name: "High Resolution", code: "hr" },
{ worksafe: false, name: "Adult GIF", code: "gif" },
{ worksafe: false, name: "Adult Cartoons", code: "aco" },
{ worksafe: false, name: "Adult Requests", code: "r" },
{ worksafe: false, name: "Off-topic", code: "trash" }
{
"worksafe": true,
"name": "Anime & Manga",
"code": "a"
},
{
"worksafe": true,
"name": "Anime/Cute",
"code": "c"
},
{
"worksafe": true,
"name": "Anime/Wallpapers",
"code": "w"
},
{
"worksafe": true,
"name": "Mecha",
"code": "m"
},
{
"worksafe": true,
"name": "Cosplay & EGL",
"code": "cgl"
},
{
"worksafe": true,
"name": "Cute/Male",
"code": "cm"
},
{
"worksafe": true,
"name": "Flash",
"code": "f"
},
{
"worksafe": true,
"name": "Transportation",
"code": "n"
},
{
"worksafe": true,
"name": "Otaku Culture",
"code": "jp"
},
{
"worksafe": true,
"name": "Virtual YouTubers",
"code": "vt"
},
{
"worksafe": true,
"name": "Video Games",
"code": "v"
},
{
"worksafe": true,
"name": "Video Game Generals",
"code": "vg"
},
{
"worksafe": true,
"name": "Video Games/Multiplayer",
"code": "vm"
},
{
"worksafe": true,
"name": "Video Games/Mobile",
"code": "vmg"
},
{
"worksafe": true,
"name": "Pokémon",
"code": "vp"
},
{
"worksafe": true,
"name": "Retro Games",
"code": "vr"
},
{
"worksafe": true,
"name": "Video Games/RPG",
"code": "vrpg"
},
{
"worksafe": true,
"name": "Video Games/Strategy",
"code": "vst"
},
{
"worksafe": true,
"name": "Comics & Cartoons",
"code": "co"
},
{
"worksafe": true,
"name": "Technology",
"code": "g"
},
{
"worksafe": true,
"name": "Television & Film",
"code": "tv"
},
{
"worksafe": true,
"name": "Weapons",
"code": "k"
},
{
"worksafe": true,
"name": "Auto",
"code": "o"
},
{
"worksafe": true,
"name": "Animals & Nature",
"code": "an"
},
{
"worksafe": true,
"name": "Traditional Games",
"code": "tg"
},
{
"worksafe": true,
"name": "Sports",
"code": "sp"
},
{
"worksafe": true,
"name": "Extreme Sports",
"code": "xs"
},
{
"worksafe": true,
"name": "Professional Wrestling",
"code": "pw"
},
{
"worksafe": true,
"name": "Science & Math",
"code": "sci"
},
{
"worksafe": true,
"name": "History & Humanities",
"code": "his"
},
{
"worksafe": true,
"name": "International",
"code": "int"
},
{
"worksafe": true,
"name": "Outdoors",
"code": "out"
},
{
"worksafe": true,
"name": "Toys",
"code": "toy"
},
{
"worksafe": true,
"name": "Oekaki",
"code": "i"
},
{
"worksafe": true,
"name": "Papercraft & Origami",
"code": "po"
},
{
"worksafe": true,
"name": "Photography",
"code": "p"
},
{
"worksafe": true,
"name": "Food & Cooking",
"code": "ck"
},
{
"worksafe": true,
"name": "Artwork/Critique",
"code": "ic"
},
{
"worksafe": true,
"name": "Wallpapers/General",
"code": "wg"
},
{
"worksafe": true,
"name": "Literature",
"code": "lit"
},
{
"worksafe": true,
"name": "Music",
"code": "mu"
},
{
"worksafe": true,
"name": "Fashion",
"code": "fa"
},
{
"worksafe": true,
"name": "3DCG",
"code": "3"
},
{
"worksafe": true,
"name": "Graphic Design",
"code": "gd"
},
{
"worksafe": true,
"name": "Do-It-Yourself",
"code": "diy"
},
{
"worksafe": true,
"name": "Worksafe GIF",
"code": "wsg"
},
{
"worksafe": true,
"name": "Quests",
"code": "qst"
},
{
"worksafe": true,
"name": "Business & Finance",
"code": "biz"
},
{
"worksafe": true,
"name": "Travel",
"code": "trv"
},
{
"worksafe": true,
"name": "Fitness",
"code": "fit"
},
{
"worksafe": true,
"name": "Paranormal",
"code": "x"
},
{
"worksafe": true,
"name": "Advice",
"code": "adv"
},
{
"worksafe": true,
"name": "LGBT",
"code": "lgbt"
},
{
"worksafe": true,
"name": "Pony",
"code": "mlp"
},
{
"worksafe": true,
"name": "Current News",
"code": "news"
},
{
"worksafe": true,
"name": "Worksafe Requests",
"code": "wsr"
},
{
"worksafe": true,
"name": "Very Important Posts",
"code": "vip"
},
{
"worksafe": false,
"name": "Random",
"code": "b"
},
{
"worksafe": false,
"name": "ROBOT9001",
"code": "r9k"
},
{
"worksafe": false,
"name": "Politically Incorrect",
"code": "pol"
},
{
"worksafe": false,
"name": "International/Random",
"code": "bant"
},
{
"worksafe": false,
"name": "Cams & Meetups",
"code": "soc"
},
{
"worksafe": false,
"name": "Shit 4chan Says",
"code": "s4s"
},
{
"worksafe": false,
"name": "Sexy Beautiful Women",
"code": "s"
},
{
"worksafe": false,
"name": "Hardcore",
"code": "hc"
},
{
"worksafe": false,
"name": "Handsome Men",
"code": "hm"
},
{
"worksafe": false,
"name": "Hentai",
"code": "h"
},
{
"worksafe": false,
"name": "Ecchi",
"code": "e"
},
{
"worksafe": false,
"name": "Yuri",
"code": "u"
},
{
"worksafe": false,
"name": "Hentai/Alternative",
"code": "d"
},
{
"worksafe": false,
"name": "Yaoi",
"code": "y"
},
{
"worksafe": false,
"name": "Torrents",
"code": "t"
},
{
"worksafe": false,
"name": "High Resolution",
"code": "hr"
},
{
"worksafe": false,
"name": "Adult GIF",
"code": "gif"
},
{
"worksafe": false,
"name": "Adult Cartoons",
"code": "aco"
},
{
"worksafe": false,
"name": "Adult Requests",
"code": "r"
},
{
"worksafe": false,
"name": "Off-Topic",
"code": "trash"
},
];
module.exports = boards;

@@ -16,13 +16,16 @@ const { File } = require("../types/File");

const isSpoiler = Boolean(e.querySelector(".imgspoiler"));
const fileText = e.querySelector(".fileText");
const fileTextA = e.querySelector(".fileText a");
_file.spoiler = isSpoiler;
_file.name = isSpoiler
? e.querySelector(".fileText").getAttribute("title")
: e.querySelector(".fileText a").hasAttribute("title")
? e.querySelector(".fileText a").getAttribute("title")
: e.querySelector(".fileText a").textContent;
? fileText.getAttribute("title")
: fileTextA.hasAttribute("title")
? fileTextA.getAttribute("title")
: fileTextA.textContent;
_file.url = e.querySelector(".fileText a").href;
_file.url = fileTextA.href;
const sizeRegexMatch = e.querySelector(".fileText").textContent.match(sizeRegex);
const sizeRegexMatch = fileText.textContent.match(sizeRegex);

@@ -29,0 +32,0 @@ _file.size = parseFileSize(sizeRegexMatch[1]);

const { parseFile } = require("./parseFile");
const { Reply } = require("../types/Reply");
const { parseMessageContent } = require("./parseMessageContent");
const { parseCountry } = require("./parseCountry");

@@ -18,2 +19,3 @@ /**

_reply.message = parseMessageContent(e.querySelector(".postMessage"));
_reply.country = parseCountry(e.querySelector(".postInfo.desktop .flag"));

@@ -20,0 +22,0 @@ return _reply;

@@ -8,2 +8,3 @@ const { parseFile } = require("./parseFile");

const { parseMessageContent } = require("./parseMessageContent");
const { parseCountry } = require("./parseCountry");

@@ -34,2 +35,4 @@ /**

_thread.country = parseCountry(e.querySelector(".opContainer .postInfo.desktop .flag"));
return _thread;

@@ -58,2 +61,4 @@ }

_semiThread.country = parseCountry(e.querySelector(".opContainer .postInfo.desktop .flag"));
return _semiThread;

@@ -60,0 +65,0 @@

@@ -0,1 +1,2 @@

const { Country } = require("./Country");
const { File } = require("./File");

@@ -16,4 +17,7 @@ const { MessageContent } = require("./MessageContent");

file;
/** @type {Country?} */
country;
}
module.exports = { Reply };
const { Reply } = require("./Reply");
const { File } = require("./File");
const { MessageContent } = require("./MessageContent");
const { Country } = require("./Country");

@@ -26,4 +27,7 @@ class SemiThread {

url;
/** @type {Country?} */
country;
}
module.exports = { SemiThread };

@@ -5,2 +5,3 @@ const { Reply } = require("./Reply");

const { MessageContent } = require("./MessageContent");
const { Country } = require("./Country");

@@ -35,4 +36,7 @@ class Thread {

archived;
/** @type {Country?} */
country;
}
module.exports = { Thread };
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc