Advertisement
Jarquafelmu

Untitled

May 1st, 2019
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.20 KB | None | 0 0
  1. from redbot.core import commands, Config
  2. from redbot.core.utils.chat_formatting import warning, error, box
  3. from .channels import Channels, ChannelIds
  4. from .logger import logger
  5.  
  6. import discord
  7. import contextlib
  8.  
  9.  
  10. class RoleManager(commands.Cog):
  11.     """Manages roles for Server McServerface"""
  12.  
  13.     def __init__(self, bot, args):
  14.         self.bot = bot
  15.         self.channels = args["channels"]
  16.         self.logic = args["logic"]
  17.         self.guild_id = args["guild_id"]
  18.         self.log = self.channels.log
  19.  
  20.         self.db = Config.get_conf(self, 268451739)
  21.  
  22.         default_guild = {
  23.             "registered_roles": [],
  24.             "default_role_template": {
  25.                 "role_name": None,
  26.                 "role_id": None,
  27.                 "emoji": None,
  28.                 "message_id": None
  29.             }
  30.         }
  31.  
  32.         self.db.register_guild(**default_guild)
  33.  
  34.     @commands.group(name="roles")
  35.     async def _roles_settings(self, ctx):
  36.         """
  37.        Settings for roles.
  38.        """
  39.    
  40.     @_roles_settings.command(name="register", aliases=["reg", "r"])
  41.     async def _roles_settings_register(self, ctx, role_id: int = None, emoji: str = None, msg_id: int = None):
  42.         """
  43.        Registers a new role.
  44.        """
  45.         fail = False;
  46.         if role_id is None:            
  47.             msg = "role_id was not provided."
  48.             fail = True
  49.  
  50.         if emoji is None:            
  51.             msg = "emoji was not provided."
  52.             fail = True
  53.  
  54.         if msg_id is None:            
  55.             msg = "message_id was not provided."
  56.             fail = True
  57.  
  58.         if (fail):
  59.             await ctx.send(error(msg))
  60.             logger.error(msg)
  61.             return
  62.  
  63.         guild = self.db.guild(self.bot.get_guild(self.guild_id))
  64.  
  65.         logger.debug("got guild")
  66.  
  67.         newRole = await self.db.guild(guild).get_raw("default_role_template")
  68.  
  69.         logger.debug("got new role template")
  70.  
  71.         newRole["role_name"] = guild.get_role(role_id)
  72.         newRole["role_id"] = role_id
  73.         newRole["emoji"] = emoji
  74.         newRole["message_id"] = msg_id
  75.        
  76.         logger.debug("set values for new role")
  77.  
  78.         async with self.db.guild(guild).registered_roles() as roles:
  79.             roles.append(newRole)
  80.        
  81.         logger.debug("stored role")
  82.  
  83.     @_roles_settings.command(name="view", aliases=["v"])
  84.     async def _roles_settings_view(self, ctx):
  85.         """
  86.        Prints out a list of the currently registered roles.
  87.        """
  88.         guild = self.db.guild(self.bot.get_guild(self.guild_id))
  89.  
  90.         async with ctx.channel.typing():
  91.             async with self.db.guild(guild).registered_roles() as roles:
  92.                 for role in roles:
  93.                     await ctx.send(box(
  94.                         f"role: {role['role_name']}\n"
  95.                         f"id: {role['role_id']}\n"
  96.                         f"emoji: {role['emoji']}\n"
  97.                         f"linked_message_id: {role['message_id']}"
  98.                     ))
  99.         await ctx.channel.send("Done.")
  100.    
  101.     async def on_raw_reaction_add(self, payload):        
  102.         """
  103.        Member agrees to the rules
  104.        """        
  105.         await self.process_reaction(payload, True)
  106.                
  107.     async def on_raw_reaction_remove(self, payload):        
  108.         """
  109.        Member no longer agrees to the rules
  110.        """        
  111.         await self.process_reaction(payload, False)
  112.                
  113.     async def process_reaction(self, payload, isAddingRole: bool):
  114.         """
  115.        Handles the processing of the reaction
  116.        """
  117.         member = self.bot.get_guild(self.guild_id).get_member(payload.user_id)
  118.        
  119.         if member is None:
  120.             return logger.debug(f"Member {member.name} not found as a valid member.")
  121.        
  122.         emoji = str(payload.emoji)
  123.  
  124.         matches = {};
  125.         guild = self.bot.get_guild(self.guild_id)
  126.  
  127.         async with self.db.guild(guild).registered_roles() as roles:
  128.                 for role_package in roles:
  129.                     if (role_package["message_id"] == payload.message_id):
  130.                         matches.append(role_package)
  131.  
  132.         if not matches:
  133.             return logger.debug(f"No registered role found to match message id: '{payload.message_id}'")
  134.  
  135.         role = None
  136.         for match in matches:
  137.             if match["emoji"].startswith(payload.emoji):
  138.                 role = match        
  139.  
  140.         if role is None:
  141.             return logger.debug(f"No registered role found to match the provided emoji.")
  142.  
  143.         role_obj = self.bot.get_guild(self.guild_id).get_role(role["role_id"])
  144.  
  145.         try:
  146.             if isAddingRole:
  147.                 action = "added"
  148.                 await member.add_roles(role_obj)
  149.             else:
  150.                 action = "removed"
  151.                 await member.remove_roles(role_obj)
  152.         except discord.Forbidden:
  153.             logger.exception(f"I do not have permission to modify roles for member {member.name}.")
  154.         except discord.HTTPException:
  155.             logger.exception("Updating the role failed.")
  156.         else:            
  157.             await self.log.send(f"`{member.name}` {action} {role['role_name']} role.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement