Discord Bot létrehozása Discord4J + rugós indítással

1. Áttekintés

A Discord4J egy nyílt forráskódú Java könyvtár, amely elsősorban a Discord Bot API gyors elérésére használható. Erősen integrálódik a Project Reactorba, hogy teljesen blokkolatlan reaktív API-t biztosítson.

Ebben az oktatóanyagban a Discord4J használatával létrehozunk egy egyszerű Discord botot, amely képes reagálni egy előre definiált parancsra. A botot a Spring Boot tetejére építjük, hogy bemutassuk, milyen egyszerű lenne botunkat átméretezni a Spring Boot által engedélyezett számos más funkcióra.

Amikor végeztünk, ez a bot képes meghallgatni a „! Todo” nevű parancsot, és kinyomtat egy statikusan meghatározott teendőlistát.

2. Hozzon létre egy Discord alkalmazást

Ahhoz, hogy botunk frissítéseket kapjon a Discordtól, és válaszokat küldjön csatornákon, létre kell hoznunk egy Discord alkalmazást a Discord Developer portálon, és botnak kell állítanunk. Ez egyszerű folyamat. Mivel a Discord lehetővé teszi több alkalmazás vagy robot létrehozását egyetlen fejlesztői fiók alatt, próbálkozzon nyugodtan többször, különböző beállításokkal.

Az új alkalmazás létrehozásának lépései:

  • Jelentkezzen be a Discord fejlesztői portálra
  • Az Alkalmazások lapon kattintson az „Új alkalmazás” elemre
  • Írja be botunk nevét, majd kattintson a „Létrehozás” gombra.
  • Töltsön fel egy alkalmazás ikont és egy leírást, majd kattintson a „Módosítások mentése” gombra.

Most, hogy létezik alkalmazás, egyszerűen hozzá kell adnunk a bot funkcióit. Ez létrehozza a Discord4J által igényelt bot-tokent.

Az alkalmazás botokká alakításának lépései:

  • Az Alkalmazások lapon válassza ki az alkalmazásunkat (ha még nincs kiválasztva).
  • A Bot lapon kattintson a „Bot hozzáadása” elemre, és erősítse meg, hogy meg akarjuk csinálni.

Most, hogy alkalmazásunk igazi bot lett, másolja a tokent, hogy hozzá tudjuk adni az alkalmazás tulajdonságaihoz. Vigyázzon, hogy ne ossza meg nyilvánosan ezt a tokent, mert valaki más képes lenne rosszindulatú kód futtatására, miközben a robotunknak adja ki magát.

Most készen állunk egy kis kód megírására!

3. Hozzon létre egy Spring Boot alkalmazást

Az új Spring Boot alkalmazás elkészítése után mindenképpen fel kell tüntetnünk a Discord4J alapvető függőségét:

 com.discord4j discord4j-core 3.1.1 

A Discord4J úgy működik, hogy inicializálja a GatewayDiscordClient a korábban létrehozott bot tokennel. Ez az ügyfélobjektum lehetővé teszi számunkra az eseményhallgatók regisztrálását és sok dolog konfigurálását, de minimális esetben legalább meg kell hívnunk a Belépés() módszer. Ez megmutatja, hogy botunk online.

Először tegyük fel bot botunkat a sajátunkba alkalmazás.yml fájl:

token: 'mi-token-itt'

Ezután fecskendezzük be a @ Konfiguráció osztály, ahol példányt tudunk adni GatewayDiscordClient:

@Configuration public class BotConfiguration {@Value ("$ {token}") private String token; @Bean public GatewayDiscordClient gatewayDiscordClient () {return DiscordClientBuilder.create (token) .build () .login () .block (); }}

Ezen a ponton botunk online állapotúnak tűnik, de még nem tesz semmit. Adjunk hozzá néhány funkciót.

4. Adja hozzá az eseményhallgatókat

A chatbot leggyakoribb jellemzője a parancs. Ez egy olyan absztrakció, amely a CLI-kben látható, ahol a felhasználó beír bizonyos szöveget bizonyos funkciók elindításához. Ezt a Discord botunkban érhetjük el, ha meghallgatjuk a felhasználók által küldött új üzeneteket, és adott esetben intelligens válaszokkal válaszolunk.

Sokféle esemény van, amelyekre meghallgathatunk. A hallgató regisztrálása azonban mindegyikük számára megegyezik, ezért először hozzunk létre egy felületet az összes rendezvényhallgatónk számára:

import discord4j.core.event.domain.Event; nyilvános felület EventListener {Logger LOG = LoggerFactory.getLogger (EventListener.class); Osztály getEventType (); Mono végrehajtás (T esemény); alapértelmezett Mono handleError (dobható hiba) {LOG.error ("Nem sikerült feldolgozni" + getEventType (). getSimpleName (), hiba); visszatér Mono.empty (); }}

Most ezt a felületet annyian tudjuk megvalósítani discord4j.core.event.domain.Event kiterjesztéseket, ahogy szeretnénk.

Mielőtt bevezetnénk az első eseményhallgatónkat, módosítsuk az ügyfelünket @Bab konfiguráció várni egy listát EventListener hogy regisztrálhasson minden tavasszal találtat ApplicationContext:

@Bean public GatewayDiscordClient gatewayDiscordClient (Lista eventListeners) {GatewayDiscordClient kliens = DiscordClientBuilder.create (token) .build () .login () .block (); for (EventListener listener: eventListeners) {client.on (listener.getEventType ()) .flatMap (listener :: execute) .onErrorResume (listener :: handleError) .subscribe (); } visszatérő kliens; }

Most csak annyit kell tennünk, hogy regisztrálhassuk az eseményhallgatókat, hogy megvalósítsuk a kezelőfelületünket, és megjegyezzük a Spring's-szel @Összetevőalapú sztereotípiás kommentárok. A regisztráció számunkra automatikusan megtörténik!

Választhattuk volna, hogy minden eseményt külön és kifejezetten regisztrálunk. Általában azonban jobb, ha modulárisabb megközelítést alkalmazunk a jobb kódskálázhatóság érdekében.

Az eseményfigyelő beállításunk most befejeződött, de a bot még mindig nem csinál semmit, ezért adjunk hozzá néhány eseményt, hogy meghallgassuk őket.

4.1. Parancsfeldolgozás

A felhasználói parancs fogadásához két különböző eseménytípust hallgathatunk meg: MessageCreateEvent új üzenetekhez és MessageUpdateEvent a frissített üzenetekhez. Lehet, hogy csak új üzeneteket akarunk hallgatni, de tanulási lehetőségként tegyük fel, hogy mindkét fajta eseményt támogatni szeretnénk botunk számára. Ez további robusztusságot nyújt, amelyet a felhasználóink ​​értékelhetnek.

Mindkét eseményobjektum tartalmazza az összes eseményre vonatkozó lényeges információt. Különösen az üzenet tartalma, az üzenet szerzője és az a csatorna érdekelt bennünket, amelyre elküldték. Szerencsére ezek az adatpontok a Üzenet objektum, amelyet mindkét eseménytípus biztosít.

Ha megvan a Üzenet, ellenőrizhetjük a szerzőt, hogy nem bot-e, ellenőrizhetjük az üzenet tartalmát, hogy megegyezzen-e a parancsunkkal, és az üzenet csatornáját használhatjuk válasz elküldésére.

Mivel teljes mértékben működhetünk mindkét eseményen keresztül azokon keresztül Üzenet objektumokat, tegyük az összes downstream logikát egy közös helyre, hogy mindkét eseményhallgató használhassa:

import discord4j.core.object.entity.Message; public abstract class MessageListener {public Mono processCommand (Message eventMessage) {return Mono.just (eventMessage) .filter (message -> message.getAuthor (). map (user ->! user.isBot ()). vagyElse (false)) .filter (message -> message.getContent (). equalsIgnoreCase ("! todo")) .flatMap (Message :: getChannel) .flatMap (channel -> channel.createMessage ("Ma tennivalók: \ n - botot írni \ n - egyél ebédet \ n - játssz egy játékot ")) .majd (); }}

Sok minden történik itt, de ez a parancs és a válasz legalapvetőbb formája. Ez a megközelítés reaktív funkcionális kialakítást használ, de lehetséges ezt hagyományosabb imperatív módon megírni Blokk().

