/[sudobot]/trunk/src/commands/moderation/ClearCommand.ts
ViewVC logotype

Diff of /trunk/src/commands/moderation/ClearCommand.ts

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

revision 51 by rakin, Mon Jul 29 17:28:23 2024 UTC revision 78 by rakin, Mon Jul 29 17:28:30 2024 UTC
# Line 1  Line 1 
1  import { BanOptions, CommandInteraction, Emoji, GuildMember, Interaction, Message, TextChannel, User } from 'discord.js';  import { BanOptions, CommandInteraction, Emoji, GuildChannel, GuildMember, Interaction, Message, TextChannel, User } from 'discord.js';
2  import BaseCommand from '../../utils/structures/BaseCommand';  import BaseCommand from '../../utils/structures/BaseCommand';
3  import DiscordClient from '../../client/Client';  import DiscordClient from '../../client/Client';
4  import CommandOptions from '../../types/CommandOptions';  import CommandOptions from '../../types/CommandOptions';
# Line 29  export default class ClearCommand extend Line 29  export default class ClearCommand extend
29              return;              return;
30          }          }
31    
32          let member: GuildMember | undefined | null;          let user: User | undefined | null;
33            let msgCount = 0, channel: GuildChannel = msg.channel! as GuildChannel;
34    
35          if (options.isInteraction) {          if (options.isInteraction) {
36              member = <GuildMember> await options.options.getMember('member');              if (options.options.getUser('user'))
37                    user = <User> options.options.getUser('user');
38    
39                console.log(user?.tag);            
40    
41                if (options.options.getChannel('channel')) {
42                    channel = <GuildChannel> options.options.getChannel('channel');
43    
44                    if (channel.type !== 'GUILD_TEXT' && channel.type !== 'GUILD_NEWS' && channel.type !== 'GUILD_PUBLIC_THREAD' && channel.type !== 'GUILD_PRIVATE_THREAD') {
45                        await msg.reply({
46                            content: 'Invalid channel given.'
47                        });
48                        
49                        return;
50                    }
51                }
52    
53                if (options.options.getInteger('count')) {
54                    msgCount = <number> options.options.getInteger('count');
55                }
56          }          }
57          else {          else {
58              try {              try {
59                  member = await getMember(msg as Message, options);                  user = await getUser(client, msg as Message, options);
60    
61                  if (!member) {                  if (!user) {
62                      throw new Error();                      throw new Error();
63                  }                  }
64              }              }
# Line 56  export default class ClearCommand extend Line 76  export default class ClearCommand extend
76                  return;                  return;
77              }              }
78          }          }
79            
80            if (msgCount === 0 && !user) {
81                await msg.reply({
82                    embeds: [
83                        new MessageEmbed()
84                        .setColor('#f14a60')
85                        .setDescription('You have to specify either the message count or the user.')
86                    ]
87                });
88    
89                return;
90            }
91    
         let fetched;  
92          let count = 0;          let count = 0;
93            (global as any).deletingMessages = true;
94    
95          const message = await msg.reply({          let message = await msg.reply({
96              embeds: [              embeds: [
97                  new MessageEmbed()                  new MessageEmbed()
98                  .setColor('GOLD')                  .setColor('GOLD')
99                  .setDescription('Deleting messages...')                  .setDescription((await fetchEmoji('loading'))?.toString() + ' Deleting messages...')
100              ]              ]
101          });          });
102    
103          do {          if (msg instanceof CommandInteraction)
104              fetched = await msg.channel!.messages.fetch({ limit: 100 });              message = <Message> await msg.fetchReply();
105              fetched = await fetched.filter(m => m.author.id === member!.id);  
106              await (msg.channel as TextChannel).bulkDelete(fetched);          if (msgCount === 0 && user) {
107              count += await fetched.size;              console.log(user?.tag);
108                
109                let fetched;
110    
111                do {
112                    fetched = await (channel as TextChannel).messages.fetch({ limit: 100 });
113                    fetched = await fetched.filter(m => m.author.id === user!.id && m.id !== message!.id);
114                    await (channel as TextChannel).bulkDelete(fetched);
115                    await new Promise(r => setTimeout(r, 900));
116                    count += await fetched.size;
117                }
118                while (fetched.size >= 2);
119            }
120            else {
121                let fetched = 0;
122                let safeLimit = 0, safeLimit2 = 0;
123    
124                do {
125                    if (count >= msgCount || safeLimit >= 50) {
126                        break;
127                    }
128    
129                    try {
130                        const data = await (channel as TextChannel).messages.fetch({ limit: 100 });
131    
132                        fetched = 0;
133    
134                        for await (const [id, m] of data.entries()) {
135                            try {
136                                if (count >= msgCount || safeLimit2 > 200) {
137                                    break;
138                                }
139    
140                                if (user && m.author?.id !== user?.id) {
141                                    continue;
142                                }
143    
144                                if (message!.id === m.id)
145                                    continue;
146    
147                                if (m.deletable) {
148                                    console.log('here', user?.tag);
149                                    
150                                    await m.delete();
151    
152                                    fetched++;
153                                    count++;
154                                    safeLimit2++;
155                                }
156    
157                                if (count % 10 === 0) {
158                                    await new Promise(r => setTimeout(r, 1100));
159                                }
160                            }
161                            catch(e) {
162                                console.log(e);
163                                
164                                safeLimit2 += 100;
165                            }
166                        }
167                    }
168                    catch(e) {
169                        console.log(e);
170                        
171                        break;
172                    }
173    
174                    safeLimit++;
175                }
176                while (fetched >= 2);
177          }          }
         while (fetched.size >= 2);  
178    
179          const messageOptions = {          const messageOptions = {
180              embeds: [              embeds: [
181                  new MessageEmbed()                  new MessageEmbed()
182                  .setColor('GREEN')                  .setColor('GREEN')
183                  .setDescription((await fetchEmoji('check') as Emoji).toString() + " Deleted " + count + " message(s) from user " + member.user.tag)                  .setDescription((await fetchEmoji('check') as Emoji).toString() + " Deleted " + count + " message(s)" + (user ? " from user " + user.tag : ''))
184              ]              ]
185          };          };
186    
# Line 90  export default class ClearCommand extend Line 190  export default class ClearCommand extend
190          else {          else {
191              await message!.edit(messageOptions);              await message!.edit(messageOptions);
192          }          }
193    
194            (global as any).deletingMessages = false;
195      }      }
196  }  }

Legend:
Removed from v.51  
changed lines
  Added in v.78

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26