async def raAssign(self, ctx: Context, role: discord.Role = None): """Randomly assign roles to members of the guild. Parameters: ----------- role: discord.Role (optional) Apply to a subset of users with a certain role. If this is not specified, then it will apply one of the roles to ALL members of the guild. """ async with self.config.guild(ctx.guild).roles() as roleList: members = ctx.guild.members if role: members = [ member for member in members if role in member.roles ] msgObj = await ctx.send(":hourglass: **Role Assigner - Assign:** " "Assigning roles, please wait...") roleObjList = [] for roleId in roleList: roleObject = discord.utils.get(ctx.guild.roles, id=roleId) if roleObject: roleObjList.append(roleObject) async with ctx.typing(): random.shuffle(members) # Assigning roles takes a while for index, member in enumerate(members): anyRoles = [i for i in member.roles if i in roleObjList] if not anyRoles: # Only assign one role per user. If they have one already, # just skip them try: await member.add_roles( roleObjList[index % len(roleObjList)]) except discord.NotFound: self.logger.error( "Could not assign role: Member most " "likely just left the server!") msg = ":white_check_mark: **Role Assigner - Assign:** Roles assigned" if role: msg += " to users with the {} role.".format(role.name) else: msg += "." await msgObj.edit(content=msg)
async def raUnassign(self, ctx: Context, role: discord.Role = None): """Remove roles on the list from users. Parameters: ----------- role: discord.Role (optional) Remove roles from members with a certain role. If this is not specified, then it will remove all roles on the list from ALL members of the guild. """ async with self.config.guild(ctx.guild).roles() as roleList: members = ctx.guild.members if role: members = [ member for member in members if role in member.roles ] msgObj = await ctx.send( ":hourglass: **Role Assigner - Unassign:** " "Unassigning roles, please wait...") roleObjList = [] for roleId in roleList: roleObject = discord.utils.get(ctx.guild.roles, id=roleId) roleObjList.append(roleObject) async with ctx.typing(): for member in members: try: await member.remove_roles(*roleObjList) except discord.NotFound: self.logger.error( "Could not unassign roles: Member most likely " "just left the server!") msg = ":white_check_mark: **Role Assigner - Unassign:** Roles removed" if role: msg += " from users with the {} role.".format(role.name) else: msg += "." await msgObj.edit(content=msg)
async def _saveAvatars(self, ctx: Context): """Save all avatars in the current guild.""" async with ctx.typing(): for member in ctx.guild.members: await self.saveAvatar(member) await ctx.send("Saved all avatars!")