diff --git a/README.md b/README.md
index 8a881a3..ce3bc62 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,7 @@ Cog Function
| ccrole | **Beta** | Create custom commands that also assign roles
May have some bugs, please create an issue if you find any |
| chatter | **Alpha** | Chat-bot trained to talk like your guild
Missing some key features, but currently functional |
| coglint | **Alpha** | Error check code in python syntax posted to discord
Works, but probably needs more turning to work for cogs |
+| exclusiverole | **Alpha** | Prevent certain roles from getting any other roles
Fully functional, but pretty simple |
| fight | **Incomplete** | Organize bracket tournaments within discord
Still in-progress, a massive project |
| flag | **Alpha** | Create temporary marks on users that expire after specified time
Ported, will not import old data. Please report bugs |
| forcemention | **Alpha** | Mentions unmentionable roles
Very simple cog, mention doesn't persist |
diff --git a/exclusiverole/__init__.py b/exclusiverole/__init__.py
new file mode 100644
index 0000000..8797845
--- /dev/null
+++ b/exclusiverole/__init__.py
@@ -0,0 +1,5 @@
+from .exclusiverole import ExclusiveRole
+
+
+def setup(bot):
+ bot.add_cog(ExclusiveRole(bot))
diff --git a/exclusiverole/exclusiverole.py b/exclusiverole/exclusiverole.py
new file mode 100644
index 0000000..3ea2b54
--- /dev/null
+++ b/exclusiverole/exclusiverole.py
@@ -0,0 +1,89 @@
+import asyncio
+
+import discord
+from redbot.core import Config, checks, commands
+
+
+class ExclusiveRole:
+ """
+ Custom commands
+ Creates commands used to display text and adjust roles
+ """
+
+ def __init__(self, bot):
+ self.bot = bot
+ self.config = Config.get_conf(self, identifier=9999114111108101)
+ default_guild = {
+ "role_list": []
+ }
+
+ self.config.register_guild(**default_guild)
+
+ @commands.group(no_pm=True, aliases=["exclusiverole"])
+ async def exclusive(self, ctx):
+ """Base command for managing exclusive roles"""
+
+ if not ctx.invoked_subcommand:
+ pass
+
+ @exclusive.command(name="add")
+ @checks.mod_or_permissions(administrator=True)
+ async def exclusive_add(self, ctx, role: discord.Role):
+ """Adds an exclusive role"""
+ if role.id in (await self.config.guild(ctx.guild).role_list()):
+ await ctx.send("That role is already exclusive")
+ return
+
+ async with self.config.guild(ctx.guild).role_list() as rl:
+ rl.append(role.id)
+
+ await self.check_guild(ctx.guild)
+
+ await ctx.send("Exclusive role added")
+
+ @exclusive.command(name="delete")
+ @checks.mod_or_permissions(administrator=True)
+ async def exclusive_delete(self, ctx, role: discord.Role):
+ """Deletes an exclusive role"""
+ if role.id not in (await self.config.guild(ctx.guild).role_list()):
+ await ctx.send("That role is not exclusive")
+ return
+
+ async with self.config.guild(ctx.guild).role_list() as rl:
+ rl.remove(role.id)
+
+ await ctx.send("Exclusive role removed")
+
+ async def check_guild(self, guild: discord.Guild):
+ role_set = set(await self.config.guild(guild).role_list())
+ for member in guild.members:
+ try:
+ await self.remove_non_exclusive_roles(member, role_set=role_set)
+ except discord.Forbidden:
+ pass
+
+ async def remove_non_exclusive_roles(self, member: discord.Member, role_set=None):
+ if role_set is None:
+ role_set = set(await self.config.guild(member.guild).role_list())
+
+ member_set = set([role.id for role in member.roles])
+ to_remove = (member_set - role_set) - {member.guild.default_role.id}
+
+ if to_remove and member_set & role_set:
+ to_remove = [discord.utils.get(member.guild.roles, id=id) for id in to_remove]
+ await member.remove_roles(*to_remove, reason="Exclusive roles")
+
+ async def on_member_update(self, before: discord.Member, after: discord.Member):
+ if before.roles == after.roles:
+ return
+
+ await asyncio.sleep(1)
+
+ role_set = set(await self.config.guild(after.guild).role_list())
+ member_set = set([role.id for role in after.roles])
+
+ if role_set & member_set:
+ try:
+ await self.remove_non_exclusive_roles(after, role_set=role_set)
+ except discord.Forbidden:
+ pass
diff --git a/exclusiverole/info.json b/exclusiverole/info.json
new file mode 100644
index 0000000..d5f7b8c
--- /dev/null
+++ b/exclusiverole/info.json
@@ -0,0 +1,22 @@
+{
+ "author": [
+ "Bobloy"
+ ],
+ "bot_version": [
+ 3,
+ 0,
+ 0
+ ],
+ "description": "Assign roles to be exclusive, preventing other roles from being added",
+ "hidden": false,
+ "install_msg": "Thank you for installing ExclusiveRole. Get started with `[p]help ExclusiveRole`",
+ "requirements": [],
+ "short": "Set roles to be exclusive",
+ "tags": [
+ "fox",
+ "bobloy",
+ "utility",
+ "tools",
+ "roles"
+ ]
+}
\ No newline at end of file