Естественно максимально точно данную команду сделать невозможно, с учётами перезапусков ботов. Я предлагаю свой вариант: Вы можете использовать datetime для таймера
@bot.command()
async def add_role(ctx, member: discord.Member, arg1=None, arg2=None):
# arg1 - ID роли
# arg2 - Время В МИНУТАХ!
if (arg == None) or (arg1 == None):
await ctx.send("Укажите пользователя или время в **минутах**")
return
discord_author = ctx.author.id
dt = datetime.now() # Текущее время
user_time = dt + timedelta(minutes=int(arg2)) # Получаем время окончания роли
with open("temp.json", 'r') as f: # Создайте файл temp.json
data = json.load(f)
data.update({
discord_author: {
"time": str(user_time),
"role": arg2
})
with open("temp.json", 'w') as file:
json.dump(data, file, indent=4)
role = discord.utils.get(ctx.guild.roles, id=int(arg1))
await ctx.send(f"Пользователю {member} выдана роль на {arg2} минут")
await ctx.member.add_roles(role)
@bot.event
async def on_ready():
with open("temp.json" 'r') as f:
data = json.load(f)
for user in data:
with open("temp.json", 'r') as file:
dont_ready_file = file.read()
files = json.loads(dont_ready_file)
user_times = files[user]["time"]
user_time = datetime.strptime(user_times, "%Y-%m-%d %H:%M:%S.%f")
dt = datetime.now()
if dt < user_time:
data.pop(user)
user_role = files[user]["role"]
role = discord.utils.get(ctx.guild.roles, id=int(user_role))
await member.remove_roles(role)
print("Срок выдачи роли игрока истёк")
# Повторяем действия, но с on_message, чтобы гарантировать максимальную точность
@bot.event
async def on_message():
with open("temp.json" 'r') as f:
data = json.load(f)
for user in data:
with open("temp.json", 'r') as file:
dont_ready_file = file.read()
files = json.loads(dont_ready_file)
user_times = files[user]["time"]
user_time = datetime.strptime(user_times, "%Y-%m-%d %H:%M:%S.%f")
dt = datetime.now()
if dt < user_time:
data.pop(user)
user_role = files[user]["role"]
role = discord.utils.get(ctx.guild.roles, id=int(user_role))
await member.remove_roles(role)
print("Срок выдачи роли игрока истёк")
Я не уверен что данный код работает. Поправьте меня если вдруг я допустил ошибку.