Source code for discordSuperUtils.ReactionRoles
from .Base import DatabaseChecker
from .Paginator import EmojiError
[docs]class ReactionManager(DatabaseChecker):
def __init__(self, bot):
super().__init__([
{
'guild': 'snowflake',
'message': 'snowflake',
'role': 'snowflake',
'emoji': 'string',
'remove_on_reaction': 'smallnumber'
}
], ['reaction_roles'])
self.bot = bot
self.add_event(self.on_database_connect)
[docs] async def on_database_connect(self):
self.bot.add_listener(self.__handle_reactions, "on_raw_reaction_add")
self.bot.add_listener(self.__handle_reactions, "on_raw_reaction_remove")
[docs] @staticmethod
def get_emoji_sql(emoji):
if not emoji.is_custom_emoji():
return str(emoji)
emoji_string = f"<:{emoji.name}:{emoji.id}>"
if emoji.animated:
emoji_string = emoji_string[:1] + 'a' + emoji_string[1:]
return emoji_string
async def __handle_reactions(self, payload):
self._check_database()
if payload.user_id == self.bot.user.id:
return
database_checks = {'guild': payload.guild_id,
'message': payload.message_id,
'emoji': self.get_emoji_sql(payload.emoji)}
reaction_role_data = await self.database.select(self.tables['reaction_roles'], self.tables_column_data[0],
database_checks)
if not reaction_role_data:
return
guild = self.bot.get_guild(payload.guild_id)
role = guild.get_role(reaction_role_data["role"])
channel = guild.get_channel(payload.channel_id)
message = await channel.fetch_message(payload.message_id)
emoji = self.get_emoji_sql(payload.emoji)
if emoji == reaction_role_data["emoji"]:
member = payload.member if payload.member else guild.get_member(payload.user_id)
if role is None:
await self.call_event('on_reaction_event', guild, channel, message, member, emoji)
else:
if role not in member.roles:
await member.add_roles(role)
elif reaction_role_data['remove_on_reaction'] == 1:
await member.remove_roles(role)
[docs] async def create_reaction(self, guild, message, role, emoji, remove_on_reaction: int):
self._check_database()
await self.database.insertifnotexists(self.tables['reaction_roles'],
dict(zip(self.tables_column_data[0], [
guild.id,
message.id,
role.id if role is not None else role,
emoji,
int(remove_on_reaction)
])), {'guild': guild.id, 'message': message.id, 'emoji': emoji})
if len(emoji) > 1:
emoji = self.bot.get_emoji(emoji)
try:
await message.add_reaction(emoji)
except Exception:
raise EmojiError("Cannot add reaction to message.")
[docs] async def delete_reaction(self, guild, message, emoji):
await self.database.delete(self.tables['reaction_roles'],
{'guild': guild.id, 'message': message.id, 'emoji': emoji})
[docs] async def get_reactions(self, guild=None):
return await self.database.select(self.tables['reaction_roles'], [], {'guild': guild.id} if guild else {}, True)