summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/package.json2
-rw-r--r--server/src/Config.ts9
-rw-r--r--server/src/client/BotClient.ts10
-rw-r--r--server/src/commands/emma/FanArt.ts2
-rw-r--r--server/src/commands/emma/Verify.ts73
-rw-r--r--server/src/commands/util/Help.ts2
-rw-r--r--server/src/json/guildMemberAdd.json5
-rw-r--r--server/src/json/guildMemberRemove.json6
-rw-r--r--server/src/listeners/client/guildMemberAdd.ts3
-rw-r--r--server/src/listeners/client/guildMemberRemove.ts6
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('🇫') });
}
});
}