/[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 5 by rakin, Mon Jul 29 17:28:11 2024 UTC trunk/src/automod/Logger.ts revision 227 by rakin, Mon Jul 29 17:29:07 2024 UTC
# Line 1  Line 1 
1  const { MessageEmbed } = require('discord.js');  import { roleMention } from '@discordjs/builders';
2    import { BanOptions, CommandInteraction, FileOptions, Guild, GuildBan, GuildMember, Message, MessageEmbed, MessageOptions, MessagePayload, TextChannel, User } from 'discord.js';
3    import ms from 'ms';
4    import DiscordClient from '../client/Client';
5    import Punishment from '../models/Punishment';
6    import { timeProcess, timeSince } from '../utils/util';
7    
8  class Logger {  class Logger {
9      constructor() {      client: DiscordClient;
10            
11        constructor(client: DiscordClient) {
12            this.client = client;
13      }      }
14    
15      channel(callback, msg) {      channel(callback: (channel: TextChannel) => any, msg: any) {
16          let channelID = app.config.get('logging_channel');          let channelID = this.client.config.props[msg.guild!.id].logging_channel;
17          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;
18    
19          if (channel) {          if (channel) {
20              return callback(channel);              return callback(channel);
21          }          }
22      }      }
23    
24      logEdit(oldMsg, newMsg) {      channelJoinLeft(callback: (channel: TextChannel) => any, msg: any) {
25            let channelID = this.client.config.props[msg.guild!.id].logging_channel_join_leave;
26            let channel = msg.guild!.channels.cache.find((c: any) => c.id === channelID) as TextChannel;
27    
28            if (channel) {
29                return callback(channel);
30            }
31        }
32    
33        async send(guild: Guild, messageOptions: MessageOptions | MessagePayload | string) {
34            let channelID = this.client.config.props[guild!.id].logging_channel;
35            let channel = guild!.channels.cache.find((c: any) => c.id === channelID) as TextChannel;
36    
37            if (channel) {
38                return await channel.send(messageOptions);
39            }
40        }
41    
42        log(guild: Guild, callback: (channel: TextChannel) => any) {
43            this.channel(callback, { guild });
44        }
45    
46        logEdit(oldMsg: Message, newMsg: Message) {
47          this.channel(async (channel) => {          this.channel(async (channel) => {
48              await channel.send({              await channel.send({
49                  embeds: [                  embeds: [
50                      new MessageEmbed()                      new MessageEmbed()
51                      .setColor('#007bff')                      .setColor('#007bff')
52                      .setTitle('Message Edited in #' + newMsg.channel.name + " (" + newMsg.channel.id + ")")                      .setTitle('Message Edited in #' + (newMsg.channel as TextChannel).name + " (" + newMsg.channel.id + ")")
53                      .addField('Before', oldMsg.content)                      .setDescription('**-+-+Before**\n' + oldMsg.content + '\n\n**-+-+After**\n' + newMsg.content)
                     .addField('After', newMsg.content)  
54                      .addField('ID', newMsg.id)                      .addField('ID', newMsg.id)
55                      .setAuthor({                      .setAuthor({
56                          name: newMsg.author.tag,                          name: newMsg.author.tag,
# Line 37  class Logger { Line 65  class Logger {
65          }, newMsg);          }, newMsg);
66      }      }
67    
68      logDelete(msg) {      logDelete(msg: Message) {
69            this.channel(async (channel) => {
70                const embed = new MessageEmbed()
71                    .setColor('#f14a60')
72                    .setTitle('Message Deleted in #' + (msg.channel as TextChannel).name + " (" + msg.channel.id + ")")
73                    .setDescription(msg.content)
74                    .setAuthor({
75                        name: msg.author.tag,
76                        iconURL: msg.author.displayAvatarURL(),
77                    })
78                    .addField('ID', msg.id)
79                    .setFooter({
80                        text: "Deleted",
81                    })
82                    .setTimestamp();
83                
84                const files: FileOptions[] = [];
85    
86                if (msg.attachments.size > 0) {
87                    let str = '';
88    
89                    msg.attachments.forEach(a => {
90                        str += `${a.name}\n`;
91                        files.push({
92                            name: a.name!,
93                            attachment: a.proxyURL
94                        });
95                    });
96    
97                    embed.addField('Attachments (top)', str);
98                }
99    
100                await channel.send({
101                    embeds: [
102                        embed
103                    ],
104                    files
105                });
106            }, msg);
107        }
108    
109        logBanned(ban: GuildBan) {
110            this.channel(async (channel) => {
111                let r = '*No reason provided*';
112    
113                const auditLog = (await ban.guild.fetchAuditLogs({
114                    limit: 1,
115                    type: 'MEMBER_BAN_ADD',
116                })).entries.first();          
117          
118    
119                if (ban.reason) {
120                    r = ban.reason;
121                }
122                else if (auditLog) {
123                    console.log(auditLog);  
124                    const { target, reason } = await auditLog;
125    
126                    if (target!.id === ban.user.id && reason) {
127                        r = await reason;
128                    }
129                }
130    
131                await channel.send({
132                    embeds: [
133                        new MessageEmbed()
134                        .setColor('#f14a60')
135                        .setTitle("A user was banned")
136                        .setAuthor({
137                            name: ban.user.tag,
138                            iconURL: ban.user.displayAvatarURL(),
139                        })
140                        .addField('Reason', r)
141                        .addField('User ID', ban.user.id)
142                        .setFooter({
143                            text: "Banned",
144                        })
145                        .setTimestamp()
146                    ]
147                });
148            }, ban);
149        }
150    
151        logSoftBan(banOptions: BanOptions, guild: Guild, user: User, model: Punishment) {
152            this.channel(async (channel) => {
153                let r = '*No reason provided*';
154    
155                const auditLog = (await guild.fetchAuditLogs({
156                    limit: 1,
157                    type: 'MEMBER_BAN_ADD',
158                })).entries.first();        
159    
160                if (banOptions.reason) {
161                    r = banOptions.reason;
162                }
163                else if (auditLog) {
164                    console.log(auditLog);  
165                    const { target, reason } = await auditLog;
166    
167                    if (target!.id === user.id && reason) {
168                        r = await reason;
169                    }
170                }
171    
172                await channel.send({
173                    embeds: [
174                        new MessageEmbed()
175                        .setColor('#f14a60')
176                        .setTitle("A user was softbanned")
177                        .setAuthor({
178                            name: user.tag,
179                            iconURL: user.displayAvatarURL(),
180                        })
181                        .addField('Reason', r)
182                        .addField('Softbanned by', model.get().mod_tag)
183                        .addField('User ID', user.id)
184                        .setFooter({
185                            text: "Softbanned",
186                        })
187                        .setTimestamp()
188                    ]
189                });
190            }, {
191                guild
192            });
193        }
194    
195        logTempBan(banOptions: BanOptions, guild: Guild, user: User, model: Punishment) {
196            this.channel(async (channel) => {
197                let r = '*No reason provided*';
198    
199                const auditLog = (await guild.fetchAuditLogs({
200                    limit: 1,
201                    type: 'MEMBER_BAN_ADD',
202                })).entries.first();        
203    
204                if (banOptions.reason) {
205                    r = banOptions.reason;
206                }
207                else if (auditLog) {
208                    console.log(auditLog);  
209                    const { target, reason } = await auditLog;
210    
211                    if (target!.id === user.id && reason) {
212                        r = await reason;
213                    }
214                }
215    
216                await channel.send({
217                    embeds: [
218                        new MessageEmbed()
219                        .setColor('#f14a60')
220                        .setTitle("A user was temporarily banned")
221                        .setAuthor({
222                            name: user.tag,
223                            iconURL: user.displayAvatarURL(),
224                        })
225                        .addField('Reason', r)
226                        .addField('Banned by', model.get().mod_tag)
227                        .addField('User ID', user.id)
228                        .addField('Duration', ms(model.get().meta?.time))
229                        .setFooter({
230                            text: "Temporarily banned",
231                        })
232                        .setTimestamp()
233                    ]
234                });
235            }, {
236                guild
237            });
238        }
239    
240        logUnbanned(ban: GuildBan) {
241          this.channel(async (channel) => {          this.channel(async (channel) => {
242              await channel.send({              await channel.send({
243                  embeds: [                  embeds: [
244                      new MessageEmbed()                      new MessageEmbed()
245                      .setColor('#f14a60')                      .setColor('#f14a60')
246                      .setTitle('Message Deleted in #' + msg.channel.name + " (" + msg.channel.id + ")")                      .setTitle("A user was unbanned")
247                      .setDescription(msg.content)                      .setAuthor({
248                            name: ban.user.tag,
249                            iconURL: ban.user.displayAvatarURL(),
250                        })
251                        .addField('User ID', ban.user.id)
252                        .setFooter({
253                            text: "Unbanned",
254                        })
255                        .setTimestamp()
256                    ]
257                });
258            }, ban);
259        }
260    
261        logJoined(member: GuildMember) {
262            this.channelJoinLeft(async (channel) => {
263                await channel.send({
264                    embeds: [
265                        new MessageEmbed()
266                        .setColor('#007bff')
267                        .setTitle("New member joined")
268                        .setAuthor({
269                            name: member.user.tag,
270                            iconURL: member.user.displayAvatarURL(),
271                        })
272                        .setDescription(`<@${member.user.id}> just joined the server!`)
273                        .addField('Account Created', `${member.user.createdAt.toLocaleString()} (${timeSince(member.user.createdAt.getTime())})`)
274                        .addField('New Account?', (new Date().getTime() - member.user.createdAt.getTime()) <= 3 * 24 * 60 * 60 * 1000 ? ":warning: Yes :warning:" : "No")
275                        .addField('Bot?', member.user.bot === true ? 'Yes' : 'No')
276                        .addField('User ID', member.user.id)
277                        .setFooter({
278                            text: "Joined",
279                        })
280                        .setTimestamp()
281                    ]
282                });
283            }, member);
284        }
285    
286        logLeft(member: GuildMember) {
287            this.channelJoinLeft(async (channel) => {
288                const roles = await member.roles.cache.filter(role => role.id !== member.guild.id).reduce((acc, val) => ` ${acc} ${roleMention(val.id)}`, '');
289    
290                await channel.send({
291                    embeds: [
292                        new MessageEmbed()
293                        .setColor('#f14a60')
294                        .setTitle("Member left")
295                        .setAuthor({
296                            name: member.user.tag,
297                            iconURL: member.user.displayAvatarURL(),
298                        })
299                        .setDescription(`**Roles**\n${roles}`)
300                        .addField('Joined at', `${member.joinedAt!.toLocaleString()} (${timeSince(member.joinedAt!.getTime())})`)
301                        .addField('User ID', member.user.id)
302                        .addField('Bot?', member.user.bot === true ? 'Yes' : 'No')
303                        .setFooter({
304                            text: "Left",
305                        })
306                        .setTimestamp()
307                    ]
308                });
309            }, member);
310        }
311    
312        logBeaned(member: GuildMember, r: string, d: User) {
313            this.channel(async (channel) => {
314                await channel.send({
315                    embeds: [
316                        new MessageEmbed()
317                        .setColor('#007bff')
318                        .setTitle("Member beaned")
319                        .setAuthor({
320                            name: member.user.tag,
321                            iconURL: member.user.displayAvatarURL(),
322                        })
323                        .addField('Reason', r)
324                        .addField('Beaned by', d.tag)
325                        .addField('User ID', member.user.id)
326                        .setFooter({
327                            text: "Beaned",
328                        })
329                        .setTimestamp()
330                    ]
331                });
332            }, member);
333        }
334    
335        logMute(member: GuildMember, reason: string, timeMs: number | null | undefined, d: User, hard: boolean = true) {
336            this.channel(async (channel) => {
337                await channel.send({
338                    embeds: [
339                        new MessageEmbed()
340                        .setColor('#f14a60')
341                        .setTitle("Member muted")
342                        .setAuthor({
343                            name: member.user.tag,
344                            iconURL: member.user.displayAvatarURL(),
345                        })
346                        .addField('Reason', reason)
347                        .addField('Muted by', d.tag)
348                        .addField('Duration Until', typeof timeMs === 'number' ? `${new Date((timeMs / 1000) + Date.now()).toLocaleString()} (${timeProcess(timeMs / 1000)})` : "*No duration set*")
349                        .addField('User ID', member.user.id)
350                        .addField('Hardmute', hard ? 'Yes' : 'No')
351                        .setFooter({
352                            text: "Muted",
353                        })
354                        .setTimestamp()
355                    ]
356                });
357            }, member);
358        }
359    
360        logUnmute(member: GuildMember, d: User) {
361            this.channel(async (channel) => {
362                await channel.send({
363                    embeds: [
364                        new MessageEmbed()
365                        .setColor('#007bff')
366                        .setTitle("Member unmuted")
367                        .setAuthor({
368                            name: member.user.tag,
369                            iconURL: member.user.displayAvatarURL(),
370                        })
371                        .addField('Unmuted by', d.tag)
372                        .addField('User ID', member.user.id)
373                        .setFooter({
374                            text: "Unmuted",
375                        })
376                        .setTimestamp()
377                    ]
378                });
379            }, member);
380        }
381    
382        logWarn(msg: Message | CommandInteraction, member: GuildMember | User, d: User, reason: string | undefined, id: number | string) {
383            if ((member as GuildMember).user)
384                member = (member as GuildMember).user;
385    
386            this.channel(async (channel) => {            
387                await channel.send({
388                    embeds: [
389                        new MessageEmbed()
390                        .setColor('GOLD')
391                        .setTitle("Member warned")
392                        .setAuthor({
393                            name: (member as User).tag,
394                            iconURL: member.displayAvatarURL(),
395                        })
396                        .addField('Reason', reason ?? '*No reason provided*')
397                        .addField('Warned by', d.tag)
398                        .addField('User ID', member.id)
399                        .addField('Case ID', id + '')
400                        .setFooter({
401                            text: "Warned",
402                        })
403                        .setTimestamp()
404                    ]
405                });
406            }, msg);
407        }
408    
409        logWarndel(msg: Message, member: GuildMember, warn: any, d: User) {
410            this.channel(async (channel) => {
411                await channel.send({
412                    embeds: [
413                        new MessageEmbed()
414                        .setColor('GOLD')
415                        .setTitle("Warning deleted")
416                      .setAuthor({                      .setAuthor({
417                          name: msg.author.tag,                          name: member.user.tag,
418                          iconURL: msg.author.displayAvatarURL(),                          iconURL: member.user.displayAvatarURL(),
419                      })                      })
420                      .addField('ID', msg.id)                      .addField('Warned by', d.tag + '')
421                        .addField('Warning ID', warn.id + '')
422                        .addField('User ID', member.user.id)
423                      .setFooter({                      .setFooter({
424                          text: "Deleted",                          text: "Warning Deleted",
425                      })                      })
426                      .setTimestamp()                      .setTimestamp()
427                  ]                  ]
# Line 60  class Logger { Line 430  class Logger {
430      }      }
431  }  }
432    
 module.exports = Logger;  
433    export default Logger;

Legend:
Removed from v.5  
changed lines
  Added in v.227

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26