2017-04-14 5 views
0

Je suis en train de terminer un simple clip sonore Discord bot que j'ai fait en recyclant un exemple de base de bot de musique en python. Tout ce que je veux que le robot fasse est d'entrer dans le canal vocal de l'utilisateur qui a appelé la commande (! Womble), jouer un clip sonore aléatoire à partir d'un dossier de clips sonores, puis quitter le canal vocal.Pourquoi mon robot discord n'exécute-t-il ma commande qu'une fois et une seule fois?

"Simple, non?" Bien sûr que non, pas avec cette API apparemment.

Après une série d'essais et d'erreurs, en regardant au moins 3 révisions d'API, j'ai demandé au bot d'exécuter la commande ..... une fois. Toutes les autres invites de la commande sont rencontrées avec des grillons. Je peux faire une invocation et amener le bot dans le canal, mais la commande! Womble ne fonctionne plus.

def bot_leave(self, ctx): 
    state = self.get_voice_state(ctx.message.server) 
    coro = state.voice.disconnect() 
    fut = asyncio.run_coroutine_threadsafe(coro, state.voice.loop) 
    try: 
     fut.result() 
    except: 
     # an error happened sending the message 
     pass 

@commands.command(pass_context=True, no_pm=True) 
async def womble(self, ctx): 
    state = self.get_voice_state(ctx.message.server) 
    opts = { 
     'default_search': 'auto', 
     'quiet': True, 
    } 

    if state.voice is None: 
     success = await ctx.invoke(self.summon) 
     if not success: 
      return 

    try: 
     random_clip = clip_dir + "\\" + random.choice(os.listdir(clip_dir)) 
     player = state.voice.create_ffmpeg_player(random_clip, after=lambda: self.bot_leave(ctx)) 
     player.start() 
    except Exception as e: 
     fmt = 'An error occurred while processing this request: ```py\n{}: {}\n```' 
     await self.bot.send_message(ctx.message.channel, fmt.format(type(e).__name__, e)) 

J'ai essayé d'entrer dans le chat python est le serveur API Discorde, mais un peu comme mon bot, je suis rencontré grillons. (Je devine que j'essaye de chercher du support à partir d'un chat qui a déjà 4 conversations.)

Répondre

0

Je suppose que vous n'aurez peut-être plus besoin d'aide mais juste au cas où vous devriez essayer de supprimer le coroutine.result() et exécutez-le directement. changement i.e.:

def bot_leave(self, ctx): 
state = self.get_voice_state(ctx.message.server) 
coro = state.voice.disconnect() 
fut = asyncio.run_coroutine_threadsafe(coro, state.voice.loop) 
try: 
    fut.result() 
except: 
    # an error happened sending the message 
    pass 

à:

def bot_leave(self, ctx): 
state = self.get_voice_state(ctx.message.server) 
coro = state.voice.disconnect() 
try: 
    asyncio.run_coroutine_threadsafe(coro, state.voice.loop) 
except: 
    # an error happened sending the message 
    pass 

C'est la seule chose que je pouvais penser à voir l'extrait de code, mais le problème peut se situer ailleurs dans le code.

+0

Welp, qui a réussi à améliorer le bot dans un aspect: le bot va maintenant rejoindre le serveur. La première fois fonctionne parfaitement, la deuxième fois, le robot apparaît ... et s'assoit juste là. Cela ne semble pas vouloir créer le lecteur plus d'une fois .... ou du moins c'est ce que je suppose. –