Files
node-red-contrib-laglord-di…/discord/discordEventManager.js

203 lines
5.9 KiB
JavaScript

module.exports = function (RED) {
var discordBotManager = require('./lib/discordBotManager.js');
var discordFramework = require('./lib/discordFramework.js');
const Flatted = require('flatted');
const {
GuildScheduledEventEntityType,
GuildScheduledEventPrivacyLevel,
} = require('discord.js');
function discordEventManager(config) {
RED.nodes.createNode(this, config);
var node = this;
var configNode = RED.nodes.getNode(config.token);
discordBotManager.getBot(configNode).then(function (bot) {
node.on('input', async function (msg, send, done) {
const _guildID = config.guild || msg.guild || null;
const _eventID = config.event || msg.event || null;
const _action = msg.action || "info";
const _eventName = msg.eventName || null;
const _eventScheduledStartTime = msg.scheduledStartTime || null;
const _eventScheduledEndTime = msg.scheduledEndTime || null;
const _eventEventType = msg.eventType || "external";
const _eventChannel = msg.channel || null;
const _eventImage = null; //To-do.....
const _eventReason = msg.reason || null;
const _eventDescription = msg.description || null;
const _eventLocation = msg.eventLocation || null;
const setError = (error) => {
node.status({
fill: "red",
shape: "dot",
text: error
})
done(error);
}
const setSuccess = (succesMessage, data) => {
node.status({
fill: "green",
shape: "dot",
text: succesMessage
});
msg.payload = Flatted.parse(Flatted.stringify(data));
send(msg);
done();
}
const infoEvent = async () => {
try {
let eventManager = await discordFramework.getEventManager(bot, _guildID)
const eventID = discordFramework.checkIdOrObject(_eventID);
let event = await eventManager.fetch(eventID)
setSuccess(`event ${event.id} info obtained`, event);
} catch (err) {
setError(err);
}
}
const getEvents = async () => {
try {
let eventManager = await discordFramework.getEventManager(bot, _guildID)
let events = await eventManager.fetch()
setSuccess(`events [${events.size}] obtained`, events);
} catch (err) {
setError(err);
}
}
const deleteEvent = async () => {
try {
let eventManager = await discordFramework.getEventManager(bot, _guildID)
const eventID = discordFramework.checkIdOrObject(_eventID);
let event = await eventManager.fetch(eventID)
let deleted = await eventManager.delete(event)
setSuccess(`event ${event.id} deleted`, deleted);
} catch (err) {
setError(err);
}
}
const createEvent = async () => {
try {
let eventManager = await discordFramework.getEventManager(bot, _guildID)
const eventName = discordFramework.checkIdOrObject(_eventName)
const eventChannel = discordFramework.checkIdOrObject(_eventChannel)
if (!eventName) {
throw (`msg.eventName wasn't set correctly`);
}
if (_eventScheduledStartTime == null) {
throw (`msg.scheduledStartTime wasn't set correctly`);
}
if ( _eventEventType == "external" ){
if ( _eventLocation == null ){
throw (`msg.eventLocation wasn't set correctly, is required when event type is set to external`);
}
if ( _eventScheduledEndTime == null ){
throw (`msg.eventScheduledEndTime wasn't set correctly, is required when event type is set to external`);
}
}
else if ( _eventEventType == "voice" ){
if ( !eventChannel ){
throw (`msg.channel wasn't set correctly, is required when event type is set to voice`);
}
}
else {
throw (`msg.eventType wasn't set correctly, ${_eventEventType} is not a valid event type`)
}
const eventMetadata = {
location: _eventLocation
};
eventScheduledEndTime = new Date(_eventScheduledEndTime) || null
let event = await eventManager.create({
name: eventName,
scheduledStartTime: new Date(_eventScheduledStartTime),
scheduledEndTime: new Date(eventScheduledEndTime),
privacyLevel: GuildScheduledEventPrivacyLevel.GuildOnly,
entityType: _eventEventType == "voice" ? GuildScheduledEventEntityType.Voice : GuildScheduledEventEntityType.External,
description: _eventDescription,
channel: _eventChannel,
image: null,
reason: _eventReason,
entityMetadata: eventMetadata
});
setSuccess(`event ${event.id} created`, event);
} catch (err) {
setError(err);
}
}
switch (_action.toLowerCase()) {
case 'info':
await infoEvent();
break;
case 'all':
await getEvents();
break;
case 'create':
await createEvent();
break;
case 'delete':
await deleteEvent();
break;
default:
setError(`msg.action has an incorrect value`)
}
node.on('close', function () {
discordBotManager.closeBot(bot);
});
});
}).catch(err => {
console.log(err);
node.status({
fill: "red",
shape: "dot",
text: err
});
});
}
RED.nodes.registerType("discordEventManager", discordEventManager);
};