Vytvorenie bota Discord s jarným topánkom Discord4J +

1. Prehľad

Discord4J je open-source knižnica Java, ktorá sa dá primárne použiť na rýchly prístup k API Discord Bot. Je intenzívne integrovaný s Project Reactor a poskytuje tak úplne neblokujúce reaktívne API.

V tomto tutoriále použijeme Discord4J na vytvorenie jednoduchého robota Discord, ktorý bude schopný reagovať na preddefinovaný príkaz. Postavíme robota na vrchole Spring Boot, aby sme demonštrovali, aké ľahké by bolo škálovať nášho robota na mnoho ďalších funkcií, ktoré Spring Boot umožňuje.

Keď skončíme, bude tento robot schopný počúvať príkaz s názvom „! Todo“ a vytlačí staticky definovaný zoznam úloh.

2. Vytvorte aplikáciu Discord

Aby náš robot dostával aktualizácie z Discordu a odosielal odpovede do kanálov, budeme musieť vytvoriť aplikáciu Discord na portáli vývojárov Discord a nastaviť ju ako bota. Toto je jednoduchý proces. Keďže program Discord umožňuje vytváranie viacerých aplikácií alebo robotov pod jedným účtom vývojára, môžete to skúsiť viackrát s rôznymi nastaveniami.

Tu sú kroky na vytvorenie novej aplikácie:

  • Prihláste sa na portáli vývojárov Discord
  • Na karte Aplikácie kliknite na položku „Nová aplikácia“.
  • Zadajte názov nášho robota a kliknite na „Vytvoriť“
  • Nahrajte ikonu aplikácie a popis a kliknite na tlačidlo „Uložiť zmeny“.

Teraz, keď aplikácia existuje, musíme do nej jednoducho pridať funkčnosť robota. Toto vygeneruje token robota, ktorý vyžaduje Discord4J.

Tu sú kroky na transformáciu aplikácie na robota:

  • Na karte Aplikácie vyberte našu aplikáciu (ak ešte nie je vybratá).
  • Na karte Bot kliknite na tlačidlo „Pridať robot“ a potvrďte, že to chceme urobiť.

Teraz, keď sa z našej aplikácie stal skutočný robot, skopírujte token, aby sme ho mohli pridať do našich vlastností aplikácie. Dávajte pozor, aby ste tento token nezdieľali verejne, pretože niekto iný by bol schopný spustiť škodlivý kód a vydávať sa za nášho robota.

Teraz sme pripravení napísať nejaký kód!

3. Vytvorte aplikáciu Spring Boot

Po vytvorení novej aplikácie Spring Boot musíme zahrnúť závislosť jadra Discord4J:

 com.discord4j discord4j-core 3.1.1 

Discord4J funguje tak, že inicializuje a GatewayDiscordClient s tokenom robota, ktorý sme vytvorili skôr. Tento objekt klienta nám umožňuje registrovať poslucháčov udalostí a konfigurovať veľa vecí, ale na nevyhnutné minimum musíme volať minimálne Prihlásiť sa() metóda. Týmto sa náš robot zobrazí ako online.

Najskôr pridajme náš robotický token do nášho aplikácia.yml spis:

token: 'our-token-here'

Ďalej to vpichneme do a @ Konfigurácia triedy, kde môžeme vytvoriť inštanciu GatewayDiscordClient:

@Configuration verejná trieda BotConfiguration {@Value ("$ {token}") súkromný reťazcový token; @Bean public GatewayDiscordClient gatewayDiscordClient () {return DiscordClientBuilder.create (token) .build () .login () .block (); }}

V tomto okamihu by sa náš robot považoval za online, ale zatiaľ nič nerobí. Pridajme nejaké funkcie.

4. Pridajte poslucháčov udalostí

Najbežnejšou vlastnosťou chatbota je príkaz. Toto je abstrakcia viditeľná v CLI, kde používateľ napíše nejaký text na spustenie určitých funkcií. To môžeme dosiahnuť v našom robote Discord počúvaním nových správ, ktoré používatelia posielajú, a v prípade potreby odpoveďou inteligentnými odpoveďami.

