async def setxpreserve(self, ctx, *, member=None, xpAmount: int = None): """Set's an absolute value for the member's xp reserve (admin only).""" author = ctx.message.author server = ctx.message.guild channel = ctx.message.channel usage = 'Usage: `{}setxpreserve [member] [amount]`'.format(ctx.prefix) # Check if we're suppressing @here and @everyone mentions if self.settings.getServerStat(server, "SuppressMentions"): suppress = True else: suppress = False if not await Utils.is_admin_reply(ctx): return if member == None: await ctx.message.channel.send(usage) return if xpAmount == None: # Check if we have trailing xp nameCheck = DisplayName.checkNameForInt(member, server) if not nameCheck or nameCheck['Member'] is None: nameCheck = DisplayName.checkRoleForInt(member, server) if not nameCheck: await ctx.message.channel.send(usage) return if "Role" in nameCheck: mem = nameCheck["Role"] else: mem = nameCheck["Member"] exp = nameCheck["Int"] if not mem: msg = 'I couldn\'t find *{}* on the server.'.format(member) # Check for suppress if suppress: msg = Nullify.clean(msg) await ctx.message.channel.send(msg) return member = mem xpAmount = exp # Check for formatting issues if xpAmount == None: # Still no xp... await channel.send(usage) return if type(member) is discord.Member: self.settings.setUserStat(member, server, "XPReserve", xpAmount) else: for m in ctx.guild.members: if member in m.roles: self.settings.setUserStat(m, server, "XPReserve", xpAmount) msg = '*{}\'s* XPReserve was set to *{:,}!*'.format( DisplayName.name(member), xpAmount) await channel.send(msg)
async def addxprole(self, ctx, *, role = None, xp : int = None): """Adds a new role to the xp promotion/demotion system (admin only).""" author = ctx.message.author server = ctx.message.guild channel = ctx.message.channel usage = 'Usage: `{}addxprole [role] [required xp]`'.format(ctx.prefix) # Check if we're suppressing @here and @everyone mentions if self.settings.getServerStat(server, "SuppressMentions"): suppress = True else: suppress = False isAdmin = author.permissions_in(channel).administrator # Only allow admins to change server stats if not isAdmin: await channel.send('You do not have sufficient privileges to access this command.') return if xp == None: # Either xp wasn't set - or it's the last section if type(role) is str: if role == "everyone": role = "@everyone" # It' a string - the hope continues roleCheck = DisplayName.checkRoleForInt(role, server) if not roleCheck: await ctx.message.channel.send(usage) return if not roleCheck["Role"]: msg = 'I couldn\'t find *{}* on the server.'.format(role) # Check for suppress if suppress: msg = Nullify.clean(msg) await ctx.message.channel.send(msg) return role = roleCheck["Role"] xp = roleCheck["Int"] if xp == None: await channel.send(usage) return if not type(xp) is int: await channel.send(usage) return # Now we see if we already have that role in our list promoArray = self.settings.getServerStat(server, "PromotionArray") for aRole in promoArray: # Get the role that corresponds to the id if str(aRole['ID']) == str(role.id): # We found it - throw an error message and return aRole['XP'] = xp msg = '**{}** updated! Required xp: *{:,}*'.format(role.name, xp) # msg = '**{}** is already in the list. Required xp: *{}*'.format(role.name, aRole['XP']) # Check for suppress if suppress: msg = Nullify.clean(msg) await channel.send(msg) return # If we made it this far - then we can add it promoArray.append({ 'ID' : role.id, 'Name' : role.name, 'XP' : xp }) self.settings.setServerStat(server, "PromotionArray", promoArray) msg = '**{}** added to list. Required xp: *{:,}*'.format(role.name, xp) # Check for suppress if suppress: msg = Nullify.clean(msg) await channel.send(msg) return
async def setxp(self, ctx, *, member = None, xpAmount : int = None): """Sets an absolute value for the member's xp (admin only).""" author = ctx.message.author server = ctx.message.guild channel = ctx.message.channel usage = 'Usage: `{}setxp [member] [amount]`'.format(ctx.prefix) # Check if we're suppressing @here and @everyone mentions if self.settings.getServerStat(server, "SuppressMentions"): suppress = True else: suppress = False isAdmin = author.permissions_in(channel).administrator # Only allow admins to change server stats if not isAdmin: await channel.send('You do not have sufficient privileges to access this command.') return if member == None: await ctx.message.channel.send(usage) return if xpAmount == None: # Check if we have trailing xp nameCheck = DisplayName.checkNameForInt(member, server) if not nameCheck or nameCheck['Member'] is None: nameCheck = DisplayName.checkRoleForInt(member, server) if not nameCheck: await ctx.message.channel.send(usage) return if "Role" in nameCheck: mem = nameCheck["Role"] else: mem = nameCheck["Member"] exp = nameCheck["Int"] if not mem: msg = 'I couldn\'t find *{}* on the server.'.format(member) # Check for suppress if suppress: msg = Nullify.clean(msg) await ctx.message.channel.send(msg) return member = mem xpAmount = exp # Check for formatting issues if xpAmount == None: # Still no xp... await channel.send(usage) return if type(member) is discord.Member: self.settings.setUserStat(member, server, "XP", xpAmount) else: for m in ctx.guild.members: if member in m.roles: self.settings.setUserStat(m, server, "XP", xpAmount) msg = '*{}\'s* xp was set to *{:,}!*'.format(DisplayName.name(member), xpAmount) # Check for suppress if suppress: msg = Nullify.clean(msg) await channel.send(msg) await CheckRoles.checkroles(member, channel, self.settings, self.bot)
async def torment(self, ctx, *, member=None, times: int = None): """Deals some vigilante justice (owner only).""" channel = ctx.message.channel author = ctx.message.author server = ctx.message.guild message = ctx.message # Only allow owner to change server stats isOwner = self.settings.isOwner(ctx.author) if isOwner == None: return elif isOwner == False: return usage = 'Usage: `{}torment [role/member] [times]`'.format(ctx.prefix) isRole = False if member == None: await ctx.channel.send(usage) return # Check for formatting issues if times == None: # Either xp wasn't set - or it's the last section if type(member) is str: # It' a string - the hope continues roleCheck = DisplayName.checkRoleForInt(member, server) if roleCheck and roleCheck["Role"]: isRole = True member = roleCheck["Role"] times = roleCheck["Int"] else: # Role is invalid - check for member instead nameCheck = DisplayName.checkNameForInt(member, server) if not nameCheck: await ctx.channel.send(usage) return if not nameCheck["Member"]: msg = 'I couldn\'t find that user or role on the server.'.format( member) await ctx.channel.send(msg) return member = nameCheck["Member"] times = nameCheck["Int"] # Set the torment flag self.toTorment = True if times == None: # Still no times - roll back to default times = 25 if times > 100: times = 100 if times == 0: await ctx.channel.send( 'Oooooh - I bet they feel *sooooo* tormented...') return if times < 0: await ctx.channel.send('I just uh... *un-tormented* them. Yeah.') return # Delete original torment message await message.delete() for i in range(0, times): # Do this over time try: if member.name == "@everyone" and type(member) is discord.Role: await channel.send("{}".format(member.name)) else: await channel.send('{}'.format(member.mention)) except Exception: pass for j in range(0, self.waitBetween): # Wait for 1 second, then check if we should cancel - then wait some more await asyncio.sleep(1) if not self.toTorment: return
async def stealthservertorment(self, ctx, *, member=None, times: int = None): """Deals some sneaky vigilante justice in all channels (owner only).""" channel = ctx.message.channel author = ctx.message.author server = ctx.message.server message = ctx.message # Only allow owner to change server stats serverDict = self.settings.serverDict try: owner = serverDict['Owner'] except KeyError: owner = None if owner == None: # No owner set return else: if not author.id == owner: return usage = 'Usage: `{}torment [role/member] [times]`'.format(ctx.prefix) isRole = False if member == None: await self.bot.send_message(ctx.message.channel, usage) return # Check for formatting issues if times == None: # Either xp wasn't set - or it's the last section if type(member) is str: # It' a string - the hope continues roleCheck = DisplayName.checkRoleForInt(member, server) if roleCheck and roleCheck["Role"]: isRole = True member = roleCheck["Role"] times = roleCheck["Int"] else: # Role is invalid - check for member instead nameCheck = DisplayName.checkNameForInt(member, server) if not nameCheck: await self.bot.send_message(ctx.message.channel, usage) return if not nameCheck["Member"]: msg = 'I couldn\'t find that user or role on the server.'.format( member) await self.bot.send_message(ctx.message.channel, msg) return member = nameCheck["Member"] times = nameCheck["Int"] # Set the torment flag self.toTorment = True if times == None: # Still no times - roll back to default times = 25 if times > 100: times = 100 if times == 0: await self.bot.send_message( ctx.message.channel, 'Oooooh - I bet they feel *sooooo* tormented...') return if times < 0: await self.bot.send_message( ctx.message.channel, 'I just uh... *un-tormented* them. Yeah.') return # Delete original torment message await self.bot.delete_message(message) for i in range(0, times): # Do this over time for channel in server.channels: # Get user's permissions if channel.permissions_for( member ).read_messages and channel.type is discord.ChannelType.text: # Only ping where they can read try: tmessage = await self.bot.send_message( channel, '*{}*'.format(member.mention)) await self.bot.delete_message(tmessage) except Exception: pass for j in range(0, self.waitBetween): # Wait for 1 second, then check if we should cancel - then wait some more await asyncio.sleep(1) if not self.toTorment: return
async def xp(self, ctx, *, member=None, xpAmount: int = None): """Gift xp to other members.""" author = ctx.message.author server = ctx.message.server channel = ctx.message.channel # Check if we're suppressing @here and @everyone mentions if self.settings.getServerStat(server, "SuppressMentions").lower() == "yes": suppress = True else: suppress = False usage = 'Usage: `{}xp [role/member] [amount]`'.format(ctx.prefix) isRole = False if member == None: await self.bot.send_message(ctx.message.channel, usage) return # Check for formatting issues if xpAmount == None: # Either xp wasn't set - or it's the last section if type(member) is str: # It' a string - the hope continues roleCheck = DisplayName.checkRoleForInt(member, server) if not roleCheck: # Returned nothing - means there isn't even an int msg = 'I couldn\'t find *{}* on the server.'.format(member) # Check for suppress if suppress: msg = Nullify.clean(msg) await self.bot.send_message(ctx.message.channel, msg) return if roleCheck["Role"]: isRole = True member = roleCheck["Role"] xpAmount = roleCheck["Int"] else: # Role is invalid - check for member instead nameCheck = DisplayName.checkNameForInt(member, server) if not nameCheck: await self.bot.send_message(ctx.message.channel, usage) return if not nameCheck["Member"]: msg = 'I couldn\'t find *{}* on the server.'.format( member) # Check for suppress if suppress: msg = Nullify.clean(msg) await self.bot.send_message(ctx.message.channel, msg) return member = nameCheck["Member"] xpAmount = nameCheck["Int"] if xpAmount == None: # Still no xp await self.bot.send_message(ctx.message.channel, usage) return if not type(xpAmount) is int: await self.bot.send_message(ctx.message.channel, usage) return # Get our user/server stats isAdmin = author.permissions_in(channel).administrator adminUnlim = self.settings.getServerStat(server, "AdminUnlimited") reserveXP = self.settings.getUserStat(author, server, "XPReserve") requiredXP = self.settings.getServerStat(server, "RequiredXPRole") approve = True decrement = True # RequiredXPRole if requiredXP: foundRole = False for checkRole in author.roles: if checkRole.id == requiredXP: foundRole = True if not foundRole: approve = False msg = msg = 'You don\'t have the permissions to give xp.' if xpAmount > int(reserveXP): approve = False msg = 'You can\'t give *{} xp*, you only have *{}!*'.format( xpAmount, reserveXP) if author == member: approve = False msg = 'You can\'t give yourself xp! *Nice try...*' if xpAmount < 0: msg = 'Only admins can take away xp!' approve = False if xpAmount == 0: msg = 'Wow, very generous of you...' approve = False # Check admin last - so it overrides anything else if isAdmin and adminUnlim.lower() == "yes": # No limit - approve approve = True decrement = False if approve: if isRole: # XP was approved - let's iterate through the users of that role, # starting with the lowest xp # # Work through our members memberList = [] sMemberList = self.settings.getServerStat(server, "Members") for amem in server.members: if amem == author: continue roles = amem.roles if member in roles: # This member has our role # Add to our list for smem in sMemberList: # Find our server entry if smem["ID"] == amem.id: # Add it. memberList.append(smem) memSorted = sorted(memberList, key=lambda x: int(x['XP'])) if len(memSorted): # There actually ARE members in said role totalXP = xpAmount if xpAmount > len(memSorted): # More xp than members leftover = xpAmount % len(memSorted) eachXP = (xpAmount - leftover) / len(memSorted) for i in range(0, len(memSorted)): cMember = DisplayName.memberForID( memSorted[i]['ID'], server) if leftover > 0: self.settings.incrementStat( cMember, server, "XP", eachXP + 1) leftover -= 1 else: self.settings.incrementStat( cMember, server, "XP", eachXP) await CheckRoles.checkroles( cMember, channel, self.settings, self.bot) else: for i in range(0, xpAmount): cMember = DisplayName.memberForID( memSorted[i]['ID'], server) self.settings.incrementStat( cMember, server, "XP", 1) await CheckRoles.checkroles( cMember, channel, self.settings, self.bot) # Decrement if needed if decrement: self.settings.incrementStat(author, server, "XPReserve", (-1 * xpAmount)) msg = '*{} collective xp* was given to *{}!*'.format( totalXP, member.name) # Check for suppress if suppress: msg = Nullify.clean(msg) await self.bot.send_message(channel, msg) else: msg = 'There are no eligible members in *{}!*'.format( member.name) await self.bot.send_message(channel, msg) else: # Decrement if needed if decrement: self.settings.incrementStat(author, server, "XPReserve", (-1 * xpAmount)) # XP was approved! Let's say it - and check decrement from gifter's xp reserve msg = '*{}* was given *{} xp!*'.format( DisplayName.name(member), xpAmount) # Check for suppress if suppress: msg = Nullify.clean(msg) await self.bot.send_message(channel, msg) self.settings.incrementStat(member, server, "XP", xpAmount) # Now we check for promotions await CheckRoles.checkroles(member, channel, self.settings, self.bot) else: await self.bot.send_message(channel, msg)
async def torment(self, ctx, *, member=None, times: int = None): """Deals some vigilante justice (owner only).""" channel = ctx.message.channel author = ctx.message.author server = ctx.message.server # Only allow owner to change server stats serverDict = self.settings.serverDict try: owner = serverDict['Owner'] except KeyError: owner = None if owner == None: # No owner set msg = 'I have not been claimed, *yet*.' await self.bot.send_message(channel, msg) return else: if not author.id == owner: msg = 'You are not the *true* owner of me. Only the rightful owner can use this command.' await self.bot.send_message(channel, msg) return usage = 'Usage: `{}torment [role/member] [times]`'.format(ctx.prefix) isRole = False if member == None: await self.bot.send_message(ctx.message.channel, usage) return # Check for formatting issues if times == None: # Either xp wasn't set - or it's the last section if type(member) is str: # It' a string - the hope continues roleCheck = DisplayName.checkRoleForInt(member, server) if roleCheck and roleCheck["Role"]: isRole = True member = roleCheck["Role"] times = roleCheck["Int"] else: # Role is invalid - check for member instead nameCheck = DisplayName.checkNameForInt(member, server) if not nameCheck: await self.bot.send_message(ctx.message.channel, usage) return if not nameCheck["Member"]: msg = 'I couldn\'t find that user or role on the server.'.format( member) await self.bot.send_message(ctx.message.channel, msg) return member = nameCheck["Member"] times = nameCheck["Int"] # Set the torment flag self.toTorment = True if times == None: # Still no times - roll back to default times = 25 if times > 100: times = 100 if times == 0: await self.bot.send_message( ctx.message.channel, 'Oooooh - I bet they feel *sooooo* tormented...') return if times < 0: await self.bot.send_message( ctx.message.channel, 'I just uh... *un-tormented* them. Yeah.') return for i in range(0, times): # Do this over time await self.bot.send_message(ctx.message.channel, '*{}*'.format(member.mention)) for j in range(0, self.waitBetween): # Wait for 1 second, then check if we should cancel - then wait some more await asyncio.sleep(1) if not self.toTorment: return