Untitled

 avatar
unknown
plain_text
a year ago
4.6 kB
6
Indexable
const { Client, Intents, EmbedBuilder } = require('discord.js');
const client = new Client({ intents: ['Guilds', 'GuildMessages'] });
const axios = require('axios');
require('dotenv').config();

async function getGuildMembers() {
    try {
        const response = await axios.get('https://stats.pika-network.net/api/clans/THEBOIS');
        const guildData = response.data;

        if (!guildData || !guildData.members || !Array.isArray(guildData.members)) {
            console.error('Invalid guild data format');
            return [];
        }

        const memberUsernames = guildData.members.map(member => member.user.username);
        return memberUsernames;
    } catch (error) {
        console.error('Error fetching guild members:', error.message);
        return [];
    }
}

async function getPlayerStats(playerIGN, interval = 'weekly', mode = 'ALL_MODES') {
    try {
        const response = await axios.get(`https://stats.pika-network.net/api/profile/${playerIGN}/leaderboard?type=bedwars&interval=${interval}&mode=${mode}`);
        return response.data;
    } catch (error) {
        console.error(`Error fetching stats for ${playerIGN}:`, error.message);
        return null;
    }
}

async function main(interval = 'weekly', mode = 'ALL_MODES') {
    const memberUsernames = await getGuildMembers();
    if (memberUsernames.length === 0) {
        console.error('No guild members found.');
        return { memberStats: [], failedMembers: [] };
    }

    const memberStats = [];
    const failedMembers = [];

    for (const username of memberUsernames) {
        try {
            // Introduce a delay between API requests to avoid rate-limiting
            await new Promise(resolve => setTimeout(resolve, 500));

            const stats = await getPlayerStats(username, interval, mode);
            if (stats) {
                const memberStat = {
                    username,
                    wins: 0
                };
                if (stats['Wins'] && stats['Wins'].entries && stats['Wins'].entries.length > 0) {
                    const entry = stats['Wins'].entries.find(entry => entry.id === username);
                    if (entry) {
                        memberStat['wins'] = entry.value || 0;
                    }
                }
                memberStats.push(memberStat);
            } else {
                console.log(`Unable to retrieve stats for ${username}. Their API may be turned off.`);
                failedMembers.push(username);
            }
        } catch (error) {
            console.error(`Error fetching stats for ${username}:`, error.message);
            failedMembers.push(username);
        }
    }

    // Sort memberStats by wins in descending order
    memberStats.sort((a, b) => b.wins - a.wins);

    return { memberStats, failedMembers };
}

client.once('ready', () => {
    console.log('Bot is ready!');
});

client.on('interactionCreate', async interaction => {
    if (!interaction.isCommand()) return;

    if (interaction.commandName === 'gstats') {
        const interval = interaction.options.getString('interval') || 'weekly';
        const mode = interaction.options.getString('mode') || 'ALL_MODES';
        await interaction.deferReply(); // Acknowledge the command

        try {
            const { memberStats, failedMembers } = await main(interval, mode);

            const embedBuilder = new EmbedBuilder()
                .setTitle('Guild Bedwars Stats')
                .setDescription(`Interval: ${interval}, Mode: ${mode}`)
                .setColor('#0099ff');

            memberStats.forEach((memberStat, index) => {
                embedBuilder.addFields({
                    name: `#${index + 1}. ${memberStat.username}`,
                    value: `${memberStat.wins} wins`,
                    inline: false
                });
            });

            if (failedMembers.length > 0) {
                embedBuilder.addFields({
                    name: 'Failed Members',
                    value: failedMembers.join('\n'),
                    inline: false
                });
            }

            await interaction.editReply({ embeds: [embedBuilder.toJSON()] }); // Send the embed
            console.log('Guild stats sent successfully.');
        } catch (error) {
            console.error('Error retrieving guild stats:', error.message);
            await interaction.editReply('An error occurred while retrieving guild stats.');
        }
    }
});

client.login(process.env.TOKEN);
Editor is loading...
Leave a Comment