Initial code commit + updates to latest api
This commit is contained in:
parent
07308bc393
commit
d38dc81fb3
81329
homestuck.txt
Normal file
81329
homestuck.txt
Normal file
File diff suppressed because one or more lines are too long
219
index.js
Normal file
219
index.js
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
require('dotenv').config();
|
||||||
|
|
||||||
|
const { Client, Intents } = require('discord.js');
|
||||||
|
let intents = new Intents();
|
||||||
|
intents.add(Intents.FLAGS.GUILDS);
|
||||||
|
intents.add(Intents.FLAGS.GUILD_MESSAGES);
|
||||||
|
const client = new Client({ intents: intents });
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
const { JSDOM } = require('jsdom');
|
||||||
|
|
||||||
|
const command = '!homestuck';
|
||||||
|
const max_len = 2000 - 8;
|
||||||
|
const max_allowed_lines = 500;
|
||||||
|
|
||||||
|
const homestuck_text = fs.readFileSync('homestuck.txt', 'utf-8');
|
||||||
|
|
||||||
|
const madfunnyid = "671165585513644042";
|
||||||
|
const hussiebotid = "HussieBot#3223";
|
||||||
|
|
||||||
|
const pages_in_homestuck = 8130;
|
||||||
|
|
||||||
|
const lines = homestuck_text.split('\n');
|
||||||
|
|
||||||
|
function handle(message) {
|
||||||
|
|
||||||
|
var messages = [];
|
||||||
|
|
||||||
|
const params = message.content.match(/ [0-9]+/);
|
||||||
|
var param = -1;
|
||||||
|
if(params && params.length > 0) {
|
||||||
|
param = parseInt(params[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const page_check = message.content.match(/ page/);
|
||||||
|
if(page_check && page_check.length > 0) {
|
||||||
|
var number = param;
|
||||||
|
if(number > pages_in_homestuck) {
|
||||||
|
number = pages_in_homestuck;
|
||||||
|
} else if(number <= 0) {
|
||||||
|
number = Math.floor(Math.random() * pages_in_homestuck) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const url = 'http://homestuck.com/story/' + number;
|
||||||
|
|
||||||
|
JSDOM.fromURL(url).then(dom => {
|
||||||
|
let title = parse_title(dom, number);
|
||||||
|
if(title) {
|
||||||
|
message.channel.send(title);
|
||||||
|
}
|
||||||
|
let imageurls = parse_image_urls(dom);
|
||||||
|
let videourls = parse_video(dom);
|
||||||
|
let messages = parse_text(dom);
|
||||||
|
sendSequential(message.channel, imageurls, videourls, messages);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
var messages = rand_slice(param);
|
||||||
|
sendmessages(messages, message.channel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendSequential(channel, images, videos, text) {
|
||||||
|
if(images.length > 0) {
|
||||||
|
channel.send({ files: [ images[0] ] }).then(m => {
|
||||||
|
sendSequential(channel, images.slice(1), videos, text);
|
||||||
|
});
|
||||||
|
} else if(videos.length > 0) {
|
||||||
|
channel.send({ files: [ videos[0] ] }).then(m => {
|
||||||
|
sendSequential(channel, [], videos.slice(1), text);
|
||||||
|
});
|
||||||
|
} else if(text.length > 0) {
|
||||||
|
channel.send(text[0]).then(m => {
|
||||||
|
sendSequential(channel, [], [], text.slice(1));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendmessages(messages, channel) {
|
||||||
|
for(var i = 0; i < messages.length; i++) {
|
||||||
|
channel.send(messages[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
#content_container h2: title
|
||||||
|
#content_container img: image
|
||||||
|
|
||||||
|
p.o-chat_log: pesterlog
|
||||||
|
p.o-story_text: text
|
||||||
|
|
||||||
|
https://www.homestuck.com/story/5263
|
||||||
|
*/
|
||||||
|
function parse_image_urls(dom) {
|
||||||
|
let imageNodes = dom.window.document.querySelectorAll('#content_container img');
|
||||||
|
let imageNodesArray = Array.from(imageNodes);
|
||||||
|
return imageNodesArray.map(node => node.src);
|
||||||
|
}
|
||||||
|
|
||||||
|
function parse_video(dom) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
function parse_title(dom, number) {
|
||||||
|
let titleNode = dom.window.document.querySelector('#content_container h2');
|
||||||
|
if(titleNode) {
|
||||||
|
return "**" + titleNode.textContent + " (" + number + ")**";
|
||||||
|
}
|
||||||
|
return "**(" + number + ")**";
|
||||||
|
}
|
||||||
|
|
||||||
|
function parse_text(dom) {
|
||||||
|
let story_text_node = dom.window.document.querySelector("p.o-story_text");
|
||||||
|
let pesterlog_node = dom.window.document.querySelector("p.o_chat-log");
|
||||||
|
var content = '';
|
||||||
|
if(story_text_node) {
|
||||||
|
content += story_text_node.textContent;
|
||||||
|
if(pesterlog_node) {
|
||||||
|
content += '\n';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(pesterlog_node) {
|
||||||
|
content += pesterlog_node.textContent;
|
||||||
|
}
|
||||||
|
return generate_messages(content);
|
||||||
|
//return generate_messages(dom.window.document.querySelector('body').textContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
function rand_slice(num_lines) {
|
||||||
|
num_lines = Math.max(Math.min(num_lines, max_allowed_lines), 1);
|
||||||
|
|
||||||
|
const randIndex = Math.floor(Math.random() * (lines.length + 1 - num_lines));
|
||||||
|
|
||||||
|
var output = '';
|
||||||
|
for(var i = randIndex; i < randIndex + num_lines; i++) {
|
||||||
|
output += lines[i];
|
||||||
|
output += '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
var messages = generate_messages(output);
|
||||||
|
|
||||||
|
return messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
function generate_messages(text) {
|
||||||
|
if(text === '') {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
if(text.length < max_len) {
|
||||||
|
return ['\`\`\`\n' + text + '\n\`\`\`'];
|
||||||
|
}
|
||||||
|
|
||||||
|
const lines = text.split('\n');
|
||||||
|
var messages = [];
|
||||||
|
var cur_msg = '';
|
||||||
|
for(var i = 0; i < lines.length; i++) {
|
||||||
|
if(lines[i].length >= max_len) {
|
||||||
|
messages.push('\`\`\`\n' + cur_msg + '\n\`\`\`');
|
||||||
|
cur_msg = '';
|
||||||
|
const words = lines[i].split(' ');
|
||||||
|
for(var k = 0; k < words.length; k++) {
|
||||||
|
if(words[k].length > max_len) {
|
||||||
|
//bad word! naughty word.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(cur_msg.length + words[k].length >= max_len) {
|
||||||
|
messages.push('\`\`\`\n' + cur_msg + '\n\`\`\`');
|
||||||
|
cur_msg = '';
|
||||||
|
}
|
||||||
|
cur_msg += words[k];
|
||||||
|
}
|
||||||
|
messages.push('\`\`\`\n' + cur_msg + '\n\`\`\`');
|
||||||
|
cur_msg = '';
|
||||||
|
} else {
|
||||||
|
//TODO: finish this
|
||||||
|
if(cur_msg.length + lines[i].length >= max_len) {
|
||||||
|
messages.push('\`\`\`\n' + cur_msg + '\n\`\`\`');
|
||||||
|
cur_msg = '';
|
||||||
|
}
|
||||||
|
cur_msg += lines[i];
|
||||||
|
cur_msg += '\n';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
function userInMentions(user, message) {
|
||||||
|
let matchingUser = message.mentions.users.find(
|
||||||
|
u => u === user
|
||||||
|
);
|
||||||
|
|
||||||
|
return matchingUser !== undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
client.on('messageCreate', (message) => {
|
||||||
|
message.channel
|
||||||
|
|
||||||
|
if(message.author === client.user) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(message.author.tag == hussiebotid) {
|
||||||
|
//console.dir(message.guild.emojis);
|
||||||
|
//console.dir(message.guild.emojis[madfunnyid]);
|
||||||
|
message.react(message.guild.emojis.get(madfunnyid));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(userInMentions(client.user, message)) {
|
||||||
|
//send message
|
||||||
|
handle(message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(lines.length);
|
||||||
|
|
||||||
|
const bot_token = process.env.TOKEN;
|
||||||
|
|
||||||
|
client.login(bot_token);
|
1372
package-lock.json
generated
Normal file
1372
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
17
package.json
Normal file
17
package.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"name": "homstuck-oracle",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "walcutt",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"discord.js": "^13.8.1",
|
||||||
|
"dotenv": "^16.0.1",
|
||||||
|
"fs": "^0.0.1-security",
|
||||||
|
"jsdom": "^20.0.0"
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user