d-bot
Version:
A quirky Discord bot made for single, small, private servers
55 lines (50 loc) • 2.16 kB
JavaScript
// Emulating users from chat history
var util = require(__base+'core/util.js');
var discord = require(__base+'core/discord.js');
var messages = require(__base+'core/messages.js');
var requireUncached = require('require-uncached');
var findHelper = requireUncached('./find.js');
var FuzzySet = require('fuzzyset.js');
function VirtualUser(params) {
this.name = params.name;
this.id = params.id;
this.channel = params.channel;
this.pre = `**Virtual ${params.name}**: `;
this.exchanges = [];
this.fuzzy = FuzzySet();
this.responses = 0;
this.greeting = `Hello! I'm _virtual ${this.name}._ Say some stuff to me, dude.`;
this.goodbye = 'I have to go now, see you later!';
}
VirtualUser.prototype.prepare = function() {
var virtual = this;
var msgQuery = {};
findHelper.addChannelQuery(msgQuery, this.channel);
setTimeout(async function() {
let allMessages = await messages.cursor(db => db.cfind(msgQuery).sort({time:1}));
if(allMessages) for(var i = 1; i < allMessages.length; i++) {
if(allMessages[i-1].user !== virtual.id && allMessages[i].user === virtual.id) {
virtual.exchanges.push([allMessages[i-1].content.toLowerCase(), allMessages[i].content]);
virtual.fuzzy.add(allMessages[i-1].content.toLowerCase());
}
}
virtual.ready = true;
if(!virtual.exchanges[0]) {
discord.sendMessage(virtual.channel, virtual.pre + `Actually, never mind. I'm leaving.`);
virtual = false;
}
}, 100);
};
VirtualUser.prototype.getResponse = function(data) {
var matchedPrompt = this.fuzzy.get(data.message.toLowerCase());
if(!matchedPrompt || !matchedPrompt[0]) return;
var responses = [];
for(var i = 0; i < this.exchanges.length; i++) {
if(this.exchanges[i][0] == matchedPrompt[0][1]) {
responses.push(i);
}
}
if(responses.length === 0) responses.push(util.randomInt(this.exchanges.length - 1));
return this.exchanges[util.pickInArray(responses)][1];
};
module.exports = VirtualUser;