Vai al contenuto
Tutti i lavori
  • #discord
  • #bots
  • #api-integration
  • #roblox
  • #open-source
  • #freeware

LegitBot

Un bot Discord per il clan LEGIT di Pet Simulator 99: seguiva le donazioni di diamanti del clan tramite l’API di BIG Games e annunciava ognuna con la classifica aggiornata.

Ruolo
Sviluppatore unico, open source.
Risultato
Ha funzionato per il clan LEGIT. Archiviato quando Pet Simulator 99 ha rilasciato un bot ufficiale multi-server e ho lasciato il gioco.
Anno
2024
Stato
archiviato
Stack
  • Python
  • discord.py
  • aiohttp
  • BIG Games API
  • Roblox API
  1. L'inizio

    Donazioni che nessuno vedeva

    LegitBot è nato in LEGIT, il mio clan in Pet Simulator 99. Guardando l'API pubblica del gioco, mi hanno colpito le sezioni dei clan: BIG Games espone i dati dei clan, compreso chi ha donato quanti diamanti. Le donazioni tenevano in piedi il clan, ma avvenivano in silenzio. Nessuno le vedeva, e nessuno ne riceveva il merito.

  2. L'obiettivo

    Ogni donazione, celebrata su Discord

    Far comparire ogni donazione nel nostro server Discord nel momento in cui avviene, con l'avatar di chi dona, l'importo, la nuova posizione in classifica e il podio aggiornato. Dare ai capi clan i comandi per gestire tutto, e rendere il risultato bello da vedere, perché le persone leggono solo i messaggi che sembrano valerne la pena.

  3. L'avventura

    Da un'API interrogata a eventi in diretta

    Ho costruito il bot con discord.py. Un ciclo aiohttp interrogava l'API di BIG Games per i totali delle donazioni del clan, li confrontava con l'ultima istantanea per trovare quelle nuove e prendeva nome e avatar del donatore dall'API di Roblox. Ogni donazione diventava un embed curato, con le medaglie per il podio, e i comandi slash permettevano agli admin di impostare il clan, il canale e la modalità silenziosa. Poi ho iniziato a riorganizzare il codice per il supporto a più server e un rilascio pubblico.

    Un annuncio di donazione.
  4. Le difficoltà

    Due messaggi per una donazione, e un rivale ufficiale

    Trasformare un'API interrogata in eventi affidabili ha richiesto attenzione: senza un debounce, una donazione poteva generare due annunci. I numeri grandi dovevano restare leggibili, quindi gli importi sono abbreviati in k, m, b e t. Poi Pet Simulator 99 ha rilasciato il suo bot Discord ufficiale, multi-server fin dal primo giorno.

  5. La fine

    Un bot curato, ritirato al momento giusto

    Il mio design aveva più personalità; il bot ufficiale era più coerente a livello di codice e aveva il supporto ufficiale. Stavo comunque lasciando il gioco e il clan, quindi ho chiuso LegitBot lì. Mi ha insegnato Python asincrono, integrazione di API e cosa vuol dire costruire per una community vera, e soprattutto quanto conta il tempismo quando costruisci nell'ecosistema di qualcun altro.

  • Donazioni in tempo reale

    Osserva le donazioni del clan tramite l'API di BIG Games e annuncia subito ogni nuova donazione.

  • Embed Discord curati

    Ogni messaggio mostra avatar del donatore, importo, posizione in classifica e il podio aggiornato, con le medaglie.

  • Comandi per gestire il clan

    Comandi slash per gli admin: impostare il tag del clan, scegliere il canale degli annunci e gestire il bot.

  • Configurabile

    Tag del clan, canali e preferenze stanno in una configurazione che sopravvive ai riavvii.

Un annuncio di donazione

Quando un membro del clan donava diamanti, il bot pubblicava un messaggio come questo nel canale delle donazioni: avatar, importo, posizione attuale e podio.

Un annuncio di donazione.

Comandi

  • /set-clan imposta il clan che il bot segue.
  • /announce-donations sceglie il canale degli annunci.
  • /mute-donations li mette in pausa.

