Passer au contenu principal
Votre bot peut rejoindre un salon vocal et y jouer du son. Mettez un fichier dans public/, puis rejoignez le salon de la personne qui demande et jouez-le :
src/commands/intro.ts
C’est tout. join() se résout quand le bot est dans le salon, play() quand le fichier a été joué, et leave() fait partir le bot. Tout le reste est fait pour vous : la connexion aux serveurs vocaux de Discord, le chiffrement, l’envoi du son au bon rythme, et le chiffrement de bout en bout que Discord exige pour le vocal.
Tout ce qu’a une connexion vocale est dans la référence ; join() est sur VoiceChannel.

Ce qui peut être joué

play() prend un fichier de public/ (asset('sounds/intro.ogg')), un fichier envoyé sur Discord, ou un lien qui commence par https://. Discord ne joue que de l’Opus. Un fichier déjà en Opus ne coûte rien à jouer ; tout le reste est converti pendant la lecture par ffmpeg, que le bot trouve tout seul quand il est installé. Quand il ne l’est pas, play() le dit :
L’Opus est reconnu aux premiers octets du fichier, quel que soit son nom, et un lien ou un fichier envoyé sur Discord est téléchargé pendant la lecture. Un lien doit mener au son lui-même (un fichier, le flux d’une radio) : la page d’une vidéo, sur YouTube par exemple, n’en est pas un.
Pour jouer sans ffmpeg en production, convertissez vos sons en Opus une fois pour toutes, sur votre ordinateur : ffmpeg -i intro.mp3 -c:a libopus intro.ogg.

Un fichier envoyé sur Discord

Une option attachment permet à la personne d’envoyer la musique avec la commande, et play() la prend telle quelle :
src/commands/song.ts

Pause, reprise, arrêt

Ce qui joue peut être mis en pause, repris et arrêté de partout : une autre commande, un bouton. guild.voice est la connexion du bot dans un serveur, ou null quand il n’y est dans aucun salon vocal.
src/commands/pause.ts
  • stop() arrête ce qui joue : son play() se résout aussitôt.
  • Un nouveau play() remplace ce qui jouait.
  • leave() quitte le salon ; une connexion qui est partie ne peut plus jouer, join() à nouveau.

Se déplacer et être déplacé

join() sur un autre salon vocal du même serveur y déplace le bot, et redonne la même connexion. Quand quelqu’un déplace le bot ou le déconnecte, la connexion suit : voice.channel est là où il est maintenant, et voice.connected passe à false quand il a été déconnecté.
src/commands/follow.ts

Permissions et salons pleins

Le bot a besoin de Se connecter (Connect) pour rejoindre et de Parler (Speak) pour jouer. Sans elles, join() ou play() échoue en disant ce qui manque :
Un salon plein (sa limite d’utilisateurs est atteinte) est refusé aussi, sauf si le bot a Déplacer des membres (Move Members). Dans un salon de conférence, le bot devient orateur quand il a Rendre muets des membres (Mute Members) ; sinon il demande la parole, et un modérateur accepte.

Options de join()

  • deaf (true par défaut) : le bot n’entend rien, donc Discord ne lui envoie pas ce que disent les gens. Il ne fait que jouer.
  • mute (false par défaut) : le bot apparaît avec le micro coupé.

Intents et chiffrement de bout en bout

Rejoindre demande l’intent GUILD_VOICE_STATES : ChapterJS le demande quand un fichier de votre projet appelle join(), et c’est grâce à lui que member.voiceChannel est connu. Il n’est pas privilégié.
Discord chiffre chaque salon vocal de bout en bout (le protocole DAVE). Votre bot y participe avec libdave, la bibliothèque des applications de Discord, que ChapterJS inclut : rien à installer. Tant que le bot est seul dans un salon, il n’y a personne pour qui chiffrer, donc rien n’est envoyé ; dès que quelqu’un arrive, il entend.
Enregistrer ce que disent les gens n’existe pas encore.

Événements vocaux

Qui rejoint, quitte ou change de salon vocal.

VoiceConnection

Tout ce qu’a une connexion vocale.