Я создал команду отключения и включения звука для своего бота discord.py, но если заглушенный участник снова войдет, роль будет удалена, как если бы он не был заглушен. Как сделать так, чтобы при повторном входе на сервер его роль оставалась с ним до конца срока?
import discord
from discord.ext import commands
import asyncio
intents = discord.Intents.default()
intents.members = True
bot = commands.Bot(command_prefix = "/", intents = intents)
logchannel = bot.get_channel(**********)
@bot.command()
async def mute(ctx, member:discord.Member, time:int):
muterole = discord.utils.get(ctx.guild.roles, id = *********)
await member.add_roles(muterole)
await asyncio.sleep(time * 60)
if muterole in member.roles:
await member.remove_roles(muterole)
return
else:
return
@bot.command()
async def unmute(ctx, member:discord.Member):
muterole = discord.utils.get(ctx.guild.roles, id = ******)
if muterole in member.roles:
await member.remove_roles(muterole)
return
else:
return
Существует событие под названием on_member_join
, которое запускается каждый раз, когда участник присоединяется к гильдии. Вы можете использовать это событие, чтобы проверить, отключен ли участник в настоящее время в соответствии с вашим ботом, когда он присоединится к серверу. Вам нужно будет отслеживать, какие участники в настоящее время каким-то образом отключены.
Ниже приведен основной способ работы этого кода. Я предположил, что вы, вероятно, могли бы использовать список как способ хранения пользовательских отключений. Это не было проверено, но это примерно то, что должно произойти.
import discord
from discord.ext import commands
import asyncio
intents = discord.Intents.default()
intents.members = True
bot = commands.Bot(command_prefix = "/", intents = intents)
logchannel = bot.get_channel(**********)
list_of_muted_members = []
@bot.event
async def on_member_join(member):
if (member in list_of_muted_members): # Once someone joins the server, this event gets triggered and checks to see if the person is currently in the muted list, if they are, the muted role gets given back to them.
muterole = discord.utils.get(member.guild.roles, name = "muterole")
await member.add_roles(muterole)
@bot.command()
async def mute(ctx, member:discord.Member, time:int):
muterole = discord.utils.get(ctx.guild.roles, id = *********)
await member.add_roles(muterole)
list_of_muted_members.append(member) # This will add the user to the list because they muted
await asyncio.sleep(time * 60)
if muterole in member.roles:
await member.remove_roles(muterole)
list_of_muted_members.remove(member) # This will remove the user from the list because they aren't muted anymore
return
else:
return
@bot.command()
async def unmute(ctx, member:discord.Member):
muterole = discord.utils.get(ctx.guild.roles, id = ******)
if muterole in member.roles:
await member.remove_roles(muterole)
list_of_muted_members.remove(member) # This will remove the user from the list because they aren't muted anymore
return
else:
return