Da una donazione a un messaggio

  1. Interroga

    Un ciclo aiohttp chiede all'API di BIG Games i totali delle donazioni del clan.
  2. Confronta

    I totali vengono confrontati con l'ultima istantanea, con un debounce perché una donazione non generi mai due messaggi.
  3. Arricchisci

    L'API di Roblox fornisce nome e avatar del donatore, e il podio viene ricalcolato.
  4. Annuncia

    Un embed curato arriva nel canale delle donazioni.

Il codice

Comporre l'annuncio

py
async def send_donation_message(channel_id, user_id, amount):
    try:
        channel = bot.get_channel(channel_id)
        if channel is None:
            logging.error("Failed to find channel with ID %s", channel_id)
            return

        user = await get_user(user_id)
        podium = await bigApi.get_donations_podium(user_id)
        user_rank = podium["Current"]["rank"]

        first = await get_user(podium["1st"]["user_id"])
        second = await get_user(podium["2nd"]["user_id"])
        third = await get_user(podium["3rd"]["user_id"])

        badge = f"{'🥇' if user_rank == 1 else '🥈' if user_rank == 2 else '🥉' if user_rank == 3 else '#'}"

        gememoji = f"{os.getenv('GEM_EMOJI_ID')}"
        message = f"""### **{user['username']}** has donated **{utils.int_to_rap(amount)}** {gememoji}
        Current rank: {badge}{user_rank}
        Donated: {utils.int_to_rap(podium["Current"]["donated"])} {gememoji}

        **Top 3**
        > 🥇 **{first["username"]}**: {utils.int_to_rap(podium["1st"]["donated"])}
        > 🥈 **{second["username"]}**: {utils.int_to_rap(podium["2nd"]["donated"])}
        > 🥉 **{third["username"]}**: {utils.int_to_rap(podium["3rd"]["donated"])}
        """

        embed = discord.Embed(description=message, color=discord.Color.from_str("#19e0ff"))
        embed.set_thumbnail(url=user["avatar"])
        embed.set_author(name="New donation!", icon_url=author_icon)
        embed.set_footer(
            text=f"Total Donations: {utils.int_to_rap(await bigApi.get_deposited_diamonds())}",
            icon_url="https://i.imgur.com/Vpwopvz.png",
        )
        await channel.send(embed=embed)
    except Exception as e:
        logging.error("Error occurred while sending donation message: %s", e)

Numeri leggibili

py
def int_to_rap(amount):
    # Shorten an amount: k for thousands, m for millions, b for billions, t for trillions
    if amount >= 1_000_000_000_000:
        return f"{amount / 1_000_000_000_000:.2f}t"
    elif amount >= 1_000_000_000:
        return f"{amount / 1_000_000_000:.2f}b"
    elif amount >= 1_000_000:
        return f"{amount / 1_000_000:.2f}m"
    elif amount >= 1_000:
        return f"{amount / 1_000:.2f}k"
    return str(amount)

Dati del clan e podio

py
async def get_clan_data():
    # Fetch clan data from the BIG Games API asynchronously
    clan_tag = bot_commands.load_config().get("clan_tag")
    async with aiohttp.ClientSession() as session:
        try:
            async with session.get(f"{API_URL}{clan_tag}") as response:
                if response.status == 200:
                    return (await response.json()).get("data", {})
                logging.error(f"Failed to retrieve data: {response.status}")
                return None
        except Exception as e:
            logging.error(f"Error occurred while fetching data: {e}")
            return None

async def get_donations_podium(user_id):
    members = (await get_clan_data()).get("Members", [])
    sorted_members = sorted(members, key=lambda x: x["Diamonds"], reverse=True)
    podium = {
        "1st": {"user_id": sorted_members[0]["UserID"], "donated": sorted_members[0]["Diamonds"]},
        "2nd": {"user_id": sorted_members[1]["UserID"], "donated": sorted_members[1]["Diamonds"]},
        "3rd": {"user_id": sorted_members[2]["UserID"], "donated": sorted_members[2]["Diamonds"]},
        "Current": {"rank": 0, "donated": 0},
    }
    for rank, member in enumerate(sorted_members, start=1):
        if member["UserID"] == user_id:
            podium["Current"] = {"rank": rank, "donated": member["Diamonds"]}
            break
    return podium

