- #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
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.
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.
L'avventura
Da un'API interrogata a eventi in diretta
Ho costruito il bot con
discord.py. Un cicloaiohttpinterrogava 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. 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.
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.
Comandi
/set-clanimposta il clan che il bot segue./announce-donationssceglie il canale degli annunci./mute-donationsli mette in pausa.
Da una donazione a un messaggio
Interroga
Un cicloaiohttpchiede all'API di BIG Games i totali delle donazioni del clan.Confronta
I totali vengono confrontati con l'ultima istantanea, con un debounce perché una donazione non generi mai due messaggi.Arricchisci
L'API di Roblox fornisce nome e avatar del donatore, e il podio viene ricalcolato.Annuncia
Un embed curato arriva nel canale delle donazioni.
Il codice
Comporre l'annuncio
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
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
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 podiumLo 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.
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.
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.
19 ago 2024
Comandi per gli admin
Comandi slash per gestire il clan:
/set-clan,/announce-donations,/mute-donationse la configurazione.20 ago 2024
Embed migliori
Colori personalizzati, avatar degli utenti e una classifica dettagliata, con le medaglie per il podio.
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.
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.
Altri lavori

- #api-integration
- #cli
- #roblox
Player Clan Finder
Uno strumento da riga di comando che trova il clan di un giocatore di Pet Simulator 99, per seguire un truffatore.

- #discord
- #bots
- #api-integration
BotFire
Un bot Discord per la mia community: giochi suggeriti e calendario Twitch sincronizzato con Google Calendar.

- #web
- #discord
- #bots
Arise Crossover Tools
Timer in diretta per dungeon ed eventi di Arise Crossover, alimentati da un bot Discord che legge gli annunci.