Пример #1
0
    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)
Пример #2
0
	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
Пример #3
0
	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)
Пример #4
0
    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
Пример #5
0
    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
Пример #6
0
    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)
Пример #7
0
    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