2017-05-15 7 views
-1

저는 C#을 처음 사용합니다. Discord 봇이 특정 사용자가 어떤 것을 입력 할 때 어떤 말을하기를 원합니다. 예를 들어, 그가 뭔가를 입력하면 봇은 "닥쳐"라고 응답합니다. 대화 내용은 다음과 같습니다.특정 사용자가 무작위로 뭔가를 입력하면 봇 유형을 만드시겠습니까?

사용자 : hello there, bot!
봇은 : 내가 가지고 올 수 있었다 모든이입니다

을 종료 :

   commands.CreateCommand("test") 
       .AddCheck((command, user, channel) => user.Id == < user id >) 
       .Do(async (e) => 
     { 
       await e.User.SendMessage("shut up"); 
     }); 

이가 아닌 제가 전혀이 같은 싶었던 것은 prefixchar = 사용하는 명령입니다! 테스트하고 개인 메시지를 통해 메시지를 보냅니다.

답변

0

염두에두고있는 특정 사용자에 대한 유효한 입력이 있습니까? 하지 않으면 것은, 당신은 당신의 비동기 메시지가 수신 함수가 호출 될 때 조건부 사용자 확인을 시도 할 수 :

 private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result) 
 
     { 
 
      var activity = await result as Activity; 
 

 
      if (activity != null && activity.Text.ToLower().Contains(username)) 
 
      { 
 
       await context.PostAsync($"Shut up {username}!"); 
 
      }      
 

 
      context.Wait(MessageReceivedAsync); 
 
     }

를 봇으로 응답 할 필요가있는 경우 "{사용자 이름} 시끄러워!" 모든 단일 사용자에 대해, 당신은 당신의 메시지 컨트롤러에 ConversationUpdate에 대한 응답을 묶을 수 :

private async Task<Activity> HandleSystemMessage(Activity message) 
 
     { 
 
      switch (message.Type) 
 
      { 
 
       case ActivityTypes.ConversationUpdate: 
 
        IConversationUpdateActivity update = message; 
 
        using (
 
         var scope = 
 
          Microsoft.Bot.Builder.Dialogs.Internals.DialogModule.BeginLifetimeScope(Conversation.Container, 
 
           message)) 
 
        { 
 
         var client = scope.Resolve<IConnectorClient>(); 
 

 
         if (!update.MembersAdded.Any()) return null; 
 

 
         foreach (var newMember in update.MembersAdded) 
 
         { 
 
          if (newMember.Id == message.Recipient.Id) continue; 
 
          await _configurationLibrary.MultiThreadLoadSettings(); 
 

 
          var reply = message.CreateReply(); 
 
          reply.Text = $"Shut up {username}"; 
 
          await client.Conversations.ReplyToActivityAsync(reply); 
 
         } 
 
        } 
 
        break; 
 
      } 
 
      return null; 
 
     }

스위치 문을 사용하면 확장 할 경우입니다.

+0

안녕하세요. 의견을 보내 주셔서 감사합니다. 봇은 특정 사용자에게 종료 코드를 회신 할 수 있어야합니다. 코드에서 사용자 ID 또는 특정 역할을 감지 할 수있는 모든 사람이 채널에 입력하지는 마십시오. – jink

+0

예제 중 하나를 사용할 수 있습니다 그것을 위해,하지만 깨끗한 코드 관점에서, 나는 첫 번째를 사용하여 사용자 이름으로 user.ID를 통과하는 것이 좋습니다. 그 답장을 받아야하는 특정 사용자 ID를 하드 코딩하고 있습니까? 아니면 어딘가에 DB에 저장하고 있습니까? – bsmith

+0

첫 번째 코드에서 다음과 같은 2 가지 오류가 발생합니다. 오류 CS1061 : 'IAwaitable '에 'GetAwaiter'에 대한 정의가없고 'IAwaitable '유형의 첫 번째 인수를 허용하는 확장 메서드 'GetAwaiter'를 찾을 수 없습니다 (using 지시문이나 어셈블리 참조가 누락 되었습니까?) 및 CS1061 오류 : '개체'에 'ToLower'에 대한 정의가없고 확장 메서드가 없습니다. '개체'유형의 첫 번째 인수를 허용하는 'ToLower'를 찾을 수 있습니다. using 지시문이나 어셈블리 참조가 누락 되었습니까?) – jink