diff options
| -rw-r--r-- | server/package.json | 2 | ||||
| -rw-r--r-- | server/src/Config.ts | 9 | ||||
| -rw-r--r-- | server/src/client/BotClient.ts | 10 | ||||
| -rw-r--r-- | server/src/commands/emma/FanArt.ts | 2 | ||||
| -rw-r--r-- | server/src/commands/emma/Verify.ts | 73 | ||||
| -rw-r--r-- | server/src/commands/util/Help.ts | 2 | ||||
| -rw-r--r-- | server/src/json/guildMemberAdd.json | 5 | ||||
| -rw-r--r-- | server/src/json/guildMemberRemove.json | 6 | ||||
| -rw-r--r-- | server/src/listeners/client/guildMemberAdd.ts | 3 | ||||
| -rw-r--r-- | server/src/listeners/client/guildMemberRemove.ts | 6 |
10 files changed, 110 insertions, 8 deletions
diff --git a/server/package.json b/server/package.json index 44fd26f..e54e63d 100644 --- a/server/package.json +++ b/server/package.json @@ -17,6 +17,8 @@ "node-emoji": "^1.10.0", "node-superfetch": "^0.1.10", "rss-parser": "^3.9.0", + "svg-captcha": "^1.4.0", + "svg2img": "^0.7.2", "winston": "^3.3.3" }, "devDependencies": { diff --git a/server/src/Config.ts b/server/src/Config.ts index 107f357..827f7c8 100644 --- a/server/src/Config.ts +++ b/server/src/Config.ts @@ -15,4 +15,11 @@ export const validIDs: string[] = [ '649676743195754550' // Soph ]; export const mongoDBUri: string = "mongodb+srv://sin:[email protected]/aki-web?retryWrites=true&w=majority"; -export const emmaServer: string = "663964105983393793";
\ No newline at end of file +export const emmaServer: string = "663964105983393793"; +export const captchaSettings: object = { + background: '#7289Da', + color: false, + size: 6 +}; +export const verificationRole: string = "Disinfector"; +export const verificationChannel: string = "verification";
\ No newline at end of file diff --git a/server/src/client/BotClient.ts b/server/src/client/BotClient.ts index da23a7b..086dc4e 100644 --- a/server/src/client/BotClient.ts +++ b/server/src/client/BotClient.ts @@ -5,6 +5,7 @@ import { prefix, owners } from '../Config'; import { logger } from '../utils/Logger'; import { SettingsProvider } from '../database'; import { Logger } from 'winston'; +import svg2img from 'svg2img'; declare module 'discord-akairo' { interface AkairoClient { @@ -12,6 +13,7 @@ declare module 'discord-akairo' { listenerHandler: ListenerHandler; logger: Logger; settings: SettingsProvider; + img } } @@ -26,6 +28,14 @@ export default class BotClient extends AkairoClient { public logger = logger; + public img = (data) => { + return new Promise((resolve, reject) => { + svg2img(data, (error, buffer) => { + return resolve(buffer); + }); + }); + } + public inhibitorHandler: InhibitorHandler = new InhibitorHandler(this, { directory: join(__dirname, '..', 'inhibitors') }); diff --git a/server/src/commands/emma/FanArt.ts b/server/src/commands/emma/FanArt.ts index 3cab365..3d04718 100644 --- a/server/src/commands/emma/FanArt.ts +++ b/server/src/commands/emma/FanArt.ts @@ -72,7 +72,7 @@ export default class FanArtEmma extends Command { msg.attachments.forEach(fanart => { if (fanart.url) { //@ts-ignore - return fanartServer.channels.cache.get(fanartChannel).send(`**New fanart submitted!**\nFanart by <@${msg.author.id}>.\n\n**Comment**\n${comment ? comment : 'None.'}\n\n**Video** ` + fanart.url) + return fanartServer.channels.cache.get(fanartChannel).send(`**New fanart submitted!**\nFanart by <@${msg.author.id}>.\n\n**Comment**\n${comment ? comment : 'None.'}\n\n**Video/ Image** ` + fanart.url) .then(m => { m.react('😍'); m.react('😂'); diff --git a/server/src/commands/emma/Verify.ts b/server/src/commands/emma/Verify.ts new file mode 100644 index 0000000..09bebbb --- /dev/null +++ b/server/src/commands/emma/Verify.ts @@ -0,0 +1,73 @@ +import { Command } from 'discord-akairo'; +import { Message } from 'discord.js'; +import { colour } from '../../Config'; +import * as svgCaptcha from 'svg-captcha'; +import { MessageAttachment } from 'discord.js'; +import { TextChannel } from 'discord.js'; +import { captchaSettings, verificationRole, verificationChannel } from '../../Config'; + +export default class VerifyEmma extends Command { + public constructor() { + super('verify', { + aliases: ['verify'], + category: 'moderation', + description: { + content: 'Allows to to verify yourself so you can access the rest of a server. Public version out soon!', + usage: '', + examples: [ + '' + ] + }, + ratelimit: 3 + }); + } + + public async exec(msg: Message): Promise<Message> { + msg.delete(); + if ((msg.channel as TextChannel).name !== verificationChannel) return; + if (msg.channel.type ==='dm') return msg.channel.send('Sorry, verification needs to be initialized in the server\'s verification channel!'); + const captcha = await svgCaptcha.create(captchaSettings); + const attachment = new MessageAttachment(await this.client.img(captcha.data).then(r => r), 'captcha.png'); + const embed = this.client.util.embed() + .setColor(colour) + .setDescription('Please reply with the following captcha. (**case-sensitive**).') + //@ts-ignore + .attachFiles(attachment) + .setImage('attachment://captcha.png') + .setFooter('Expires in 60 seconds.') + const m1 = await msg.author.send('Generating captcha...').catch(async () => { + const deleteMessage = await msg.reply('I\'m unable to send you a direct message. Please, make sure to allow direct messages from server members in the privacy settings!'); + await this.wait(7000); + return deleteMessage.delete(); + }); + m1.delete(); + const message = await msg.author.send(embed); + const response = await this.awaitReplyDM(msg.member, message, 60000); + if (!response) return msg.author.send(`The captcha has expired! Try again by typing \`${this.client.commandHandler.prefix}verify\` in the server's verification channel!`).catch(async () => { + const deleteMessage = await msg.reply('I\'m unable to send you a direct message. Please, make sure to allow direct messages from server members in the privacy settings!'); + await this.wait(7000); + return deleteMessage.delete(); + }); + if (response.includes(captcha.text)) { + msg.author.send('You passed the captcha! Granting access...').then(async m => { + const role = await msg.guild.roles.cache.find(r => r.name.toLowerCase() === verificationRole.toLowerCase()); + if (role) msg.member.roles.add(role.id); + m.edit(`Access granted to **${msg.guild.name}**!`); + }); + } else { + return msg.author.send(`Wrong captcha! Try again by typing \`${this.client.commandHandler.prefix}verify\` in the server's verification channel!`); + } + } + + public awaitReplyDM = async (member, msg, question, limit = 60000) => { + const filter = m => member.id == member.id; + try { + const collected = await msg.channel.awaitMessages(filter, { max: 1, time: limit, errors: ['time'] }); + return collected.first().content; + } catch (error) { + return false; + } + } + + public wait = require("util").promisify(setTimeout); +}
\ No newline at end of file diff --git a/server/src/commands/util/Help.ts b/server/src/commands/util/Help.ts index 76d2bf6..15549d5 100644 --- a/server/src/commands/util/Help.ts +++ b/server/src/commands/util/Help.ts @@ -92,7 +92,7 @@ export default class HelpUtil extends Command { } if (msg.channel.type === 'dm') return msg.author.send({ embed }); - return msg.reply('sending you a DM with information...').then(async m => { + return msg.reply('Sending you a DM with information...').then(async m => { await msg.author.send({ embed }); m.edit('I\'ve send you a DM with information!'); }); diff --git a/server/src/json/guildMemberAdd.json b/server/src/json/guildMemberAdd.json index c79e360..bc05dd1 100644 --- a/server/src/json/guildMemberAdd.json +++ b/server/src/json/guildMemberAdd.json @@ -4,5 +4,8 @@ "has entered the swamp.", "used warp-speed to get here!", "has entered the Gulag.", - "has come to end Dio." + "has come to end Dio.", + "has come to simp.", + "has entered the chat.", + "is ready to simp." ]
\ No newline at end of file diff --git a/server/src/json/guildMemberRemove.json b/server/src/json/guildMemberRemove.json index 65f6566..b892839 100644 --- a/server/src/json/guildMemberRemove.json +++ b/server/src/json/guildMemberRemove.json @@ -6,5 +6,9 @@ "left the swamp.", "was written in the Death Note.", "used instant transmission to escape", - "forgot to put their mask on." + "forgot to put their mask on.", + "peace out-a here.", + "couldn't stay for desert.", + "had to go.", + "left in a hurry." ]
\ No newline at end of file diff --git a/server/src/listeners/client/guildMemberAdd.ts b/server/src/listeners/client/guildMemberAdd.ts index 8d9263c..6a54d22 100644 --- a/server/src/listeners/client/guildMemberAdd.ts +++ b/server/src/listeners/client/guildMemberAdd.ts @@ -20,7 +20,8 @@ export default class GuildMemberAddListener extends Listener { const secret = Math.floor(Math.random() * 1000); if (secret === 420) { //@ts-ignore - return member.guild.channels.cache.get(g.channelID).send(`${member.user.tag} (<@${member.id}>) has just got the secret welcome message! They had a 1/1000 chance of getting this! ✨`); + return member.guild.channels.cache.get(g.channelID).send(`${member.user.tag} (<@${member.id}>) has just got the secret welcome message! They had a **1/1000** chance of getting this! ✨`) + .then(m => { m.react('✨') }); } else { const leaveMessage = await wMRResponses[Math.floor(Math.random() * wMRResponses.length)]; //@ts-ignore diff --git a/server/src/listeners/client/guildMemberRemove.ts b/server/src/listeners/client/guildMemberRemove.ts index eacdd6b..40caa45 100644 --- a/server/src/listeners/client/guildMemberRemove.ts +++ b/server/src/listeners/client/guildMemberRemove.ts @@ -20,11 +20,13 @@ export default class GuildMemberRemoveListener extends Listener { const secret = Math.floor(Math.random() * 1000); if (secret === 420) { //@ts-ignore - return member.guild.channels.cache.get(g.channelID).send(`${member.user.tag} (<@${member.id}>) has just got the secret goodbye message! They had a 1/1000 chance of getting this! ✨`); + return member.guild.channels.cache.get(g.channelID).send(`${member.user.tag} (<@${member.id}>) has just got the secret goodbye message! They had a **1/1000** chance of getting this! ✨`) + .then(m => { m.react('✨') }); } else { const leaveMessage = await gMRResponses[Math.floor(Math.random() * gMRResponses.length)]; //@ts-ignore - return member.guild.channels.cache.get(g.channelID).send(`${member.user.tag} (<@${member.id}>) ${leaveMessage}`); + return member.guild.channels.cache.get(g.channelID).send(`${member.user.tag} (<@${member.id}>) ${leaveMessage}`) + .then(m => { m.react('🇫') }); } }); } |