gpt4 book ai didi

python - 将冷却时间/计时器添加到 on_message [Discord.py]

转载 作者:行者123 更新时间:2023-12-01 01:55:09 24 4
gpt4 key购买 nike

我最近开始用 Python 制作一个 Discord 机器人(用它测试 Python 的基础),并自己创建了一个带有多个命令的功能机器人。为了扩大其用途,我添加了一个级别/XP 系统,到目前为止该系统正在运行。

[...]
@bot.event
async def on_message(message):
user_add_xp(message.author.id, 2)
await bot.process_commands(message)

# commands go here

def user_add_xp(user_id, xp):
if os.path.isfile('users.json'):
try:
with open('users.json', 'r') as fp:
users = json.load(fp)
users[user_id]['xp'] += xp
with open('users.json', 'w') as fp:
json.dump(users, fp, sort_keys=True, indent=4)
except KeyError:
with open('users.json', 'r') as fp:
users = json.load(fp)
users[user_id] = {}
users[user_id]['xp'] = xp
with open('users.json', 'w') as fp:
json.dump(users, fp, sort_keys=True, indent=4)
else:
users = {user_id: {}}
users[user_id]['xp'] = xp
with open('users.json', 'w') as fp:
json.dump(users, fp, sort_keys=True, indent=4)
[...]

但是为了防止用户在某些 channel 中大量涌入/垃圾邮件并飙升至顶部,我想在 XP 奖励上添加一个冷却/计时器。我尝试将 @commands.cooldown(1, 120, Commands.BucketType.server) 添加到 @bot.eventuser_add_xp,但两者都没有给我带来想要的结果。我不知道如何添加此冷却/计时器。

最后,我希望机器人每两分钟只授予一次 XP。

最佳答案

不确定仅使用 discord.py 是否可行,但您可以将上次向用户授予 XP 的消息存储在您的字典中。

下面的代码存储了一条消息奖励 XP 时自静态开始日期(纪元)以来的秒数。然后,当新消息事件发生时,它会检查该时间。

[...]
import datetime

epoch = datetime.datetime.utcfromtimestamp(0)

@bot.event
async def on_message(message):
user_add_xp(message.author.id, 2)
await bot.process_commands(message)

# commands go here

def user_add_xp(user_id, xp):
if os.path.isfile('users.json'):
try:
with open('users.json', 'r') as fp:
users = json.load(fp)

time_diff = (datetime.datetime.utcnow() - epoch).total_seconds() - users[user_id]['xp_time']
if time_diff >= 120:
users[user_id]['xp'] += xp
users[user_id]['xp_time'] = (datetime.datetime.utcnow() - epoch).total_seconds()
with open('users.json', 'w') as fp:
json.dump(users, fp, sort_keys=True, indent=4)
except KeyError:
with open('users.json', 'r') as fp:
users = json.load(fp)
users[user_id] = {}
users[user_id]['xp'] = xp
users[user_id]['xp_time'] = (datetime.datetime.utcnow() - epoch).total_seconds()
with open('users.json', 'w') as fp:
json.dump(users, fp, sort_keys=True, indent=4)
else:
users = {user_id: {}}
users[user_id]['xp'] = xp
users[user_id]['xp_time'] = (datetime.datetime.utcnow() - epoch).total_seconds()
with open('users.json', 'w') as fp:
json.dump(users, fp, sort_keys=True, indent=4)
[...]

关于python - 将冷却时间/计时器添加到 on_message [Discord.py],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50291785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com