Advertisement
Nimbi

commands/clear.ts

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