Nimbi

join-leave.ts

May 27th, 2021 (edited)
336
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { config } from '../../modules/config/cfg';
  2.  
  3. enum Type {
  4.   JOIN,
  5.   LEAVE
  6. }
  7.  
  8. const joinLeaveImage = async (
  9.   type: Type,
  10.   member: discord.GuildMember | discord.Event.IGuildMemberRemove
  11. ) => {
  12.   const leaveChannel = await discord.getGuildTextChannel(
  13.     config.modules.automated.onLeave.channel
  14.   );
  15.   if (!leaveChannel) throw new Error(config.msg.INVALID_CHANNEL);
  16.  
  17.   const errorChannel = await discord.getTextChannel(
  18.     config.modules.errors.channel
  19.   );
  20.   if (!errorChannel) throw new Error(config.msg.INVALID_CHANNEL);
  21.  
  22.   const code = `
  23.       let avatar = await fetch(avatarURL).then(r => r.arrayBuffer()).then(r => decode(r, true));
  24.       if(avatar instanceof GIF)
  25.         avatar = avatar[0];
  26.       const font = await fetch('https://cdn.jsdelivr.net/npm/roboto-font@0.1.0/fonts/Roboto/roboto-regular-webfont.ttf').then(r => r.arrayBuffer()).then(r => new Uint8Array(r));
  27.       const avgAvatarColor = avatar.averageColor();
  28.       const image = new Image(1024, 256);
  29.       image.fill(avgAvatarColor);
  30.       image.lightness(0.75);
  31.       let border = new Image(image.width, image.height);
  32.       border.fill((x, y) => {
  33.         const alpha = Math.max(
  34.           (Math.max(x, border.width - x) / border.width) ** 10,
  35.           (Math.max(y, border.height - y) / border.height) ** 5,
  36.         );
  37.         return avgAvatarColor & 0xffffff00 | alpha * 0xff;
  38.       });
  39.       border.lightness(0.25);
  40.       image.composite(border, 0, 0);
  41.       avatar.resize(image.height * 0.75, Image.RESIZE_AUTO);
  42.       avatar.cropCircle();
  43.       image.composite(avatar, image.width * 0.05, image.height / 8);
  44.       const message = \`\${tag} just \${join ? 'joined' : 'left'}!\`;
  45.       const text = await Image.renderText(font, 1280 / message.length, message, avgAvatarColor > 0xaaaaaaff ? 0x000000ff : 0xffffffff);
  46.       image.composite(text, image.width * 0.1 + image.height * 0.75, image.height / 2 - text.height / 2);
  47.       if(!join) image.saturation(0.25);
  48.       return image.encode();
  49.     `;
  50.  
  51.   const request = await fetch('https://api.pxlapi.dev/imagescript/1.2.5', {
  52.     body: JSON.stringify({
  53.       code,
  54.       inject: {
  55.         tag: member.user.getTag(),
  56.         avatarURL: member.user.getAvatarUrl(),
  57.         join: type === Type.JOIN
  58.       }
  59.     }),
  60.     headers: {
  61.       'Content-Type': 'application/json',
  62.       Authorization: `Application ${config.api.PXLAPI_TOKEN}`
  63.     },
  64.     method: 'POST'
  65.   });
  66.  
  67.   const joinChannel = await discord.getGuildTextChannel(
  68.     config.modules.automated.onJoin.channel
  69.   );
  70.  
  71.   if (!joinChannel) throw new Error('Invalid channel');
  72.  
  73.   if (!request.ok) throw new Error(await request.text());
  74.  
  75.   try {
  76.     if (Type.JOIN) {
  77.       let channel = joinChannel;
  78.       channel.sendMessage({
  79.         attachments: [
  80.           {
  81.             name: type === Type.JOIN ? 'join.png' : 'leave.png',
  82.             data: await request.arrayBuffer()
  83.           }
  84.         ]
  85.       });
  86.     } else if (Type.LEAVE) {
  87.       let channel = leaveChannel;
  88.       channel.sendMessage({
  89.         attachments: [
  90.           {
  91.             name: type === Type.LEAVE ? 'join.png' : 'leave.png',
  92.             data: await request.arrayBuffer()
  93.           }
  94.         ]
  95.       });
  96.     }
  97.   } catch (err) {
  98.     if (config.modules.errors.enabled) return;
  99.     const guild = await discord.getGuild();
  100.     console.error(err);
  101.     let channel = errorChannel;
  102.     channel.sendMessage(
  103.       '\`\`\`css\n' +
  104.         config.msg.DISCORD_API_ERROR +
  105.         ':' +
  106.         err.code +
  107.         '[' +
  108.         err.message +
  109.         ']\n\`\`\`'
  110.     );
  111.   }
  112. };
  113.  
  114. discord.on(discord.Event.GUILD_MEMBER_ADD, async (member) => {
  115.   if (member.user.username.match(/(twitter\.com\/h0nde|h0nda)/gims)) {
  116.     member.ban({ reason: 'Advertising/raid account', deleteMessageDays: 7 });
  117.   }
  118.  
  119.   if (
  120.     !config.modules.automated.onJoin.enabled &&
  121.     !config.modules.admin.autoRoles.enabled
  122.   )
  123.     return;
  124.  
  125.   if (member.user.bot) {
  126.     for (let i = 0; i < config.modules.admin.autoRoles.bot.length; i++) {
  127.       member.addRole(config.modules.admin.autoRoles.bot[i]);
  128.       return;
  129.     }
  130.   } else {
  131.     if (!member.user.bot) {
  132.       for (let i = 0; i < config.modules.admin.autoRoles.human.length; i++) {
  133.         await joinLeaveImage(Type.JOIN, member);
  134.         member.addRole(config.modules.admin.autoRoles.human[i]);
  135.       }
  136.     }
  137.   }
  138. });
  139.  
  140. discord.on(discord.Event.GUILD_MEMBER_REMOVE, async (member) => {
  141.   if (!config.modules.automated.onLeave.enabled)
  142.     if (member.user.bot) {
  143.       return;
  144.     } else {
  145.       if (!member.user.bot) {
  146.         await joinLeaveImage(Type.LEAVE, member);
  147.       }
  148.     }
  149. });
Add Comment
Please, Sign In to add comment