Discord.py

Versione del 11 mag 2021 alle 23:06 di Italaid (discussione | contributi) (+tmp, fix minori)

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

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, in quanto necessita di abilitare da Discord Developer Portal[3] una funzione privilegiata[4])
  • Scrivere in privato agli utenti

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

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

  • Scrivere in privato agli utenti
  • Menzionare gli utenti
  • Espellere gli utenti[9]
  • Bannare gli utenti[10]
  • 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[11], 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[12].

Bot.remove_command('help')

Sono esempi di comandi di aiuto migliorati rispetto a quello di default ad esempio quello di Lawliet, basato sulle reazioni[13], 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[14], che richiedono l'importazione di discord.exe.errors, o (nel caso specifico) soltanto di discord.py.

Collegamenti esterni

Esempi

Documentazione

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.guild.members, su Python.tutoriallink.com.
  4. ^ discord.Intents, su https://discordpy.readthedocs.io/. URL consultato l'11 Maggio 2021.
  5. ^ Si veda Discord, alla definizione di canale, sottodivisione del "server".
  6. ^ Si veda Discord, nella sezione riguardante la gerarchia dei ruoli, e i vari permessi.
  7. ^ Dalla stessa libreria Discord.py definito (discord.guild.)owner.user
  8. ^ Server vs Guild, su GitHub, 15 Agosto 2016. URL consultato l'11 Maggio 2021.
  9. ^ Esiste il comando apposito
    member.kick()
    
    Con il parametro opzionale reason
  10. ^ Esiste il comando apposito
    member.ban()
    
    Con il parametro opzionale reason
  11. ^ 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.
  12. ^ Bot.remove_command(help), su stackoverflow.com, 11 Maggio 2021.
  13. ^ 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():
    
  14. ^ Come TypeError e ValueError
  15. ^ Per installare il modulo è sufficiente digitare nel prompt dei comandi pip install discord.py ovviamente dopo aver installato pip e Python.
  Portale Informatica: accedi alle voci di Wikipedia che trattano di Informatica