/[sudobot]/trunk/src/automod/Logger.ts
ViewVC logotype

Diff of /trunk/src/automod/Logger.ts

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/src/Logger.js revision 50 by rakin, Mon Jul 29 17:28:22 2024 UTC trunk/src/automod/Logger.ts revision 393 by rakin, Mon Jul 29 17:29:59 2024 UTC
# Line 1  Line 1 
1  const { MessageEmbed } = require('discord.js');  /**
2  const util = require('./util');  * This file is part of SudoBot.
3    *
4    * Copyright (C) 2021-2022 OSN Inc.
5    *
6    * SudoBot is free software; you can redistribute it and/or modify it
7    * under the terms of the GNU Affero General Public License as published by
8    * the Free Software Foundation, either version 3 of the License, or
9    * (at your option) any later version.
10    *
11    * SudoBot is distributed in the hope that it will be useful, but
12    * WITHOUT ANY WARRANTY; without even the implied warranty of
13    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14    * GNU Affero General Public License for more details.
15    *
16    * You should have received a copy of the GNU Affero General Public License
17    * along with SudoBot. If not, see <https://www.gnu.org/licenses/>.
18    */
19    
20    import { roleMention } from '@discordjs/builders';
21    import { formatDuration, intervalToDuration } from 'date-fns';
22    import { BanOptions, CommandInteraction, FileOptions, Guild, GuildBan, GuildMember, Message, MessageEmbed, MessageOptions, MessagePayload, TextChannel, User } from 'discord.js';
23    import ms from 'ms';
24    import DiscordClient from '../client/Client';
25    import { IPunishment } from '../models/Punishment';
26    import { timeSince } from '../utils/util';
27    
28  class Logger {  class Logger {
29      constructor() {      client: DiscordClient;
30            
31        constructor(client: DiscordClient) {
32            this.client = client;
33      }      }
34    
35      channel(callback, msg) {      channel(callback: (channel: TextChannel) => any, msg: any) {
36          let channelID = app.config.props[msg.guild.id].logging_channel;          let channelID = this.client.config.props[msg.guild!.id].logging_channel;
37          let channel = msg.guild.channels.cache.find(c => c.id === channelID);          let channel = msg.guild!.channels.cache.find((c: any) => c.id === channelID) as TextChannel;
38    
39          if (channel) {          if (channel) {
40              return callback(channel);              return callback(channel);
41          }          }
42      }      }
43    
44      channelJoinLeft(callback, msg) {      channelJoinLeft(callback: (channel: TextChannel) => any, msg: any) {
45          let channelID = app.config.props[msg.guild.id].logging_channel_join_leave;          let channelID = this.client.config.props[msg.guild!.id].logging_channel_join_leave;
46          let channel = msg.guild.channels.cache.find(c => c.id === channelID);          let channel = msg.guild!.channels.cache.find((c: any) => c.id === channelID) as TextChannel;
47    
48          if (channel) {          if (channel) {
49              return callback(channel);              return callback(channel);
50          }          }
51      }      }
52    
53      logEdit(oldMsg, newMsg) {      async send(guild: Guild, messageOptions: MessageOptions | MessagePayload | string) {
54            let channelID = this.client.config.props[guild!.id].logging_channel;
55            let channel = guild!.channels.cache.find((c: any) => c.id === channelID) as TextChannel;
56    
57            if (channel) {
58                return await channel.send(messageOptions);
59            }
60        }
61    
62        log(guild: Guild, callback: (channel: TextChannel) => any) {
63            this.channel(callback, { guild });
64        }
65    
66        logEdit(oldMsg: Message, newMsg: Message) {
67          this.channel(async (channel) => {          this.channel(async (channel) => {
68              await channel.send({              await channel.send({
69                  embeds: [                  embeds: [
70                      new MessageEmbed()                      new MessageEmbed()
71                      .setColor('#007bff')                      .setColor('#007bff')
72                      .setTitle('Message Edited in #' + newMsg.channel.name + " (" + newMsg.channel.id + ")")                      .setTitle('Message Edited in #' + (newMsg.channel as TextChannel).name + " (" + newMsg.channel.id + ")")
73                      .setDescription('**-+-+Before**\n' + oldMsg.content + '\n\n**-+-+After**\n' + newMsg.content)                      .setDescription('**-+-+Before**\n' + oldMsg.content + '\n\n**-+-+After**\n' + newMsg.content)
74                      .addField('ID', newMsg.id)                      .addField('ID', newMsg.id)
75                      .setAuthor({                      .setAuthor({
# Line 46  class Logger { Line 85  class Logger {
85          }, newMsg);          }, newMsg);
86      }      }
87    
88      logDelete(msg) {      logDelete(msg: Message) {
89          this.channel(async (channel) => {          this.channel(async (channel) => {
90              const embed = new MessageEmbed()              const embed = new MessageEmbed()
91                  .setColor('#f14a60')                  .setColor('#f14a60')
92                  .setTitle('Message Deleted in #' + msg.channel.name + " (" + msg.channel.id + ")")                  .setTitle('Message Deleted in #' + (msg.channel as TextChannel).name + " (" + msg.channel.id + ")")
93                  .setDescription(msg.content)                  .setDescription(msg.content)
94                  .setAuthor({                  .setAuthor({
95                      name: msg.author.tag,                      name: msg.author.tag,
# Line 61  class Logger { Line 100  class Logger {
100                      text: "Deleted",                      text: "Deleted",
101                  })                  })
102                  .setTimestamp();                  .setTimestamp();
103                
104                const files: FileOptions[] = [];
105    
106              if (msg.attachments.size > 0) {              if (msg.attachments.size > 0) {
107                  let str = '';                  let str = '';
108    
109                  msg.attachments.forEach(a => {                  msg.attachments.forEach(a => {
110                      str += `**${a.name}** ${a.url}\n`;                      str += `${a.name}\n`;
111                        files.push({
112                            name: a.name!,
113                            attachment: a.proxyURL
114                        });
115                  });                  });
116    
117                  embed.addField('Attachments', str);                  embed.addField('Attachments (top)', str);
118              }              }
119    
120              await channel.send({              await channel.send({
121                  embeds: [                  embeds: [
122                      embed                      embed
123                  ]                  ],
124                    files
125              });              });
126          }, msg);          }, msg);
127      }      }
128    
129      logBanned(ban) {      logBanned(ban: GuildBan) {
130          this.channel(async (channel) => {          this.channel(async (channel) => {
131              let r = '*No reason provided*';              let r = '*No reason provided*';
132    
133                const auditLog = (await ban.guild.fetchAuditLogs({
134                    limit: 1,
135                    type: 'MEMBER_BAN_ADD',
136                })).entries.first();          
137          
138    
139              if (ban.reason) {              if (ban.reason) {
140                  r = ban.reason;                  r = ban.reason;
141              }              }
142                else if (auditLog) {
143                    console.log(auditLog);  
144                    const { target, reason } = await auditLog;
145    
146                    if (target!.id === ban.user.id && reason) {
147                        r = await reason;
148                    }
149                }
150    
151              await channel.send({              await channel.send({
152                  embeds: [                  embeds: [
# Line 108  class Logger { Line 168  class Logger {
168          }, ban);          }, ban);
169      }      }
170    
171      logUnbanned(ban) {      logSoftBan(banOptions: BanOptions, guild: Guild, user: User, model: IPunishment) {
172            this.channel(async (channel) => {
173                let r = '*No reason provided*';
174    
175                const auditLog = (await guild.fetchAuditLogs({
176                    limit: 1,
177                    type: 'MEMBER_BAN_ADD',
178                })).entries.first();        
179    
180                if (banOptions.reason) {
181                    r = banOptions.reason;
182                }
183                else if (auditLog) {
184                    console.log(auditLog);  
185                    const { target, reason } = await auditLog;
186    
187                    if (target!.id === user.id && reason) {
188                        r = await reason;
189                    }
190                }
191    
192                await channel.send({
193                    embeds: [
194                        new MessageEmbed()
195                        .setColor('#f14a60')
196                        .setTitle("A user was softbanned")
197                        .setAuthor({
198                            name: user.tag,
199                            iconURL: user.displayAvatarURL(),
200                        })
201                        .addField('Reason', r)
202                        .addField('Softbanned by', model.mod_tag)
203                        .addField('User ID', user.id)
204                        .setFooter({
205                            text: "Softbanned",
206                        })
207                        .setTimestamp()
208                    ]
209                });
210            }, {
211                guild
212            });
213        }
214    
215        logTempBan(banOptions: BanOptions, guild: Guild, user: User, model: IPunishment) {
216            this.channel(async (channel) => {
217                let r = '*No reason provided*';
218    
219                const auditLog = (await guild.fetchAuditLogs({
220                    limit: 1,
221                    type: 'MEMBER_BAN_ADD',
222                })).entries.first();        
223    
224                if (banOptions.reason) {
225                    r = banOptions.reason;
226                }
227                else if (auditLog) {
228                    console.log(auditLog);  
229                    const { target, reason } = await auditLog;
230    
231                    if (target!.id === user.id && reason) {
232                        r = await reason;
233                    }
234                }
235    
236                await channel.send({
237                    embeds: [
238                        new MessageEmbed()
239                        .setColor('#f14a60')
240                        .setTitle("A user was temporarily banned")
241                        .setAuthor({
242                            name: user.tag,
243                            iconURL: user.displayAvatarURL(),
244                        })
245                        .addField('Reason', r)
246                        .addField('Banned by', model.mod_tag)
247                        .addField('User ID', user.id)
248                        .addField('Duration', ms((model.meta as any).time))
249                        .setFooter({
250                            text: "Temporarily banned",
251                        })
252                        .setTimestamp()
253                    ]
254                });
255            }, {
256                guild
257            });
258        }
259    
260        logUnbanned(ban: GuildBan) {
261          this.channel(async (channel) => {          this.channel(async (channel) => {
262              await channel.send({              await channel.send({
263                  embeds: [                  embeds: [
# Line 129  class Logger { Line 278  class Logger {
278          }, ban);          }, ban);
279      }      }
280    
281      logJoined(member) {      logJoined(member: GuildMember) {
282          this.channelJoinLeft(async (channel) => {          this.channelJoinLeft(async (channel) => {
283              await channel.send({              await channel.send({
284                  embeds: [                  embeds: [
# Line 141  class Logger { Line 290  class Logger {
290                          iconURL: member.user.displayAvatarURL(),                          iconURL: member.user.displayAvatarURL(),
291                      })                      })
292                      .setDescription(`<@${member.user.id}> just joined the server!`)                      .setDescription(`<@${member.user.id}> just joined the server!`)
293                      .addField('Account Created', `${member.user.createdAt.toLocaleString()} (${util.timeSince(member.user.createdAt.getTime())})`)                      .addField('Account Created', `${member.user.createdAt.toLocaleString()} (${timeSince(member.user.createdAt.getTime())})`)
294                      .addField('New Account?', (new Date().getTime() - member.user.createdAt.getTime()) <= 3 * 24 * 60 * 60 * 1000 ? ":warning: Yes :warning:" : "No")                      .addField('New Account?', (new Date().getTime() - member.user.createdAt.getTime()) <= 3 * 24 * 60 * 60 * 1000 ? ":warning: Yes :warning:" : "No")
295                      .addField('Bot?', member.user.bot === true ? 'Yes' : 'No')                      .addField('Bot?', member.user.bot === true ? 'Yes' : 'No')
296                      .addField('User ID', member.user.id)                      .addField('User ID', member.user.id)
# Line 154  class Logger { Line 303  class Logger {
303          }, member);          }, member);
304      }      }
305    
306      logLeft(member) {      logLeft(member: GuildMember) {
307          this.channelJoinLeft(async (channel) => {          this.channelJoinLeft(async (channel) => {
308                const roles = await member.roles.cache.filter(role => role.id !== member.guild.id).reduce((acc, val) => ` ${acc} ${roleMention(val.id)}`, '');
309    
310              await channel.send({              await channel.send({
311                  embeds: [                  embeds: [
312                      new MessageEmbed()                      new MessageEmbed()
# Line 165  class Logger { Line 316  class Logger {
316                          name: member.user.tag,                          name: member.user.tag,
317                          iconURL: member.user.displayAvatarURL(),                          iconURL: member.user.displayAvatarURL(),
318                      })                      })
319                      .addField('Joined at', `${member.joinedAt.toLocaleString()} (${util.timeSince(member.joinedAt.getTime())})`)                      .setDescription(`**Roles**\n${roles}`)
320                        .addField('Joined at', `${member.joinedAt!.toLocaleString()} (${timeSince(member.joinedAt!.getTime())})`)
321                      .addField('User ID', member.user.id)                      .addField('User ID', member.user.id)
322                      .addField('Bot?', member.user.bot === true ? 'Yes' : 'No')                      .addField('Bot?', member.user.bot === true ? 'Yes' : 'No')
323                      .setFooter({                      .setFooter({
# Line 177  class Logger { Line 329  class Logger {
329          }, member);          }, member);
330      }      }
331    
332      logBeaned(member, r, d) {      logBeaned(member: GuildMember, r: string, d: User) {
333          this.channel(async (channel) => {          this.channel(async (channel) => {
334              await channel.send({              await channel.send({
335                  embeds: [                  embeds: [
# Line 200  class Logger { Line 352  class Logger {
352          }, member);          }, member);
353      }      }
354    
355      logMute(member, reason, timeMs, d) {      logMute(member: GuildMember, reason: string, duration: number | null | undefined, d: User, hard: boolean = true) {
356          this.channel(async (channel) => {          this.channel(async (channel) => {
357              await channel.send({              await channel.send({
358                  embeds: [                  embeds: [
# Line 213  class Logger { Line 365  class Logger {
365                      })                      })
366                      .addField('Reason', reason)                      .addField('Reason', reason)
367                      .addField('Muted by', d.tag)                      .addField('Muted by', d.tag)
368                      .addField('Duration Until', typeof timeMs === 'number' ? new Date((timeMs / 1000) + Date.now()).toLocaleString() : "*No duration set*")                      .addField('Duration Until', duration ? `${(new Date(Date.now() + duration)).toLocaleString()} (${formatDuration(intervalToDuration({ start: 0, end: duration }))})` : "*No duration set*")
369                      .addField('User ID', member.user.id)                      .addField('User ID', member.user.id)
370                        .addField('Hardmute', hard ? 'Yes' : 'No')
371                      .setFooter({                      .setFooter({
372                          text: "Muted",                          text: "Muted",
373                      })                      })
# Line 224  class Logger { Line 377  class Logger {
377          }, member);          }, member);
378      }      }
379    
380      logUnmute(member, d) {      logUnmute(member: GuildMember, d: User) {
381          this.channel(async (channel) => {          this.channel(async (channel) => {
382              await channel.send({              await channel.send({
383                  embeds: [                  embeds: [
# Line 246  class Logger { Line 399  class Logger {
399          }, member);          }, member);
400      }      }
401    
402      logWarn(msg, member, d, reason) {      logWarn(msg: Message | CommandInteraction, member: GuildMember | User, d: User, reason: string | undefined, id: number | string) {
403          if (member.user)          if ((member as GuildMember).user)
404              member = member.user;              member = (member as GuildMember).user;
405    
406          this.channel(async (channel) => {          this.channel(async (channel) => {            
407              await channel.send({              await channel.send({
408                  embeds: [                  embeds: [
409                      new MessageEmbed()                      new MessageEmbed()
410                      .setColor('GOLD')                      .setColor('GOLD')
411                      .setTitle("Member warned")                      .setTitle("Member warned")
412                      .setAuthor({                      .setAuthor({
413                          name: member.tag,                          name: (member as User).tag,
414                          iconURL: member.displayAvatarURL(),                          iconURL: member.displayAvatarURL(),
415                      })                      })
416                      .addField('Reason', reason)                      .addField('Reason', reason ?? '*No reason provided*')
417                      .addField('Warned by', d.tag)                      .addField('Warned by', d.tag)
418                      .addField('User ID', member.id)                      .addField('User ID', member.id)
419                        .addField('Case ID', id + '')
420                      .setFooter({                      .setFooter({
421                          text: "Warned",                          text: "Warned",
422                      })                      })
# Line 272  class Logger { Line 426  class Logger {
426          }, msg);          }, msg);
427      }      }
428    
429      logWarndel(msg, member, warn, d) {      logWarndel(msg: Message, member: GuildMember, warn: any, d: User) {
430          this.channel(async (channel) => {          this.channel(async (channel) => {
431              await channel.send({              await channel.send({
432                  embeds: [                  embeds: [
# Line 296  class Logger { Line 450  class Logger {
450      }      }
451  }  }
452    
453  module.exports = Logger;  export default Logger;

Legend:
Removed from v.50  
changed lines
  Added in v.393

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26