Advertisement
Nimbi

clear.ts

Jul 14th, 2021
543
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { config } from '../../modules/config/cfg';
  2. const KV = new pylon.KVNamespace('clear');
  3. config.commands.handler.on(
  4.   {
  5.     name: 'clear',
  6.     aliases: ['prune', 'purge'],
  7.     description: 'Delete a specified amount of messages',
  8.     filters: config.modules.permissions.mod
  9.   },
  10.   (args) => ({
  11.     number: args.number() + 1
  12.   }),
  13.   async (message, { number }) => {
  14.     const numberOfDeletedMessages: number = await DeleteClearMessages(
  15.       message.channelId,
  16.       number
  17.     );
  18.  
  19.     const errorChannel = await discord.getTextChannel(
  20.       config.modules.errors.channel
  21.     );
  22.     if (!errorChannel) throw new Error(config.msg.INVALID_CHANNEL);
  23.     try {
  24.       let response: discord.Message;
  25.       if (numberOfDeletedMessages === 0)
  26.         response = await message?.reply(`No messages deleted.`);
  27.       else
  28.         response = await message?.reply(
  29.           `Deleted the last ${numberOfDeletedMessages} message(s) from this channel.`
  30.         );
  31.  
  32.       if (!config.modules.mod.commands.clear.enabled) {
  33.         return;
  34.       } else {
  35.         await message?.delete();
  36.       }
  37.     } catch (err) {
  38.       console.error(err);
  39.       errorChannel.sendMessage(
  40.         '\`\`\`css\n' +
  41.           config.msg.DISCORD_API_ERROR +
  42.           ':' +
  43.           err.code +
  44.           '[' +
  45.           err.message +
  46.           ']\n\`\`\`'
  47.       );
  48.     }
  49.   }
  50. );
  51.  
  52. discord.on(discord.Event.MESSAGE_CREATE, (message) =>
  53.   SaveClearMessages(message.channelId, message.id)
  54. );
  55.  
  56. discord.on(discord.Event.MESSAGE_DELETE, async (message) => {
  57.   let messages: string[] =
  58.     (await KV.get(`messages-${message.channelId}`)) ?? [];
  59.  
  60.   let index: number = messages.findIndex((m) => m === message.id);
  61.   if (index === -1) return;
  62.  
  63.   messages.splice(index, 1);
  64.  
  65.   if (messages.length !== 0)
  66.     await KV.put(`messages-${message.channelId}`, messages);
  67.   else await KV.delete(`messages-${message.channelId}`);
  68. });
  69.  
  70. discord.on(discord.Event.CHANNEL_DELETE, async (channel) => {
  71.   try {
  72.     await KV.delete(`messages-${channel.id}`);
  73.   } catch (e) {}
  74. });
  75.  
  76. async function DeleteClearMessages(
  77.   channelId: string,
  78.   nr: number
  79. ): Promise<number> {
  80.   let messages: string[] | undefined = await KV.get(`messages-${channelId}`);
  81.   if (messages === undefined) return 0;
  82.  
  83.   const channel = await discord.getGuildTextChannel(channelId);
  84.  
  85.   let toDeleteMessages: string[] = [];
  86.   for (
  87.     let i = messages.length - (nr < messages.length ? nr : messages.length);
  88.     i < messages.length;
  89.     ++i
  90.   )
  91.     toDeleteMessages.push(messages[i]);
  92.  
  93.   if (toDeleteMessages.length === 1) {
  94.     try {
  95.       await (await channel?.getMessage(toDeleteMessages[0]))?.delete();
  96.     } catch (_) {}
  97.   } else if (toDeleteMessages.length !== 0) {
  98.     try {
  99.       await channel?.bulkDeleteMessages(toDeleteMessages);
  100.     } catch (_) {}
  101.   }
  102.  
  103.   const currentMessages: string[] = messages.filter(
  104.     (m) => !toDeleteMessages.includes(m)
  105.   );
  106.  
  107.   if (currentMessages.length === 0)
  108.     try {
  109.       await KV.delete(`messages-${channelId}`);
  110.     } catch (_) {}
  111.   else {
  112.     await KV.put(`messages-${channelId}`, currentMessages);
  113.   }
  114.  
  115.   return toDeleteMessages.length;
  116. }
  117.  
  118. export async function SaveClearMessages(
  119.   channelId: string | undefined,
  120.   messageId: string | undefined
  121. ): Promise<void> {
  122.   if (messageId === undefined || channelId === undefined) return;
  123.  
  124.   let messages: string[] = (await KV.get(`messages-${channelId}`)) ?? [];
  125.   messages.push(messageId);
  126.   while (JSON.stringify(messages).length > 8192) messages.splice(0, 1);
  127.  
  128.   await KV.put(`messages-${channelId}`, messages);
  129. }
  130.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement