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.