Init
This commit is contained in:
commit
2475931869
181
bot/index.ts
Normal file
181
bot/index.ts
Normal file
@ -0,0 +1,181 @@
|
||||
import {
|
||||
MatrixClient,
|
||||
SimpleFsStorageProvider,
|
||||
AutojoinRoomsMixin,
|
||||
} from "matrix-bot-sdk";
|
||||
|
||||
const http = require("http");
|
||||
|
||||
// probably the worst code you have seen in your life
|
||||
|
||||
const bannedKeywords = [
|
||||
['Sus', 'thigh high'],
|
||||
['Amogus!!', 'amogus', 'among us'],
|
||||
|
||||
['LGBTQQIAAP++ propaganda',
|
||||
|
||||
'transgender', 'trans rights',
|
||||
|
||||
[
|
||||
'thigh', 'sock', 'computer'
|
||||
],
|
||||
|
||||
'transhumanist evolution', 'pride parade', 'pride flag', 'gay pride'
|
||||
|
||||
],
|
||||
|
||||
['Chinese cartoons', 'anime', 'manga', 'loli', 'azur lane', 'mihoyo', 'kancolle', 'neko', 'touhou', 'foxgirl', 'wolf girl', 'ayanamikodon', 'hatsune miku', 'vocaloid', 'mikudayo', 'kyoto animation'],
|
||||
|
||||
['Furries', 'fursona', 'fursuit', 'e621', 'furry fandom', 'furry art'],
|
||||
|
||||
['Gore', ' gore ', ' guro ', ' gory '],
|
||||
];
|
||||
|
||||
// This will be the URL where clients can reach your homeserver. Note that this might be different
|
||||
// from where the web/chat interface is hosted. The server must support password registration without
|
||||
// captcha or terms of service (public servers typically won't work).
|
||||
const homeserverUrl = "https://trygve.me";
|
||||
|
||||
// Use the access token you got from login or registration above.
|
||||
const accessToken = "your token";
|
||||
|
||||
// In order to make sure the bot doesn't lose its state between restarts, we'll give it a place to cache
|
||||
// any information it needs to. You can implement your own storage provider if you like, but a JSON file
|
||||
// will work fine for this example.
|
||||
const storage = new SimpleFsStorageProvider("hello-bot.json");
|
||||
|
||||
// Finally, let's create the client and set it to autojoin rooms. Autojoining is typical of bots to ensure
|
||||
// they can be easily added to any room.
|
||||
const client = new MatrixClient(homeserverUrl, accessToken, storage);
|
||||
AutojoinRoomsMixin.setupOnClient(client);
|
||||
|
||||
// Before we start the bot, register our command handler
|
||||
client.on("room.event", handleCommand);
|
||||
|
||||
// Now that everything is set up, start the bot. This will start the sync loop and run until killed.
|
||||
client.start().then(() => console.log("Bot started!"));
|
||||
|
||||
// This is the command handler we registered a few lines up
|
||||
async function handleCommand(roomId: string, event: any) {
|
||||
let expression = '';
|
||||
let image_url = '';
|
||||
if (
|
||||
event['content']?.['msgtype'] == 'm.image'
|
||||
) {
|
||||
image_url = homeserverUrl + "/_matrix/media/r0/download/" + (event['content']?.['url']).slice(6);
|
||||
expression = 'image';
|
||||
}
|
||||
if (
|
||||
event["content"]["avatar_url"]
|
||||
) {
|
||||
image_url = homeserverUrl + "/_matrix/media/r0/download/" + (event['content']?.['avatar_url']).slice(6);
|
||||
expression = 'pfp';
|
||||
}
|
||||
|
||||
if (event['sender'] === await client.getUserId()) return;
|
||||
if (image_url == '') return;
|
||||
|
||||
console.log('New image received, analyzing...');
|
||||
analyze_image(image_url, function(degenerate, degenerateKeywords, fullDegenerateKeywords, response) {
|
||||
if (degenerate) {
|
||||
console.log('====Degeneracy Detected!====');
|
||||
console.log('User: ' + event['sender'] + ' sent image with url: ' + image_url);
|
||||
console.log("Full keywords: " + fullDegenerateKeywords);
|
||||
console.log("Sent keywords: " + degenerateKeywords);
|
||||
console.log(response);
|
||||
console.log('https://matrix.to/#/' + roomId + '/' + event['event_id'] + '?via=willy.club&via=trygve.me&via=matrix.org');
|
||||
console.log('============================');
|
||||
// determine what type of event it was
|
||||
if (expression == 'image') {
|
||||
client.redactEvent(roomId, event['event_id']);
|
||||
client.sendText(roomId, 'Woah! Please refrain from posting images containing: "' + degenerateKeywords + '".');
|
||||
} else {
|
||||
client.kickUser(event['sender'], roomId, 'Please change your profile picture');
|
||||
}
|
||||
|
||||
} else {
|
||||
console.log('=======Nothing found========');
|
||||
console.log('User: ' + event['sender'] + ' sent image with url: ' + image_url);
|
||||
console.log(response);
|
||||
console.log('https://matrix.to/#/' + roomId + '/' + event['event_id'] + '?via=willy.club&via=trygve.me&via=matrix.org');
|
||||
console.log('============================');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function analyze_image(image_url, callback) {
|
||||
http.get(`http://localhost:5000/?image_url=` + image_url, resp => {
|
||||
let data = "";
|
||||
|
||||
// A chunk of data has been recieved.
|
||||
resp.on("data", chunk => {
|
||||
data += chunk;
|
||||
});
|
||||
|
||||
// The whole response has been received. Print out the result.
|
||||
resp.on("end", () => {
|
||||
let response = JSON.parse(data).message;
|
||||
let responseWithoutComma = response.replace(',', ' ');
|
||||
|
||||
let degenerate = false;
|
||||
let degenerateKeywords = '';
|
||||
let fullDegenerateKeywords = '';
|
||||
bannedKeywords.forEach(keyword => {
|
||||
if (Array.isArray(keyword)) {
|
||||
let alreadyAddedKeywordForThisGroup = false;
|
||||
let skippedFirstIterationBecauseItsTheTitle = false;
|
||||
keyword.forEach(subKeyword => {
|
||||
if (!skippedFirstIterationBecauseItsTheTitle) {
|
||||
skippedFirstIterationBecauseItsTheTitle = true;
|
||||
return;
|
||||
}
|
||||
if (Array.isArray(subKeyword)) {
|
||||
let allOfThemMatch = true;
|
||||
subKeyword.forEach(subsubKeyword => {
|
||||
if(responseWithoutComma.includes(subsubKeyword)) {
|
||||
fullDegenerateKeywords += subsubKeyword + ',';
|
||||
} else {
|
||||
allOfThemMatch = false;
|
||||
}
|
||||
});
|
||||
if (allOfThemMatch) {
|
||||
degenerate = true;
|
||||
if (!alreadyAddedKeywordForThisGroup) {
|
||||
degenerateKeywords += keyword[0] + ',';
|
||||
alreadyAddedKeywordForThisGroup = true;
|
||||
}
|
||||
}
|
||||
} else if (responseWithoutComma.includes(subKeyword)) {
|
||||
degenerate = true;
|
||||
if (!alreadyAddedKeywordForThisGroup) {
|
||||
degenerateKeywords += keyword[0] + ',';
|
||||
fullDegenerateKeywords += subKeyword + ',';
|
||||
alreadyAddedKeywordForThisGroup = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
} else if (responseWithoutComma.includes(keyword)) {
|
||||
degenerate = true;
|
||||
degenerateKeywords += keyword + ',';
|
||||
fullDegenerateKeywords += keyword + ',';
|
||||
}
|
||||
});
|
||||
|
||||
degenerateKeywords = degenerateKeywords.substr(0, degenerateKeywords.length -1);
|
||||
fullDegenerateKeywords = fullDegenerateKeywords.substr(0, fullDegenerateKeywords.length -1);
|
||||
|
||||
if (degenerate) {
|
||||
callback(true, degenerateKeywords, fullDegenerateKeywords, response);
|
||||
} else {
|
||||
callback(false, '', '', response);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// sometimes we dont have permission to redact messages, lets just ignore that
|
||||
process.on('uncaughtException', function (exception) {
|
||||
console.log('An error occured but it was probably not that important');
|
||||
//console.log(exception);
|
||||
});
|
||||
|
6
bot/package.json
Normal file
6
bot/package.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"matrix-bot-sdk": "^0.6.3",
|
||||
"typescript": "^4.9.4"
|
||||
}
|
||||
}
|
26
interrogator/app.py
Normal file
26
interrogator/app.py
Normal file
@ -0,0 +1,26 @@
|
||||
from flask import Flask, request
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
from PIL import Image
|
||||
from clip_interrogator import Config, Interrogator
|
||||
|
||||
ci = Interrogator(Config(clip_model_name="ViT-L-14/openai"))
|
||||
#ci = Interrogator(Config(clip_model_name="ViT-H-14/laion2b_s32b_b79k"))
|
||||
|
||||
image_path = "/dev/shm/image_data"
|
||||
|
||||
import requests
|
||||
|
||||
@app.route("/", methods=['GET'])
|
||||
def hello_world():
|
||||
args = request.args
|
||||
|
||||
img_data = requests.get(args['image_url']).content
|
||||
with open(image_path, 'wb') as handler:
|
||||
handler.write(img_data)
|
||||
|
||||
image = Image.open(image_path).convert('RGB')
|
||||
|
||||
#return {'message': ci.interrogate(image)}
|
||||
return {'message': ci.interrogate_fast(image)}
|
Loading…
Reference in New Issue
Block a user