Lo stack

  • Python

    3.x

    Il linguaggio del bot e del livello API.

  • discord.py

    2.4.0

    Comandi slash, embed, permessi basati sui ruoli e gestione asincrona degli eventi.

  • API di BIG Games

    Dati del clan

    Donazioni e statistiche dei membri del clan.

  • API di Roblox

    Dati degli utenti

    Nomi utente e miniature degli avatar per gli annunci.

Competenze acquisite

  • Sviluppo di bot Discord

    discord.py

    Comandi slash, design degli embed, permessi per ruolo, gestione degli eventi e struttura di un bot Discord.

  • Programmazione asincrona

    aiohttp, async/await

    Chiamate API concorrenti, sessioni asincrone e gestione degli errori nel codice asincrono.

  • Integrazione di API

    BIG Games e Roblox

    Combinare due API esterne ed elaborarne i dati in tempo reale, tenendo conto dei limiti di richieste.

  • Gestione della configurazione

    JSON, variabili d'ambiente

    Comandi comodi per gli admin e impostazioni persistenti che sopravvivono ai riavvii.

Perché hai creato LegitBot?

Per risolvere un problema reale della mia community. Il clan LEGIT in Pet Simulator 99 aveva bisogno di un modo per tenere traccia delle donazioni e coinvolgere i membri, e quando ho scoperto che il gioco aveva un'API pubblica ho visto l'occasione per costruire qualcosa che migliorasse il nostro server Discord.

Come funzionava il tracciamento delle donazioni?

Il bot chiedeva regolarmente all'API di BIG Games i dati del clan, comprese le donazioni dei membri. Quando ne trovava una nuova, pubblicava un embed formattato in un canale dedicato con i dati del donatore, l'importo, la posizione attuale e la classifica aggiornata.

Cosa lo rendeva diverso dal bot ufficiale?

Più cura visiva: embed personalizzati con avatar, numeri formattati e classifiche dettagliate. Il bot ufficiale, d'altra parte, aveva un codice più coerente e il supporto a più server fin dall'inizio.

Perché l'hai interrotto?

Per due motivi. Pet Simulator 99 ha rilasciato il suo bot Discord ufficiale, già multi-server, e io ho smesso di giocare e ho lasciato il clan. Il mio design era più bello, ma il bot ufficiale era più coerente e supportato ufficialmente.

Cosa ti ha insegnato?

discord.py, Python asincrono, l'integrazione di API esterne, la gestione della configurazione e come costruire strumenti per community di gioco. Soprattutto, quanto conta capire di cosa gli utenti hanno davvero bisogno.

Rifaresti qualcosa di simile?

Assolutamente. Mi ha insegnato molto sugli strumenti per le community, sull'integrazione di API e sul tempismo, e lo applicherei volentieri ad altre community.

  1. 19 ago 2024

    Inizio del progetto

    Lo sviluppo parte dopo la scoperta dell'API di BIG Games: la prima struttura del bot, con discord.py.

  2. 19 ago 2024

    Tracciamento delle donazioni

    Monitoraggio delle donazioni in tempo reale tramite l'API di BIG Games, con un embed automatico per ogni nuova donazione.

  3. 19 ago 2024

    Comandi per gli admin

    Comandi slash per gestire il clan: /set-clan, /announce-donations, /mute-donations e la configurazione.

  4. 20 ago 2024

    Embed migliori

    Colori personalizzati, avatar degli utenti e una classifica dettagliata, con le medaglie per il podio.

  5. 20 ago 2024

    Piano multi-server

    Progettazione del supporto a più server e di un rilascio pubblico, con una riorganizzazione del codice per scalabilità e configurazione.

  6. 20 ago 2024

    Interrotto

    Pet Simulator 99 ha rilasciato il suo bot Discord ufficiale e io ho lasciato il gioco, quindi mi sono fermato qui.

Ti serve qualcosa di simile?

Dimmi cosa deve fare, dove gira e per quando ti serve.

Contattami