· 8 years ago · Aug 24, 2018, 05:28 PM
1//Set our requirements
2const Discord = require('discord.js');
3const { CommandoClient } = require('discord.js-commando');
4const path = require('path');
5
6
7const config = require("./config.json");
8const fs = require("fs");
9
10
11const client = new CommandoClient({
12 commandPrefix: config.prefix,
13 owner: config.ownerID,
14 disableEveryone: true,
15 unknownCommandResponse: false
16});
17
18
19client.registry
20 .registerDefaultTypes()
21 .registerGroups([
22 ['board', 'Board commands. (Needs to connect their mariomods.net account to discord)'],
23 ['info', 'All the info on Mario Making Mods (rules, invite, etc)']
24 ])
25 .registerDefaultGroups()
26 .registerDefaultCommands()
27 .registerCommandsIn(path.join(__dirname, 'commands'));
28
29
30const sqlite = require("sqlite");
31sqlite.open("./score.sqlite");
32
33
34const https = require("https");
35var htmlToText = require('html-to-text');
36
37
38var spoilersRole;
39var communityRole;
40var modRole;
41var mutedRole;
42
43var logschannel;
44var modmailchannel;
45
46
47//Tell us when the client is ready
48client.on('ready', () => {
49 client.user.setPresence({ status: 'online', game: { name: 'https://mariomods.net/ - Mario Making Mods' } });
50 console.log(`My body is ready to serve ${client.users.size} users in ${client.guilds.size} servers!`);
51});
52
53var blacklist = ['dyke', 'fag', 'faggot', 'kike', 'kys', 'nigga', 'nigger', 'retard', 'tranny'];
54var foundintext = false;
55
56
57function isEmpty(value) { //Function to check if value is really empty or not
58 return (value == null || value.length === 0);
59}
60
61function stripHTML(text) {
62 text = text.replace(/<style([\s\S]*?)<\/style>/gi, '');
63 text = text.replace(/<script([\s\S]*?)<\/script>/gi, '');
64 text = text.replace(/<\/div>/ig, '\n');
65 text = text.replace(/<\/li>/ig, '\n');
66 text = text.replace(/<li>/ig, ' * ');
67 text = text.replace(/<\/ul>/ig, '\n');
68 text = text.replace(/<\/p>/ig, '\n');
69 text = text.replace(/<br\s*[\/]?>/gi, "\n");
70 text = text.replace(/<[^>]+>/ig, '');
71 text = htmlToText.fromString(text, {
72 wordwrap: 1000
73 });
74 return text;
75}
76
77function getDateTime() {
78 var date = new Date();
79
80 var hour = date.getHours();
81 hour = (hour < 10 ? "0" : "") + hour;
82
83 var min = date.getMinutes();
84 min = (min < 10 ? "0" : "") + min;
85
86 var sec = date.getSeconds();
87 sec = (sec < 10 ? "0" : "") + sec;
88
89 var year = date.getFullYear();
90
91 var month = date.getMonth() + 1;
92 month = (month < 10 ? "0" : "") + month;
93
94 var day = date.getDate();
95 day = (day < 10 ? "0" : "") + day;
96
97 return year + ":" + month + ":" + day + ":" + hour + ":" + min + ":" + sec;
98}
99
100const YTDL = require("ytdl-core");
101
102//Now comes the actual commands
103client.on("message", async message => {
104 if (message.author.bot)
105 return;
106
107 const prefixMention = new RegExp(`^<@!?${client.user.id}>( |)$`);
108 if (message.content.match(prefixMention)) {
109 return message.reply(`My prefix is \`${config.prefix}\``);
110 }
111
112 for (var i in blacklist) {
113 if(message.content.toLowerCase().includes(blacklist[i].toLowerCase()))
114 foundintext = true;
115 }
116
117 function isMMM() { //Check if we're in the guild
118 if (!message.guild) return false; //If we're not in a guild
119 if (message.channel.type !== "text") return false; //If we're not in a text channel
120 if (message.guild.id !== config.server) return false; //If you aren't in the guild
121
122 return true; //If all above checks are done with, that means that we really are in the guild, so return true
123 }
124
125 if(isMMM()) { //Now if we're in the server (specified in the config), define a few things
126 spoilersRole = message.guild.roles.find('name', config.SpoilersRole); //Define the spoiler role
127 communityRole = message.guild.roles.find('name', config.CommunityRole); //Define the community role
128 modRole = message.guild.roles.find("name", config.ModRole); //Define that staff role
129 mutedRole = message.guild.roles.find('name', config.MutedRole); //Define the Muted role
130
131 logschannel = message.guild.channels.find("name", config.logschannel);
132 modlogschannel = message.guild.channels.find("name", config.modlogschannel);
133 modmailchannel = client.channels.get(config.modmailchannel);
134
135 if(foundintext) {
136 message.delete();
137 return message.channel.send('Sorry, that word is blacklisted');
138 }
139 }
140
141 if (message.mentions
142 && message.mentions.members
143 && message.mentions.members.size > 4)
144 return message.reply("Do not mention spam.");
145
146 if (message.content.indexOf(config.prefix) !== 0) {
147 if(message.channel.type === "dm") {
148 var embed = new Discord.RichEmbed()
149 .setTimestamp(new Date())
150 .setAuthor(`${message.author.tag} [${message.author.id}]`, message.author.displayAvatarURL)
151 .setColor("#15f153")
152 .setDescription(message.content);
153
154 try { modmailchannel.send(embed); } catch(error) { console.error;}
155 return;
156 }
157
158 sqlite.get(`SELECT * FROM scores WHERE userId ="${message.author.id}"`).then(row => {
159 if(!isMMM) return;
160 if(message.content.indexOf("?") == 0) return; //ignore Dyno
161 if(message.channel.name == "end-of-server") return;
162 if (!row) {
163 sqlite.run("INSERT INTO scores (userId, points, level) VALUES (?, ?, ?)", [message.author.id, 1, 0]);
164 } else {
165 var curLevel = row.points / 100;
166 curLevel = ~~curLevel;
167 if (curLevel > row.level) {
168 row.level = curLevel;
169 sqlite.run(`UPDATE scores SET points = ${row.points + 1}, level = ${row.level} WHERE userId = ${message.author.id}`);
170 message.reply(`You've leveled up to level **${curLevel}**! Ain't that dandy?`);
171 } else {
172 sqlite.run(`UPDATE scores SET points = ${row.points + 1} WHERE userId = ${message.author.id}`);
173 }
174 }
175 }).catch(() => {
176 if (message.channel.type !== "text") {
177 const channel = member.guild.channels.find('name', 'general');
178 return;
179 }
180 console.error;
181 sqlite.run("CREATE TABLE IF NOT EXISTS scores (userId TEXT, points INTEGER, level INTEGER)").then(() => {
182 sqlite.run("INSERT INTO scores (userId, points, level) VALUES (?, ?, ?)", [message.author.id, 1, 0]);
183 });
184 });
185 return;
186 }
187
188 const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
189 const command = args.shift().toLowerCase();
190
191 var arg1 = args.slice(1).join(" ");
192
193 if(message.mentions.users.size) { //If there is a user mentioned
194 var memberping = message.mentions.members.first();
195 var userbio = message.mentions.users.first().id; // Grab that mentioned user's ID
196 var username = message.mentions.users.first().username; // Grab that mentioned user's username
197 var useravatar = message.mentions.users.first().avatarURL; // Grab that mentioned user's avatar
198 } else { //Otherwise if there isn't a user mentioned
199 var userbio = message.author.id; // Grab the ID from the author of the post
200 var username = message.author.username; // Grab the username from the author of the post
201 var useravatar = message.author.avatarURL; // Grab the avatar from the author of the post
202 }
203
204 function play(connection, message) {
205 var server = servers[message.guild.id];
206 server.dispatcher = connection.playStream(YTDL(server.queue[0], {filter: "audioonly"}));
207 server.queue.shift();
208 server.dispatcher.on("end", function() {
209 if(server.queue[0]) play(connection, messsage);
210 else connection.disconnect();
211 });
212 }
213
214 var servers = {};
215
216 switch (command) {
217 case "play":
218 var voiceChannel = message.member.voiceChannel;
219 if (!voiceChannel) return message.reply("I think it may work better if you are in a voice channel!");
220
221 var permissions = voiceChannel.permissionsFor(message.client.user);
222 if (!permissions.has('CONNECT')) return message.reply("I can't join voice channels. Make sure I have the proper permissions.").catch(console.error);
223 if (!permissions.has('SPEAK')) return message.reply("I can't speak in this server. Make sure I have the proper permissions.").catch(console.error);
224
225 if (!args[0]) return message.reply("Please specify a link");
226
227 if(!servers[message.guild.id]) {
228 servers[message.guild.id] = {
229 queue: []
230 }
231 }
232 var server = servers[message.guild.id];
233
234 server.queue.push(args[0]);
235
236 message.channel.send("Your song has been added to the queue.")
237 if(!message.guild.voiceConnection)
238 message.member.voiceChannel.join().then(function(connection) {
239 play(connection, message);
240 })
241 break;
242 case "skip":
243 if (!message.member.voiceChannel) return message.reply("I think it may work better if you are in a voice channel!");
244
245 var server = servers[message.guild.id];
246 if (server.dispatcher) {
247 server.dispatcher.end();
248 return message.reply("the song has been sucessfully skipped.");
249 }
250 break;
251 case "stop":
252 if (!message.member.voiceChannel) return message.reply("I think it may work better if you are in a voice channel!");
253
254 var server = servers[message.guild.id];
255 if(message.guild.voiceConnection) {
256 message.guild.voiceConnection.disconnect();
257 return message.reply("I have stopped playing music");
258 }
259 break;
260 case "pause":
261 if (!message.member.voiceChannel) return message.reply("I think it may work better if you are in a voice channel!");
262
263 var server = servers[message.guild.id];
264 if (server.dispatcher) {
265 server.dispatcher.pause();
266 return message.reply("the song is paused.");
267 }
268 break;
269 case "resume":
270 if (!message.member.voiceChannel) return message.reply("I think it may work better if you are in a voice channel!");
271
272 var server = servers[message.guild.id];
273 if (server.dispatcher) {
274 server.dispatcher.resume();
275 return message.reply("the song is continued.");
276 }
277 break;
278 case "ping":
279 // !ping command emoji reaction.
280 try { message.react(client.emojis.get('371886a66446c46e66e9435158468720')); } catch(error) { console.log(error); };
281 break;
282 case "dm":
283 if (!isMMM()) return;
284 if (!message.member.roles.has(modRole.id))
285 return message.reply("you can't use this command.");
286
287 let dmuser = message.guild.member(message.mentions.users.first()) || message.guild.members.get(args[0]);
288 if (!dmuser) return message.reply("please mention a user to DM");
289
290 if(!arg1) return message.reply("you need to specify what you want to DM that user");
291
292 try {
293 try {
294 dmuser.send(`Staff reply: ${arg1}`);
295 message.react(client.emojis.get('c6b26ba81f44b0c43697852e1e1d1420'));
296 } catch(error) {
297 message.react(client.emojis.get('15ccaf984f2fafcf3ed5d896763ed510'));
298 }
299 } catch(error) {
300 console.log(error);
301 }
302 break;
303 case "warn":
304 if (!isMMM) return;
305 if (message.channel.name == "end-of-server") return;
306 if (!message.member.roles.has(modRole.id))
307 return message.reply("you can't use this command.");
308
309 var warnuser = message.guild.member(message.mentions.users.first()) || message.guild.members.get(args[0]);
310 if (!warnuser)
311 return message.reply("please mention a user to warn");
312
313 if(!arg1) return message.reply("you need to specify what you want to DM that user");
314
315 sqlite.get(`SELECT * FROM warns WHERE userId ="${warnuser}"`).then(row => {
316 sqlite.run("INSERT INTO warns (userId, reason, moderator, time) VALUES (?, ?, ?, ?)", [memberping.id, arg1, message.author.id, getDateTime()]).then(() => {
317 if(logschannel)
318 logschannel.send(`${warnuser.user.tag} **[${memberping.id}]** was warned by ${message.author.tag} **[${message.author.id}]** for ${arg1} at ${message.createdAt} in ${message.channel}`);
319
320 if(modlogschannel) {
321 var embed = new Discord.RichEmbed() // Master is MessageEmbed
322 .setTitle("User Warned")
323 .setColor("#ff0000")
324 .setTimestamp(new Date())
325 .addField("Warned User:", `${username}, ID: ${warnuser.user.id}`)
326 .addField("Reason:", arg1)
327 .addField("Moderator:", `${message.author}, ID: ${message.author.id}`)
328 .addField("Time:", message.createdAt)
329 .addField("Channel:", message.channel);
330
331 modlogschannel.send(embed);
332 }
333 message.channel.send(`***${warnuser.user.tag} was warned!***`)
334 warnuser.send(`You have been warned in ${message.guild.name} by ${message.author.username} for: ${arg1}.`)
335 });
336 }).catch(() => {
337 sqlite.run("CREATE TABLE IF NOT EXISTS warns (userId TEXT, reason TEXT, moderator TEXT, time TEXT)").then(() => {
338 sqlite.run("INSERT INTO warns (userId, reason, moderator, time) VALUES (?, ?, ?, ?)", [memberping.id, arg1, message.author.id, getDateTime()]).then(() => {
339 if(logschannel)
340 logschannel.send(`${memberping.user.tag} **[${memberping.id}]** was warned by ${message.author.tag} **[${message.author.id}]** for ${arg1} at ${message.createdAt} in ${message.channel}`);
341
342 if(modlogschannel) {
343 var embed = new Discord.RichEmbed() // Master is MessageEmbed
344 .setTitle("User Warned")
345 .setColor("#ff0000")
346 .setTimestamp(new Date())
347 .addField("Warned User:", `${username}, ID: ${warnuser.user.id}`)
348 .addField("Reason:", arg1)
349 .addField("Moderator:", `${message.author}, ID: ${message.author.id}`)
350 .addField("Time:", message.createdAt)
351 .addField("Channel:", message.channel);
352
353 modlogschannel.send(embed);
354 }
355 message.channel.send(`***${warnuser.user.tag} was warned!***`)
356 warneduser.send(`You have been warned in ${message.guild.name} by ${message.author.username} for: ${arg1}.`)
357 });
358 }).catch(error => {
359 console.error(error);
360 });
361 });
362 break;
363 case "listwarns":
364 if (!isMMM) return;
365 if (message.channel.name == "end-of-server") return;
366 if (!message.member.roles.has(modRole.id))
367 return message.reply("You can't use this command.");
368
369 var warnuser = message.guild.member(message.mentions.users.first()) || message.guild.members.get(args[0]);
370 if (!warnuser)
371 return message.reply("Please mention a user to warn");
372
373 // Now shake it and show it! (as a nice embed, too!)
374 var embed = new Discord.RichEmbed()
375 .setTitle(`Warning for ${warnuser.user.username}`)
376 .setAuthor(client.user.username, client.user.avatarURL)
377 .setColor(0x00AE86);
378
379 sqlite.all(`SELECT * FROM warns WHERE userId = "${memberping.id}"`).then(rows => {
380 console.log(rows);
381 var len = rows.length;
382 console.log(len)
383 for(var row of rows) {
384 console.log(row);
385 embed.addField(message.guild.members.get(row.moderator).user.username, `${row.reason} (at ${row.time})`);
386 }
387 message.channel.send(embed);
388 });
389 break;
390 case "points":
391 //Command to show how much points a user has
392 sqlite.get(`SELECT * FROM scores WHERE userId ="${userbio}"`).then(row => {
393 if (!row) { //If the row isn't existant
394 return message.reply(`${message.mentions ? username + "doesn't" : "You don't"} have any points yet.`); /* Then the user doesn't have any points. Tell them that. */
395 }
396
397 var embed = new Discord.RichEmbed()
398 .setColor("#15f153")
399 .setTitle(`Showing stats for ${username}`)
400 .setThumbnail(message.guild.iconURL)
401 .setTimestamp(new Date());
402
403 if(!isEmpty(row.points)) { embed.addField("Points", row.points); }
404 else { embed.addField("Points", "Nothing"); }
405
406 if(!isEmpty(row.level)) { embed.addField("Level", row.level); }
407
408 return message.channel.send(embed);
409 }).catch(() => {
410 return message.reply(`${message.mentions ? username + " doesn't" : "You don't"} have any points yet.`); /* Tell them that the user doesn't have any points. */
411 });
412 break;
413 case "avatar":
414 return message.reply(useravatar);
415 break;
416 case "spoilers":
417 if (!isMMM()) return;
418 if(!spoilersRole) return;
419
420 if(message.member.roles.has(spoilersRole.id)) {
421 message.member.removeRole(spoilersRole);
422 message.channel.send(':ok_hand: You can\'t access the spoilers channel anymore.');
423 } else {
424 message.member.addRole(spoilersRole);
425 message.channel.send(':ok_hand: You can now access the spoilers channel!');
426 }
427 break;
428 case "community":
429 if(!isMMM()) return;
430 if(!communityRole) return;
431
432 if(message.member.roles.has(communityRole.id)) {
433 message.member.removeRole(communityRole);
434 message.channel.send(':ok_hand: You can\'t access the Community channel anymore.');
435 } else {
436 message.member.addRole(communityRole);
437 message.channel.send(':ok_hand: You can now access the Community channel!');
438 }
439 break;
440 case "invite":
441 // Send a channel invite
442 var embed = new Discord.RichEmbed()
443 .setColor("#15f153")
444 .setTitle("Mario Making Mods")
445 .setDescription("Mario Making Mods is the home for Super Mario Maker modding. Here is where you can get updates on the board, share your own Super Mario Maker mod, get assistance, hang out with our community, and much more.")
446 .addField("Super Mario Maker Mods", "We have all sorts of crazy mods for Super Mario Maker. Whatever you are interested in, you might find it on our Depot. Over at the [Depot](https://mariomods.net/depot), we have download links to some of the best mods out there for Super Mario Maker.")
447 .addField("Wiki", "At the Mario Making Mods [Wiki](https://mariomods.net/wiki), you'll find information about all the technical parts of Super Mario Maker, and the file formats it uses. You can submit your own findings there, too!")
448 .addField("Chat", "Come take a look at our [Discord Server](https://discord.gg/btQdJNw)! It's a great central for quick and general discussions.")
449 .setTimestamp(new Date())
450 .setThumbnail("https://mariomods.net/apple-touch-icon.png");
451
452 message.channel.send(embed);
453 break;
454 case "change-prefix":
455 if(message.author.id !== config.ownerID) {
456 message.reply(`You do not have the permission to do this`);
457 return;
458 }
459 // Gets the prefix from the command (eg. "!prefix +" it will take the "+" from it)
460 let newPrefix = message.content.split(" ").slice(1, 2)[0];
461 // change the configuration in memory
462 config.prefix = newPrefix;
463
464 // Now we have to save the file.
465 fs.writeFile("./config.json", JSON.stringify(config), (err) => console.error);
466 break;
467 case "kick":
468 if (!isMMM()) return;
469 if (!message.member.roles.has(modRole.id))
470 return message.reply("You can't use this command.");
471
472 if (message.mentions.members.size === 0)
473 return message.reply("Please mention a user to kick");
474
475 if (!message.guild.me.hasPermission("KICK_MEMBERS"))
476 return message.reply("");
477
478 memberping.kick(reason.join(" ")).then(memberping => {
479 message.reply(`${username} was succesfully kicked.`);
480 if(logschannel)
481 logschannel.send(`${memberping.tag} **[${memberping.id}]** was kicked by ${message.author.tag} **[${message.author.id}]** for ${arg1} at ${message.createdAt} in ${message.channel}`);
482
483 if(modlogschannel) {
484 var embed = new Discord.RichEmbed() // Master is MessageEmbed
485 .setTitle("User Kicked")
486 .setColor("#ff0000")
487 .setTimestamp(new Date())
488 .addField("Kicked User:", `${username}, ID: ${banMember.user.id}`)
489 .addField("Reason:", arg1)
490 .addField("Moderator:", `${message.author}, ID: ${message.author.id}`)
491 .addField("Time:", message.createdAt)
492 .addField("Channel:", message.channel);
493
494 modlogschannel.send(embed);
495 }
496 });
497 break;
498 case "mute":
499 if (!isMMM()) return;
500 if (!message.member.roles.has(modRole.id))
501 return message.reply("You can't use this command.");
502
503 if (message.mentions.members.size === 0)
504 return message.reply("Please mention a user to mute");
505
506 if(memberping.roles.has(mutedRole.id)) {
507 memberping.removeRole(mutedRole);
508 message.channel.send(`${username} was succesfully unmuted.`);
509 } else {
510 memberping.addRole(mutedRole);
511 message.channel.send(`${username} was succesfully muted.`);
512 }
513 break;
514 case "ban":
515 if (!isMMM()) return;
516 if (!message.member.roles.has(modRole.id))
517 return message.reply("You can't use this command.");
518
519 if (message.mentions.members.size === 0)
520 return message.reply("Please mention a user to banned");
521
522 if (!message.guild.me.hasPermission("KICK_MEMBERS"))
523 return message.reply("");
524
525 if (message.guild.me.hasPermission('MANAGE_CHANNELS') && !logschannel) {
526 message.guild.createChannel('discord-logs', 'text');
527 }
528 if (!message.guild.me.hasPermission('MANAGE_CHANNELS') && !logschannel) {
529 console.log('The logs channel does not exist. I tried to create the channel. However, I am lacking permissions');
530 }
531
532 if(!arg1) arg1 = "No reason given";
533
534 memberping.ban(arg1).then(member => {
535 message.reply(`${username} was succesfully banned.`);
536 if(logschannel) {
537 var embed = new Discord.RichEmbed() // Master is MessageEmbed
538 .setTitle("User Banned")
539 .setColor("#ff0000")
540 .setTimestamp(new Date())
541 .addField("Banned User:", `${username}, ID: ${banMember.user.id}`)
542 .addField("Reason:", arg1)
543 .addField("Moderator:", `${message.author}, ID: ${message.author.id}`)
544 .addField("Time:", message.createdAt)
545 .addField("Channel:", message.channel);
546
547 logschannel.send(embed);
548 }
549
550 if(modlogschannel) {
551 var embed = new Discord.RichEmbed() // Master is MessageEmbed
552 .setTitle("User Banned")
553 .setColor("#ff0000")
554 .setTimestamp(new Date())
555 .addField("Banned User:", `${username}, ID: ${banMember.user.id}`)
556 .addField("Reason:", arg1)
557 .addField("Moderator:", `${message.author}, ID: ${message.author.id}`)
558 .addField("Time:", message.createdAt)
559 .addField("Channel:", message.channel);
560
561 modlogschannel.send(embed);
562 }
563 });
564 break;
565 case "say":
566 if(message.author.id !== config.ownerID) {
567 message.reply(`You do not have the permission to do this`);
568 return;
569 }
570 let text = args.slice(0).join(" ");
571 message.delete();
572 message.channel.send(text);
573 break;
574 }
575});
576
577client.on('guildMemberAdd', member => {
578 var welcomechannel = member.guild.channels.find('name', 'general');
579 if (!welcomechannel) return;
580
581 var embed = new Discord.RichEmbed()
582 .setColor("#B6FF00")
583 .setTitle(`Welcome to Mario Making Mods, ${member.user.username}`)
584 .setDescription("We're the home for Super Mario Maker modding, where you can share your own mods, get assistance, hang out with our community, and much more")
585 .addField("Website", "https://mariomods.net", true)
586 .addField("Twitter", "https://twitter.com/MarioMakingMods", true)
587 .addField("Youtube", "https://www.youtube.com/c/MarioMakingMods", true)
588 .setFooter(`Please read #welcome-and-news before participating`);
589
590 welcomechannel.send(embed);
591});
592
593client.on('messageDelete', async (msg) => {
594 const logs = msg.guild.channels.find('name', 'discord-logs');
595 if (msg.guild.me.hasPermission('MANAGE_CHANNELS') && !logs) {
596 msg.guild.createChannel('discord-logs', 'text');
597 }
598 if (!msg.guild.me.hasPermission('MANAGE_CHANNELS') && !logs) {
599 console.log('The logs channel does not exist. I tried to create the channel. However, I am lacking permissions');
600 } else {
601 var deleter = "";
602
603 const entry = await msg.guild.fetchAuditLogs({type: 'MESSAGE_DELETE'}).then(audit => audit.entries.first());
604
605 if (entry.extra.channel.id === msg.channel.id
606 && (entry.target.id === msg.author.id)
607 && (entry.createdTimestamp > (Date.now() - 5000))
608 && (entry.extra.count >= 1)) {
609 deleter = entry.executor.username;
610 } else {
611 deleter = msg.author.username;
612 }
613
614 var embed = new Discord.RichEmbed()
615 .setAuthor(`${msg.author.tag} **[${msg.author.id}]**`, msg.author.displayAvatarURL)
616 .setColor("#ff0000")
617 .setTimestamp(new Date())
618 .setTitle(`:scissors: Message Deleted by ${deleter}`)
619 .setDescription(msg.content)
620 .addField(":bookmark_tabs: Channel", `${msg.channel.name} **[${msg.channel.id}]**`, true)
621 .addField(":id: ID", msg.id, true);
622
623 try { logs.send(embed); } catch(error) { console.error; }
624 }
625});
626
627client.on("error", (err) => console.error(err));
628client.login(config.token);