C# 保存发送给bot的用户消息,并将完成的表单发送给其他用户

C# 保存发送给bot的用户消息,并将完成的表单发送给其他用户,c#,telegram,telegram-bot,C#,Telegram,Telegram Bot,几天来,我一直试图用我的电报机器人解决这个问题 我试图在用户“/启动”机器人后向他发送一些问题 我想捕获所有用户答案,然后将其发送给我希望在一条消息中看到用户答案的某个用户 我试图通过发送内联按钮来完成,但找不到等待用户下一条消息的方法。我试图将答案存储在字符串数组中,但它也不起作用 在问题的最后,我想将所有用户的答案发送到一条包含所有用户问题的消息中的某个用户ID/通道 我用电报。机器人图书馆 这是我的密码 static string gotName = "0"; static string

几天来,我一直试图用我的电报机器人解决这个问题

我试图在用户“/启动”机器人后向他发送一些问题

我想捕获所有用户答案,然后将其发送给我希望在一条消息中看到用户答案的某个用户

我试图通过发送内联按钮来完成,但找不到等待用户下一条消息的方法。我试图将答案存储在字符串数组中,但它也不起作用

在问题的最后,我想将所有用户的答案发送到一条包含所有用户问题的消息中的某个用户ID/通道

我用电报。机器人图书馆

这是我的密码

static string gotName = "0";
static string gotAge = "0";
static string gotMessage = "0";

static string[] Forminfo = { gotName, gotAge, gotMessage };


 async  private void Bot_OnUpdate(object sender, Telegram.Bot.Args.UpdateEventArgs e)
{
    if (e.Update.Type == UpdateType.Message && e.Update.Message.Text == "/start")
    {
        var streg = new InlineKeyboardMarkup(new[]
        {
            new [] // first row
            {
                InlineKeyboardButton.WithCallbackData("Next Step","start")
            }
        });

        var update = e.Update.Message.Text;

        var strmsg = "To Start The Register please send the bot your name and click on Next Step";
        await bot.SendTextMessageAsync(e.Update.Message.Chat.Id, strmsg, ParseMode.Html, replyMarkup: streg);
        var usermsg = await bot.GetUpdatesAsync();
        Forminfo[0] = usermsg.ToString();
    }
}


async private void Bot_OnCallbackQuery(object sender, Telegram.Bot.Args.CallbackQueryEventArgs e)
{            
    var streg1 = new InlineKeyboardMarkup(new[]
    {
        new [] // first row
        {
            InlineKeyboardButton.WithCallbackData("Next","start1")
        }
    });

    if (Forminfo[0] != "0")
    {
        var startedmsg = "Hello " + Forminfo[0].ToString() + "\n" +
                "Please Send us your Age and click Next";
        try
        {
            await bot.SendTextMessageAsync(e.CallbackQuery.Message.Chat.Id, startedmsg, ParseMode.Html, replyMarkup: streg1);
        }
        catch(HttpRequestException ex)
        {
            await bot.SendTextMessageAsync(e.CallbackQuery.Message.Chat.Id, "To Many Request Please Try Later.", ParseMode.Html);
        }
    }
}

有两件事需要解决:

  • 如果在
    OnUpdate
    回调中处理的都是消息,请改用
    OnMessage
  • 您正在使用
    OnUpdate
    ,然后手动调用
    GetUpdates
    。您不能混合使用多种获取更新的方法,
    startreceiting
    调用已经在内部处理调用
    GetUpdates
  • 通过将一个字符串[]作为结果,您假定只有一个用户将同时使用bot。更好的方法是使用
    词典
  • SendTextMessageAsync
    调用中,如果发送常规文本,则不必设置
    ParseMode
  • 如果你从不检查用户是否点击了按钮,我看不出你在用这些按钮做什么
这是一个代码示例,它执行您想要的操作,但根本不验证输入:

const long TargetChannelId=123456;
静态只读ConcurrentDictionary答案=新建ConcurrentDictionary();
私有静态异步void Bot_OnMessage(对象发送方,MessageEventArgs e)
{
消息消息=e.消息;
int userId=message.From.Id;
if(message.Type==MessageType.Text)
{
if(Answers.TryGetValue(userId,out字符串[]Answers))
{
如果(回答[0]==null)
{
答案[0]=消息。文本;
等待Bot.SendTextMessageAsync(message.Chat,“现在将您的年龄发送给我”);
}
else if(回答[1]==null)
{
答案[1]=消息文本;
等待Bot.SendTextMessageAsync(message.Chat,“现在向我发送您的消息”);
}
其他的
{
TryRemove(userId,out string[]\uux);
等待Bot.SendTextMessageAsync(message.Chat,“谢谢你,我只需要你这么做”);
字符串answersText=$“用户{answers[0]},过期的{answers[1]}发送了以下消息:\n{message.Text}”;
等待Bot.SendTextMessageAsync(TargetChannelId,answersText);
}
}
其他的
{
TryAdd(userId,新字符串[2]);
等待Bot.SendTextMessageAsync(message.Chat,“请将您的姓名发送给我”);
}
}
}

如果我想让多个用户填写此表单,如果两个不同的用户同时尝试填写表单,我将向每个用户发送saprate,否则表单将混乱/崩溃?@tuarek使用此代码片段,几乎任何数量的用户都可以同时与机器人交互,而不会破坏状态