127 lines
4.0 KiB
JavaScript
127 lines
4.0 KiB
JavaScript
const Flatted = require('flatted');
|
|
module.exports = function (RED) {
|
|
var discordBotManager = require('./lib/discordBotManager.js');
|
|
|
|
function discordMessage(config) {
|
|
RED.nodes.createNode(this, config);
|
|
var configNode = RED.nodes.getNode(config.token);
|
|
var channelFilterList = cleanChannelFilterList(config.channelIdFilter);
|
|
var node = this;
|
|
discordBotManager.getBot(configNode).then(function (bot) {
|
|
var callbacks = [];
|
|
node.status({
|
|
fill: "green",
|
|
shape: "dot",
|
|
text: "ready"
|
|
});
|
|
|
|
var registerCallback = function (eventName, listener) {
|
|
callbacks.push({
|
|
'eventName': eventName,
|
|
'listener': listener
|
|
});
|
|
bot.on(eventName, listener);
|
|
}
|
|
|
|
registerCallback('messageCreate', message => {
|
|
if (message.author !== bot.user) {
|
|
var msgid = RED.util.generateId();
|
|
var msg = {
|
|
_msgid: msgid
|
|
}
|
|
msg.payload = message.content;
|
|
msg.channel = Flatted.parse(Flatted.stringify(message.channel));
|
|
msg.member = Flatted.parse(Flatted.stringify(message.member));
|
|
msg.memberRoleNames = message.member ? message.member.roles.cache.each(function (item) {
|
|
return item.name
|
|
}) : null;
|
|
msg.memberRoleIDs = message.member ? message.member.roles.cache.each(function (item) {
|
|
return item.id
|
|
}) : null;
|
|
|
|
try {
|
|
msg.data = Flatted.parse(Flatted.stringify(message));
|
|
msg.data.attachments = Flatted.parse(Flatted.stringify(message.attachments));
|
|
msg.data.reference = message.reference;
|
|
} catch (e) {
|
|
node.warn("Could not set `msg.data`: JSON serialization failed");
|
|
}
|
|
|
|
if (channelFilterList && !channelFilterList.includes(msg.channel.id)){
|
|
return;
|
|
} else if (message.author.bot) {
|
|
msg.author = {
|
|
id: message.author.id,
|
|
bot: message.author.bot,
|
|
system: message.author.system,
|
|
flags: message.author.flags,
|
|
username: message.author.bot,
|
|
discriminator: message.author.discriminator,
|
|
avatar: message.author.avatar,
|
|
createdTimestamp: message.author.createdTimestamp,
|
|
tag: message.author.tag,
|
|
}
|
|
node.send(msg);
|
|
} else {
|
|
message.author.fetch(true).then(author => {
|
|
msg.author = Flatted.parse(Flatted.stringify(author));
|
|
node.send(msg);
|
|
}).catch(error => {
|
|
node.error(error);
|
|
node.status({
|
|
fill: "red",
|
|
shape: "dot",
|
|
text: error
|
|
});
|
|
});
|
|
}
|
|
}
|
|
});
|
|
|
|
registerCallback('error', error => {
|
|
node.error(error);
|
|
node.status({
|
|
fill: "red",
|
|
shape: "dot",
|
|
text: error
|
|
});
|
|
});
|
|
|
|
node.on('close', function () {
|
|
callbacks.forEach(function (cb) {
|
|
bot.removeListener(cb.eventName, cb.listener);
|
|
});
|
|
discordBotManager.closeBot(bot);
|
|
});
|
|
|
|
}).catch(function (err) {
|
|
node.error(err);
|
|
node.status({
|
|
fill: "red",
|
|
shape: "dot",
|
|
text: err
|
|
});
|
|
});
|
|
}
|
|
RED.nodes.registerType("discordMessage", discordMessage);
|
|
};
|
|
|
|
function cleanChannelFilterList(channelFilterList)
|
|
{
|
|
if (!channelFilterList)
|
|
return;
|
|
|
|
var cleanedChannelFilterList = null;
|
|
if (channelFilterList.startsWith(',') && channelFilterList.endsWith(','))
|
|
{
|
|
cleanedChannelFilterList = channelFilterList.slice(1, -1);
|
|
} else if (channelFilterList.startsWith(',')) {
|
|
cleanedChannelFilterList = channelFilterList.slice(1);
|
|
} else if (channelFilterList.endsWith(',')) {
|
|
cleanedChannelFilterList = channelFilterList.slice(0, -1);
|
|
} else {
|
|
cleanedChannelFilterList = channelFilterList;
|
|
}
|
|
return cleanedChannelFilterList.split(',');
|
|
}
|