delete the textmode bot
This commit is contained in:
parent
e299e0d330
commit
33fa4e7b9b
3 changed files with 6 additions and 466 deletions
445
RedditRadio.js
445
RedditRadio.js
|
@ -1,445 +0,0 @@
|
||||||
var discord = require("discord.js");
|
|
||||||
var colors = require("colors");
|
|
||||||
var moment = require("moment-timezone");
|
|
||||||
|
|
||||||
var process = require("process");
|
|
||||||
var fs = require("fs");
|
|
||||||
var https = require("https");
|
|
||||||
|
|
||||||
var cmdsplit = require("./cmdsplit");
|
|
||||||
var Radio = require("./Radio");
|
|
||||||
var MongoClient = require("mongodb").MongoClient;
|
|
||||||
|
|
||||||
function findCommand(obj, cmdID)
|
|
||||||
{
|
|
||||||
var cmdName = "onCmd" + cmdID;
|
|
||||||
var cmdRegex = new RegExp("^" + cmdName + "$", "i");
|
|
||||||
|
|
||||||
var prototype = Object.getPrototypeOf(obj);
|
|
||||||
var props = Object.getOwnPropertyNames(prototype);
|
|
||||||
for (var i = 0; i < props.length; i++) {
|
|
||||||
var key = props[i];
|
|
||||||
if (!key.startsWith("onCmd")) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (key.match(cmdRegex)) {
|
|
||||||
return obj[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
class RedditRadio
|
|
||||||
{
|
|
||||||
constructor(config)
|
|
||||||
{
|
|
||||||
this.config = config;
|
|
||||||
this.readyPromises = [];
|
|
||||||
|
|
||||||
moment.tz.setDefault(this.config.discord.timezone || "Europe/Amsterdam");
|
|
||||||
|
|
||||||
console.log('Discord.js version', discord.version);
|
|
||||||
|
|
||||||
this.client = new discord.Client({
|
|
||||||
intents: [
|
|
||||||
// List of intents: https://discord.com/developers/docs/topics/gateway#list-of-intents
|
|
||||||
discord.Intents.FLAGS.GUILDS,
|
|
||||||
discord.Intents.FLAGS.GUILD_MEMBERS,
|
|
||||||
discord.Intents.FLAGS.GUILD_BANS,
|
|
||||||
discord.Intents.FLAGS.GUILD_MESSAGES,
|
|
||||||
discord.Intents.FLAGS.GUILD_MESSAGE_REACTIONS,
|
|
||||||
discord.Intents.FLAGS.DIRECT_MESSAGES,
|
|
||||||
],
|
|
||||||
});
|
|
||||||
this.client.on("messageCreate", (msg) => { this.onMessage(msg, false); });
|
|
||||||
this.client.on("messageUpdate", (oldMsg, newMsg) => { this.onMessageUpdate(oldMsg, newMsg); });
|
|
||||||
this.client.on("messageDelete", (msg) => { this.onMessageDelete(msg); });
|
|
||||||
this.client.on("guildMemberAdd", (member) => { this.onMemberJoin(member); });
|
|
||||||
this.readyPromises.push(this.client.login(this.config.discord.token));
|
|
||||||
|
|
||||||
this.modules = [];
|
|
||||||
|
|
||||||
if (this.config.database) {
|
|
||||||
this.mongoclient = new MongoClient(this.config.database.url, { useUnifiedTopology: true });
|
|
||||||
this.readyPromises.push(this.mongoclient.connect());
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @type {discord.TextChannel} */
|
|
||||||
this.logChannel = null;
|
|
||||||
/** @type {discord.TextChannel} */
|
|
||||||
this.dmChannel = null;
|
|
||||||
/** @type {discord.TextChannel} */
|
|
||||||
this.errorChannel = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
loadConfigModules()
|
|
||||||
{
|
|
||||||
if (!this.config.modules) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var name in this.config.modules) {
|
|
||||||
var moduleClass = require('./modules/' + name);
|
|
||||||
if (!moduleClass) {
|
|
||||||
console.error('Unable to find module with name "' + name + '"!');
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var configs = this.config.modules[name];
|
|
||||||
|
|
||||||
console.log('Module: "' + name + '" (' + configs.length + ' instances)');
|
|
||||||
|
|
||||||
for (let config of configs) {
|
|
||||||
var newModule = new moduleClass(config, this.client, this);
|
|
||||||
this.modules.push(newModule);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onReady()
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
this.client.guilds.cache.tap(guild => {
|
|
||||||
guild.members.fetch().then(() => {
|
|
||||||
console.log('Cached ' + guild.members.size + ' members in ' + guild.name);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
|
|
||||||
this.client.user.setActivity(this.config.discord.activity);
|
|
||||||
|
|
||||||
this.client.channels.fetch(this.config.discord.logchannel).then(logChannel => this.logChannel = logChannel);
|
|
||||||
this.client.channels.fetch(this.config.discord.dmchannel).then(dmChannel => this.dmChannel = dmChannel);
|
|
||||||
this.client.channels.fetch(this.config.discord.errorchannel).then(errorChannel => this.errorChannel = errorChannel);
|
|
||||||
|
|
||||||
if (this.mongoclient) {
|
|
||||||
this.mongodb = this.mongoclient.db(this.config.database.db);
|
|
||||||
console.log("Database connected.");
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("Client ready, loading modules...");
|
|
||||||
|
|
||||||
this.loadConfigModules();
|
|
||||||
|
|
||||||
console.log("Modules loaded!");
|
|
||||||
|
|
||||||
setInterval(() => { this.onTick(); }, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
start()
|
|
||||||
{
|
|
||||||
Promise.all(this.readyPromises).then(() => {
|
|
||||||
this.onReady();
|
|
||||||
}).catch((err) => {
|
|
||||||
console.error(err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
stop()
|
|
||||||
{
|
|
||||||
var promises = [];
|
|
||||||
|
|
||||||
console.log("Stopping client...");
|
|
||||||
promises.push(this.client.destroy());
|
|
||||||
|
|
||||||
if (this.mongoclient) {
|
|
||||||
console.log("Stopping MongoDB...");
|
|
||||||
promises.push(this.mongoclient.close());
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.all(promises).then(() => {
|
|
||||||
console.log("Client stopped.");
|
|
||||||
process.exit();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
addLogMessage(text, fromMember)
|
|
||||||
{
|
|
||||||
if (!this.logChannel) {
|
|
||||||
console.log("Couldn't log because we couldn't find the log channel:", text);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fromMember) {
|
|
||||||
text += " (via " + fromMember.user.username + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("Log: " + text);
|
|
||||||
this.logChannel.send(":robot: " + text);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the given member is an admin.
|
|
||||||
* @param {discord.GuildMember} member
|
|
||||||
*/
|
|
||||||
isAdmin(member)
|
|
||||||
{
|
|
||||||
return member.permissions.has(discord.Permissions.FLAGS.ADMINISTRATOR);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the given member is a moderator.
|
|
||||||
* @param {discord.GuildMember} member
|
|
||||||
*/
|
|
||||||
isMod(member)
|
|
||||||
{
|
|
||||||
return member.permissions.has(discord.Permissions.FLAGS.MANAGE_MESSAGES);
|
|
||||||
}
|
|
||||||
|
|
||||||
onTick()
|
|
||||||
{
|
|
||||||
for (var i = 0; i < this.modules.length; i++) {
|
|
||||||
var m = this.modules[i];
|
|
||||||
if (m.onTick) {
|
|
||||||
m.onTick();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onMemberJoin(member)
|
|
||||||
{
|
|
||||||
console.log("User joined: " + member + " (" + member.user.username + ")");
|
|
||||||
|
|
||||||
for (var i = 0; i < this.modules.length; i++) {
|
|
||||||
var m = this.modules[i];
|
|
||||||
if (m.onMemberJoin) {
|
|
||||||
m.onMemberJoin(member);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
handleError(ex)
|
|
||||||
{
|
|
||||||
console.log(ex);
|
|
||||||
if (this.errorChannel) {
|
|
||||||
this.errorChannel.send(":octagonal_sign: Bot error!\n```\n" + ex.toString() + "\n```");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {discord.Message} msg
|
|
||||||
* @param {Boolean} edited
|
|
||||||
*/
|
|
||||||
async onMessage(msg, edited)
|
|
||||||
{
|
|
||||||
// Ignore our own messages
|
|
||||||
if (msg.author == this.client.user) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ignore DM's
|
|
||||||
if (msg.member === null && msg.guild === null) {
|
|
||||||
// Log DM's
|
|
||||||
var logUsername = msg.author.username + '#' + msg.author.discriminator;
|
|
||||||
console.warn("Ignored a DM from " + logUsername.brightWhite + ": \"" + msg.content + "\"");
|
|
||||||
|
|
||||||
// Send DM's to the DM channel
|
|
||||||
if (this.dmChannel) {
|
|
||||||
this.dmChannel.send(":mailbox_with_mail: " + msg.author.toString() + ": `" + msg.content + "`");
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ignore webhooks
|
|
||||||
if (msg.webhookID) {
|
|
||||||
console.warn("Ignored webhook: \"" + msg.content + "\"");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure we have a member (sometimes this is null if their status is offline)
|
|
||||||
if (msg.member === null) {
|
|
||||||
console.warn("Member is null, fetching member now");
|
|
||||||
msg.member = await msg.guild.fetchMember(msg.author);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Log line
|
|
||||||
var logUsername = msg.author.username + '#' + msg.author.discriminator;
|
|
||||||
if (this.isAdmin(msg.member)) {
|
|
||||||
logUsername = logUsername.red;
|
|
||||||
} else if (this.isMod(msg.member)) {
|
|
||||||
logUsername = logUsername.yellow;
|
|
||||||
} else {
|
|
||||||
logUsername = logUsername.brightWhite;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('[' + moment().format('MMM Do LTS') + '] '
|
|
||||||
+ logUsername
|
|
||||||
+ ' in ' + ('#' + msg.channel.name).green.underline + ': '
|
|
||||||
+ (edited ? '(edited) '.gray : '')
|
|
||||||
+ '"' + msg.content + '"');
|
|
||||||
|
|
||||||
for (var i = 0; i < this.modules.length; i++) {
|
|
||||||
var m = this.modules[i];
|
|
||||||
if (m.onMessage) {
|
|
||||||
try {
|
|
||||||
if (m.onMessage(msg, edited)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} catch (ex) { this.handleError(ex); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!msg.content.startsWith(".")) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var parse = cmdsplit(msg.content);
|
|
||||||
var cmdID = parse[0].slice(1);
|
|
||||||
cmdID = cmdID.charAt(0).toUpperCase() + cmdID.slice(1);
|
|
||||||
if (!cmdID.match(/^[a-z]+$/i)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var cmdFound = false;
|
|
||||||
|
|
||||||
var cmdFunc = findCommand(this, cmdID);
|
|
||||||
if (cmdFunc) {
|
|
||||||
if (msg.member !== null) {
|
|
||||||
console.log("Built-in command from \"" + msg.member.user.username + "\": " + cmdID);
|
|
||||||
} else {
|
|
||||||
console.log("Module command from offline member: " + cmdID);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
var r = cmdFunc.apply(this, [ msg ].concat(parse.slice(1)));
|
|
||||||
if (r && r.catch) {
|
|
||||||
r.catch(ex => this.handleError(ex));
|
|
||||||
}
|
|
||||||
} catch (ex) { this.handleError(ex); }
|
|
||||||
cmdFound = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0; i < this.modules.length; i++) {
|
|
||||||
var m = this.modules[i];
|
|
||||||
|
|
||||||
var cmdFunc = findCommand(m, cmdID);
|
|
||||||
if (!cmdFunc) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msg.member !== null) {
|
|
||||||
console.log("Module command from \"" + msg.member.user.username + "\": " + cmdID);
|
|
||||||
} else {
|
|
||||||
console.log("Module command from offline member: " + cmdID);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
var r = cmdFunc.apply(m, [ msg ].concat(parse.slice(1)));
|
|
||||||
if (r && r.catch) {
|
|
||||||
r.catch(ex => this.handleError(ex));
|
|
||||||
}
|
|
||||||
} catch (ex) { this.handleError(ex); }
|
|
||||||
cmdFound = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cmdFound) {
|
|
||||||
console.log("Unknown command: \"" + cmdID + "\"");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async onMessageUpdate(oldMsg, newMsg)
|
|
||||||
{
|
|
||||||
if (oldMsg.content != newMsg.content) {
|
|
||||||
this.onMessage(newMsg, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async onMessageDelete(msg)
|
|
||||||
{
|
|
||||||
console.log("Message deleted: \"" + msg.content + "\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
onCmdGithub(msg)
|
|
||||||
{
|
|
||||||
msg.channel.send("My code is on Github! :robot: https://github.com/deflax/radiobot");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
//TODO: Move this to a module
|
|
||||||
onCmdWeather(msg)
|
|
||||||
{
|
|
||||||
var url = "https://api.darksky.net/forecast/" + this.config.weather.apikey + "/" + this.config.weather.coords + "?units=auto";
|
|
||||||
https.get(url, (res) => {
|
|
||||||
var data = "";
|
|
||||||
res.setEncoding("utf8");
|
|
||||||
res.on("data", function(chunk) { data += chunk; });
|
|
||||||
res.on("end", () => {
|
|
||||||
try {
|
|
||||||
var obj = JSON.parse(data);
|
|
||||||
var ret = "**The weather at Defqon.1 is currently:** (powered by darksky.net)\n";
|
|
||||||
ret += "*" + obj.currently.summary + "* / **" + obj.currently.temperature + "\u2103 (" + Math.round((obj.currently.temperature * 9/5) + 32) + "\u2109)** / " + Math.round(obj.currently.humidity * 100) + "% humidity\n";
|
|
||||||
ret += "UV index " + obj.currently.uvIndex + ", wind speed " + obj.currently.windSpeed + " m/s";
|
|
||||||
msg.channel.send(ret);
|
|
||||||
} catch (err) {
|
|
||||||
msg.channel.send("I failed to get the weather... :sob:");
|
|
||||||
console.log(err);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
//TODO: Change this to .timeout and move this to its own module
|
|
||||||
/*
|
|
||||||
onCmdMute(msg)
|
|
||||||
{
|
|
||||||
if (!this.isMod(msg.member)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var memberID of msg.mentions.members.keys()) {
|
|
||||||
var member = msg.mentions.members.get(memberID);
|
|
||||||
member.roles.remove(this.config.discord.mutedrole);
|
|
||||||
|
|
||||||
this.addLogMessage("Muted " + member.user.username, msg.member);
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.delete();
|
|
||||||
}
|
|
||||||
|
|
||||||
onCmdUnmute(msg)
|
|
||||||
{
|
|
||||||
if (!this.isMod(msg.member)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var memberID of msg.mentions.members.keys()) {
|
|
||||||
var member = msg.mentions.members.get(memberID);
|
|
||||||
member.roles.add(this.config.discord.mutedrole);
|
|
||||||
|
|
||||||
this.addLogMessage("Unmuted " + member.user.username, msg.member);
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.delete();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
formatMilliseconds(ms)
|
|
||||||
{
|
|
||||||
var sec = Math.floor(ms / 1000);
|
|
||||||
|
|
||||||
var secs = sec % 60;
|
|
||||||
var mins = Math.floor(sec / 60) % 60;
|
|
||||||
var hours = Math.floor(sec / 60 / 60) % 60;
|
|
||||||
|
|
||||||
var ret = "";
|
|
||||||
if (hours > 0) {
|
|
||||||
ret += hours + "h";
|
|
||||||
}
|
|
||||||
if (mins > 0) {
|
|
||||||
ret += mins + "m";
|
|
||||||
}
|
|
||||||
ret += secs + "s";
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
onCmdTime(msg)
|
|
||||||
{
|
|
||||||
var date = moment();
|
|
||||||
var text = "The local time is: **" + date.format("HH:mm") + "** (<https://time.is/CET>)";
|
|
||||||
msg.channel.send(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = RedditRadio;
|
|
|
@ -1,22 +1,7 @@
|
||||||
[discord]
|
|
||||||
token = "main_bot_token"
|
|
||||||
timezone = "Europe/Amsterdam"
|
|
||||||
logchannel = "647767937054277642"
|
|
||||||
dmchannel = "736529983706628146"
|
|
||||||
|
|
||||||
[filter]
|
|
||||||
badwords = "(thepiratebay|badwords)"
|
|
||||||
|
|
||||||
#[[modules.event]]
|
|
||||||
#file = "events/Qlimax2019.json"
|
|
||||||
|
|
||||||
#[[modules.eventquick]]
|
|
||||||
#channel = "651911168650248208"
|
|
||||||
|
|
||||||
[[radios]]
|
[[radios]]
|
||||||
token = "radio_bot_1_token"
|
token = "radio_bot_token"
|
||||||
channel = "330121740758024193"
|
channel = "channel_id"
|
||||||
name = "Q-dance Radio"
|
name = "Example Radio"
|
||||||
url = "http://example.net"
|
url = "http://example.net"
|
||||||
|
|
||||||
[voice]
|
[voice]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "redditradio",
|
"name": "radiobot",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "discord.gg/hardstyle",
|
"description": "deflax radiobot",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@discordjs/opus": "^0.3.2",
|
"@discordjs/opus": "^0.3.2",
|
||||||
|
@ -22,5 +22,5 @@
|
||||||
"radios": "node index.js --radios",
|
"radios": "node index.js --radios",
|
||||||
"no-radio": "node index.js --no-radios"
|
"no-radio": "node index.js --no-radios"
|
||||||
},
|
},
|
||||||
"author": "Codecat"
|
"author": "deflax"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue