2017-08-25 39 views
0

我一直在c#中为投票电报机器人写一个GetUpdates()方法。我想永远运行我的方法,但是当我的机器人完成并且我想要进入/开始另一轮运行时,我的机器人不再工作。请帮帮我。当我停止程序并再次运行时,我的机器人只适合单次运行。我怎么能电报bot c#永远运行?

我GetUpdates()的代码:

public async Task GetUpdates() 
    { 
     try 
     { 

      DefineQuestion = false; 
      DefineOptions = false; 
      DefineTextQuestion = false; 

      while (true) 
      {     
       updates = bot.GetUpdatesAsync(offset).Result; 

       foreach (var update in updates) 
       { 
        offset = update.Id + 1;      

        if (update.Message == null) 
        { 
         continue; 
        }  

        TxT = update.Message.Text; 

        ChatID = update.Message.Chat.Id; 
        UserID = update.Message.MessageId; 

        NameTeleg = update.Message.From.FirstName + " " + update.Message.From.LastName; 

        URL = update.Message.Chat.InviteLink = "telegram.me/my_bot?startgroup=..."; 

        if (Link) 
        { 
         TxT = "/[email protected]_bot"; 
         Link = false; 
        } 

        if (TxT == "/[email protected]_bot") 
        { 
         await bot.SendTextMessageAsync(ChatID, "پرسش نظرسنجی\n" + QuestionAndOptions[0], Telegram.Bot.Types.Enums.ParseMode.Default, false, false, 0); 

         await Task.Delay(50); 

         for (int i = 1; i < QuestionAndOptions.Count; i++) 
         { 
          await bot.SendTextMessageAsync(ChatID, "<a> /" + i.ToString() + ". </a>" + QuestionAndOptions[i], Telegram.Bot.Types.Enums.ParseMode.Html, false, false, 0); 
          await Task.Delay(50); 
         } 
         DefineTextQuestion = false; 

         await bot.SendTextMessageAsync(ChatID, "برای پایان دادن به نظرسنجی <a>/EndVote</a> را وارد نمایید", Telegram.Bot.Types.Enums.ParseMode.Html, false, false, 0); 
         await Task.Delay(50); 
        } 

        if (TxT == "/start") 
        { 
         await bot.SendTextMessageAsync(ChatID, "به ربات نظرسنجی خوش آمدید\n" + "برای پایان دادن <a>/EndVote</a> را وارد نمایید", Telegram.Bot.Types.Enums.ParseMode.Html, false, false, 0, Keyboard.MainKey()); 
        } 
        else if (TxT == "وارد نمودن پرسش نظرسنجی") 
        { 
         await bot.SendTextMessageAsync(ChatID, "لطفاً پرسش خود را برای نظرسنجی وارد کنید\n" + "برای پایان دادن <a>/EndVote</a> را وارد نمایید", Telegram.Bot.Types.Enums.ParseMode.Html, false, false, 0, Keyboard.RemoveKeys()); 
         DefineTextQuestion = true; 
        } 
        else if (DefineTextQuestion) 
        { 
         if (TxT != "/End") 
         { 
          QuestionAndOptions.Add(TxT); 

          await bot.SendTextMessageAsync(ChatID, "لطفاً گزینه های خود را برای نظرسنجی وارد کنید. برای خاتمه <a> /End </a> را وارد نمایید", Telegram.Bot.Types.Enums.ParseMode.Html, false, false, 0); 
         } 
         else 
         { 
          await bot.SendTextMessageAsync(ChatID, "پرسش نظرسنجی\n" + QuestionAndOptions[0], Telegram.Bot.Types.Enums.ParseMode.Default, false, false, 0); 

          await Task.Delay(50); 

          for (int i = 1; i < QuestionAndOptions.Count; i++) 
          { 
           await bot.SendTextMessageAsync(ChatID, "<a> /" + i.ToString() + ". </a>" + QuestionAndOptions[i], Telegram.Bot.Types.Enums.ParseMode.Html, false, false, 0); 
           await Task.Delay(50); 
          } 
          DefineTextQuestion = false; 

          await bot.SendTextMessageAsync(ChatID, "لطفا روی لینک زیر کلیک نمایید\n" + "<a>" + URL + "</a>", Telegram.Bot.Types.Enums.ParseMode.Html, false, false, 0); 
          await Task.Delay(50); 

          Link = true; 
         } 
        } 
        else 
        { 
         for (int i = 1; i < QuestionAndOptions.Count; i++) 
         { 
          if (TxT == "/" + i) 
          { 
           for (int index = 0; index < NameTeleg.Length; index++) 
           { 
            if (!Result.ContainsKey(NameTeleg)) 
            { 
             Result.Add(NameTeleg, i); 
             Sum += 1; 
            } 
            else 
            { 
             Result.Remove(NameTeleg); 
             Result.Add(NameTeleg, i); 
            } 
           } 

           await bot.SendTextMessageAsync(ChatID, "رای کاربر " + NameTeleg + " گزینه " + i.ToString() + " " + "می باشد\n" + "برای پایان دادن <a>/EndVote</a> را وارد نمایید", Telegram.Bot.Types.Enums.ParseMode.Html, false, false, 0); 
           await Task.Delay(50); 
          } 
          if (TxT == "/EndVote") 
          { 
           for (int index = 1; index < QuestionAndOptions.Count; index++) 
           { 
            VoteAve.Add(0); 
           } 

           for (int index1 = 1; index1 <= VoteAve.Count; index1++) 
           { 
            if (Result.ContainsValue(index1)) 
            { 
             VoteAve[index1 - 1] += 1; 
            } 
           } 

           for (int index2 = 0; index2 < VoteAve.Count; index2++) 
           { 
            VoteAve[index2] /= Sum; 
            VoteAve[index2] *= 100; 
           } 

           await bot.SendTextMessageAsync(ChatID, Sum.ToString() + " " + "نفر در نظرسنجی شرکت کرده اند", Telegram.Bot.Types.Enums.ParseMode.Default, false, false, 0); 

           await Task.Delay(50); 

           for (int index3 = 0; index3 < VoteAve.Count; index3++) 
           { 
            var Counter = index3 + 1; 

            if (VoteAve[index3] == 0) 
            { 
             await bot.SendTextMessageAsync(ChatID, Counter.ToString() + "- " + QuestionAndOptions[index3 + 1] + "\n" + VoteAve[index3].ToString() + " %", Telegram.Bot.Types.Enums.ParseMode.Default, false, false, 0); 
            } 
            if (VoteAve[index3] >= 10 && VoteAve[index3] <= 20) 
            { 
             await bot.SendTextMessageAsync(ChatID, Counter.ToString() + "- " + QuestionAndOptions[index3 + 1] + "\n" + "\U0000270C\U0000270C" + VoteAve[index3].ToString() + " %", Telegram.Bot.Types.Enums.ParseMode.Default, false, false, 0); 
            } 
            ... 
           } 


           DefineQuestion = false; 
           DefineOptions = false; 
           DefineTextQuestion = false; 
           QuestionAndOptions.Clear(); 
           Result.Clear();         
           Sum = 0; 

           cts.Cancel(); 

           break; 
          } 
         } 
        } 
       }      
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
+3

请分享您的代码 –

+0

嗨迈克尔。感谢您的编辑。 – Shahrokh

+0

删除'break;'if'(TxT ==“/ EndVote”)'条件结束时 – Juggernaut

回答

0

通常getUpdates用于调试。发布你的机器人,你需要使用WebhookSee this

getUpdates是一种拉机制,setWebhook是推送。 有超过getUpdates使用网络挂接的一些优点:

  1. 避免了不得不要求经常更新,你的机器人。
  2. 避免在代码中需要某种轮询机制。
+0

嗨Naser Yousefi。感谢您的回复。因此,我需要在C#和Windows窗体中学习Webhook和Websocket ... – Shahrokh

+0

在nuget中有几个用于电报的库。你只需要使用其中的一个,并且模拟地调用webhook方法。 –

+0

非常感谢。你有C#中的webhook代码吗? – Shahrokh