Construirea unui bot Discord folosind Discord.js
Publicat: 2022-03-10Platformele de comunicare în echipă devin populare zi de zi, pe măsură ce tot mai mulți oameni lucrează de acasă. Slack și Discord sunt două dintre cele mai populare platforme de comunicare în echipă. În timp ce Discord este axat pe jucători, unele funcționalități, cum ar fi capacitatea de a adăuga până la 50 de membri în camera de apel vocal, îl fac o alternativă excelentă la Slack. Unul dintre cele mai semnificative avantaje ale utilizării unei astfel de platforme este că multe sarcini pot fi automatizate folosind boți.
În acest articol, vom construi un bot de la zero folosind JavaScript și cu ajutorul Discord.js. Vom acoperi procesul de la construirea botului până la implementarea lui în cloud. Înainte de a construi botul nostru, să notăm funcționalitatea pe care o va avea botul nostru:
- Distribuiți glume aleatorii dintr-o serie de glume.
- Adăugați și eliminați roluri de utilizator selectând emoji.
- Partajați tweet-uri dintr-un anumit cont către un anumit canal.
Deoarece modulul Discord.js se bazează pe Node.js, voi presupune că sunteți oarecum familiarizat cu Node.js și npm. Familiarizarea cu JavaScript este o necesitate pentru acest articol.
Acum că știm cerințele preliminare și scopul nostru, să începem. Și dacă doriți să clonați și să explorați codul imediat, puteți utiliza depozitul GitHub.
Pași de urmat
Vom construi botul urmând câțiva pași.
Mai întâi, vom construi un server Discord . Un server Discord este ca un grup în care poți atribui diverse subiecte pe diverse canale, foarte asemănătoare cu un server Slack. O diferență majoră între Slack și Discord este că Slack necesită acreditări de conectare diferite pentru a accesa diferite servere, în timp ce în Discord puteți accesa toate serverele din care faceți parte cu o singură autentificare.
Motivul pentru care trebuie să creăm un server este că, fără privilegii de administrator pentru un server, nu vom putea adăuga un bot la server. Odată ce serverul nostru este creat, vom adăuga botul la server și vom obține jetonul de acces de pe portalul pentru dezvoltatori Discord. Acest token ne permite să comunicăm cu API-ul Discord. Discord oferă un API deschis oficial cu care să interacționăm. API-ul poate fi folosit pentru orice, de la deservirea solicitărilor pentru roboți până la integrarea OAuth. API-ul acceptă totul, de la un bot cu un singur server până la un bot care poate fi integrat pe sute de servere. Este foarte puternic și poate fi implementat în multe moduri.
Biblioteca Discord.js ne va ajuta să comunicăm cu API-ul Discord folosind simbolul de acces . Toate funcțiile se vor baza pe API-ul Discord. Apoi, putem începe să ne codificăm botul. Vom începe prin a scrie mici bucăți de cod care ne vor prezenta API-ul Discord și biblioteca Discord.js. Vom înțelege apoi conceptul de parțiale în Discord.js. Odată ce înțelegem parțialele, vom adăuga ceea ce este cunoscut sub numele de sistem de „rol de reacție” la bot. După aceasta, vom ști și cum să comunicăm cu Twitter folosind un pachet npm numit twit
. Acest pachet npm ne va ajuta să integrăm funcționalitatea de redirecționare a Twitter Twitter. În cele din urmă, îl vom implementa în cloud folosind Heroku.
Acum că știm cum ne vom construi botul, să începem să lucrăm la el.
Construirea unui server Discord
Primul lucru pe care trebuie să-l facem este să creăm un server Discord . Fără un server cu privilegii de administrator, nu vom putea integra botul.
Construirea unui server Discord este ușoară, iar Discord oferă acum șabloane, care îl fac și mai ușor. Urmați pașii de mai jos și serverul dvs. Discord va fi gata. Mai întâi, vom alege cum vom accesa portalul Discord. Putem folosi fie versiunea web, fie aplicația. Ambele funcționează la fel. Vom folosi versiunea web pentru acest tutorial.
Dacă citiți acest articol, presupun că aveți deja un cont Discord. Dacă nu, trebuie doar să creați un cont ca pe orice alt site web. Faceți clic pe butonul „Autentificare” din dreapta sus și conectați-vă dacă aveți un cont sau faceți clic pe butonul „Înregistrare”. Completați formularul simplu, completați Captcha și veți fi creat cu succes un cont. După ce deschideți aplicația sau site-ul web Discord, faceți clic pe pictograma plus din partea stângă, unde se află lista de servere. Când faceți clic pe el, vi se va solicita să alegeți un șablon sau să creați al dvs.
Vom alege opțiunea „Creați-mi propriul”. Să sărim peste următoarea întrebare. Vom numi serverul nostru Discord „Exemplu zdrobitor”. De asemenea, puteți furniza o fotografie pentru serverul dvs. Făcând clic pe butonul „Creați”, vă va crea serverul.
Înregistrarea botului cu Discord
Înainte de a codifica botul, trebuie să obținem un token furnizat de Discord . Acest token va stabili o conexiune de la codul nostru la Discord. Pentru a obține jetonul, trebuie să ne înregistrăm botul pe serverul nostru. Pentru a înregistra botul, trebuie să vizităm portalul pentru dezvoltatori Discord. Dacă construiți o aplicație Discord pentru prima dată, veți găsi o listă goală acolo. Pentru a ne înregistra aplicația, faceți clic pe linkul „Aplicație nouă” din colțul din dreapta sus. Dați un nume aplicației dvs. și faceți clic pe butonul „Creați”. Vom numi aplicația noastră „Smashing App”.
Noul meniu ne oferă câteva opțiuni. În partea dreaptă este o opțiune etichetată „Bot”. Faceți clic pe el și selectați „Adăugați bot”. Faceți clic pe confirmare, schimbați numele botului dacă doriți, salvați modificările și copiați simbolul primit de pe această pagină. Botul nostru este acum înregistrat la Discord. Putem începe să adăugăm funcționalități și să codificăm botul.
Construirea lui Bot
Ce este Discord.js?
Discord.js se definește astfel:
Discord.js este un modul puternic node.js care vă permite să interacționați cu API-ul Discord foarte ușor. Este nevoie de o abordare mult mai orientată pe obiect decât majoritatea altor biblioteci JS Discord, făcând codul botului dvs. semnificativ mai ordonat și mai ușor de înțeles.
Deci, Discord.js face interacțiunea cu API-ul Discord mult mai ușoară. Are acoperire 100% cu API-ul oficial Discord.
Inițializarea Bot-ului
Deschideți editorul de text preferat și creați un folder în care vor fi salvate toate fișierele dvs. Deschideți interfața de linie de comandă (CLI), cd
în folder și inițializați folderul cu npm: npm init -y
.
Vom avea nevoie de două pachete pentru a începe construirea botului. Primul este dotenv, iar al doilea, evident, este modulul Discord.js Node.js. Dacă sunteți familiarizat cu Node.js, atunci veți fi familiarizat cu pachetul dotenv. Încarcă variabilele de mediu dintr-un fișier numit .env
în process.env
.
Instalați aceste două folosind npm i dotenv discord.js
.
Odată ce instalarea este finalizată, creați două fișiere în folderul rădăcină. Denumiți unul dintre fișiere .env
. Numiți celălalt fișier principal cum doriți. Îi voi numi app.js
Structura folderului va arăta astfel:
│ .env │ app.js │ package-lock.json │ package.json └─── node_modules
Vom stoca jetoane și alte informații sensibile în fișierul .env
și vom stoca codul care produce rezultatele în fișierul app.js
Deschideți fișierul .env
și creați o nouă variabilă. Să numim variabila BOT_TOKEN
pentru acest exemplu. Lipiți indicativul în acest fișier. Fișierul .env
va arăta acum similar cu acesta:
BOT_TOKEN=ODAxNzE1NTA2Njc1NDQ5ODY3.YAktvw.xxxxxxxxxxxxxxxxxxxxxxxx
Putem începe să lucrăm la fișierul app.js
Primul lucru de făcut este să solicitați modulele pe care le-am instalat.
const Discord = require('discord.js'); require('dotenv').config();
Modulul dotenv
este inițializat folosind metoda config()
. Putem trece parametri la metoda config()
. Dar pentru că aceasta este o utilizare foarte simplă a modulului dotenv, nu avem nevoie de nicio funcție specială de la acesta.
Pentru a începe să folosim modulul Discord.js, trebuie să inițializam un constructor. Acest lucru este prezentat în documentație:
const client = new Discord.Client();
Modulul Discord.js oferă o metodă numită client.on
. Metoda client.on
ascultă diverse evenimente. Biblioteca Discord.js este bazată pe evenimente , ceea ce înseamnă că de fiecare dată când un eveniment este emis din Discord, funcționalitatea atașată evenimentului respectiv va fi invocată.
Primul eveniment pe care îl vom asculta este evenimentul ready
. Această metodă se va declanșa când conexiunea cu API-ul Discord este gata. În această metodă, putem transmite funcții care vor fi executate atunci când se stabilește o conexiune între API-ul Discord și aplicația noastră. Să transmitem o instrucțiune console.log
în această metodă, astfel încât să putem ști dacă este stabilită o conexiune. Metoda client.on
cu evenimentul ready
va arăta astfel:
client.on('ready', () => { console.log('Bot is ready'); });
Dar, acest lucru nu va stabili o conexiune cu API-ul, deoarece nu ne-am conectat la bot cu serverul Discord. Pentru a activa acest lucru, modulul Discord.js oferă o metodă de login
. Folosind metoda de login
disponibilă pe client și trecând simbolul în această metodă, ne putem conecta în aplicație cu serverul Discord.
client.login(process.env.BOT_TOKEN)
Dacă porniți aplicația acum - cu node app.js
sau, dacă utilizați nodemon, atunci cu nodemon app.js
- veți putea vedea mesajul din consolă pe care l-ați definit. Botul nostru s-a conectat cu succes la serverul Discord acum. Putem începe să experimentăm cu unele funcționalități.
Să începem prin a obține un conținut de mesaj în funcție de cod.
message
Eveniment
Evenimentul message
ascultă un mesaj. Folosind metoda de reply
, putem programa botul să răspundă conform mesajului utilizatorului.
client.on('message', (msg) => { if (msg.content === 'Hello') msg.reply('Hi'); });
Acest exemplu de cod va răspunde cu „Bună” ori de câte ori este primit un mesaj „Bună ziua”. Dar pentru ca acest lucru să funcționeze, trebuie să conectăm botul cu un server.
Conectarea botului cu un server Discord
Până în acest moment, botul nu este conectat la niciun server. Pentru a vă conecta la serverul nostru ( Smashing Example ), vizitați portalul pentru dezvoltatori Discord. Faceți clic pe numele aplicației pe care am creat-o mai devreme în acest tutorial (în cazul nostru, „Smashing App”). Selectați aplicația și faceți clic pe opțiunea „OAuth2” din meniu. Veți găsi un grup numit „Scopes”. Bifați caseta de validare „bot” și copiați adresa URL care este generată.
Accesați această adresă URL într-o filă nouă, alegeți serverul dvs. și faceți clic pe „Autorizare”. Completați Captcha, iar botul nostru va fi acum conectat la serverul pe care l-am ales.
Dacă vizitați acum serverul Discord, veți vedea că Discord a trimis deja o notificare, iar botul apare acum și în lista membrilor din partea dreaptă.
Adăugarea de funcționalități la Bot
Acum că botul nostru este conectat la server, dacă trimiteți un „Salut” serverului, botul va răspunde cu un „Salut”. Aceasta este doar o introducere în API-ul Discord. Adevărata distracție este pe cale să înceapă.
Pentru a ne familiariza un pic mai mult cu modulul Discord.js, să adăugăm o funcționalitate care trimite o glumă ori de câte ori este primită o anumită comandă. Acest lucru este similar cu ceea ce tocmai am făcut.
Adăugarea unei funcții de glumă aleatoare la bot
Pentru a face această parte mai clară și mai ușor de înțeles, nu vom folosi niciun API. Glumele pe care botul nostru le va întoarce vor fi o simplă matrice. Un număr aleatoriu va fi generat de fiecare dată în intervalul matricei și acea locație specifică a matricei va fi accesată pentru a returna o glumă.
În cazul în care ați folosit vreodată funcționalitatea oferită de un bot în Discord, este posibil să fi observat că un anumit caracter special distinge mesajele normale de comenzile speciale. Am de gând să folosesc un ?
în fața comenzilor noastre pentru a le face să arate diferit de mesajele normale. Deci, comanda noastră de glumă va fi ?joke
.
Vom crea o matrice numită jokes
în fișierul nostru app.js
Modul în care vom obține o glumă aleatorie din matrice este folosind această formulă:
jokes[Math.floor(Math.random() * jokes.length)]
Formula Math.random() * jokes.length
va genera un număr aleator în intervalul matricei. Metoda Math.floor
va limita numărul care este generat.
Dacă console.log()
asta, Math.floor(Math.random() * jokes.length)
, veți obține o înțelegere mai bună. În cele din urmă, jokes[]
ne va oferi o glumă aleatorie din matricea de jokes
.
Poate ați observat că primul nostru cod a fost folosit pentru a răspunde la mesajul nostru. Dar nu vrem să primim un răspuns aici. Mai degrabă, vrem să primim o glumă ca mesaj, fără a eticheta pe nimeni. Pentru aceasta, modulul Discord.js are o metodă numită channel.send()
. Folosind această metodă, putem trimite mesaje către canalul unde a fost apelată comanda. Deci, codul complet până în acest punct arată astfel:
const Discord = require('discord.js'); require('dotenv').config(); const client = new Discord.Client(); client.login(process.env.BOT_TOKEN); client.on('ready', () => console.log('The Bot is ready!')); // Adding jokes function // Jokes from dcslsoftware.com/20-one-liners-only-software-developers-understand/ // www.journaldev.com/240/my-25-favorite-programming-quotes-that-are-funny-too const jokes = [ 'I went to a street where the houses were numbered 8k, 16k, 32k, 64k, 128k, 256k and 512k. It was a trip down Memory Lane.', '“Debugging” is like being the detective in a crime drama where you are also the murderer.', 'The best thing about a Boolean is that even if you are wrong, you are only off by a bit.', 'A programmer puts two glasses on his bedside table before going to sleep. A full one, in case he gets thirsty, and an empty one, in case he doesn't.', 'If you listen to a UNIX shell, can you hear the C?', 'Why do Java programmers have to wear glasses? Because they don't C#.', 'What sits on your shoulder and says “Pieces of 7! Pieces of 7!”? A Parroty Error.', 'When Apple employees die, does their life HTML5 in front of their eyes?', 'Without requirements or design, programming is the art of adding bugs to an empty text file.', 'Before software can be reusable it first has to be usable.', 'The best method for accelerating a computer is the one that boosts it by 9.8 m/s2.', 'I think Microsoft named .Net so it wouldn't show up in a Unix directory listing.', 'There are two ways to write error-free programs; only the third one works.', ]; client.on('message', (msg) => { if (msg.content === '?joke') { msg.channel.send(jokes[Math.floor(Math.random() * jokes.length)]); } });
Am eliminat partea „Salut”/„Salut” din cod, deoarece nu ne mai este de folos.
Acum că aveți o înțelegere de bază a modulului Discord.js, să mergem mai adânc. Dar modulul poate face mult mai mult - de exemplu, adăugarea unor roluri unei persoane sau interzicerea acestora sau darea afară. Deocamdată, vom construi un sistem simplu de reacție-rol.
Construirea unui sistem de reacție-rol
Ori de câte ori un utilizator răspunde cu un emoji special într-un anumit mesaj sau canal, utilizatorului i se va acorda un rol legat de acel emoji. Implementarea va fi foarte simplă. Dar înainte de a construi acest sistem de reacție-rol, trebuie să înțelegem parțiale.
Parțiale
Parțial este un concept Discord.js. De obicei, Discord.js memorează în cache toate mesajele, ceea ce înseamnă că stochează mesajele într-o colecție. Când un mesaj memorat în cache primește un eveniment, cum ar fi primirea unui mesaj sau a unui răspuns, este emis un eveniment. Dar mesajele trimise înainte ca botul să înceapă sunt scoase în cache. Deci, reacționarea la astfel de cazuri nu va emite niciun eveniment, cu excepția cazului în care le luăm înainte de a le folosi. Versiunea 12 a bibliotecii Discord.js introduce conceptul de parțiale. Dacă vrem să captăm astfel de evenimente necache , trebuie să optăm pentru partiale. Biblioteca are cinci tipuri de partiale:
-
USER
-
CHANNEL
-
GUILD_MEMBER
-
MESSAGE
-
REACTION
În cazul nostru, vom avea nevoie doar de trei tipuri de parțiale:
-
USER
, persoana care reactioneaza; -
MESSAGE
, mesajul la care reacționează; -
REACTION
, reacția dată de utilizator la mesaj.
Documentația conține mai multe despre parțiale.
Biblioteca Discord.js oferă o modalitate foarte ușoară de a utiliza parțiale. Trebuie doar să adăugăm o singură linie de cod, trecând un obiect în constructorul Discord.Client()
. Noul constructor arată astfel:
const client = new Discord.Client({ partials: ['MESSAGE', 'REACTION', 'CHANNEL'], });
Crearea de roluri pe serverul Discord
Pentru a activa sistemul de reacție-rol, trebuie să creăm câteva roluri. Primul rol pe care îl vom crea este rolul bot . Pentru a crea un rol, accesați „Setări server”:
În setările serverului, accesați opțiunea „Roluri” și faceți clic pe pictograma plus mic ( +
) de lângă unde scrie „Roluri”.
Mai întâi, haideți să creăm rolul bot
și asigurați-vă că bifați opțiunea „Gestionați roluri” din meniul de opțiuni de rol. Odată ce rolul bot
este creat, puteți adăuga mai multe roluri. Am adăugat roluri js
, c++
și python
. Nu trebuie să le oferi nicio abilitate specială, dar este o opțiune.
Aici, amintiți-vă un lucru: rolurile Discord funcționează în funcție de prioritate . Orice rol care are roluri dedesubt poate gestiona rolurile de dedesubt, dar nu poate gestiona rolurile de deasupra. Dorim ca rolul nostru de bot să gestioneze rolurile js
, c++
și python
. Deci, asigurați-vă că rolul bot
este deasupra celorlalte roluri. Pur și simplu trageți și plasați pentru a schimba ordinea rolurilor în meniul „Roluri” din setările serverului dvs.
Când ați terminat de creat roluri, atribuiți rolul de bot
botului . Pentru a acorda un rol, faceți clic pe numele botului din lista de membri din partea dreaptă a serverului, apoi faceți clic pe pictograma plus mic ( +
). Vă va arăta toate rolurile disponibile. Selectați aici rolul „bot” și veți termina.
Activarea modului dezvoltator în Discord
Rolurile pe care le-am creat nu pot fi folosite după numele lor în codul nostru. În Discord, totul, de la mesaje la roluri, are propriul său ID. Dacă faceți clic pe indicatorul „mai mult” din orice mesaj, veți vedea o opțiune numită „Copiați ID”. Această opțiune este disponibilă pentru tot în Discord, inclusiv pentru roluri.
Cel mai probabil, nu veți găsi această opțiune în mod implicit. Va trebui să activați o opțiune numită „Mod dezvoltator”. Pentru a-l activa, mergeți la setările Discord (nu la setările serverului), chiar lângă numele dvs. în stânga jos. Apoi accesați opțiunea „Aspect” din „Setări aplicație” și activați „Modul dezvoltator” de aici. Acum veți putea copia ID-urile.
messageReactionAdd
și messageReactionRemove
Evenimentul care trebuie emis atunci când un mesaj este reacţionat este messageReactionAdd
. Și ori de câte ori o reacție este eliminată, evenimentul messageReactionRemove
ar trebui să fie emis.
Să continuăm construirea sistemului. După cum am spus, mai întâi trebuie să ascultăm evenimentul messageReactionAdd
. Atât evenimentele messageReactionAdd
, cât și messageReactionRemove
preia doi parametri în funcția lor de apel invers. Primul parametru este reaction
, iar al doilea este user
. Acestea sunt destul de explicite.
Codificarea funcționalității reacție-rol
Mai întâi, vom crea un mesaj care descrie ce emoji va acorda ce rol, ceva asemănător cu ceea ce am făcut aici:
S-ar putea să vă gândiți, cum vom folosi acele emoji în codul nostru? Emoji-urile implicite sunt Unicode și va trebui să copiem versiunea Unicode. Dacă urmați sintaxa \:emojiName:
și apăsați „Enter”, veți primi un emoji cu numele. De exemplu, emoji-ul meu pentru rolul JavaScript este vulpe; deci, dacă tast \:fox:
și apăs pe „Enter” în Discord, voi primi un emoji de vulpe. În mod similar, aș folosi \:tiger:
și \:snake:
pentru a obține acele emoji. Păstrați-le în configurația dvs. Discord; vom avea nevoie de ele mai târziu.
Iată codul de pornire. Această parte a codului verifică pur și simplu unele cazuri marginale. Odată ce înțelegem aceste cazuri, vom implementa logica sistemului de reacție-rol.
// Adding reaction-role function client.on('messageReactionAdd', async (reaction, user) => { if (reaction.message.partial) await reaction.message.fetch(); if (reaction.partial) await reaction.fetch(); if (user.bot) return; if (!reaction.message.guild) return; });
Trecem într-o funcție asincronă. În apelul invers, primul lucru pe care îl facem este să verificăm dacă mesajul este parțial . Dacă este, atunci îl preluăm, adică îl memorăm în cache sau îl stocăm într-o metodă de hartă JavaScript. În mod similar, verificăm dacă reacția în sine este parțială și apoi facem același lucru. Apoi, verificăm dacă utilizatorul care a reacționat este un bot, deoarece nu vrem să atribuim roluri botului care reacționează la mesajele noastre. În cele din urmă, verificăm dacă mesajul este pe server. Discord.js folosește guild
ca nume alternativ al serverului. Dacă mesajul nu este pe server, atunci vom opri funcția.
Botul nostru va atribui rolurile numai dacă mesajul este în canalul de roles
. Dacă faceți clic dreapta pe canalul de roles
, veți vedea o opțiune „Copiați ID”. Copiați ID-ul și urmați-l.
if (reaction.message.channel.id == '802209416685944862') { if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208163776167977'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208242696192040'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208314766524526'); } } else return;
Mai sus este restul codului din apel invers. Folosim proprietatea reaction.message.channel.id
pentru a obține ID-ul canalului. Apoi, îl comparăm cu ID-ul canalului de roluri pe care tocmai l-am copiat. Dacă este adevărat, atunci verificăm emoji-urile și le comparăm cu reacțiile. Reaction.emoji.name returnează emoji-ul care a fost folosit pentru a reaction.emoji.name
. O comparăm cu versiunea noastră Unicode a emoji. Dacă se potrivesc, atunci așteptăm proprietatea reaction.message.guild.members.cache
.
Cache-ul este o colecție care stochează datele . Aceste colecții sunt o Map
JavaScript cu utilități suplimentare. Una dintre utilitățile pe care le oferă este metoda get
. Pentru a obține orice prin ID, putem pur și simplu să transmitem ID-ul în această metodă. Deci, trecem user.id
în metoda get
pentru a obține utilizatorul. În cele din urmă, metoda roles.add
adaugă rolul utilizatorului. În metoda roles.add
, transmitem ID-ul rolului. Puteți găsi ID-ul rolului în opțiunea „Rol” a setărilor de server. Făcând clic dreapta pe un rol, veți avea opțiunea de a copia ID-ul rolului. Și am terminat de adăugat sistemul de rol de reacție la botul nostru!
Putem adăuga funcționalitate pentru ca un rol să fie eliminat atunci când un utilizator își elimină reacția din mesaj. Acesta este exact același cu codul nostru de mai sus, singura diferență fiind că ascultăm evenimentul messageReactionRemove
și folosim metoda roles.remove
. Deci, codul complet pentru adăugarea și eliminarea rolurilor ar fi astfel:
// Adding reaction-role function client.on('messageReactionAdd', async (reaction, user) => { if (reaction.message.partial) await reaction.message.fetch(); if (reaction.partial) await reaction.fetch(); if (user.bot) return; if (!reaction.message.guild) return; if (reaction.message.channel.id == '802209416685944862') { if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208163776167977'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208242696192040'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208314766524526'); } } else return; }); // Removing reaction roles client.on('messageReactionRemove', async (reaction, user) => { if (reaction.message.partial) await reaction.message.fetch(); if (reaction.partial) await reaction.fetch(); if (user.bot) return; if (!reaction.message.guild) return; if (reaction.message.channel.id == '802209416685944862') { if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.remove('802208163776167977'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.remove('802208242696192040'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.remove('802208314766524526'); } } else return; });
Adăugarea funcției de redirecționare Twitter
Următoarea funcție pe care o vom adăuga botului nostru va fi puțin mai provocatoare. Dorim să ne concentrăm asupra unui anumit cont Twitter, astfel încât de fiecare dată când contul Twitter postează un tweet, acesta să fie redirecționat către canalul nostru Discord .
Înainte de a începe să codificăm, va trebui să obținem token-urile necesare de pe portalul pentru dezvoltatori Twitter. Vizitați portalul și creați o nouă aplicație făcând clic pe butonul „Creați aplicația” din opțiunea „Prezentare generală”. Dați un nume aplicației dvs., copiați toate indicatoarele și lipiți-le în fișierul .env
al codului dvs., cu numele corecte. Apoi faceți clic pe „Setări aplicație” și activați caracteristica OAuth cu trei picioare. Adăugați adresele URL de mai jos ca adrese URL de apel invers în scopuri de testare:
https://127.0.0.1/ https://localhost/
Dacă dețineți un site web, adăugați adresa la adresa URL a site-ului web și faceți clic pe „Salvați”. Mergeți la fila „Chei și jetoane” și generați cheile și jetoanele de acces. Copiați și salvați-le în fișierul dvs. .env
. Lucrarea noastră cu portalul pentru dezvoltatori Twitter este încheiată. Putem reveni la editorul nostru de text pentru a continua codificarea botului. Pentru a obține funcționalitatea pe care o dorim, trebuie să adăugăm un alt pachet npm numit twit
. Este un client API Twitter pentru Node.js. Acceptă atât REST, cât și API-ul de streaming.
Mai întâi, instalați pachetul twit folosind npm install twit
și solicitați-l în fișierul principal:
const Twit = require('twit');
Trebuie să creăm o instanță twit folosind constructorul Twit
. Introduceți un obiect în constructorul Twit
cu toate jetoanele pe care le-am primit de la Twitter:
const T = new Twit({ consumer_key: process.env.API_TOKEN, consumer_secret: process.env.API_SECRET, access_token: process.env.ACCESS_KEY, access_token_secret: process.env.ACCESS_SECRET, bearer_token: process.env.BEARER_TOKEN, timeout_ms: 60 * 1000, });
Un timeout este de asemenea specificat aici. Vrem ca toți atacanții să fie pe un anumit canal. Am creat un canal separat numit „Twitter forwards”, unde vor fi redirecționate toate tweet-urile. Am explicat deja cum poți crea un canal. Creați-vă propriul canal și copiați ID-ul.
// Destination Channel Twitter Forwards const dest = '803285069715865601';
Acum trebuie să creăm un flux. Un stream API permite accesul la un flux de date prin rețea. Datele sunt împărțite în bucăți mai mici, apoi sunt transmise. Iată codul nostru pentru a transmite datele:
// Create a stream to follow tweets const stream = T.stream('statuses/filter', { follow: '32771325', // @Stupidcounter });
În tasta de follow
, specific @Stupidcounter
, deoarece tweetează în fiecare minut, ceea ce este grozav pentru scopurile noastre de testare. Puteți furniza ID-ul oricărui handle Twitter pentru a obține tweet-urile acestuia. TweeterID vă va oferi ID-ul oricărui mâner. În cele din urmă, utilizați metoda stream.on
pentru a obține datele și a le transmite în flux către canalul dorit.
stream.on('tweet', (tweet) => { const twitterMessage = `Read the latest tweet by ${tweet.user.name} (@${tweet.user.screen_name}) here: https://twitter.com/${tweet.user.screen_name}/status/${tweet.id_str}`; client.channels.cache.get(dest).send(twitterMessage); return; });
Ascultăm evenimentul tweet
și, ori de câte ori se întâmplă acest lucru, transmitem tweet-ul unei funcții de apel invers. Vom construi un mesaj personalizat; în cazul nostru, mesajul va fi:
Read the latest tweet by The Count (@Stupidcounter) here: https://twitter.com/Stupidcounter/status/1353949542346084353
Din nou, folosim metoda client.channels.cache.get
pentru a obține canalul dorit și metoda .send
pentru a trimite mesajul nostru. Acum, rulați botul și așteptați un minut. Mesajul Twitter va fi trimis la server.
Deci, iată codul complet de redirecționare Twitter:
// Adding Twitter forward function const Twit = require('twit'); const T = new Twit({ consumer_key: process.env.API_TOKEN, consumer_secret: process.env.API_SECRET, access_token: process.env.ACCESS_KEY, access_token_secret: process.env.ACCESS_SECRET, bearer_token: process.env.BEARER_TOKEN, timeout_ms: 60 * 1000, }); // Destination channel Twitter forwards const dest = '803285069715865601'; // Create a stream to follow tweets const stream = T.stream('statuses/filter', { follow: '32771325', // @Stupidcounter }); stream.on('tweet', (tweet) => { const twitterMessage = `Read the latest tweet by ${tweet.user.name} (@${tweet.user.screen_name}) here: https://twitter.com/${tweet.user.screen_name}/status/${tweet.id_str}`; client.channels.cache.get(dest).send(twitterMessage); return; });
Toate funcțiile pe care vrem să le adăugăm sunt finalizate. Singurul lucru rămas acum este să-l implementați în cloud. Vom folosi Heroku pentru asta.
Desfășurarea botului în Heroku
Mai întâi, creați un fișier nou în directorul rădăcină al folderului codului dvs. bot. Numiți-i Procfile
. Acest Procfile
va conține comenzile care vor fi executate la pornirea programului. În fișier, vom adăuga worker: node app.js
, care va informa Heroku despre ce fișier să ruleze la pornire.
După adăugarea fișierului, să inițiem un depozit git
și să împingem codul nostru în GitHub (cum să facem acest lucru depășește scopul acestui articol). Un lucru pe care l-aș sugera este să adăugați folderul node_modules
și fișierul .env
la fișierul .gitignore
, astfel încât dimensiunea pachetului dvs. să rămână mică și informațiile sensibile să nu fie partajate în exterior.
După ce ați trimis cu succes tot codul în GitHub, vizitați site-ul web Heroku. Conectați-vă sau creați un cont dacă nu aveți deja unul. Faceți clic pe butonul „Nou” pentru a crea o nouă aplicație și denumiți-o după cum doriți. Alegeți „Metoda de implementare” ca GitHub.
Căutați aplicația dvs. și faceți clic pe conectare odată ce o găsiți. Activați implementarea automată din meniul „Deploy”, astfel încât de fiecare dată când introduceți modificări la cod, codul va fi implementat automat în Heroku.
Acum, trebuie să adăugăm variabilele de configurare la Heroku, ceea ce este foarte ușor. Accesați opțiunea „Setări”, sub numele aplicației dvs. și faceți clic pe „Reveal Config Vars”.
Aici, am adăugat variabilele de configurare ca perechi cheie-valoare. După ce ați terminat, accesați din nou fila „Deploy” și faceți clic pe „Deploy Branch” sub „Manual Deploy”.
Ultimul lucru de luat în considerare este că s-ar putea să întâmpinați o eroare de 60 de secunde care oprește executarea botului. Pentru a preveni acest lucru, trebuie să schimbăm tipul de lucrător al aplicației. În Heroku, dacă accesați fila „Resurse” a aplicației dvs., veți vedea că, sub „Dynos gratuit”, web npm start
este activată. Trebuie să dezactivăm acest lucru și să activăm worker node app.js
. Deci, faceți clic pe butonul de editare de lângă butonul de pornire web npm start
, dezactivați-l și activați opțiunea worker node app.js
Confirmați modificarea. Reporniți toate dynos-urile și am terminat!
Concluzie
Sper că ți-a plăcut să citești acest articol. Am încercat să acopăr toate elementele de bază pe care trebuie să le înțelegeți în dezvoltarea unui bot complicat. Documentația Discord.js este un loc minunat pentru a afla mai multe. Are explicații grozave. De asemenea, veți găsi tot codul în depozitul GitHub. Și iată câteva resurse care vă vor ajuta în dezvoltarea ulterioară:
- Documentație, Portal pentru dezvoltatori Discord
- Discord API (server Discord)
- Parțiale, Discord.js, GitHub
- Portal pentru dezvoltatori, Twitter
- Twit, pachet și documentație