started fix on NSFW & Malware checking (using tfjs-node + NSFWJS & clamscan)

broken-automod
TheCodedProf 3 years ago
parent 7a83f7601b
commit d8ef1f3d13

@ -1,13 +1,16 @@
{ {
"dependencies": { "dependencies": {
"@discordjs/rest": "^0.2.0-canary.0",
"@hokify/agenda": "^6.2.12", "@hokify/agenda": "^6.2.12",
"@tensorflow/tfjs": "^4.0.0",
"@tensorflow/tfjs-node": "^4.2.0",
"@total-typescript/ts-reset": "^0.3.7", "@total-typescript/ts-reset": "^0.3.7",
"@tsconfig/node18-strictest-esm": "^1.0.0", "@tsconfig/node18-strictest-esm": "^1.0.0",
"@types/node": "^18.14.6", "@types/node": "^18.14.6",
"@ungap/structured-clone": "^1.0.1", "@ungap/structured-clone": "^1.0.1",
"agenda": "^4.3.0", "agenda": "^4.3.0",
"body-parser": "^1.20.0", "body-parser": "^1.20.0",
"canvas": "^2.11.0",
"clamscan": "^2.1.2",
"discord.js": "^14.7.1", "discord.js": "^14.7.1",
"eslint": "^8.21.0", "eslint": "^8.21.0",
"express": "^4.18.1", "express": "^4.18.1",
@ -18,12 +21,11 @@
"mongodb": "^4.7.0", "mongodb": "^4.7.0",
"node-fetch": "^3.3.0", "node-fetch": "^3.3.0",
"node-tesseract-ocr": "^2.2.1", "node-tesseract-ocr": "^2.2.1",
"nsfwjs": "2.4.2",
"seedrandom": "^3.0.5",
"structured-clone": "^0.2.2", "structured-clone": "^0.2.2",
"systeminformation": "^5.17.3" "systeminformation": "^5.17.3"
}, },
"resolutions": {
"discord-api-types": "0.37.23"
},
"name": "nucleus", "name": "nucleus",
"version": "0.0.1", "version": "0.0.1",
"description": "Nucleus: The core of your server", "description": "Nucleus: The core of your server",
@ -38,7 +40,8 @@
"lint-list": "echo 'Style checking...'; prettier --check .; echo 'Linting...'; eslint src; echo 'To view errors in more detail, please run `yarn lint`'; true", "lint-list": "echo 'Style checking...'; prettier --check .; echo 'Linting...'; eslint src; echo 'To view errors in more detail, please run `yarn lint`'; true",
"lint-ci": "echo 'Style checking...' && prettier --check . && echo 'Linting...' && eslint src", "lint-ci": "echo 'Style checking...' && prettier --check . && echo 'Linting...' && eslint src",
"setup": "node Installer.js", "setup": "node Installer.js",
"win-force-build": "clear | rm -r dist | tsc-suppress" "win-force-build": "clear | rm -r dist | tsc-suppress",
"audit-fix": "yarn-audit-fix"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -57,6 +60,7 @@
"private": false, "private": false,
"type": "module", "type": "module",
"devDependencies": { "devDependencies": {
"@types/clamscan": "^2.0.4",
"@types/lodash": "^4.14.191", "@types/lodash": "^4.14.191",
"@typescript-eslint/eslint-plugin": "^5.32.0", "@typescript-eslint/eslint-plugin": "^5.32.0",
"@typescript-eslint/parser": "^5.32.0", "@typescript-eslint/parser": "^5.32.0",
@ -64,6 +68,7 @@
"prettier": "^2.7.1", "prettier": "^2.7.1",
"prettier-eslint": "^15.0.1", "prettier-eslint": "^15.0.1",
"tsc-suppress": "^1.0.7", "tsc-suppress": "^1.0.7",
"typescript": "^4.9.4" "typescript": "^4.9.4",
"yarn-audit-fix": "^9.3.9"
} }
} }

@ -5,6 +5,9 @@ import Tesseract from "node-tesseract-ocr";
import type Discord from "discord.js"; import type Discord from "discord.js";
import client from "../utils/client.js"; import client from "../utils/client.js";
import { createHash } from "crypto"; import { createHash } from "crypto";
import * as nsfwjs from 'nsfwjs';
import * as clamscan from 'clamscan'
import * as tf from "@tensorflow/tfjs-node";
interface NSFWSchema { interface NSFWSchema {
nsfw: boolean; nsfw: boolean;
@ -15,32 +18,18 @@ interface MalwareSchema {
errored?: boolean; errored?: boolean;
} }
const model = await nsfwjs.load();
export async function testNSFW(link: string): Promise<NSFWSchema> { export async function testNSFW(link: string): Promise<NSFWSchema> {
const [p, hash] = await saveAttachment(link); const [fileName, hash] = await saveAttachment(link);
const alreadyHaveCheck = await client.database.scanCache.read(hash); const alreadyHaveCheck = await client.database.scanCache.read(hash);
if (alreadyHaveCheck) return { nsfw: alreadyHaveCheck.data }; if (alreadyHaveCheck) return { nsfw: alreadyHaveCheck.data };
const data = new URLSearchParams();
const r = createReadStream(p); // const image = tf.node.decodePng()
data.append("file", r.read(fs.statSync(p).size));
const result = await fetch("https://unscan.p.rapidapi.com/", { // const result = await model.classify(image)
method: "POST",
headers: { return { nsfw: false };
"X-RapidAPI-Key": client.config.rapidApiKey,
"X-RapidAPI-Host": "unscan.p.rapidapi.com"
},
body: data
})
.then((response) =>
response.status === 200 ? (response.json() as Promise<NSFWSchema>) : { nsfw: false, errored: true }
)
.catch((err) => {
console.error(err);
return { nsfw: false, errored: true };
});
if (!result.errored) {
client.database.scanCache.write(hash, result.nsfw);
}
return { nsfw: result.nsfw };
} }
export async function testMalware(link: string): Promise<MalwareSchema> { export async function testMalware(link: string): Promise<MalwareSchema> {

Loading…
Cancel
Save