Oman Discord-pal­ve­li­men ylläpito voi vaatia paljon työtä, minkä vuoksi hal­lin­nol­li­sis­ta teh­tä­vis­tä huo­leh­ti­vat botit ovat suo­sit­tu­ja. Voit helposti suun­ni­tel­la oman botin käyt­tä­mäl­lä Python-kirjastoa discord.py ja so­vel­ta­mal­la pe­rus­tie­to­ja Pyt­ho­nis­ta.

Askel as­ke­leel­ta kohti omaa Python-Discord-bottia

Ennen kuin aloitat botin oh­jel­moin­nin, sinun tulee luoda Discord-botti. Voit luoda oman so­vel­luk­sen Discor­dis­sa, ja kun olet tehnyt sen, mikään ei enää estä Discord-bottisi käyttöä. Discord-bottiin tar­vit­ta­va koodi riippuu teh­tä­vis­tä, jotka haluat au­to­ma­ti­soi­da. Tässä oppaassa esitelty botti on tar­koi­tet­tu roolien li­sää­mi­seen Discord-pal­ve­li­mel­la.

Vaihe 1: asenna discord.py

Botin luomiseen tarvitset eh­dot­to­mas­ti Python-kirjaston discord.py. Ennen kuin aloitat, sinun on asen­net­ta­va se jär­jes­tel­mää­si pip-ko­men­nol­la, kuten Pyt­ho­nis­sa on tapana. Win­dow­sis­sa asen­nuk­seen käy­tet­tä­vä ko­men­to­ri­vi­ko­men­to on:

py -3 -m pip install -U discord.py
python

Vaihe 2: Luo Python-tiedosto

Luo uusi Python-tiedosto botin koo­daa­mis­ta varten. Voit käyttää Python-tiedoston luomiseen erilaisia koo­die­di­to­rei­ta tai in­tegroi­tua ke­hi­ty­sym­pä­ris­töä (IDE), kuten Pycharmia.

Vaihe 3: Yhdistä Discor­diin

Aloita tuomalla Discord-kirjasto Python-tie­dos­too­si. Määritä botin tunnus, jonka sait re­kis­te­röi­des­sä­si Discord-botin Discordin ke­hit­tä­jä­si­vus­tol­la. Korvaa tätä varten paik­ka­merk­ki omalla botin tun­nuk­sel­la­si:

import discord
TOKEN = token_placeholder
python

Tarvitset kirjaston, jotta voit käyttää Discord-so­vel­lus­liit­ty­mää. Yhteyden muo­dos­ta­mi­sek­si Discor­diin tarvitset niin sanotun client-objektin ins­tans­sin. Luo se seu­raa­val­la koodilla:

client = discord.Client()
python

Vaihe 4: Varmista, että yhteys on muo­dos­tet­tu on­nis­tu­nees­ti

Var­mis­taak­se­si, että botti on kytketty oikein Discord-pal­ve­li­meen, lisää Python-tie­dos­toon asynk­ro­ni­nen menetelmä. Tämä to­teu­te­taan rea­goi­mal­la on_ready, joka on mää­ri­tel­ty discord.py-so­vel­lus­liit­ty­mäs­sä. Jotta funk­tios­ta tulisi ta­pah­tu­man­kä­sit­te­li­jä, käytä Pyt­ho­nis­sa @client.event.

@client.event
async def on_ready():
    print(f'{client.user} is connected to the following server:\n')
    for server in client.guilds:
        print(f'{server.name}(id: {server.id})')
python
Huomio

Asynk­ro­ni­sia funk­tioi­ta käytetään usein Discord-bottien oh­jel­moin­nis­sa. Näin var­mis­te­taan, että funktio suo­ri­te­taan pää­säi­kees­tä eril­li­sel­lä omalla säikeellä, mikä mah­dol­lis­taa bot­ti­teh­tä­vien rin­nak­kai­sen suo­rit­ta­mi­sen estämättä pää­säi­keen toimintaa.

Vaihe 5: Lisää toi­min­to­ja bottiisi

Bot-toi­min­to­jen to­teut­ta­mi­sek­si discord.py-kir­jas­tos­sa käytetään on_message. Tämä tapahtuma laukeaa aina, kun Discord-botisi vas­taa­not­taa viestin. Ta­pah­tu­man kä­sit­te­le­mi­sek­si metodisi tulisi ensin tunnistaa viestin lähettäjä ja suorittaa sitten haluttu toiminto, kuten roolien li­sää­mi­nen.

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    if message.content.startswith('!add_role'):
        # Find role name
        role_name = message.content.split(' ')[1]
        # search corresponding Discord role
        role = discord.utils.get(message.guild.roles, name=role_name)
        # Check if the role exists
        if role is None:
            await message.channel.send(f'Role "{role_name}" does not exist)
            return
        # Role assignment
        await message.author.add_roles(role)
        await message.channel.send(f'Role "{role_name}" was added to {message.author}')

Aluksi funktio tarkistaa, onko vas­taa­no­tet­tu viesti lähetetty Discord-botin itsensä toimesta. Jos näin on, funktio lo­pe­te­taan return.

Seu­raa­vas­sa vaiheessa viestin sisältöä tar­kas­tel­laan tarkemmin. Jos viesti alkaa merk­ki­jo­nol­la !add_role, botti tunnistaa sen ko­men­nok­si. Tämä tar­koit­taa, että pal­ve­li­men käyt­tä­jien on aloi­tet­ta­va Discord-botille osoitetut pyynnöt merk­ki­jo­nol­la !add_role. Vaikka ko­men­nok­si voidaan käyttää mitä tahansa merk­ki­jo­noa, on suo­si­tel­ta­vaa käyttää merk­ki­jo­no­ja, joita ei yleisesti käytetä luon­nol­li­ses­sa kielessä.

Botti määrittää halutun roolin nimen oikein tul­kit­se­man­sa komennon pe­rus­teel­la Python-funktiota split() käyttäen. Sen jälkeen se etsii kyseisen roolin pal­ve­li­mel­ta­si. Tämä tapahtuu hyö­dyn­tä­mäl­lä message, jonka message.guild on mo­nen­lais­ta tietoa pal­ve­li­mes­ta­si.

Jos roolia ei ole olemassa ja sen arvoksi tulee siten ”None”, jär­jes­tel­mä tuottaa vir­heil­moi­tuk­sen ja lopettaa toiminnon return. Jos rooli on olemassa, se mää­ri­te­tään tarpeen mukaan. Tätä varten käytämme discord.py-kirjaston add_roles, joka on mää­ri­tel­ty myös message.

Siirry pää­va­lik­koon