Discord.py

Versione del 12 mag 2021 alle 13:03 di FLAK-ZOSO (discussione | contributi) (Aggiungo il template)

Discord.py è una libreria open source[1] per il linguaggio di programmazione Python, che permette di sviluppare Bot per il social media Discord.

Discord.py
software
Genere
Ultima versione2.5.2 (5 marzo 2025)
Sistema operativoMicrosoft Windows
LinguaggioPython
Licenzalicenza MIT
(licenza libera)
LinguaInglese
Sito webAPI

Utilizzo

Con l'importazione del modulo all'interno di un programma, è possibile dare vita a un Bot il quale, attraverso le funzioni e le variabili della libreria, potrà comportarsi su Discord esattamente come un utente umano.

Funzioni

Il Bot potrà quindi eseguire, come un normale utente, le seguenti operazioni:

  • Leggere i messaggi
  • Inviare messaggi
  • Allegare file[2]
  • Accedere alla lista degli utenti. (Lista che dopo l'ultimo aggiornamento ha causato problemi[3], in quanto necessita di abilitare da Discord Developer Portal[4] una funzione privilegiata[5])
  • Scrivere in privato agli utenti

Non potrà naturalmente leggere i messaggi di canali[6] che per questioni di autorizzazione[7] non possa vedere.

Allo stesso modo per mancanza di autorizzazione da parte del proprietario[8] del server (che i programmatori usano chiamare Guild[9]) potrebbe subire limitazioni nei permessi per:

  • Scrivere in privato agli utenti
  • Menzionare gli utenti
  • Espellere gli utenti[10]
  • Bannare gli utenti[11]
  • Modificare il nickname degli altri utenti

Le autorizzazioni dei singoli Bot sono gestite da Discord Developer Portal, che genera link di invito al server per i Bot a seconda dei permessi che il ruolo personalizzato richiede.

In caso di mancata autorizzazione, il compilatore restituirà l'errore seguente:

discord.ext.command.errors.MissingPermission

Applicazioni

A partire dalle funzioni di base, utilizzando altri moduli tra i quali asyncio.py e time.py[12], si possono creare applicazioni utili, tra le quali:

  • Ban/Kick a tempo determinato
async def ban_temporaneo(member, tempo):
    await member.ban()
    await asyncio.sleep(tempo)
    await member.unban()
  • Stato del Bot a tempo determinato
async def Cambia_stato(ctx, tempo, nuovo_stato):
    nuovo_stato = discord.Game(str(nuovo_stato))
    await Bot.change_presence(status = discord.Status.idle, activity = nuovo_stato)
    tempo = float(tempo)
    from asyncio import sleep
    await sleep(tempo) 
    await Bot.change_presence(status = discord.Status.idle, activity = gioco)

Esempi di codice

Il codice seguente è lo stretto necessario per un programma che semplicemente porti il Bot online.

import discord #L'alternativa è di importare  discord.client, discord.ban, discord.kick, discord.events e così via
import discord.ext.commands.errors
from discord.ext import commands
from discord import client

token = "<inserisci-qui-il-token-del-bot>" #I token dei Bot vengono presi da Discord Developer Portal, e vengono immediatamente rinnovati se trovati online dal sistema di Discord
Bot = commands.Bot(command_prefix = "£", description = "<inserisci-qui-la-descrizione-del-bot>")
gioco = discord.Game("£Aiuto | Bot | @Bot#1127")

Bot.run(token)

Il codice di cui sotto contiene un piccolo evento aggiunto, che stampa a schermata Bot#1127 è ora online ID: 12345678

@Bot.event
async def on_ready():
    print(Bot.user, " è ora online ", "ID: ", Bot.user.id)
    await Bot.change_presence(status = discord.Status.idle, activity = gioco)

Bot.help

Ogni Bot possiede di default un suo comando per inviare l'elenco delle funzioni che può svolgere, che può essere però rimosso se se ne volesse implementare uno simile e che si giudichi maggiormente funzionale[13].

Bot.remove_command('help')

Sono esempi di comandi di aiuto migliorati rispetto a quello di default ad esempio quello di Lawliet, basato sulle reazioni[14], o quello di Unbelievaboat, che ha sostanziali modifiche nella grafica.

Anti-spam

I Bot possono essere usati per limitare la spam, come nell'esempio che segue:

@Bot.event
async def on_message(messaggio):
    global messaggi
    author = messaggio.author
    if author != Bot.user:
        messaggi.append(messaggio.content)
        for i in messaggi:
            if i == messaggio.content:
                if len(messaggi) > 2:
                    lunghezza = len(messaggi)
                    if messaggi[lunghezza-1] == messaggi[lunghezza-2] == messaggi[lunghezza-3]:
                        if messaggi[lunghezza-1] == messaggi[lunghezza-2] == messaggi[lunghezza-3] == messaggi[lunghezza-4]:
                            if messaggi[lunghezza-1] == messaggi[lunghezza-2] == messaggi[lunghezza-3] == messaggi[lunghezza-4] == messaggi[lunghezza-5]:
                                try:
                                    await author.kick(reason = 'spam')
                                    print(f"{author} stava spammando un messaggio in {messaggio.channel}, quindi l'ho espulso.")
                                    await messaggio.reply(f"{author.mention} stava spammando questo messaggio, quindi l'ho espulso.")
                                    print(messaggi)
                                    messaggi = []
                                    return
                                except discord.errors.Forbidden:
                                    await messaggio.reply(f"{author.mention} stava spammando questo messaggio, quindi ho provato ad espellerlo. Purtroppo non ho l'autorizzazione necessaria per farlo.")
                                    print(messaggi)
                                    messaggi = []
                                    return
                            else:
                                await messaggio.reply(f'{author.mention}, questo è il tuo ultimo avvertimento!')
                                return
                        else:
                            await messaggio.reply(f'{author.mention}, smettila di scrivere lo stesso messaggio. Se lo farai altre due volte sarai espulso dal server!')
                            return messaggi
                    else:
                        return messaggi
    else:
        return

Sono inseriti (ad esempio a riga 21) degli except riguardanti degli errori diversi da quelli built-in[15], che richiedono l'importazione di discord.exe.errors, o (nel caso specifico) soltanto di discord.py.

Collegamenti esterni

Note

  1. ^ Discord.py, su awesomeopensource.com. URL consultato l'11 Maggio 2021.
  2. ^ Che devono però essere presenti nella stessa cartella del programma, e che vanno quindi consegnati nel caso ci si avvalga di un servizio di hosting.
  3. ^ discord.py - discord py, ctx.guild.members, only returns bot, su Stack Overflow. URL consultato l'11 maggio 2021.
  4. ^ discord.guild.members, su Python.tutoriallink.com.
  5. ^ discord.Intents, su https://discordpy.readthedocs.io/. URL consultato l'11 Maggio 2021.
  6. ^ Si veda Discord, alla definizione di canale, sottodivisione del "server".
  7. ^ Si veda Discord, nella sezione riguardante la gerarchia dei ruoli, e i vari permessi.
  8. ^ Dalla stessa libreria Discord.py definito (discord.guild.)owner.user
  9. ^ Server vs Guild, su GitHub, 15 Agosto 2016. URL consultato l'11 Maggio 2021.
  10. ^ Esiste il comando apposito member.kick()
  11. ^ Esiste il comando apposito member.ban()
  12. ^ L'equivalente di <locale> (lettura "local-e") in C++, importa una serie di variabili a seconda del luogo nel quale ci si trova, tra le quali il fuso orario e i caratteri UTF-8 della lingua locale.
  13. ^ Bot.remove_command(help), su stackoverflow.com, 11 Maggio 2021.
  14. ^ Emoji che si possono attaccare al di sotto di un messaggio, e che tramite Discord.py possono essere percepite dal Bot con:
    @Bot.event
    async def on_reaction():
    
  15. ^ Come TypeError e ValueError