如何存储用户数据并根据其对应的回调显示

How to store user data and display them according to their corresponding callbacks

这是我的代码:

from telegram import *
from telegram.ext import *
import telegram, telegram.ext

u = Updater('TOKEN', use_context=True)
j=u.job_queue

def set(update: Update, context: CallbackContext):
    user_says=' '.join(context.args)
    user_says=user_says.split(' ')
    global item, chat_id
    item=user_says[1:]
    chat_id=update.effective_chat.id
    j.run_once(callback, int(user_says[0]))

def callback(context: telegram.ext.CallbackContext):
    context.bot.send_message(chat_id=chat_id, text=f'Great you won {item}')

if __name__ == '__main__':
    dp = u.dispatcher
    dp.add_handler(CommandHandler('set', set))
    u.start_polling()
    u.idle()

所以问题是,如果有人启动了计时器,同时计时器是 运行 其他人(或同一个人)启动了不同的计时器,则项目的值将被替换为最新的值,它将为当时已经 运行 的所有计时器显示错误的项目值(最新的除外)我如何存储项目并通过相应的计时器回调显示它们

希望你理解我的问题:)

您可以简单地使用字典来存储项目,chat_id 以 UUID 作为键,然后将 UUID 传递给回调函数并从字典中检索项目。

from uuid import uuid4
items = {}

def set(update: Update, context: CallbackContext):
    user_says=' '.join(context.args)
    user_says=user_says.split(' ')
    chat_id=update.effective_chat.id
    uid = uuid4()
    items[uid] = {"id": chat_id, "item": user_says[1:]}
    j.run_once(callback, int(user_says[0]), context=uid)

def callback(context: telegram.ext.CallbackContext):
    uid = context.job.context
    chat_id = items[uid]["id"]
    context.bot.send_message(chat_id=chat_id, text=f'Great you won {items[uid]["item"]}')
    del items[uid]

阅读

中有关多用户处理的更多信息

恕我直言 不必要地复杂。与其将一些数据存储在全局字典中,然后将密钥传递给 context,不如直接传递数据,例如作为元组:

j.run_once(callback, int(user_says[0]), context=(chat_id, user_says[1:]))

然后

def callback(context: telegram.ext.CallbackContext):
    uid, user_says = context.job.context
    ...

关于一个有点相关的说明,我想指出 PTB 已经带有内置机制来存储 user/chat-related 数据。有关详细信息,请参阅 this wiki page


免责声明:我目前是 python-telegram-bot.

的维护者