auto roles manage themselves completely, remove/add when leave

This commit is contained in:
brandons209 2020-05-07 22:49:22 -04:00
parent 79bd86000e
commit 35f314f456

View file

@ -32,8 +32,8 @@ class PersonalRoles(commands.Cog):
def __init__(self, bot: commands.Bot): def __init__(self, bot: commands.Bot):
self.bot = bot self.bot = bot
self.config = Config.get_conf(self, identifier=0x3D86BBD3E2B744AE8AA8B5D986EB4DD8, force_registration=True) self.config = Config.get_conf(self, identifier=0x3D86BBD3E2B744AE8AA8B5D986EB4DD8, force_registration=True)
default_member = {"role": None} default_member = {"role": None, "auto_role": False}
default_guild = {"blacklist": [], "auto_roles": [], "position_role": None, "auto_enabled": False} default_guild = {"blacklist": [], "auto_roles": [], "position_role": None}
self.config.register_member(**default_member) self.config.register_member(**default_member)
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
@ -199,18 +199,6 @@ class PersonalRoles(commands.Cog):
await self.config.guild(ctx.guild).position_role.set(role_pos.id) await self.config.guild(ctx.guild).position_role.set(role_pos.id)
await ctx.tick() await ctx.tick()
@myrole_auto.command(name="enabled")
async def myrole_auto_enabled(self, ctx, *, on_off: bool = None):
"""Enable/disable auto role"""
curr = await self.config.guild(ctx.guild).auto_enabled()
if on_off is None:
curr_msg = "on" if curr else "off"
await ctx.send(f"Auto role creation is currently {curr_msg}.")
return
await self.config.guild(ctx.guild).auto_enabled.set(on_off)
await ctx.tick()
@myrole.group() @myrole.group()
@commands.guild_only() @commands.guild_only()
@checks.admin_or_permissions(manage_roles=True) @checks.admin_or_permissions(manage_roles=True)
@ -343,7 +331,7 @@ class PersonalRoles(commands.Cog):
if not role: if not role:
pos = await self.config.guild(ctx.guild).position_role() pos = await self.config.guild(ctx.guild).position_role()
pos = ctx.guild.get_role(pos) pos = ctx.guild.get_role(pos)
pos = pos.position if pos else 0 pos = pos.position if pos else 1
try: try:
role = await ctx.guild.create_role( role = await ctx.guild.create_role(
@ -354,12 +342,13 @@ class PersonalRoles(commands.Cog):
await asyncio.sleep(0.3) await asyncio.sleep(0.3)
await ctx.author.add_roles(role, reason=_("Personal Roles")) await ctx.author.add_roles(role, reason=_("Personal Roles"))
await self.config.member(ctx.author).role.set(role.id) await self.config.member(ctx.author).role.set(role.id)
await self.config.member(ctx.author).auto_role.set(True)
except: except:
await ctx.send(chat.warning("Could not create your personal role, please contact an admin.")) await ctx.send(chat.warning("Could not create your personal role, please contact an admin."))
return return
await ctx.send( await ctx.send(
f"Role created! You can edit it using `{ctx.prefix}myrole name` and `{ctx.prefix}myrole colour` commands. Pos: {pos}" f"Role created! You can edit it using `{ctx.prefix}myrole name` and `{ctx.prefix}myrole colour` commands."
) )
else: else:
await ctx.send(chat.warning("You already have a personal role!")) await ctx.send(chat.warning("You already have a personal role!"))
@ -376,15 +365,64 @@ class PersonalRoles(commands.Cog):
return role return role
### Listeners ### Listeners
@commands.Cog.listener("on_member_join")
async def role_persistance(self, member):
"""Automatically give already assigned roles on join"""
role = await self.config.member(member).role()
if role:
role = member.guild.get_role(role)
if role and member:
try:
await member.add_roles(role, reason=_("Personal Role"))
except discord.Forbidden:
pass
@commands.Cog.listener("on_member_remove") @commands.Cog.listener("on_member_remove")
async def remove_role(self, member): async def remove_role(self, member):
""" Delete personal role if member leaves.""" """ Delete personal role if member leaves."""
role = await self.config.member(member).role() role = await self.config.member(member).role()
await self.config.member(member).role.clear() auto = await self.config.member(member).auto_role()
role = member.guild.get_role(role) role = member.guild.get_role(role)
if role: if auto:
await self.config.member(member).role.clear()
await self.config.member(member).auto_role.clear()
try: try:
await role.delete() await role.delete()
except: except:
pass pass
@commands.Cog.listener("on_member_update")
async def modify_roles(self, before, after):
""" Delete personal role if member looses their auto role or looses their personal role """
role = await self.config.member(after).role()
role = before.guild.get_role(role)
if not role:
return
auto = await self.config.member(after).auto_role()
if not auto:
return
auto_roles = await self.config.guild(before.guild).auto_roles()
if before.roles != after.roles:
if role not in after.roles:
await self.config.member(after).role.clear()
await self.config.member(after).auto_role.clear()
try:
await role.delete()
except:
pass
else:
after_ids = [r.id for r in after.roles]
for m_role in after_ids:
if m_role in auto_roles:
return
# lost their auto role, remove personal role, delete, and clear their data.
await after.remove_roles(role, reason=_("Personal Roles"))
await self.config.member(after).role.clear()
await self.config.member(after).auto_role.clear()
try:
await role.delete()
except:
pass