218 lines
5.1 KiB
JavaScript
218 lines
5.1 KiB
JavaScript
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) {
|
|
return message.mentions.users.some(
|
|
u => u === user
|
|
);
|
|
}
|
|
|
|
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);
|