2017-09-17 13 views
-1

Discord 로봇을 Rasberry Pi에 넣었지만 이제 문제가 있습니다. 명령을 사용하려고하면 처음으로 작동합니다. 하지만 작업을하는 대신 두 번째로 사용하면 "MessageReceived 핸들러가 게이트웨이 작업을 차단하고 있습니다."라고 표시됩니다. System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw에서 마지막으로 하트 비트 놓친 서버()는 0x0000C]에 : System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess에서 0 (그후 바로 그 다음비동기 api를 두 번째 호출 한 후 Pi에 Bot이 충돌 함

System.Exception 말한다 System.Threading.Tasks.Task 작업) [0x0003e] in : 0 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task 작업) [0x00028] in : 0 at System.Runtime.CompilerServices. TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task 작업) [0x00008] in : 0 at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1 + ConfiguredTaskAwaiter [TResult] .GetResult() [0x00000] in : 0 012 3,516,Discord.ConnectionManager에서 + <> c__DisplayClass28_0 + < b__0> d.MoveNext() 0x0014b]에 0

끊 일부를 재접속하려하지만 매번 erroring. 명령 인터페이스를 사용하지 않지만 비동기/대기를 사용하고 있습니다. 그것은 내 정상적인 컴퓨터에서 완벽하게 작동, 내 파이에 휴식.

using Discord; 
using Discord.WebSocket; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace GlurrrBotDiscord 
{ 
    public class Program 
    { 
     DiscordSocketClient client; 

     static void Main(string[] args) => new Program().MainAsync().GetAwaiter().GetResult(); 

     public async Task MainAsync() 
     { 
      client = new DiscordSocketClient(); 

      try 
      { 
       using(StreamReader sr = new StreamReader("botcode.txt")) 
       { 
        string code = sr.ReadLine(); 
        await client.LoginAsync(TokenType.Bot, code); 
       } 
      } 
      catch(Exception e) 
      { 
       Console.WriteLine("Code not found"); 
       Console.WriteLine(e.Message); 
      } 

      await client.StartAsync(); 
      await client.SetGameAsync("praise"); 

      client.MessageReceived += handleMessage; 

      await Task.Delay(-1); 
     } 

     private async Task handleMessage(SocketMessage msg) 
     { 
      Console.WriteLine(msg.Author + " : " + msg.Content); 

      if(msg.Content.Contains("/leave")) 
      { 
       var embed = new EmbedBuilder() { 
        Title = msg.Author + " has left", 
        Description = msg.Author + " has left the Discord and would like everyone to know they did. They are very triggered.", 
        Color = Color.DarkRed, 
       }; 

       await msg.Channel.SendMessageAsync("", false, embed); 
      } 
     } 
    } 
} 

전체 코드는 ~ https://github.com/Silthreent/Glurrr-Discord-Bot

+0

관련 코드 ** 여기 **를 게시하십시오. [mcve] – MickyD

+0

두 개의 비동기 호출을 사용할 때가 있습니다. '''경우 (msg.Content.Contains ("/ 휴가")) { var에 삽입 = 새로운 EmbedBuilder() { 제목 = msg.Author + "떠났다" 설명 = msg.Author + " 불화를 떠났고 모든 사람들에게 그들이 알았 으면 좋겠다. 그들은 매우 촉발되었다. ", Color = Color.DarkRed, }; 기다리고 있습니다 msg.Channel.SendMessageAsync ("", false, embed); }''' 아마도 가장 쉬운 장소 일 것입니다. ~ ~ 새로운 스택 주석; 쓰레기처럼 보입니다 ~~ – Silthreent

+1

주석에 코드를 넣지 마십시오. 질문을 편집하고 거기에 최소 완전 검증 가능 예제를 넣어야합니다. 질문을 업데이트하기 전에 MickyD가 보낸 링크를 읽으십시오. 주석에 게시 한 코드는 예제로 허용되지 않습니다. –

답변

0

DiscordNet을 사용하는 대신 DiscordSharpPlus로 전환하여 문제를 해결했지만 실제로 문제가 무엇인지 알지 못합니다.

0

Server missed last heartbeat at에서 실행중인 명령 중 하나가 게이트웨이를 사용한다는 것을 의미 A MessageReceived handler is blocking the gateway task의 결과는, 그리고 (가 연결 시간 제한을 할 수있을만큼 오래 점유 유지 30 초).

이 문제를 해결하려면 기본 봇 구현의 일부인 a command handler을 구현해야합니다. 이렇게하면 비동기 명령을 실행하여 스레드 차단을 방지 할 수 있습니다. bot sample을보고 구현 된 동작을 확인하십시오

+0

아무리 기다려도 두 번째 명령이 중단됩니다. 나는 명령 처리기를 사용하는 다른 봇을 사용해 보았는데 실제로 더 세게 찢어졌습니다.맨 처음 명령을 마친 후에는 명령을 수행 한 다음 두 번째 명령없이 MessageRecieved 핸들러 문제를 제공합니다. – Silthreent

+0

@silthreent 및 u는 핸들러의 모드가 비동기로 설정된 사용자입니다. 그리고 함수는 비동기 모드 속성으로 장식 되었습니까? –

+0

runmode를 async로 설정해도 MessageRecieved 핸들러 메시지가 표시되지 않지만 첫 번째 메시지를 넘어서는 메시지는 게시되지 않습니다. – Silthreent