我正在使用Deno和GrammY创建一个简单的机器人,它将通过/q
命令向用户发送轮询,然后当用户尝试轮询时,将根据用户的选择回复用户。
bot.ts
的代码现在看起来像:
import { Bot } from "https://deno.land/x/grammy@v1.11.2/mod.ts";
const bot = new Bot(MY_REDACTED_BOT_TOKEN);
bot.command("q", async (ctx) => {
ctx.api.sendPoll(
ctx.msg.chat.id,
`What is 1+1?`,
["0", "1", "2", "3"],
{
is_anonymous: false,
type: "quiz",
correct_option_id: 2,
}
);
});
bot.start();
我如何添加等待用户尝试测试的功能,然后在此基础上继续(相当于python-telegram-bot
中的PollAnswerHandler(?
您可以监听poll_answer
,如下所示。您将在上下文对象ctx
中找到所有相关信息,特别是在ctx.pollAnswer
下,例如user
和选定的option_ids
(即选定的答案(,如以下代码示例所示:
const correctAnswerId = 2;
bot.command("q", async (ctx) => {
const message = await ctx.api.sendPoll(
ctx.msg.chat.id,
`What is 1+1?`,
["0", "1", "2", "3"],
{
is_anonymous: false,
type: "quiz",
correct_option_id: correctAnswerId,
}
);
console.log("sent poll #" + message.poll.id + " to user " + ctx.from?.id);
});
bot.on('poll_answer', async (ctx) => {
console.log(ctx.pollAnswer.user.first_name + " answered to poll " + ctx.pollAnswer.poll_id + " with option " + ctx.pollAnswer.option_ids)
if (ctx.pollAnswer.option_ids.indexOf(correctAnswerId) > -1 ) {
await bot.api.sendMessage(ctx.pollAnswer.user.id, "You're a genius!");
}
else {
await bot.api.sendMessage(ctx.pollAnswer.user.id, "Almost correct!");
}
});
在发送轮询的代码中,我还添加了const message =
来保存返回值,其中包含message.poll.id
。这可以用来跟踪哪个轮询被发送给了哪个用户,这样您就可以很容易地找到轮询响应所指的轮询。注意:每次发送投票时,投票Id都会更改。
控制台将显示例如:
向用户1234567890发送了轮询#5418284016237281795jps用选项2 回答了5418284016237281795的民意调查