/[sudobot]/branches/2.x/src/automod/Logger.ts
ViewVC logotype

Contents of /branches/2.x/src/automod/Logger.ts

Parent Directory Parent Directory | Revision Log Revision Log


Revision 577 - (show annotations)
Mon Jul 29 18:52:37 2024 UTC (8 months ago) by rakinar2
File MIME type: application/typescript
File size: 15510 byte(s)
chore: add old version archive branches (2.x to 9.x-dev)
1 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 {
9 client: DiscordClient;
10
11 constructor(client: DiscordClient) {
12 this.client = client;
13 }
14
15 channel(callback: (channel: TextChannel) => any, msg: any) {
16 let channelID = this.client.config.props[msg.guild!.id].logging_channel;
17 let channel = msg.guild!.channels.cache.find((c: any) => c.id === channelID) as TextChannel;
18
19 if (channel) {
20 return callback(channel);
21 }
22 }
23
24 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) => {
48 await channel.send({
49 embeds: [
50 new MessageEmbed()
51 .setColor('#007bff')
52 .setTitle('Message Edited in #' + (newMsg.channel as TextChannel).name + " (" + newMsg.channel.id + ")")
53 .setDescription('**-+-+Before**\n' + oldMsg.content + '\n\n**-+-+After**\n' + newMsg.content)
54 .addField('ID', newMsg.id)
55 .setAuthor({
56 name: newMsg.author.tag,
57 iconURL: newMsg.author.displayAvatarURL(),
58 })
59 .setFooter({
60 text: "Edited",
61 })
62 .setTimestamp()
63 ]
64 });
65 }, newMsg);
66 }
67
68 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) => {
242 await channel.send({
243 embeds: [
244 new MessageEmbed()
245 .setColor('#f14a60')
246 .setTitle("A user was unbanned")
247 .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({
417 name: member.user.tag,
418 iconURL: member.user.displayAvatarURL(),
419 })
420 .addField('Warned by', d.tag + '')
421 .addField('Warning ID', warn.id + '')
422 .addField('User ID', member.user.id)
423 .setFooter({
424 text: "Warning Deleted",
425 })
426 .setTimestamp()
427 ]
428 });
429 }, msg);
430 }
431 }
432
433 export default Logger;

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26