Update role_manager.py
This commit is contained in:
@@ -1,9 +1,11 @@
|
|||||||
|
import asyncio
|
||||||
|
import logging
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
|
|
||||||
import config
|
import config
|
||||||
from utils.data_manager import save_message_id, load_message_id
|
from utils.data_manager import save_message_id, load_message_id
|
||||||
import logging
|
|
||||||
import asyncio
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -21,7 +23,7 @@ class RoleManager(commands.Cog):
|
|||||||
logger.info("Initialized role message with id: %s", self.role_message_id)
|
logger.info("Initialized role message with id: %s", self.role_message_id)
|
||||||
else:
|
else:
|
||||||
logger.info("No role message found")
|
logger.info("No role message found")
|
||||||
asyncio.ensure_future(self._startup())
|
asyncio.create_task(self._startup())
|
||||||
|
|
||||||
async def _startup(self):
|
async def _startup(self):
|
||||||
await self.bot.wait_until_ready()
|
await self.bot.wait_until_ready()
|
||||||
@@ -42,6 +44,7 @@ class RoleManager(commands.Cog):
|
|||||||
|
|
||||||
emoji = str(payload.emoji)
|
emoji = str(payload.emoji)
|
||||||
if emoji not in self.REACTION_ROLES:
|
if emoji not in self.REACTION_ROLES:
|
||||||
|
logger.debug("Unknown emoji reaction: %s", emoji)
|
||||||
return
|
return
|
||||||
|
|
||||||
guild = self.bot.get_guild(payload.guild_id)
|
guild = self.bot.get_guild(payload.guild_id)
|
||||||
@@ -78,6 +81,8 @@ class RoleManager(commands.Cog):
|
|||||||
channel = await self.bot.fetch_channel(self.CHANNEL_ID)
|
channel = await self.bot.fetch_channel(self.CHANNEL_ID)
|
||||||
message = await channel.fetch_message(self.role_message_id)
|
message = await channel.fetch_message(self.role_message_id)
|
||||||
|
|
||||||
|
users_with_reactions: dict[int, set[int]] = {}
|
||||||
|
|
||||||
for reaction in message.reactions:
|
for reaction in message.reactions:
|
||||||
emoji = str(reaction.emoji)
|
emoji = str(reaction.emoji)
|
||||||
if emoji not in self.REACTION_ROLES:
|
if emoji not in self.REACTION_ROLES:
|
||||||
@@ -88,14 +93,27 @@ class RoleManager(commands.Cog):
|
|||||||
logger.warning("Role with id %s not found during sync", self.REACTION_ROLES[emoji])
|
logger.warning("Role with id %s not found during sync", self.REACTION_ROLES[emoji])
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
reacted_ids = set()
|
||||||
async for user in reaction.users():
|
async for user in reaction.users():
|
||||||
if user.bot:
|
if user.bot:
|
||||||
continue
|
continue
|
||||||
|
reacted_ids.add(user.id)
|
||||||
member = message.guild.get_member(user.id)
|
member = message.guild.get_member(user.id)
|
||||||
if member and role not in member.roles:
|
if member and role not in member.roles:
|
||||||
await member.add_roles(role)
|
await member.add_roles(role)
|
||||||
logger.info("Sync gave role '%s' to '%s'", role.name, member.name)
|
logger.info("Sync gave role '%s' to '%s'", role.name, member.name)
|
||||||
|
|
||||||
|
users_with_reactions[self.REACTION_ROLES[emoji]] = reacted_ids
|
||||||
|
|
||||||
|
for role_id, reacted_ids in users_with_reactions.items():
|
||||||
|
role = message.guild.get_role(role_id)
|
||||||
|
if not role:
|
||||||
|
continue
|
||||||
|
for member in role.members:
|
||||||
|
if member.id not in reacted_ids:
|
||||||
|
await member.remove_roles(role)
|
||||||
|
logger.info("Sync removed role '%s' from '%s'", role.name, member.name)
|
||||||
|
|
||||||
except discord.NotFound:
|
except discord.NotFound:
|
||||||
logger.warning("Role message not found during sync")
|
logger.warning("Role message not found during sync")
|
||||||
except discord.Forbidden:
|
except discord.Forbidden:
|
||||||
@@ -106,18 +124,25 @@ class RoleManager(commands.Cog):
|
|||||||
@commands.hybrid_command()
|
@commands.hybrid_command()
|
||||||
@commands.has_permissions(administrator=True)
|
@commands.has_permissions(administrator=True)
|
||||||
async def create_role_message(self, ctx):
|
async def create_role_message(self, ctx):
|
||||||
message = await ctx.send(config.ROLE_MESSAGE_TEXT)
|
channel = self.bot.get_channel(self.CHANNEL_ID)
|
||||||
|
if not channel:
|
||||||
|
await ctx.send("канал не найден")
|
||||||
|
return
|
||||||
|
|
||||||
|
message = await channel.send(config.ROLE_MESSAGE_TEXT)
|
||||||
for emoji in self.REACTION_ROLES:
|
for emoji in self.REACTION_ROLES:
|
||||||
await message.add_reaction(emoji)
|
await message.add_reaction(emoji)
|
||||||
|
|
||||||
self.role_message_id = message.id
|
self.role_message_id = message.id
|
||||||
save_message_id(message.id)
|
save_message_id(message.id)
|
||||||
logger.info("Created new role message with id: %s", message.id)
|
logger.info("Created new role message with id: %s", message.id)
|
||||||
|
await ctx.send("готово", ephemeral=True)
|
||||||
|
|
||||||
@commands.hybrid_command()
|
@commands.hybrid_command()
|
||||||
@commands.has_permissions(administrator=True)
|
@commands.has_permissions(administrator=True)
|
||||||
async def update_role_message(self, ctx):
|
async def update_role_message(self, ctx):
|
||||||
if not self.role_message_id:
|
if not self.role_message_id:
|
||||||
|
await ctx.send("сообщение с ролями не создано, используй /create_role_message")
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -132,12 +157,15 @@ class RoleManager(commands.Cog):
|
|||||||
await message.add_reaction(emoji)
|
await message.add_reaction(emoji)
|
||||||
|
|
||||||
logger.info("Role message updated by %s", ctx.author.name)
|
logger.info("Role message updated by %s", ctx.author.name)
|
||||||
|
await ctx.send("готово", ephemeral=True)
|
||||||
|
|
||||||
except discord.NotFound:
|
except discord.NotFound:
|
||||||
logger.warning("Role message not found during update")
|
logger.warning("Role message not found during update")
|
||||||
|
await ctx.send("сообщение не найдено")
|
||||||
except discord.Forbidden:
|
except discord.Forbidden:
|
||||||
logger.error("Missing permissions to edit role message")
|
logger.error("Missing permissions to edit role message")
|
||||||
|
await ctx.send("нет прав на редактирование")
|
||||||
|
|
||||||
|
|
||||||
async def setup(bot):
|
async def setup(bot):
|
||||||
await bot.add_cog(RoleManager(bot))
|
await bot.add_cog(RoleManager(bot))
|
||||||
|
|||||||
Reference in New Issue
Block a user