Több bot parancs skálázása, különféle szolgáltatások vagy adattárak meghívása, vagy akár a Discord szerepkörök használata bizonyos parancsok engedélyezéseként a jó bot parancs architektúra általános részei. Mivel hallgatóink tavaszi irányításúak @Szolgáltatáss könnyedén beadhatunk más tavasszal kezelt babot ezeknek a feladatoknak a kezelésére. Ebben a cikkben azonban ezek egyikével sem foglalkozunk.

4.2. EventListener

Ahhoz, hogy új üzeneteket kapjunk egy felhasználótól, meg kell hallgatnunk a MessageCreateEvent. Mivel a parancsfeldolgozási logika már benne él MessageListener, kibővíthetjük, hogy örököljük ezt a funkcionalitást. Továbbá meg kell valósítanunk a mi EventListener felület, hogy megfeleljen a regisztrációs tervünknek:

@Service public class Az MessageCreateListener kiterjeszti a MessageListener megvalósítja az EventListener {@Override public class getEventType () {return MessageCreateEvent.class; } @Orride public Mono execute (MessageCreateEvent event) {return processCommand (event.getMessage ()); }}

Az öröklés révén az üzenet továbbadódik a miénknek processCommand () módszer, ahol minden ellenőrzés és válasz megtörténik.

Ekkor botunk megkapja és reagál a „! Todo” parancsra. Ha azonban a felhasználó kijavítja a hibásan beírt parancsot, a bot nem válaszol. Támogassuk ezt a felhasználási esetet egy másik eseményhallgatóval.

4.3. EventListener

A MessageUpdateEvent akkor jelenik meg, amikor a felhasználó üzenetet szerkeszt. Hallgathatjuk ezt az eseményt, hogy felismerjük a parancsokat, hasonlóan ahhoz, ahogyan a MessageCreateEvent.

Céljaink érdekében ez az esemény csak akkor törődik velünk, ha az üzenet tartalma megváltozott. Figyelmen kívül hagyhatjuk az esemény más példányait. Szerencsére használhatjuk a isContentChanged () módszer az ilyen esetek kiszűrésére:

@Service nyilvános osztály A MessageUpdateListener kiterjeszti a MessageListener megvalósítja az EventListener {@Override public class getEventType () {return MessageUpdateEvent.class; } @Orride public Mono execute (MessageUpdateEvent event) {return Mono.just (event) .filter (MessageUpdateEvent :: isContentChanged) .flatMap (MessageUpdateEvent :: getMessage) .flatMap (super :: processCommand); }}

Ebben az esetben, mivel getMessage () visszatér Monó nyers helyett Üzenet, használnunk kell flatMap () hogy elküldje a szuperosztályunkba.

5. Tesztelje Botot a viszályban

Most, hogy van egy működő Discord botunk, meghívhatjuk egy Discord szerverre, és tesztelhetjük.

Meghívó link létrehozásához meg kell adnunk, hogy a bot mely engedélyekre van szükség a megfelelő működéshez. Egy népszerű, harmadik féltől származó Discord Engedélyek Számológépet gyakran használnak meghívó link létrehozásához a szükséges engedélyekkel. Bár nem ajánlott a gyártáshoz, tesztelési célokra egyszerűen választhatjuk az „Adminisztrátort”, és nem aggódhatunk a többi engedély miatt. Egyszerűen adja meg botunk kliens azonosítóját (megtalálható a Discord Developer Portal-ban), és a létrehozott link segítségével hívja meg botunkat egy szerverre.

Ha nem adunk rendszergazdai engedélyeket a botnak, akkor szükség lehet a csatorna engedélyeinek módosítására, hogy a bot olvashasson és írhasson egy csatornában.

A bot most válaszol a „! Todo” üzenetre, és amikor egy üzenetet szerkesztenek, hogy „! Todo” legyen:

6. Áttekintés

Ez az oktatóanyag leírta az összes szükséges lépést a Discord bot létrehozásához a Discord4J könyvtár és a Spring Boot segítségével. Végül leírta, hogy miként állíthat be egy skálázható parancs- és válaszstruktúrát a bot számára.

A teljes és működő bot megtekintéséhez tekintse meg a forráskódot a GitHubon. A futtatásához érvényes bot token szükséges.


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