如何存储用户数据并根据其对应的回调显示
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
.
的维护者
这是我的代码:
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
.