Nan atik sa a, nou pral pale sou manyèlman kreye yon bot pou jwe mizik nan dezakò. Ou ka senpleman kopye tout kòd la soumèt, ak edit li pou tèt ou si ou posede ladrès JavaScript. Bot la te kreye pa nou, men nan kèk etap itilizatè a ka toujou fè fas a pwoblèm diferan, se konsa nou konseye w ak anpil atansyon li pa sèlman enstriksyon nou an, men tou, parèt sou kòd yo erè ekran si gen sa yo.
Si li sanble ke materyèl sa a twò konplike pou ou oswa ou pa apwopriye pou lòt rezon, sèvi ak pare-fè robo gratis yo jwe mizik. Atik la sou lyen ki anba a ou pral jwenn enfòmasyon detaye sou sa a epi ou ka aplike travay la.
Li piplis:
Ajoute yon bot mizik nan sèvè a nan dezakò
Jwe mizik nan bot nan dezakò
Etap 1: Kreye yon nouvo aplikasyon
Chak bot pou jete a dwe anrejistre sou pòtal ofisyèl la pou devlopè. Se konsa, ou jwenn aksè nan tout anviwònman ki nesesè ki asosye ak autorisations yo ak konpòtman an jeneral nan bot la, ou ka kopye lyen ki nan otorizasyon li yo nan sèvè a pèsonèl epi sèvi ak siy la inik, ki se nesesè pou plis devlopman nan kòmandman.
Ale nan sit entènèt ofisyèl la nan Portal Discord Developer
- Sèvi ak lyen ki anwo a yo louvri paj prensipal Portal a pou devlopè, ouvri sesyon an nan kont pèsonèl la dezakò, epi klike sou "nouvo aplikasyon an" yo kreye yon nouvo aplikasyon.
- Ekri non l ', yo bay singularité a, paske si gen robo anpil ak non an menm, li pa pral posib yo kreye li - se yon avi sou lòt non konnen.
- Apre yo fini, louvri meni an sou sit la epi chwazi "Bot" kategori.
- Opoze "bati-yon-bot" fisèl la klike sou "Add bot la".
- Konfime adisyon bot la pou aplikasyon an chwazi.
- Atravè yon meni abitye, ale nan «OAuth2».
- Seksyon sa a responsab pou paramèt jeneral bot la ak otorizasyon li yo. Nan "Scopes" blòk la, make "bot" paragraf la.
- Nan lis la nan autorisations, asire w ke ou aktive koneksyon nan chanèl vwa ak kapasite nan pale, kòm li nesesè pou plis mizik difize.
- Bot la ta dwe kapab li epi voye mesaj, Se konsa, pa bliye yo ki ap pèmèt opsyon sa yo nan seksyon an ak autorisations chat tèks. Natirèlman, ou ka bay tout autorisations nan yon fwa, men apwòch sa a se enkwayab, espesyalman nan ka kote ou fè yon bot pou yon itilizatè mas.
- Le pli vit ke se anviwònman an pèmisyon ranpli, kopi lyen ki pou otorizasyon an premye nan bot la sou sèvè a, paske otreman ajoute li jouk li vire soti.
- Swiv lyen sa a epi chwazi sèvè a tès kote ou vle tcheke bot la.
- Konfime kaptire epi tann pou enfòmasyon sou otorizasyon siksè.
Koulye a, ou gen yon bot ak yon siy inik, epi li te bot la deja te ajoute nan sèvè a, men pandan ke yo nan mòd offline. Pou kòmanse li, li pral gen fè yon kèk plis aksyon sou òdinatè a lokal yo, depi pandan ke nou pa dechaje bot boting a pou operasyon offline.
Etap 2: aksyon Preparatory
Aksyon Preparatory gen ladan kreyasyon an repèrtwar yo mande yo ak dosye, enstalasyon an nan zouti ak Dependencies pou yo. Pa gen anyen ki konplike nan sa a, ou sèlman bezwen fè chak aksyon nan vire, ak anpil atansyon swiv erè yo ki nan nenpòt ki etap yo.
- Kreye yon katab ak non an nan bot la. Ou ka chwazi nenpòt kote, men se folder nan kay la itilizatè a pi byen adapte pou sa a.
- Kreye de dosye nan li: "Config.json" ak "index.js". Nan premye a enstale konfigirasyon an jeneral nan bot la - prefiks li yo ak siy inik, ak nan dezyèm lan - kòd la pwogram tout antye ak kòmandman ak travay komen nan zouti sa a.
- Pou travay la nan bot la ap bezwen node.js. Zouti sa a fèt pou kòmanse Scripts sou òdinatè lokal la. Swiv lyen ki anba a epi telechaje enstale li pou fenèt yo.
Download node.js soti nan sit ofisyèl la
- Atann yo download ègzèkutabl ègzèkutabl dosye a, kouri li epi yo pase pwosedi a enstalasyon senp, apre enstriksyon yo parèt sou ekran an.
- Apre sa, louvri "liy lan lòd" pratik pou ou, pou egzanp, k ap antre nan CMD nan "kouri" sèvis piblik la (li kòmanse genyen + R kle konbinezon an).
- Enstale modil la nan travay ak API la Discord, ki te rele "Discord.js". Pou fè sa, nan fenèt la konsole ki ouvè, antre nan NPM a enstale diskord.js ffmpeg-binèr opsscript ytdl-nwayo --save ak laprès antre - se konsa ou imedyatman ajoute tout depandans ki nesesè yo.
- Rete tann pou notifikasyon sou ekran an sou yon enstalasyon siksè, san yo pa fèmen fenèt konsole aktyèl la. Si erè parèt, aprann kòd yo epi sèvi ak motè rechèch la jwenn yon desizyon travay sou fowòm yo oswa sit entènèt ofisyèl la.
Kòm yon rezilta, folder kay itilizatè a ta dwe parèt dosye ki asosye ak eleman nan node.js ak te ajoute apre modil la. Rekòmanse òdinatè a pou ke bot la pa gen difikilte pou demaraj, lè sa a ale nan pwochen etap la.
Etap 3: koreksyon dosye konfigirasyon bot
Ou deja konnen ke nan dosye a te kreye konfigirasyon bot la pral gen tout yon pè nan ranje nan kòd la ki responsab pou prefiks la itilize (senbòl anvan yo rantre nan lòd la sou sèvè a) ak yon siy inik ki defini aplikasyon an nan API la. Pou satisfè tout aksyon plis, nou rekòmande pou telechaje yon pwogram ak sipò JS Sentaks oswa nenpòt editè tèks avanse si sa a pa te fè deja. Atik la sou lyen ki anba a ou yo pral kapab familyarize w avèk solisyon yo disponib apwopriye.
Li plis: Chwazi anviwònman an Devlopman pou Programming
Le pli vit ke li se enstale sou òdinatè a ak pare nan travay, ou ka san danje kòmanse edite dosye a konfigirasyon, k ap antre nan done itilizatè la.
- Kouri dosye a config.js nan yon editè tèks oswa anviwònman devlopman, insert kòd ki anba a.
{
"Prefiks": "!",
"Siy": "ou-toke"
}
Chanje prefiks la nan quotes doub nan vle a oswa kite yon mak esklamasyon. Yon egzanp sou yon lòd lè l sèvi avèk siy sa a sanble tankou sa a :! Jwe.
- Ale nan bot ou sou pòtal la devlopman, jwenn yon siy inik gen ak kopi li.
- Antre enspeksyon ou-toke olye san yo pa efase quotes doub.
- Sove chanjman yo epi fèmen dosye sa a. By wout la, ou ka fè aksyon an menm nan yon estanda "kaye".
Sou aksyon sa a ak dosye a konfigirasyon yo fin fèt, pa gen okenn ankò ou bezwen preskri yon sèl liy nan kòd. Fèmen li, san yo pa bliye pou konsève pou edits yo te fè, epi kontinye nan plis ekri bot la pou jwe mizik.
Etap 4: Jijman kòmanse bot
Premyèman, nou bezwen asire w ke se bot la jeneralman kouri sou sèvè a ak ale nan mòd nan sou entènèt, li pral nesesè yo ekri pati prensipal li yo nan kòd la nan index.js, ak Lè sa a, sèvi ak ne.js yo kòmanse.
- Atravè anviwònman an devlopman oswa editè a tèks chwazi, louvri dosye a mansyone pou koreksyon.
- Mete blòk la nan kòd ki responsab pou enstalasyon an depandans ak endike modil yo itilize:
Konsekans discord = mande pou ('diskord.js');
konsekans {
Prefiks,
jetè
} = Egzije ('./ config.json');
konstitisyon ytdl = mande pou ('ytdl-nwayo');
- Avèk èd nan marqueur yo te deja espesifye, kreye yon kliyan ak login, ki se te pote soti nan k ap antre nan sèlman de liy senp:
Konsekans kliyan = nouvo disord.Client ();
Client.login (siy);
- Li rete sèlman nan presize dènye liy ki debaz pou koute bot la.
Client.once ('pare', () => {
Console.log ('pare!');
});
Client.Once ('rekonekte', () => {
Konsole.log ('rekonekte!');
});
Client.once ('dekonekte', () => {
Console.log ('dekonekte!');
});
- Elaji "File" meni an epi sove chanjman ki fèt yo fè.
- Kouri konsole a ankò nan yon fason pratik.
- Antre nan lòd la Index.js ne yo kòmanse script la bot.
- Si dosye li yo pa yo ki sitiye nan anyè kay itilizatè a, apre yo fin ne pral gen presize yon konplè kite yo.
- Se lansman an siksè nan bot la endike nan inscription a parèt "pare!".
- Open dezakò ak asire w ke bot la te ale nan estati a nan "sou entènèt".
Etap 5: Ekri koder prensipal la nan bot la mizik
Pwosesis ki pi konplèks rete - ekri kòd la debaz pou bot la mizik. Gen yon lis travay ke li dwe fè: lekti mesaj ak kòmandman pwosesis, definisyon yon non chante oswa adrès li yo, konekte ak chanèl vwa ak lèktur. Otorizasyon sou tout bot sa a se, kidonk ou jis bezwen presize aksyon lè l sèvi avèk JavaScript fonksyon, ki se fèt nan menm "index.js" dosye a.
Ajoute yon karakteristik senp pou li mesaj:
Kliyan.On ('mesaj', async mesaj => {
}
Li konsiste de sèlman de liy, men yo pral pèmèt bot a pran yon rechèch koutim ak trete kòrèkteman. Li kapab di ke sa a se youn nan ekip ki pi enpòtan pou bots nan nenpòt ki kalite. Asire ou ke ou ajoute inyore mesaj ki soti nan lòt bots pa antre nan
Si (message.author.bot) retounen;
Sa a evite konfli pandan w ap itilize bots miltip sou sèvè a ansanm. Apre sa, li pral nesesè yo tcheke prefiks la pou ke bot la aksepte ekip la oswa retounen li.
si (! message.content.startswith (prefiks)) retounen;
Tcheke te lanse kòmandman se te pote soti lè l sèvi avèk senp si operatè yo, ak desen an nan ka nou an sanble tankou sa a:
Conster serverqueue = queue.get (message.guild.id);
si (messaps.content.startswith (`$ {prefiks} jwe`)) {
Egzekite (mesaj, serverqueue);
Retounen;
} Lòt bagay si (message.content.startswith (`$ {prefiks} skip`)) {
Sote (mesaj, serverqueue);
Retounen;
} Lòt bagay si (messaps.content.startswith (`$ {prefiks} sispann`)) {
Sispann (mesaj, serverqueue);
Retounen;
} Lòt bagay {
Mesaj.Channel.Send ('Ou dwe itilize lòd la ki deja egziste!')
}
Tanpri note ke fonksyon an voye ('') voye mesaj la bay itilizatè a si li toudenkou antre nan lòd la ki pa travay. Mesaj sa a ou ka edite, chanje inscription a nan quotes.
Koulye a, bot la te aprann pran kòmandman, men jiskaske li ka kominike avèk yo, depi aksyon sa yo yo pa espesifye. Premye ajoute lòd la jwe, ki se responsab pou lèktur. Pou li, se yon etalaj bezwen ak fòm sa a:
Konsekans ke keu = nouvo kat ();
Li voye tout kòmandman yo nan keu la epi fè chante yo jwe sèlman lè yon sèl anvan an fini. Apre sa, li pral nesesè yo kreye yon fonksyon ki pral tcheke si itilizatè a ki konekte nan kanal la vwa ak si wi ou non bot la se autorisations ki koresponn lan.
Fonksyon async egzekite (mesaj, serverqueue) {
konstitisyon args = message.content.split ('');
Const VoiceChannel = message.member.Voicechannel;
Si (! VoiceChannel) retounen message.Channel.Send ('pou koute mizik, ou bezwen nan kanal vwa!');
Tonksyon Permissions = VoiceChannel.PermissionsFor (message.client.user);
Si (! Permissions.Has ('Konekte') ||! Permissions.Has ('pale')) {
Retounen message.channel.send ('Mwen bezwen pèmi yo rantre nan epi pale chanèl vwa ou!');
}
}
Next Aksyon - Koneksyon Bibliyotèk la YTDL, depi bot sa a pral li non an nan chan an sou lyen ki soti nan YouTube, apre yo fin ki li se te jwe sou sèvè a. Li pral pran insert yon ti moso nan insert kòd.
Konsekans Songinfo = tann ytdl.getinfo (args [1]);
Const Song = {
Tit: Songinfo.title,
URL: Songinfo.Video_url,
};
Blòk nan pwochen nan kòd pral pèmèt ou konprann si gen chante nan keu la oswa ou ka imedyatman konekte nan kanal la vwa epi yo kòmanse lèktur.
Si (! Serverqueue) {
} Lòt bagay {
Serverqueue.songs.push (chante);
Console.log (serverqueue.songs);
Retounen message.channel.send (`$ {song.title} ki te ajoute nan keu la!`);
}
Next vini yon ti kras konplike pou pwogramasyon inisyasyon yon konplo kontra ki ajoute yon chante nan yon etalaj epi fè menm bagay la chak fwa ou antre nan! Jwe, tcheke keu la ak chwazi aksyon an dwa. Peye atansyon sou kòmantè yo prezante, ki pèmèt ou fè fas ak tout sibtilite yo.
// kreye yon kontra pou keu la
Const QueueContruct = {
TextChannel: mesaj.Channel,
VoiceChannel: VoiceChannel,
Koneksyon: nil,
Songs: [],
Volim: 5,
Jwe: Vrè,
};
// mete keu ak kontra nou an
queue.set (message.guild.ID, QueueContruct);
// mete konpozisyon an nan etalaj nou an nan chante
keuecontruct.songs.push (chante);
eseye {
// Isit la nou yo ap eseye rantre nan chat la vwa ak sove koneksyon an nan objè a
var koneksyon = tann voicechannel.join ();
queuecontruct.connection = koneksyon;
// rele fonksyon an lèktur yo kòmanse chante a
Jwe (message.guild, queuecontruct.Songs [0]);
} Trape (erè) {
// montre yon mesaj erè si bot la pa ka rantre nan chat la vwa
Konsole.log (erè);
keu.delete (message.guild.id);
Retounen message.channel.send (erè);
}
Avèk keu la, tout bagay se klè, men yo toujou pa jwe chante, paske pa gen okenn plasman pou fonksyon an jwe. Pou fè sa nan kòd la li nesesè yo ajoute estrikti
Fonksyon Jwe (Guild, Song) {
Conster serverqueue = queue.get (Guild.ID);
Si (! Song) {
Serverqueue.voicechannel.leave ();
keu.delete (Guild.ID);
Retounen;
}
}
Jwe kòmanse lè l sèvi avèk Fonksyon an Playstream () ak lyen ki espesifye nan tras la.
Const Dispatcher = serverqueu.connection.playstream (YTDL (Song.url))
.On ('fen', () => {
Console.log ('mizik se sou!');
// retire chan an fini soti nan keu la
serverqueue.songs.shift ();
// ankò ki lakòz fonksyon lèktur ak chan sa a
Jwe (Guild, serverqueue.Songs [0]);
})
.On ('erè', erè => {
Konsole.Error (erè);
});
Dispatcher.Setvolumelogaritmic (serverqueue.volume / 5);
Si ou vle ajoute yon chan Skip fonksyon, pou egzanp, lè ou deside jwe yon playlist, premye pran swen nan lòd ki apwopriye a, ak Lè sa a, ajoute tankou yon fragman:
Fonksyon SKIP (mesaj, serverqueue) {
Si (! Mesaj.Member.VoiceChannel) Retounen message.Channel.Send ('Ou ta dwe nan yon kanal vwa yo sispann mizik!');
Si (sèr serverqueue) retounen message.Channel.Send ('Pa gen okenn chante ke mwen te ka sote!');
Serverqueue.connection.dispatcher.end ();
}
Apeprè konplo a menm tou travay fonksyon an sispann, men blòk la ak kòd la achte yon gade yon ti kras diferan:
Fonksyon sispann (mesaj, serverqueue) {
Si (! Mesaj.Member.VoiceChannel) Retounen message.Channel.Send ('
Ou dwe nan kanal la vwa yo sispann mizik!);
Serverqueue.songs = [];
Serverqueue.connection.dispatcher.end ();
}
Konsidere ke enfòmasyon ki prezante anwo a se apwopriye sèlman pou moun ki itilizatè ki deja abitye avèk lang JavaScript la oswa se sèlman angaje nan etidye ak deside kreye yon bot mizik. Si ou pa posede ladrès an jeneral ak blòk yo espesifye ak kòd la ou pa di anyen nan tout, tou senpleman insert kòd la sous tout antye nan dosye a, ranplase mesaj yo soti nan bot la nan Ris (yo nan quotes) epi sove la chanjman. Tout kòd sous gen kalite sa a:
Konsekans discord = mande pou ('diskord.js');
konsekans {
Prefiks,
jetè
} = Egzije ('./ config.json');
konstitisyon ytdl = mande pou ('ytdl-nwayo');
Konsekans kliyan = nouvo disord.Client ();
Konsekans ke keu = nouvo kat ();
Client.once ('pare', () => {
Console.log ('pare!');
});
Client.Once ('rekonekte', () => {
Konsole.log ('rekonekte!');
});
Client.once ('dekonekte', () => {
Console.log ('dekonekte!');
});
Kliyan.On ('mesaj', async mesaj => {
Si (message.author.bot) retounen;
si (! message.content.startswith (prefiks)) retounen;
Conster serverqueue = queue.get (message.guild.id);
si (messaps.content.startswith (`$ {prefiks} jwe`)) {
Egzekite (mesaj, serverqueue);
Retounen;
} Lòt bagay si (message.content.startswith (`$ {prefiks} skip`)) {
Sote (mesaj, serverqueue);
Retounen;
} Lòt bagay si (messaps.content.startswith (`$ {prefiks} sispann`)) {
Sispann (mesaj, serverqueue);
Retounen;
} Lòt bagay {
Mesaj.Channel.Send ('Ou bezwen antre nan yon lòd valab!')
}
});
Fonksyon async egzekite (mesaj, serverqueue) {
konstitisyon args = message.content.split ('');
Const VoiceChannel = message.member.Voicechannel;
Si (! VoiceChannel) retounen message.Channel.Send ('ou bezwen yo dwe nan yon kanal vwa yo jwe mizik!');
Tonksyon Permissions = VoiceChannel.PermissionsFor (message.client.user);
Si (! Permissions.Has ('Konekte') ||! Permissions.Has ('pale')) {
Retounen message.Channel.Send ('Mwen bezwen autorisations yo rantre nan epi pale nan chanèl vwa ou!');
}
Konsekans Songinfo = tann ytdl.getinfo (args [1]);
Const Song = {
Tit: Songinfo.title,
URL: Songinfo.Video_url,
};
Si (! Serverqueue) {
Const QueueContruct = {
TextChannel: mesaj.Channel,
VoiceChannel: VoiceChannel,
Koneksyon: nil,
Songs: [],
Volim: 5,
Jwe: Vrè,
};
queue.set (message.guild.ID, QueueContruct);
keuecontruct.songs.push (chante);
eseye {
var koneksyon = tann voicechannel.join ();
queuecontruct.connection = koneksyon;
Jwe (message.guild, queuecontruct.Songs [0]);
} Trape (erè) {
Konsole.log (erè);
keu.delete (message.guild.id);
Retounen message.channel.send (erè);
}
} Lòt bagay {
Serverqueue.songs.push (chante);
Console.log (serverqueue.songs);
Retounen message.channel.send (`$ {song.title} ki te ajoute nan keu la!`);
}
}
Fonksyon SKIP (mesaj, serverqueue) {
Si (! Mesaj.Member.VoiceChannel) retounen message.Channel.Send ('Ou gen yo dwe nan yon kanal vwa yo sispann mizik la!');
Si (sèr serverqueue) retounen message.Channel.Send ('Pa gen okenn chante ke mwen te ka sote!');
Serverqueue.connection.dispatcher.end ();
}
Fonksyon sispann (mesaj, serverqueue) {
Si (! Mesaj.Member.VoiceChannel) retounen message.Channel.Send ('Ou gen yo dwe nan yon kanal vwa yo sispann mizik la!');
Serverqueue.songs = [];
Serverqueue.connection.dispatcher.end ();
}
Fonksyon Jwe (Guild, Song) {
Conster serverqueue = queue.get (Guild.ID);
Si (! Song) {
Serverqueue.voicechannel.leave ();
keu.delete (Guild.ID);
Retounen;
}
Const Dispatcher = serverqueu.connection.playstream (YTDL (Song.url))
.On ('fen', () => {
Konsole.log ('mizik te fini!');
serverqueue.songs.shift ();
Jwe (Guild, serverqueue.Songs [0]);
})
.On ('erè', erè => {
Konsole.Error (erè);
});
Dispatcher.Setvolumelogaritmic (serverqueue.volume / 5);
}
Client.login (siy);
Apre yo fini, li se pi bon rekòmanse bot a, apre yo fin ki ou ka ale nan sèvè ou, konekte nan kanal la vwa ak antre nan nenpòt ki lòd nan entèraksyon an, tcheke ki jan yo reyaji nan bot la.
Si Variant a pi wo a nan bot a se pa apwopriye pou ou, ou ka jwenn kòd yo sous sou GitHub a menm ak kopi yo nan òdinatè w lan. Prensip la nan enskripsyon ak lanse rete menm jan an, Se konsa, si sa nesesè, tou senpleman edite kòd la fini, ak Lè sa a kontinye nan tès bot la.
Nan atik sa a, nou pa t 'afekte egzeyat la nan yon bot sou hosting, distribye li nan mitan itilizatè lòt, kreye yon avatar ak itilize nan sit louvri, ki soti nan kote li kapab otorize. Tout bagay sa a se pwosesis separe ki ta dwe angaje sèlman lè ou te adousi konpetans ou yo kreye robo ak yo pare yo distribye pwojè sou rezo a.