Existuje veľa druhov udalostí, ktoré môžeme počúvať. Registrácia poslucháča je však pre všetky rovnaká, takže najskôr vytvorme rozhranie pre všetkých našich poslucháčov udalostí:

import discord4j.core.event.domain.Event; verejné rozhranie EventListener {Logger LOG = LoggerFactory.getLogger (EventListener.class); Trieda getEventType (); Mono prevedenie (T udalosť); predvolené Mono handleError (chyba, ktorá sa dá hodiť) {LOG.error ("Nedá sa spracovať" + getEventType (). getSimpleName (), chyba); vrátiť Mono.empty (); }}

Teraz môžeme toto rozhranie implementovať pre toľko ľudí discord4j.core.event.domain.Event rozšírenia ako chceme.

Pred implementáciou nášho prvého poslucháča udalostí upravme nášho klienta @Bean konfigurácia očakávať zoznam EventListener aby mohla zaregistrovať všetky nájdené na jar ApplicationContext:

@Bean public GatewayDiscordClient gatewayDiscordClient (zoznam eventListeners) {GatewayDiscordClient client = DiscordClientBuilder.create (token) .build () .login () .block (); pre (poslucháč EventListener: eventListeners) {client.on (listener.getEventType ()) .flatMap (listener :: execute) .onErrorResume (listener :: handleError) .subscribe (); } návratový klient; }

Všetko, čo musíme urobiť, aby sme zaregistrovali poslucháčov udalostí, je implementovať naše rozhranie a anotovať ho pomocou Spring's @ Komponentanotácie založené na stereotypoch. Registrácia pre nás teraz prebehne automaticky!

Mohli sme sa rozhodnúť zaregistrovať každú udalosť osobitne a výslovne. Všeobecne je však lepšie zvoliť modulárnejší prístup pre lepšiu škálovateľnosť kódu.

Naše nastavenie poslucháča udalostí je teraz dokončené, ale robot stále ešte nič nerobí, a preto pridajme nejaké udalosti, ktoré si budeme môcť vypočuť.

4.1. Spracovanie príkazov

Aby sme dostali príkaz používateľa, môžeme si vypočuť dva rôzne typy udalostí: MessageCreateEvent pre nové správy a MessageUpdateEvent pre aktualizované správy. Možno budeme chcieť iba počúvať nové správy, ale ako vzdelávacia príležitosť predpokladajme, že chceme pre nášho robota podporiť oba druhy udalostí. To poskytne ďalšiu vrstvu robustnosti, ktorú naši používatelia môžu oceniť.

Oba objekty udalostí obsahujú všetky príslušné informácie o každej udalosti. Nás zaujíma najmä obsah správy, autor správy a kanál, do ktorého bola uverejnená. Našťastie všetky tieto dátové body žijú v Správa objekt, ktorý poskytujú oba tieto typy udalostí.

Akonáhle máme Správa, môžeme skontrolovať autora, aby sme sa uistili, že nejde o robota, môžeme skontrolovať obsah správy, či sa zhoduje s našim príkazom, a na odoslanie odpovede môžeme použiť kanál správy.

Pretože dokážeme plne fungovať od oboch udalostí cez ich Správa objekty, dajme celú následnú logiku na spoločné miesto, aby ju mohli používať obidvaja poslucháči udalostí:

import discord4j.core.object.entity.Message; verejná abstraktná trieda MessageListener {public Mono processCommand (Message eventMessage) {return Mono.just (eventMessage) .filter (message -> message.getAuthor (). map (user ->! user.isBot ()). orElse (false)) .filter (message -> message.getContent (). equalsIgnoreCase ("! todo")) .flatMap (Message :: getChannel) .flatMap (channel -> channel.createMessage ("Čo robiť dnes: \ n - napísať robota \ n - jedzte obed \ n - zahrajte si hru ")). potom (); }}

Veľa sa tu deje, ale toto je najzákladnejšia forma príkazu a odpovede. Tento prístup používa reaktívny funkčný dizajn, ale je možné ho napísať tradičnejším imperatívnym spôsobom pomocou blok ().

