auth-bot

Discord Bot to verify user, allowing server owner to recover server by pulling back members
git clone https://codeberg.org/night0721/auth-bot
Log | Files | Refs | README | LICENSE

pull.js (3638B)


      1 const db = require("../../../models/user");
      2 const server = require("../../../models/server");
      3 const { Client, CommandInteraction, EmbedBuilder } = require("discord.js");
      4 const fetch = require("node-fetch");
      5 let pulled = [];
      6 let failed = 0;
      7 module.exports = {
      8   name: "pull",
      9   description: "Pull Members",
     10   options: [
     11     {
     12       type: 3,
     13       name: "code",
     14       description: "Code to pull members",
     15       required: true,
     16     },
     17   ],
     18   /**
     19    *
     20    * @param {Client} client
     21    * @param {CommandInteraction} interaction
     22    * @param {String[]} args
     23    */
     24   run: async (client, interaction, args) => {
     25     const data = await server.findOne({ code: args[0] });
     26     if (!data) {
     27       return interaction.editReply({
     28         ephemeral: true,
     29         embeds: [
     30           new EmbedBuilder()
     31             .setTitle("Error!")
     32             .setDescription("Invalid Code!")
     33             .setColor("#02023a"),
     34         ],
     35       });
     36     }
     37     for (let i = 0; i < data.members.length; i++) {
     38       const user = await db.findOne({ id: data.members[i] });
     39       if (!user) failed++;
     40       else {
     41         fetch(
     42           `https://discord.com/api/v10/guilds/${interaction.guild.id}/members/${user.id}`,
     43           {
     44             method: "PUT",
     45             headers: {
     46               Authorization: `Bot ${process.env.TOKEN}`,
     47               "Content-Type": "application/json",
     48               "User-Agent": "Auth",
     49             },
     50             body: JSON.stringify({
     51               access_token: user.accessToken,
     52             }),
     53           }
     54         ).then(res => {
     55           if (res.status == 204 || res.status == 201) pulled.push(user.id);
     56           else if (res.status == 403) {
     57             fetch(
     58               `https://discord.com/api/v10/guilds/${interaction.guild.id}/members/${user.id}`,
     59               {
     60                 method: "PUT",
     61                 headers: {
     62                   Authorization: `Bot ${process.env.TOKEN}`,
     63                   "Content-Type": "application/json",
     64                   "User-Agent": "Auth",
     65                 },
     66                 body: JSON.stringify({
     67                   access_token: getAccessToken(user.refreshToken),
     68                 }),
     69               }
     70             ).then(res => {
     71               if (res.status == 204 || res.status == 201) pulled.push(user.id);
     72               else if (res.status == 400) failed++;
     73             });
     74           }
     75         });
     76       }
     77     }
     78     for (let user of pulled) {
     79       interaction.guild.members.cache.get(user).roles.add(data.role);
     80     }
     81     interaction.editReply({
     82       ephemeral: true,
     83       content: `Pulled ${pulled.length} members. Failed to pull ${failed} members.`,
     84     });
     85   },
     86 };
     87 
     88 function getAccessToken(refreshToken) {
     89   var details = {
     90     client_id: process.env.CLIENT_ID,
     91     client_secret: process.env.CLIENT_SECRET,
     92     grant_type: "refresh_token",
     93     scope: "identify guilds.join guilds",
     94     redirect_uri: process.env.CALLBACK_URL,
     95     refresh_token: refreshToken,
     96   };
     97 
     98   var body = [];
     99   for (var property in details) {
    100     var encodedKey = encodeURIComponent(property);
    101     var encodedValue = encodeURIComponent(details[property]);
    102     body.push(encodedKey + "=" + encodedValue);
    103   }
    104   body = body.join("&");
    105   fetch("https://discord.com/api/v10/oauth2/token", {
    106     method: "POST",
    107     headers: {
    108       Authorization: `Bot ${process.env.TOKEN}`,
    109       "Content-Type": "application/x-www-form-urlencoded",
    110       "User-Agent": "Auth",
    111     },
    112     body,
    113   }).then(res => {
    114     if (res.status != 400) return res.json().access_token;
    115     else return null;
    116   });
    117 }