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 }