Škálovanie naprieč viacerými príkazmi robota, vyvolanie rôznych služieb alebo archívov údajov alebo dokonca použitie rolí Discord ako autorizácie určitých príkazov sú bežnou súčasťou dobrej architektúry príkazov robota. Pretože naši poslucháči majú jarnú správu @Službas, mohli by sme ľahko vpichnúť ďalšie jarné fazule, aby sa o tieto úlohy postarali. V tomto článku sa však nebudeme venovať ničomu z toho.

4.2. EventListener

Aby sme mohli prijímať nové správy od užívateľa, musíme si vypočuť MessageCreateEvent. Pretože logika spracovania príkazov už žije v MessageListener, môžeme ju rozšíriť, aby sme túto funkciu zdedili. Musíme tiež implementovať naše EventListener rozhranie v súlade s našim registračným dizajnom:

@Service verejná trieda MessageCreateListener rozširuje MessageListener implementuje EventListener {@Override verejná trieda getEventType () {návrat MessageCreateEvent.class; } @Override public Mono execute (udalosť MessageCreateEvent) {return processCommand (event.getMessage ()); }}

Prostredníctvom dedičstva sa správa odovzdáva nášmu processCommand () metóda, pri ktorej sa vyskytujú všetky overenia a odpovede.

V tomto okamihu náš robot prijme a odpovie na príkaz „! Todo“. Ak však používateľ opraví svoj nesprávne zadaný príkaz, robot by neodpovedal. Podporme tento prípad použitia s iným poslucháčom udalostí.

4.3. EventListener

The MessageUpdateEvent sa vydá, keď používateľ upraví správu. Môžeme počúvať, ako táto udalosť rozpoznáva príkazy, podobne ako to, ako počúvame MessageCreateEvent.

Pre naše účely sa o túto udalosť staráme iba v prípade, že bol zmenený obsah správy. Ostatné prípady tejto udalosti môžeme ignorovať. Našťastie môžeme použiť isContentChanged () metóda na filtrovanie takýchto inštancií:

@Service verejná trieda MessageUpdateListener rozširuje MessageListener implementuje EventListener {@Override verejná trieda getEventType () {návrat MessageUpdateEvent.class; } @Override public Mono execute (MessageUpdateEvent event) {return Mono.just (event) .filter (MessageUpdateEvent :: isContentChanged) .flatMap (MessageUpdateEvent :: getMessage) .flatMap (super :: processCommand); }}

V tomto prípade od getMessage () vracia Mono namiesto surového Správa, musíme použiť flatMap () poslať to do našej nadtriedy.

5. Test Bot v nesúlade

Teraz, keď máme funkčného robota Discord, môžeme ho pozvať na server Discord a otestovať ho.

Aby sme vytvorili odkaz na pozvánku, musíme určiť, ktoré povolenia vyžaduje robot na správne fungovanie. Na vygenerovanie odkazu na pozvánku s potrebnými povoleniami sa často používa populárna kalkulačka povolení nesúladu od tretích strán. Aj keď sa to pri výrobe neodporúča, môžeme si na účely testovania jednoducho zvoliť „Správca“ a nemusíme sa starať o ďalšie povolenia. Jednoducho zadajte ID klienta nášho robota (nachádza sa na portáli Discord Developer Portal) a pomocou vygenerovaného odkazu pozvite nášho robota na server.

Ak robotovi neudelíme oprávnenie správcu, možno budeme musieť vylepšiť povolenia kanála, aby mohol robot čítať a zapisovať do kanála.

Robot teraz reaguje na správu „! Todo“ a po úprave správy hovorí „! Todo“:

6. Prehľad

Tento tutoriál popísal všetky potrebné kroky na vytvorenie robota Discord pomocou knižnice Discord4J a Spring Boot. Na záver bolo popísané, ako nastaviť základnú škálovateľnú štruktúru príkazov a odpovedí pre robota.

Kompletný a funkčný robot si môžete pozrieť zdrojový kód na GitHub. Na jeho spustenie je potrebný platný token robota.


$config[zx-auto] not found$config[zx-overlay] not found