@Mind2077

Как сделать команду, выдающую роль на время?

Хочу сделать команду, которая выдаёт роль пользователю на определённое время(например, на 3 часа) и, когда срок заканчивается, автоматически снимает роль. При этом надо, чтобы всё это работало не через asyncio.sleep и ему подобные, а записывало данные в Json, чтобы например, после перезапуска бота, всё работало корректно.
  • Вопрос задан
  • 341 просмотр
Пригласить эксперта
Ответы на вопрос 1
@DF0rig
clay
Естественно максимально точно данную команду сделать невозможно, с учётами перезапусков ботов. Я предлагаю свой вариант: Вы можете использовать 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("Срок выдачи роли игрока истёк")

Я не уверен что данный код работает. Поправьте меня если вдруг я допустил ошибку.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы