Example #1
0
    async def adduserrole(self, ctx, *, role=None):
        """Adds a new role to the user role system (admin only)."""

        author = ctx.message.author
        server = ctx.message.guild
        channel = ctx.message.channel

        usage = 'Usage: `{}adduserrole [role]`'.format(ctx.prefix)

        # Check if we're suppressing @here and @everyone mentions
        if self.settings.getServerStat(server, "SuppressMentions"):
            suppress = True
        else:
            suppress = False

        isAdmin = self._is_admin(ctx.message.author, ctx.message.channel,
                                 ctx.message.guild)
        # 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 role == None:
            await ctx.send(usage)
            return

        if type(role) is str:
            if role == "everyone":
                role = "@everyone"
            # It' a string - the hope continues
            roleCheck = DisplayName.roleForName(role, server)
            if not roleCheck:
                msg = "I couldn't find **{}**...".format(role)
                if suppress:
                    msg = Nullify.clean(msg)
                await ctx.send(msg)
                return
            role = roleCheck

        # Now we see if we already have that role in our list
        try:
            promoArray = self.settings.getServerStat(server, "UserRoles")
        except Exception:
            promoArray = []
        if promoArray == None:
            promoArray = []

        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
                msg = '**{}** is already in the list.'.format(role.name)
                # 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})
        self.settings.setServerStat(server, "UserRoles", promoArray)

        msg = '**{}** added to list.'.format(role.name)
        # Check for suppress
        if suppress:
            msg = Nullify.clean(msg)
        await channel.send(msg)
        return
Example #2
0
    async def check_temp_roles(self, member, temp_role):
        # Get the current task
        task = asyncio.Task.current_task()

        #self._log("Temp Role Object:", value=temp_role, member=member)

        # Get the cooldown and server id
        c = int(temp_role["Cooldown"])
        r_id = int(temp_role["ID"])

        # Wait until we're ready to remove
        timeleft = c-int(time.time())

        #self._log("Time left check 1 - do we have time left?", value=timeleft, member=member)

        if timeleft > 0:
            await asyncio.sleep(timeleft)
        # Resolve the role
        role = DisplayName.roleForID(r_id, member.guild)

        #self._log("Role check - is role?", value=role, member=member)

        if not role:
            # Doesn't exist - remove it
            temp_roles = self.settings.getUserStat(member, member.guild, "TempRoles")
            temp_roles.remove(temp_role)
            self._remove_task(task)
            return
        # We have a role - let's see if we still need to keep it
        c = temp_role["Cooldown"]

        #self._log("Cooldown check - do we have a cooldown?", value=c, member=member)

        if c == None:
            # We now have this role forever
            # One last check to make sure it all makes sense
            found = False
            temp_roles = self.settings.getUserStat(member, member.guild, "TempRoles")
            if not role in member.roles:
                temp_roles.remove(temp_role)
                self.settings.setUserStat(member, member.guild, "TempRoles", temp_roles)
            self._remove_task(task)
            return
        # We still have a cooldown
        timeleft = c-int(time.time())

        #self._log("Time left:", value=timeleft, member=member)

        if timeleft > 0:
            # Recalibrate
            self.loop_list.append(self.bot.loop.create_task(self.check_temp_roles(member, temp_role)))
            self._remove_task(task)
            return
        # Here - we're either past our cooldown, or who knows what else

        #self._log("Past the cooldown - no time left - do we have the role?", value=(role in member.roles), member=member)

        if role in member.roles:
            #self._log("Removing the role now - on time (supposedly)", member=member, value=role)
            # We have the role still - remove it
            self.settings.role.rem_roles(member, [role])

        # Remove the entry from our user settings
        temp_roles = self.settings.getUserStat(member, member.guild, "TempRoles")
        if not temp_roles:
            temp_roles = []
        if temp_role in temp_roles:
            #self._log("Temp Role was in user settings - removing", member=member)
            temp_roles.remove(temp_role)
            self.settings.setUserStat(member, member.guild, "TempRoles", temp_roles)

        # Check if we pm
        if self.settings.getServerStat(member.guild, "TempRolePM") and "AddedBy" in temp_role:
            try:
                await member.send("**{}** was removed from your roles in *{}*.".format(role.name, member.guild.name))
            except:
                pass
        self._remove_task(task)
Example #3
0
    async def untemp(self, ctx, member = None, role = None):
        """Removes the passed temp role from the passed user (bot-admin only)."""
        # Check if we're suppressing @here and @everyone mentions
        if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
            suppress = True
        else:
            suppress = False

        isAdmin = ctx.message.author.permissions_in(ctx.message.channel).administrator
        if not isAdmin:
            checkAdmin = self.settings.getServerStat(ctx.message.guild, "AdminArray")
            for arole in ctx.message.author.roles:
                for aRole in checkAdmin:
                    # Get the role that corresponds to the id
                    if str(aRole['ID']) == str(arole.id):
                        isAdmin = True
        # Only allow admins to change server stats
        if not isAdmin:
            await ctx.channel.send('You do not have sufficient privileges to access this command.')
            return

        if member == None or role == None:
            msg = 'Usage: `{}untemp "[member]" "[role]"`'.format(ctx.prefix)
            await ctx.channel.send(msg)
            return

        # Get member and role
        member_from_name = DisplayName.memberForName(member, ctx.guild)
        role_from_name   = DisplayName.roleForName(role, ctx.guild)

        if not member_from_name and not role_from_name:
            msg = "I couldn't find either the role or member..."
            await ctx.send(msg)
            return

        if not member_from_name:
            msg = 'I couldn\'t find *{}*...'.format(member)
            # Check for suppress
            if suppress:
                msg = Nullify.clean(msg)
            await ctx.send(msg)
            return

        if not role_from_name:
            msg = 'I couldn\'t find *{}*...'.format(role)
            # Check for suppress
            if suppress:
                msg = Nullify.clean(msg)
            await ctx.send(msg)
            return

        # Make sure our role is in the list
        promoArray = self.settings.getServerStat(ctx.guild, "TempRoleList")
        if not role_from_name.id in [int(x["ID"]) for x in promoArray]:
            # No dice
            await ctx.send("That role is not in the temp role list!")
            return

        # Check if the user has that role - and remove it
        if not role_from_name in member_from_name.roles:
            # Don't have it
            await ctx.send("That user doesn't have that role!")
            return

        message = await ctx.send("Applying...")
        # We should be able to remove it now
        self.settings.role.rem_roles(member_from_name, [role_from_name])

        user_roles = self.settings.getUserStat(member_from_name, ctx.guild, "TempRoles")
        for r in user_roles:
            if int(r["ID"]) == role_from_name.id:
                user_roles.remove(r)
                self.settings.setUserStat(member_from_name, ctx.guild, "TempRoles", user_roles)
                break

        msg = "*{}* was removed from **{}**.".format(
            DisplayName.name(member_from_name),
            role_from_name.name
        )
        # Announce it
        if suppress:
            msg = Nullify.clean(msg)
        await message.edit(content=msg)
        # Check if we pm
        if self.settings.getServerStat(ctx.guild, "TempRolePM"):
            try:
                await member_from_name.send("**{}** was removed from your roles in *{}*.".format(role_from_name.name, ctx.guild.name))
            except:
                pass
Example #4
0
    async def gethw(self, ctx, *, user=None, search=None):
        """Searches the user's hardware for a specific search term."""
        if not user:
            usage = "Usage: `{}gethw [user] [search term]`".format(ctx.prefix)
            await ctx.send(usage)
            return

        # Let's check for username and search term
        parts = user.split()

        memFromName = None
        buildParts = None

        for j in range(len(parts)):
            # Reverse search direction
            i = len(parts) - 1 - j
            memFromName = None
            buildParts = None

            # Name = 0 up to i joined by space
            nameStr = ' '.join(parts[0:i])
            buildStr = ' '.join(parts[i:])

            memFromName = DisplayName.memberForName(nameStr, ctx.guild)
            if memFromName:
                # Got a member - let's check the remainder length, and search!
                if len(buildStr) < 3:
                    usage = "Search term must be at least 3 characters."
                    return await ctx.send(usage)
                buildList = self.settings.getGlobalUserStat(
                    memFromName, "Hardware")
                if buildList == None:
                    buildList = []
                buildList = sorted(buildList, key=lambda x: x['Name'].lower())
                foundStr = ''
                foundCt = 0
                for build in buildList:
                    bParts = build['Hardware']
                    for line in bParts.splitlines():
                        if buildStr.lower() in line.lower():
                            foundCt += 1
                            foundStr += '{}. **{}**\n   {}\n'.format(
                                foundCt, build['Name'],
                                line.replace("`", "").replace("\\", ""))

                if len(foundStr):
                    # We're in business
                    foundStr = "__**\"{}\" Results:**__\n\n".format(
                        buildStr, DisplayName.name(memFromName)) + foundStr
                    break
                else:
                    # foundStr = 'Nothing found for "{}" in *{}\'s* builds.'.format(buildStr, DisplayName.name(memFromName))
                    # Nothing found...
                    memFromName = None
                    buildStr = None
        if memFromName and len(foundStr):
            # We're in business
            return await Message.Message(
                message=Utils.suppressed(ctx, foundStr)).send(ctx)

        # If we're here - then we didn't find a member - set it to the author, and run another quick search
        buildStr = user

        if len(buildStr) < 3:
            usage = "Search term must be at least 3 characters."
            return await ctx.send(usage)

        buildList = self.settings.getGlobalUserStat(ctx.author, "Hardware")
        if buildList == None:
            buildList = []
        buildList = sorted(buildList, key=lambda x: x['Name'].lower())

        foundStr = ''
        foundCt = 0
        for build in buildList:
            bParts = build['Hardware']
            for line in bParts.splitlines():
                if buildStr.lower() in line.lower():
                    foundCt += 1
                    foundStr += '{}. **{}**\n   {}\n'.format(
                        foundCt, build['Name'],
                        line.replace("`", "").replace("\\", ""))

        if len(foundStr):
            # We're in business
            foundStr = "__**\"{}\" Results:**__\n\n".format(
                buildStr) + foundStr
        else:
            foundStr = 'Nothing found for "{}".'.format(buildStr)
            # Nothing found...
        await Message.Message(message=Utils.suppressed(ctx, foundStr)
                              ).send(ctx)
Example #5
0
    async def newhw(self, ctx):
        """Initiate a new-hardware conversation with the bot.  The hardware added will also be set as the Main Build."""
        buildList = self.settings.getGlobalUserStat(ctx.author, "Hardware")
        if buildList == None:
            buildList = []
        hwChannel = None
        if ctx.guild:
            # Not a pm
            hwChannel = self.settings.getServerStat(ctx.guild,
                                                    "HardwareChannel")
            if not (not hwChannel or hwChannel == ""):
                # We need the channel id
                if not str(hwChannel) == str(ctx.channel.id):
                    msg = 'This isn\'t the channel for that...'
                    for chan in ctx.guild.channels:
                        if str(chan.id) == str(hwChannel):
                            msg = 'This isn\'t the channel for that.  Take the hardware talk to the **{}** channel.'.format(
                                chan.name)
                    return await ctx.send(msg)
                else:
                    hwChannel = self.bot.get_channel(hwChannel)
        if not hwChannel:
            # Nothing set - pm
            hwChannel = ctx.author

        # Make sure we're not already in a parts transaction
        if str(ctx.author.id) in self.hwactive:
            return await ctx.send(
                "You're already in a hardware session!  You can leave with `{}cancelhw`"
                .format(ctx.prefix))

        # Set our HWActive flag
        hw_id = self.gen_id()
        self.hwactive[str(ctx.author.id)] = hw_id

        msg = 'Alright, *{}*, let\'s add a new build.\n\n'.format(
            DisplayName.name(ctx.author))
        if len(buildList) == 1:
            msg += 'You currently have *1 build* on file.\n\n'
        else:
            msg += 'You currently have *{} builds* on file.\n\nLet\'s get started!'.format(
                len(buildList))

        try:
            await hwChannel.send(msg)
        except:
            # Can't send to the destination
            self._stop_hw(ctx.author)
            if hwChannel == ctx.author:
                # Must not accept pms
                await ctx.send(
                    "It looks like you don't accept pms.  Please enable them and try again."
                )
            return

        if hwChannel == ctx.author and ctx.channel != ctx.author.dm_channel:
            await ctx.message.add_reaction("📬")
        msg = '*{}*, tell me what you\'d like to call this build (type stop to cancel):'.format(
            DisplayName.name(ctx.author))

        # Get the build name
        newBuild = {'Main': True}
        while True:
            buildName = await self.prompt(hw_id, ctx, msg, hwChannel,
                                          DisplayName.name(ctx.author))
            if not buildName:
                self._stop_hw(ctx.author)
                return
            buildExists = False
            for build in buildList:
                if build['Name'].lower() == buildName.content.lower():
                    mesg = 'It looks like you already have a build by that name, *{}*.  Try again.'.format(
                        DisplayName.name(ctx.author))
                    await hwChannel.send(mesg)
                    buildExists = True
                    break
            if not buildExists:
                newBuild['Name'] = buildName.content
                break
        bname = Utils.suppressed(ctx, buildName.content)
        msg = 'Alright, *{}*, what parts does "{}" have? (Please include *all* parts for this build - you can add new lines with *shift + enter*)\n'.format(
            DisplayName.name(ctx.author), bname)
        msg += 'You can also pass pcpartpicker links to have them formatted automagically - I can also format them using different styles.\n'
        msg += 'For example: '
        msg += '```https://pcpartpicker.com/list/123456 mdblock``` would format with the markdown block style.\n'
        msg += 'Markdown styles available are *normal, md, mdblock, bold, bolditalic*'
        while True:
            parts = await self.prompt(hw_id, ctx, msg, hwChannel,
                                      DisplayName.name(ctx.author))
            if not parts:
                self._stop_hw(ctx.author)
                return
            if 'pcpartpicker.com' in parts.content.lower():
                # Possibly a pc partpicker link?
                msg = 'It looks like you sent a pc part picker link - did you want me to try and format that? (y/n/stop)'
                test = await self.confirm(hw_id, ctx, parts, hwChannel, msg)
                if test == None:
                    self._stop_hw(ctx.author)
                    return
                elif test == True:
                    partList = parts.content.split()
                    if len(partList) == 1:
                        partList.append(None)
                    output = None
                    try:
                        output = await PCPP.getMarkdown(
                            partList[0], partList[1], False)
                    except:
                        pass
                    #output = PCPP.getMarkdown(parts.content)
                    if not output:
                        msg = 'Something went wrong!  Make sure you use a valid pcpartpicker link.'
                        await hwChannel.send(msg)
                        self._stop_hw(ctx.author)
                        return
                    if len(output) > 2000:
                        msg = "That's an *impressive* list of parts - but the max length allowed for messages in Discord is 2000 characters, and you're at *{}*.".format(
                            len(output))
                        msg += '\nMaybe see if you can prune up that list a bit and try again?'
                        await hwChannel.send(msg)
                        self._stop_hw(ctx.author)
                        return
                    # Make sure
                    conf = await self.confirm(hw_id, ctx, output, hwChannel,
                                              None, ctx.author)
                    if conf == None:
                        # Timed out
                        self._stop_hw(ctx.author)
                        return
                    elif conf == False:
                        # Didn't get our answer
                        msg = 'Alright, *{}*, what parts does "{}" have? (Please include *all* parts for this build - you can add new lines with *shift + enter*)'.format(
                            DisplayName.name(ctx.author), bname)
                        continue
                    m = '{} set to:\n{}'.format(bname, output)
                    await hwChannel.send(m)
                    newBuild['Hardware'] = output
                    break
            newBuild['Hardware'] = parts.content
            break

        # Check if we already have a main build and clear it
        for build in buildList:
            if build['Main']:
                build['Main'] = False

        buildList.append(newBuild)
        self.settings.setGlobalUserStat(ctx.author, "Hardware", buildList)
        msg = '*{}*, {} was created successfully!  It has been set as your main build.  To select a different main, you can use `{}mainhw`'.format(
            DisplayName.name(ctx.author), bname, ctx.prefix)
        self._stop_hw(ctx.author)
        await hwChannel.send(msg)
Example #6
0
    async def confirm(self,
                      hw_id,
                      ctx,
                      message,
                      dest=None,
                      m=None,
                      author=None):
        # Get author name
        authorName = None
        if author:
            if type(author) is str:
                authorName = author
            else:
                try:
                    authorName = DisplayName.name(author)
                except Exception:
                    pass
        else:
            if message:
                try:
                    author = message.author
                except Exception:
                    pass
            try:
                authorName = DisplayName.name(message.author)
            except Exception:
                pass

        if not dest:
            dest = message.channel
        if not m:
            if authorName:
                msg = '*{}*, I got:'.format(Utils.suppressed(ctx, authorName))
            else:
                msg = "I got:"
            if type(message) is str:
                msg2 = Utils.suppressed(ctx, message)
            else:
                msg2 = '{}'.format(Utils.suppressed(ctx, message.content))
            msg3 = 'Is that correct? (y/n/stop)'
            await dest.send(msg)
            await dest.send(msg2)
            await dest.send(msg3)
        else:
            msg = m
            await dest.send(Utils.suppressed(ctx, msg))

        while True:

            def littleCheck(m):
                return ctx.author.id == m.author.id and self.confirmCheck(
                    m, dest) and len(m.content)

            try:
                talk = await self.bot.wait_for('message',
                                               check=littleCheck,
                                               timeout=300)
            except Exception:
                talk = None

            # See if we're still in the right context
            if not hw_id == self.hwactive.get(str(ctx.author.id), None):
                return None

            # Hardware ended
            if not self.stillHardwaring(ctx.author):
                return None

            if not talk:
                if authorName:
                    msg = "*{}*, I'm out of time...".format(authorName)
                else:
                    msg = "I'm out of time..."
                await dest.send(msg)
                return None
            else:
                # We got something
                if talk.content.lower().startswith('y'):
                    return True
                elif talk.content.lower().startswith('stop'):
                    if authorName:
                        msg = "No problem, *{}!*  See you later!".format(
                            authorName)
                    else:
                        msg = "No problem!  See you later!"
                    await dest.send(msg)
                    return None
                else:
                    return False
Example #7
0
    async def edithw(self, ctx, *, build=None):
        """Edits a build from your build list."""
        hwChannel = None
        if ctx.guild:
            # Not a pm
            hwChannel = self.settings.getServerStat(ctx.guild,
                                                    "HardwareChannel")
            if not (not hwChannel or hwChannel == ""):
                # We need the channel id
                if not str(hwChannel) == str(ctx.channel.id):
                    msg = 'This isn\'t the channel for that...'
                    for chan in ctx.guild.channels:
                        if str(chan.id) == str(hwChannel):
                            msg = 'This isn\'t the channel for that.  Take the hardware talk to the **{}** channel.'.format(
                                chan.name)
                            break
                    return await ctx.send(Utils.suppressed(ctx, msg))
                else:
                    hwChannel = self.bot.get_channel(hwChannel)
        if not hwChannel:
            # Nothing set - pm
            hwChannel = ctx.author

        # Make sure we're not already in a parts transaction
        if str(ctx.author.id) in self.hwactive:
            return await ctx.send(
                "You're already in a hardware session!  You can leave with `{}cancelhw`"
                .format(ctx.prefix))

        buildList = self.settings.getGlobalUserStat(ctx.author, "Hardware")
        if buildList == None:
            buildList = []
        if not len(buildList):
            # No parts!
            msg = 'You have no builds on file!  You can add some with the `{}newhw` command.'.format(
                ctx.prefix)
            return await ctx.send(msg)
        buildList = sorted(buildList, key=lambda x: x['Name'].lower())

        mainBuild = None

        # Get build by name first - then by number
        if build is not None:
            for b in buildList:
                if b['Name'].lower() == build.lower():
                    # Found it
                    mainBuild = b
                    break

            if not mainBuild:
                try:
                    build = int(build) - 1
                    if build >= 0 and build < len(buildList):
                        mainBuild = buildList[build]
                except:
                    pass
        else:
            # No build passed - get the main if it exists
            for b in buildList:
                if b['Main']:
                    mainBuild = b
                    break

        if not mainBuild:
            msg = "I couldn't find that build or number."
            return await ctx.send(msg)

        # Set our HWActive flag
        hw_id = self.gen_id()
        self.hwactive[str(ctx.author.id)] = hw_id

        # Here, we have a build
        bname = Utils.suppressed(ctx, mainBuild['Name'])
        bparts = Utils.suppressed(ctx, mainBuild['Hardware'])

        msg = '"{}"\'s current parts:'.format(bname)
        try:
            await hwChannel.send(msg)
        except:
            # Can't send to the destination
            self._stop_hw(ctx.author)
            if hwChannel == ctx.author:
                # Must not accept pms
                await ctx.send(
                    "It looks like you don't accept pms.  Please enable them and try again."
                )
            return
        if hwChannel == ctx.author and ctx.channel != ctx.author.dm_channel:
            await ctx.message.add_reaction("📬")
        await hwChannel.send(bparts)

        msg = 'Alright, *{}*, what parts does "{}" have now? (Please include *all* parts for this build - you can add new lines with *shift + enter*)\n'.format(
            DisplayName.name(ctx.author), bname)
        msg += 'You can also pass pcpartpicker links to have them formatted automagically - I can also format them using different styles.\n'
        msg += 'For example: '
        msg += '```https://pcpartpicker.com/list/123456 mdblock``` would format with the markdown block style.\n'
        msg += 'Markdown styles available are *normal, md, mdblock, bold, bolditalic*'
        while True:
            parts = await self.prompt(hw_id, ctx, msg, hwChannel,
                                      DisplayName.name(ctx.author))
            if not parts:
                self._stop_hw(ctx.author)
                return
            if 'pcpartpicker.com' in parts.content.lower():
                # Possibly a pc partpicker link?
                msg = 'It looks like you sent a pc part picker link - did you want me to try and format that? (y/n/stop)'
                test = await self.confirm(hw_id, ctx, parts, hwChannel, msg)
                if test == None:
                    self._stop_hw(ctx.author)
                    return
                elif test == True:
                    partList = parts.content.split()
                    if len(partList) == 1:
                        partList.append(None)
                    output = None
                    try:
                        output = await PCPP.getMarkdown(
                            partList[0], partList[1], False)
                    except:
                        pass
                    if not output:
                        msg = 'Something went wrong!  Make sure you use a valid pcpartpicker link.'
                        await hwChannel.send(msg)
                        self._stop_hw(ctx.author)
                        return
                    if len(output) > 2000:
                        msg = "That's an *impressive* list of parts - but the max length allowed for messages in Discord is 2000 characters, and you're at *{}*.".format(
                            len(output))
                        msg += '\nMaybe see if you can prune up that list a bit and try again?'
                        await hwChannel.send(msg)
                        self._stop_hw(ctx.author)
                        return
                    # Make sure
                    conf = await self.confirm(hw_id, ctx, output, hwChannel,
                                              None, ctx.author)
                    if conf == None:
                        # Timed out
                        self._stop_hw(ctx.author)
                        return
                    elif conf == False:
                        # Didn't get our answer
                        msg = 'Alright, *{}*, what parts does "{}" have now? (Please include *all* parts for this build - you can add new lines with *shift + enter*)'.format(
                            DisplayName.name(ctx.author), bname)
                        continue

                    m = '{} set to:\n{}'.format(bname, output)
                    await hwChannel.send(m)
                    mainBuild['Hardware'] = output
                    self.settings.setGlobalUserStat(ctx.author, "Hardware",
                                                    buildList)
                    break
            mainBuild['Hardware'] = parts.content
            self.settings.setGlobalUserStat(ctx.author, "Hardware", buildList)
            break
        msg = '*{}*, {} was edited successfully!'.format(
            DisplayName.name(ctx.author), bname)
        self._stop_hw(ctx.author)
        await hwChannel.send(msg)
Example #8
0
    async def mute(self, ctx, *, member=None, cooldown=None):
        """Prevents a member from sending messages in chat (bot-admin only)."""

        # Check if we're suppressing @here and @everyone mentions
        if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
            suppress = True
        else:
            suppress = False

        isAdmin = ctx.message.author.permissions_in(
            ctx.message.channel).administrator
        if not isAdmin:
            checkAdmin = self.settings.getServerStat(ctx.message.guild,
                                                     "AdminArray")
            for role in ctx.message.author.roles:
                for aRole in checkAdmin:
                    # Get the role that corresponds to the id
                    if str(aRole['ID']) == str(role.id):
                        isAdmin = True
        # Only allow admins to change server stats
        if not isAdmin:
            await ctx.channel.send(
                'You do not have sufficient privileges to access this command.'
            )
            return

        if member == None:
            msg = 'Usage: `{}mute [member] [cooldown]`'.format(ctx.prefix)
            await ctx.channel.send(msg)
            return

        if cooldown == None:
            # Either a cooldown wasn't set - or it's the last section
            if type(member) is str:
                # It' a string - the hope continues
                # Let's search for a name at the beginning - and a time at the end
                parts = member.split()
                for j in range(len(parts)):
                    # Reverse search direction
                    i = len(parts) - 1 - j
                    memFromName = None
                    endTime = None
                    # Name = 0 up to i joined by space
                    nameStr = ' '.join(parts[0:i + 1])
                    # Time = end of name -> end of parts joined by space
                    timeStr = ' '.join(parts[i + 1:])
                    memFromName = DisplayName.memberForName(
                        nameStr, ctx.message.guild)
                    if memFromName:
                        # We got a member - let's check for time
                        # Get current time - and end time
                        try:
                            # Get current time - and end time
                            currentTime = int(time.time())
                            cal = parsedatetime.Calendar()
                            time_struct, parse_status = cal.parse(timeStr)
                            start = datetime(*time_struct[:6])
                            end = time.mktime(start.timetuple())

                            # Get the time from now to end time
                            endTime = end - currentTime
                        except:
                            pass

                        if not endTime == None:
                            # We got a member and a time - break
                            break

                if memFromName == None:
                    # We couldn't find one or the other
                    msg = 'Usage: `{}mute [member] [cooldown]`'.format(
                        ctx.prefix)
                    await ctx.channel.send(msg)
                    return

                if endTime == 0:
                    coolDown = None
                else:
                    cooldown = endTime
                member = memFromName

        # Check if we're muting ourself
        if member is ctx.message.author:
            msg = 'It would be easier for me if you just *stayed quiet all by yourself...*'
            await ctx.channel.send(msg)
            return

        # Check if we're muting the bot
        if member.id == self.bot.user.id:
            msg = 'How about we don\'t, and *pretend* we did...'
            await ctx.channel.send(msg)
            return

        # Check if member is admin or bot admin
        isAdmin = member.permissions_in(ctx.channel).administrator
        if not isAdmin:
            checkAdmin = self.settings.getServerStat(ctx.guild, "AdminArray")
            for role in member.roles:
                for aRole in checkAdmin:
                    # Get the role that corresponds to the id
                    if str(aRole['ID']) == str(role.id):
                        isAdmin = True
        # Only allow admins to change server stats
        if isAdmin:
            await ctx.channel.send(
                'You can\'t mute other admins or bot-admins.')
            return

        # Set cooldown - or clear it
        if type(cooldown) is int or type(cooldown) is float:
            if cooldown < 0:
                msg = 'Cooldown cannot be a negative number!'
                await ctx.channel.send(msg)
                return
            currentTime = int(time.time())
            cooldownFinal = currentTime + cooldown
        else:
            cooldownFinal = None
        mess = await ctx.send("Muting...")
        # Do the actual muting
        await self.muter.mute(member, ctx.message.guild, cooldownFinal)

        if cooldown:
            mins = "minutes"
            checkRead = ReadableTime.getReadableTimeBetween(
                currentTime, cooldownFinal)
            msg = '*{}* has been **Muted** for *{}*.'.format(
                DisplayName.name(member), checkRead)
            pm = 'You have been **Muted** by *{}* for *{}*.\n\nYou will not be able to send messages on *{}* until either that time has passed, or you have been **Unmuted**.'.format(
                DisplayName.name(ctx.message.author), checkRead,
                self.suppressed(ctx.guild, ctx.guild.name))
        else:
            msg = '*{}* has been **Muted** *until further notice*.'.format(
                DisplayName.name(member))
            pm = 'You have been **Muted** by *{}* *until further notice*.\n\nYou will not be able to send messages on *{}* until you have been **Unmuted**.'.format(
                DisplayName.name(ctx.message.author),
                self.suppressed(ctx.guild, ctx.guild.name))

        if suppress:
            msg = Nullify.clean(msg)

        await mess.edit(content=msg)
        try:
            await member.send(pm)
        except Exception:
            pass
Example #9
0
    async def addgif(self, ctx, *, role: str = None):
        """Adds a new role to the gif list (admin only)."""

        usage = 'Usage: `{}addgif [role]`'.format(ctx.prefix)

        # Check if we're suppressing @here and @everyone mentions
        if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
            suppress = True
        else:
            suppress = False

        isAdmin = ctx.message.author.permissions_in(
            ctx.message.channel).administrator
        # Only allow admins to change server stats
        if not isAdmin:
            await ctx.message.channel.send(
                'You do not have sufficient privileges to access this command.'
            )
            return

        if role == None:
            await ctx.message.channel.send(usage)
            return

        roleName = role
        if type(role) is str:
            if role.lower() == "everyone" or role.lower() == "@everyone":
                role = ctx.guild.default_role
            else:
                role = DisplayName.roleForName(roleName, ctx.guild)
            if not role:
                msg = 'I couldn\'t find *{}*...'.format(roleName)
                # Check for suppress
                if suppress:
                    msg = Nullify.clean(msg)
                await ctx.message.channel.send(msg)
                return

        # Now we see if we already have that role in our list
        promoArray = self.settings.getServerStat(ctx.message.guild, "GifArray")

        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
                msg = '**{}** is already in the list.'.format(role.name)
                # Check for suppress
                if suppress:
                    msg = Nullify.clean(msg)
                await ctx.message.channel.send(msg)
                return

        # If we made it this far - then we can add it
        promoArray.append({'ID': role.id, 'Name': role.name})
        self.settings.setServerStat(ctx.message.guild, "GifArray", promoArray)

        msg = '**{}** added to list.'.format(role.name)
        # Check for suppress
        if suppress:
            msg = Nullify.clean(msg)
        await ctx.message.channel.send(msg)
        return
Example #10
0
    async def listen(self, ctx, *, member=None):
        """Removes a member from the bot's "ignore" list (bot-admin only)."""

        # Check if we're suppressing @here and @everyone mentions
        if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
            suppress = True
        else:
            suppress = False

        isAdmin = ctx.message.author.permissions_in(
            ctx.message.channel).administrator
        if not isAdmin:
            checkAdmin = self.settings.getServerStat(ctx.message.guild,
                                                     "AdminArray")
            for role in ctx.message.author.roles:
                for aRole in checkAdmin:
                    # Get the role that corresponds to the id
                    if str(aRole['ID']) == str(role.id):
                        isAdmin = True
        # Only allow admins to change server stats
        if not isAdmin:
            await ctx.channel.send(
                'You do not have sufficient privileges to access this command.'
            )
            return

        if member == None:
            msg = 'Usage: `{}listen [member]`'.format(ctx.prefix)
            await ctx.channel.send(msg)
            return

        if type(member) is str:
            memberName = member
            member = DisplayName.memberForName(memberName, ctx.message.guild)
            if not member:
                msg = 'I couldn\'t find *{}*...'.format(memberName)
                # Check for suppress
                if suppress:
                    msg = Nullify.clean(msg)
                await ctx.channel.send(msg)
                return

        ignoreList = self.settings.getServerStat(ctx.message.guild,
                                                 "IgnoredUsers")

        found = False
        for user in ignoreList:
            if str(member.id) == str(user["ID"]):
                # Found our user - already ignored
                found = True
                msg = '*{}* no longer being ignored.'.format(
                    DisplayName.name(member))
                ignoreList.remove(user)
                self.settings.setServerStat(ctx.message.guild, "IgnoredUsers",
                                            ignoreList)

        if not found:
            # Whatchu talkin bout Willis?
            msg = '*{}* wasn\'t being ignored...'.format(
                DisplayName.name(member))

        await ctx.channel.send(msg)
Example #11
0
    async def ban(self, ctx, *, member: str = None):
        """Bans the selected member (bot-admin only)."""

        # Check if we're suppressing @here and @everyone mentions
        if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
            suppress = True
        else:
            suppress = False

        isAdmin = ctx.message.author.permissions_in(
            ctx.message.channel).administrator
        if not isAdmin:
            checkAdmin = self.settings.getServerStat(ctx.message.guild,
                                                     "AdminArray")
            for role in ctx.message.author.roles:
                for aRole in checkAdmin:
                    # Get the role that corresponds to the id
                    if str(aRole['ID']) == str(role.id):
                        isAdmin = True
        # Only allow admins to ban
        if not isAdmin:
            await ctx.channel.send(
                'You do not have sufficient privileges to access this command.'
            )
            return

        if not member:
            await ctx.channel.send('Usage: `{}ban [member]`'.format(ctx.prefix)
                                   )
            return

        # Resolve member name -> member
        newMem = DisplayName.memberForName(member, ctx.message.guild)
        if not newMem:
            msg = 'I couldn\'t find *{}*.'.format(member)
            # Check for suppress
            if suppress:
                msg = Nullify.clean(msg)
            await ctx.channel.send(msg)
            return

        # newMem = valid member
        member = newMem

        if member.id == ctx.message.author.id:
            await ctx.channel.send('Ahh - the ol\' self-ban.  Good try.')
            return

        # Check if we're banning the bot
        if member.id == self.bot.user.id:
            await ctx.channel.send(
                'Oh - you probably meant to ban *yourself* instead, right?')
            return

        # Check if the targeted user is admin
        isTAdmin = member.permissions_in(ctx.message.channel).administrator
        if not isTAdmin:
            checkAdmin = self.settings.getServerStat(ctx.message.guild,
                                                     "AdminArray")
            for role in member.roles:
                for aRole in checkAdmin:
                    # Get the role that corresponds to the id
                    if str(aRole['ID']) == str(role.id):
                        isTAdmin = True

        # Can't ban other admins
        if isTAdmin:
            await ctx.channel.send(
                'You can\'t ban other admins with this command.')
            return

        # We can ban
        await ctx.channel.send(
            'If this were live - you would have **banned** *{}*'.format(
                DisplayName.name(member)))
Example #12
0
    async def setrole(self, ctx, *, role=None):
        """Sets your role from the user role list.  You can only have one at a time."""
        block_list = self.settings.getServerStat(ctx.guild, "UserRoleBlock")
        if ctx.author.id in block_list:
            await ctx.send("You are currently blocked from using this command."
                           )
            return

        server = ctx.message.guild
        channel = ctx.message.channel

        if not self.settings.getServerStat(server, "OnlyOneUserRole"):
            await ctx.invoke(self.addrole, role=role)
            return

        # Check if we're suppressing @here and @everyone mentions
        if self.settings.getServerStat(server, "SuppressMentions"):
            suppress = True
        else:
            suppress = False

        # Get the array
        try:
            promoArray = self.settings.getServerStat(server, "UserRoles")
        except Exception:
            promoArray = []
        if promoArray == None:
            promoArray = []

        if role == None:
            # Remove us from all roles
            remRole = []
            for arole in promoArray:
                roleTest = DisplayName.roleForID(arole['ID'], server)
                if not roleTest:
                    # Not a real role - skip
                    continue
                if roleTest in ctx.message.author.roles:
                    # We have this in our roles - remove it
                    remRole.append(roleTest)
            if len(remRole):
                self.settings.role.rem_roles(ctx.author, remRole)
            # Give a quick status
            msg = '*{}* has been moved out of all roles in the list!'.format(
                DisplayName.name(ctx.message.author))
            if suppress:
                msg = Nullify.clean(msg)
            await channel.send(msg)
            return

        # Check if role is real
        roleCheck = DisplayName.roleForName(role, server)
        if not roleCheck:
            # No luck...
            msg = '*{}* not found in list.\n\nTo see a list of user roles - run `{}listuserroles`'.format(
                role, ctx.prefix)
            # Check for suppress
            if suppress:
                msg = Nullify.clean(msg)
            await channel.send(msg)
            return

        # Got a role - set it
        role = roleCheck

        addRole = []
        remRole = []
        for arole in promoArray:
            roleTest = DisplayName.roleForID(arole['ID'], server)
            if not roleTest:
                # Not a real role - skip
                continue
            if str(arole['ID']) == str(role.id):
                # We found it!
                addRole.append(roleTest)
            elif roleTest in ctx.message.author.roles:
                # Not our intended role and we have this in our roles - remove it
                remRole.append(roleTest)

        if not len(addRole):
            # We didn't find that role
            msg = '*{}* not found in list.\n\nTo see a list of user roles - run `{}listuserroles`'.format(
                role.name, ctx.prefix)
            # Check for suppress
            if suppress:
                msg = Nullify.clean(msg)
            await channel.send(msg)
            return

        if len(remRole) or len(addRole):
            self.settings.role.change_roles(ctx.author,
                                            add_roles=addRole,
                                            rem_roles=remRole)

        msg = '*{}* has been moved to **{}!**'.format(
            DisplayName.name(ctx.message.author), role.name)
        if suppress:
            msg = Nullify.clean(msg)
        await channel.send(msg)
Example #13
0
    async def addrole(self, ctx, *, role=None):
        """Adds a role from the user role list to your roles.  You can have multiples at a time."""
        block_list = self.settings.getServerStat(ctx.guild, "UserRoleBlock")
        if ctx.author.id in block_list:
            await ctx.send("You are currently blocked from using this command."
                           )
            return

        if role == None:
            await ctx.send("Usage: `{}addrole [role name]`".format(ctx.prefix))
            return

        server = ctx.message.guild
        channel = ctx.message.channel

        if self.settings.getServerStat(server, "OnlyOneUserRole"):
            await ctx.invoke(self.setrole, role=role)
            return

        # Check if we're suppressing @here and @everyone mentions
        if self.settings.getServerStat(server, "SuppressMentions"):
            suppress = True
        else:
            suppress = False

        # Get the array
        try:
            promoArray = self.settings.getServerStat(server, "UserRoles")
        except Exception:
            promoArray = []
        if promoArray == None:
            promoArray = []

        # Check if role is real
        roleCheck = DisplayName.roleForName(role, server)
        if not roleCheck:
            # No luck...
            msg = '*{}* not found in list.\n\nTo see a list of user roles - run `{}listuserroles`'.format(
                role, ctx.prefix)
            # Check for suppress
            if suppress:
                msg = Nullify.clean(msg)
            await channel.send(msg)
            return

        # Got a role - set it
        role = roleCheck

        addRole = []
        for arole in promoArray:
            roleTest = DisplayName.roleForID(arole['ID'], server)
            if not roleTest:
                # Not a real role - skip
                continue
            if str(arole['ID']) == str(role.id):
                # We found it!
                if roleTest in ctx.author.roles:
                    # We already have it
                    await ctx.send("You already have that role.")
                    return
                addRole.append(roleTest)
                break

        if not len(addRole):
            # We didn't find that role
            msg = '*{}* not found in list.\n\nTo see a list of user roles - run `{}listuserroles`'.format(
                role.name, ctx.prefix)
            # Check for suppress
            if suppress:
                msg = Nullify.clean(msg)
            await channel.send(msg)
            return

        if len(addRole):
            self.settings.role.add_roles(ctx.author, addRole)

        msg = '*{}* has acquired **{}!**'.format(
            DisplayName.name(ctx.message.author), role.name)
        if suppress:
            msg = Nullify.clean(msg)
        await channel.send(msg)
Example #14
0
    async def removeuserrole(self, ctx, *, role=None):
        """Removes a role from the user role system (admin only)."""

        author = ctx.message.author
        server = ctx.message.guild
        channel = ctx.message.channel

        usage = 'Usage: `{}removeuserrole [role]`'.format(ctx.prefix)

        # Check if we're suppressing @here and @everyone mentions
        if self.settings.getServerStat(server, "SuppressMentions"):
            suppress = True
        else:
            suppress = False

        isAdmin = self._is_admin(ctx.message.author, ctx.message.channel,
                                 ctx.message.guild)
        # 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 role == None:
            await channel.send(usage)
            return

        if type(role) is str:
            if role == "everyone":
                role = "@everyone"
            # It' a string - the hope continues
            # Let's clear out by name first - then by role id
            try:
                promoArray = self.settings.getServerStat(server, "UserRoles")
            except Exception:
                promoArray = []
            if promoArray == None:
                promoArray = []

            for aRole in promoArray:
                # Get the role that corresponds to the name
                if aRole['Name'].lower() == role.lower():
                    # We found it - let's remove it
                    promoArray.remove(aRole)
                    self.settings.setServerStat(server, "UserRoles",
                                                promoArray)
                    msg = '**{}** removed successfully.'.format(aRole['Name'])
                    # Check for suppress
                    if suppress:
                        msg = Nullify.clean(msg)
                    await channel.send(msg)
                    return
            # At this point - no name
            # Let's see if it's a role that's had a name change

            roleCheck = DisplayName.roleForName(role, server)
            if roleCheck:
                # We got a role
                # If we're here - then the role is an actual role
                try:
                    promoArray = self.settings.getServerStat(
                        server, "UserRoles")
                except Exception:
                    promoArray = []
                if promoArray == None:
                    promoArray = []

                for aRole in promoArray:
                    # Get the role that corresponds to the id
                    if str(aRole['ID']) == str(roleCheck.id):
                        # We found it - let's remove it
                        promoArray.remove(aRole)
                        self.settings.setServerStat(server, "UserRoles",
                                                    promoArray)
                        msg = '**{}** removed successfully.'.format(
                            aRole['Name'])
                        # Check for suppress
                        if suppress:
                            msg = Nullify.clean(msg)
                        await channel.send(msg)
                        return

            # If we made it this far - then we didn't find it
            msg = '*{}* not found in list.'.format(roleCheck.name)
            # Check for suppress
            if suppress:
                msg = Nullify.clean(msg)
            await channel.send(msg)
            return

        # If we're here - then the role is an actual role - I think?
        try:
            promoArray = self.settings.getServerStat(server, "UserRoles")
        except Exception:
            promoArray = []
        if promoArray == None:
            promoArray = []

        for aRole in promoArray:
            # Get the role that corresponds to the id
            if str(arole['ID']) == str(role.id):
                # We found it - let's remove it
                promoArray.remove(aRole)
                self.settings.setServerStat(server, "UserRoles", promoArray)
                msg = '**{}** removed successfully.'.format(aRole['Name'])
                # Check for suppress
                if suppress:
                    msg = Nullify.clean(msg)
                await channel.send(msg)
                return

        # If we made it this far - then we didn't find it
        msg = '*{}* not found in list.'.format(role.name)
        # Check for suppress
        if suppress:
            msg = Nullify.clean(msg)
        await channel.send(msg)
Example #15
0
	async def removexprole(self, ctx, *, role = None):
		"""Removes a role from the xp promotion/demotion system (admin only)."""
		
		author  = ctx.message.author
		server  = ctx.message.server
		channel = ctx.message.channel

		usage = 'Usage: `{}removexprole [role]`'.format(ctx.prefix)

		# Check if we're suppressing @here and @everyone mentions
		if self.settings.getServerStat(server, "SuppressMentions").lower() == "yes":
			suppress = True
		else:
			suppress = False
		
		isAdmin = author.permissions_in(channel).administrator
		# Only allow admins to change server stats
		if not isAdmin:
			await self.bot.send_message(channel, 'You do not have sufficient privileges to access this command.')
			return

		if role == None:
			await self.bot.send_message(channel, usage)
			return

		if type(role) is str:
			if role == "everyone":
				role = "@everyone"
			# It' a string - the hope continues
			# Let's clear out by name first - then by role id
			promoArray = self.settings.getServerStat(server, "PromotionArray")

			for aRole in promoArray:
				# Get the role that corresponds to the name
				if aRole['Name'].lower() == role.lower():
					# We found it - let's remove it
					promoArray.remove(aRole)
					self.settings.setServerStat(server, "PromotionArray", promoArray)
					msg = '**{}** removed successfully.'.format(aRole['Name'])
					# Check for suppress
					if suppress:
						msg = Nullify.clean(msg)
					await self.bot.send_message(channel, msg)
					return
			# At this point - no name
			# Let's see if it's a role that's had a name change


			roleCheck = DisplayName.roleForName(role, server)
			if roleCheck:
				# We got a role
				# If we're here - then the role is an actual role
				promoArray = self.settings.getServerStat(server, "PromotionArray")

				for aRole in promoArray:
					# Get the role that corresponds to the id
					if aRole['ID'] == roleCheck.id:
						# We found it - let's remove it
						promoArray.remove(aRole)
						self.settings.setServerStat(server, "PromotionArray", promoArray)
						msg = '**{}** removed successfully.'.format(aRole['Name'])
						# Check for suppress
						if suppress:
							msg = Nullify.clean(msg)
						await self.bot.send_message(channel, msg)
						return
				
			# If we made it this far - then we didn't find it
			msg = '{} not found in list.'.format(roleCheck.name)
			# Check for suppress
			if suppress:
				msg = Nullify.clean(msg)
			await self.bot.send_message(channel, msg)
			return

		# If we're here - then the role is an actual role - I think?
		promoArray = self.settings.getServerStat(server, "PromotionArray")

		for aRole in promoArray:
			# Get the role that corresponds to the id
			if aRole['ID'] == role.id:
				# We found it - let's remove it
				promoArray.remove(aRole)
				self.settings.setServerStat(server, "PromotionArray", promoArray)
				msg = '**{}** removed successfully.'.format(aRole['Name'])
				# Check for suppress
				if suppress:
					msg = Nullify.clean(msg)
				await self.bot.send_message(channel, msg)
				return

		# If we made it this far - then we didn't find it
		msg = '{} not found in list.'.format(role.name)
		# Check for suppress
		if suppress:
			msg = Nullify.clean(msg)
		await self.bot.send_message(channel, msg)
Example #16
0
    async def vk(self, ctx, *, user=None):
        """Places your vote to have the passed user kicked."""
        # Should be a dict like this:
        # { "ID" : 123456789, "Kicks" : [ { "ID" : 123456789, "Added" : 123456789 } ] }
        if user == None:
            await ctx.send("Usage:  `{}vk [user]`".format(ctx.prefix))
            return

        mute_votes = self.settings.getServerStat(ctx.guild, "VotesToMute")
        ment_votes = self.settings.getServerStat(ctx.guild, "VotesToMention")
        mute_time = self.settings.getServerStat(ctx.guild, "VotesMuteTime")
        ment_chan = self.settings.getServerStat(ctx.guild, "VoteKickChannel")
        vote_ment = self.settings.getServerStat(ctx.guild, "VoteKickMention")
        vote_anon = self.settings.getServerStat(ctx.guild, "VoteKickAnon")

        if vote_anon:
            await ctx.message.delete()

        # Check if mention and mute are disabled
        if (ment_votes == 0 or ment_chan == None
                or ment_chan == None) and (mute_votes == 0 or mute_time == 0):
            await ctx.send('This function is not setup yet.')
            return

        check_user = DisplayName.memberForName(user, ctx.guild)
        if not check_user:
            await ctx.send("I couldn't find *{}*...".format(
                Nullify.clean(user)))
            return

        # Check if we're trying to kick ourselves
        if check_user.id == ctx.author.id:
            await ctx.send(
                "You should probably find a way to be okay with yourself.  Kicking yourself will get you nowhere."
            )
            return

        # Check if we're trying to kick an admin
        isAdmin = check_user.permissions_in(ctx.message.channel).administrator
        if not isAdmin:
            checkAdmin = self.settings.getServerStat(ctx.message.guild,
                                                     "AdminArray")
            for role in check_user.roles:
                for aRole in checkAdmin:
                    # Get the role that corresponds to the id
                    if str(aRole['ID']) == str(role.id):
                        isAdmin = True
        if isAdmin:
            await ctx.channel.send(
                'You cannot vote to kick the admins.  Please work out any issues you may have with them in a civil manner.'
            )
            return

        vote_list = self.settings.getServerStat(ctx.guild, "VoteKickArray")
        for member in vote_list:
            if member["ID"] == check_user.id:
                # They're in the list - let's see if you've already voted for them
                for vote in member["Kicks"]:
                    if vote["ID"] == ctx.author.id:
                        await ctx.send(
                            "You've already voted to kick that member.  You cannot vote against them again while your vote is still active."
                        )
                        return
                # We haven't voted for them yet - add our vote
                member["Kicks"].append({
                    "ID": ctx.author.id,
                    "Added": time.time()
                })
                await ctx.send("Vote kick added for *{}!*".format(
                    DisplayName.name(check_user)))
                await self._check_votes(ctx, check_user)
                return
        # Never found the member
        vote_list.append({
            "ID": check_user.id,
            "Muted": False,
            "Mentioned": False,
            "Kicks": [{
                "ID": ctx.author.id,
                "Added": time.time()
            }]
        })
        await ctx.send("Vote kick added for *{}!*".format(
            DisplayName.name(check_user)))
        await self._check_votes(ctx, check_user)
Example #17
0
	async def removeadmin(self, ctx, *, role : str = None):
		"""Removes a role from the admin list (admin only)."""

		usage = 'Usage: `{}removeadmin [role]`'.format(ctx.prefix)

		# Check if we're suppressing @here and @everyone mentions
		if self.settings.getServerStat(ctx.message.server, "SuppressMentions").lower() == "yes":
			suppress = True
		else:
			suppress = False

		isAdmin = ctx.message.author.permissions_in(ctx.message.channel).administrator
		# Only allow admins to change server stats
		if not isAdmin:
			await self.bot.send_message(ctx.message.channel, 'You do not have sufficient privileges to access this command.')
			return

		if role == None:
			await self.bot.send_message(ctx.message.channel, usage)
			return

		# Name placeholder
		roleName = role
		if type(role) is str:
			if role == "everyone":
				role = "@everyone"
			# If this fails - role will be None, then we know to look at names only
			role = DisplayName.roleForName(roleName, ctx.message.server)

		# If we're here - then the role is a real one
		promoArray = self.settings.getServerStat(ctx.message.server, "AdminArray")

		for aRole in promoArray:
			# Check for Name
			if aRole['Name'].lower() == roleName.lower():
				# We found it - let's remove it
				promoArray.remove(aRole)
				self.settings.setServerStat(ctx.message.server, "AdminArray", promoArray)
				msg = '**{}** removed successfully.'.format(aRole['Name'])
				# Check for suppress
				if suppress:
					msg = Nullify.clean(msg)
				await self.bot.send_message(ctx.message.channel, msg)
				return

			# Get the role that corresponds to the id
			if role and (aRole['ID'] == role.id):
				# We found it - let's remove it
				promoArray.remove(aRole)
				self.settings.setServerStat(ctx.message.server, "AdminArray", promoArray)
				msg = '**{}** removed successfully.'.format(role.name)
				# Check for suppress
				if suppress:
					msg = Nullify.clean(msg)
				await self.bot.send_message(ctx.message.channel, msg)
				return

		# If we made it this far - then we didn't find it
		msg = '**{}** not found in list.'.format(aRole['Name'])
		# Check for suppress
		if suppress:
			msg = Nullify.clean(msg)
		await self.bot.send_message(ctx.message.channel, msg)
Example #18
0
    async def madlibs(self, ctx):
        """Let's play MadLibs!"""

        channel = ctx.message.channel
        author = ctx.message.author
        server = ctx.message.guild

        # Check if we're suppressing @here and @everyone mentions
        if self.settings.getServerStat(ctx.message.guild,
                                       "SuppressMentions").lower() == "yes":
            suppress = True
        else:
            suppress = False

        # Check if we have a MadLibs channel - and if so, restrict to that
        channelID = self.settings.getServerStat(server, "MadLibsChannel")
        if not (not channelID or channelID == ""):
            # We need the channel id
            if not str(channelID) == str(channel.id):
                msg = 'This isn\'t the channel for that...'
                for chan in server.channels:
                    if str(chan.id) == str(channelID):
                        msg = 'This isn\'t the channel for that.  Take the MadLibs to the **{}** channel.'.format(
                            chan.name)
                await channel.send(msg)
                return

        # Check if our folder exists
        if not os.path.isdir("./Cogs/MadLibs"):
            msg = 'I\'m not configured for MadLibs yet...'
            await channel.send(msg)
            return

        # Folder exists - let's see if it has any files
        choices = []  # Empty array
        for file in os.listdir("./Cogs/MadLibs"):
            if file.endswith(".txt"):
                choices.append(file)

        if len(choices) == 0:
            # No madlibs...
            msg = 'I\'m not configured for MadLibs yet...'
            await channel.send(msg)
            return

        # Check if we're already in a game
        if self.settings.getServerStat(server, "PlayingMadLibs"):
            msg = 'I\'m already playing MadLibs - use `{}{} [your word]` to submit answers.'.format(
                ctx.prefix, self.prefix)
            await channel.send(msg)
            return

        self.settings.setServerStat(server, "PlayingMadLibs", "Yes")

        # Get a random madlib from those available
        randnum = random.randint(0, (len(choices) - 1))
        randLib = choices[randnum]

        # Let's load our text and get to work
        with open("./Cogs/MadLibs/{}".format(randLib), 'r') as myfile:
            data = myfile.read()

        # Set up an empty arry
        words = []

        # Match
        matches = re.finditer(self.regex, data)

        # Iterate matches
        for match in matches:
            words.append(match.group(0))

        # Create empty substitution array
        subs = []

        # Iterate words and ask for input
        i = 0
        while i < len(words):
            # Ask for the next word
            vowels = "aeiou"
            word = words[i][2:-2]
            if word[:1].lower() in vowels:
                msg = "I need an **{}** (word *{}/{}*).  `{}{} [your word]`".format(
                    words[i][2:-2], str(i + 1), str(len(words)), ctx.prefix,
                    self.prefix)
            else:
                msg = "I need a **{}** (word *{}/{}*).  `{}{} [your word]`".format(
                    words[i][2:-2], str(i + 1), str(len(words)), ctx.prefix,
                    self.prefix)
            await channel.send(msg)

            # Setup the check
            def check(msg):
                return msg.content.startswith("{}{}".format(
                    ctx.prefix, self.prefix)) and msg.channel == channel

            # Wait for a response
            try:
                talk = await self.bot.wait_for('message',
                                               check=check,
                                               timeout=60)
            except Exception:
                talk = None

            if not talk:
                # We timed out - leave the loop
                msg = "*{}*, I'm done waiting... we'll play another time.".format(
                    DisplayName.name(author))
                await channel.send(msg)
                self.settings.setServerStat(server, "PlayingMadLibs", None)
                return

            # Check if the message is to leave
            if talk.content.lower().startswith('{}{}'.format(
                    ctx.prefix, self.leavePrefix.lower())):
                if talk.author is author:
                    msg = "Alright, *{}*.  We'll play another time.".format(
                        DisplayName.name(author))
                    await channel.send(msg)
                    self.settings.setServerStat(server, "PlayingMadLibs", None)
                    return
                else:
                    # Not the originator
                    msg = "Only the originator (*{}*) can leave the MadLibs.".format(
                        DisplayName.name(author))
                    await channel.send(msg)
                    continue

            # We got a relevant message
            word = talk.content
            # Let's remove the $ml prefix (with or without space)
            if word.startswith('{}{} '.format(ctx.prefix.lower(),
                                              self.prefix.lower())):
                word = word[len(ctx.prefix) + len(self.prefix) + 1:]
            if word.startswith('{}{}'.format(ctx.prefix.lower(),
                                             self.prefix.lower())):
                word = word[len(ctx.prefix) + len(self.prefix):]

            # Check capitalization
            if words[i][:3].isupper():
                # Capitalized
                word = string.capwords(word)

            # Add to our list
            subs.append(word)
            # Increment our index
            i += 1

        # Let's replace
        for asub in subs:
            # Only replace the first occurence
            data = re.sub(self.regex, "**{}**".format(asub), data, 1)

        self.settings.setServerStat(server, "PlayingMadLibs", None)

        # Check for suppress
        if suppress:
            data = Nullify.clean(data)
        # Message the output
        await channel.send(data)
Example #19
0
    async def prompt(self, hw_id, ctx, message, dest=None, author=None):
        # Get author name
        authorName = None
        if author:
            if type(author) is str:
                authorName = author
            else:
                try:
                    authorName = DisplayName.name(author)
                except Exception:
                    pass
        else:
            if message:
                try:
                    author = message.author
                except Exception:
                    pass
            try:
                authorName = DisplayName.name(message.author)
            except Exception:
                pass

        if not dest:
            dest = ctx.channel
        await dest.send(Utils.suppressed(ctx, message))
        while True:

            def littleCheck(m):
                return ctx.author.id == m.author.id and self.channelCheck(
                    m, dest) and len(m.content)

            try:
                talk = await self.bot.wait_for('message',
                                               check=littleCheck,
                                               timeout=300)
            except Exception:
                talk = None

            # See if we're still in the right context
            if not hw_id == self.hwactive.get(str(ctx.author.id), None):
                return None

            # Hardware ended
            if not self.stillHardwaring(ctx.author):
                return None

            if not talk:
                msg = "*{}*, I'm out of time...".format(authorName)
                await dest.send(msg)
                return None
            else:
                # Check for a stop
                if talk.content.lower() == 'stop':
                    msg = "No problem, *{}!*  See you later!".format(
                        authorName, ctx.prefix)
                    await dest.send(msg)
                    return None
                # Make sure
                conf = await self.confirm(hw_id, ctx, talk, dest, "", author)
                if conf == True:
                    # We're sure - return the value
                    return talk
                elif conf == False:
                    # Not sure - ask again
                    return await self.prompt(hw_id, ctx, message, dest, author)
                else:
                    # Timed out
                    return None
Example #20
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:
                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
Example #21
0
    async def renhw(self, ctx, *, build=None):
        """Renames a build from your build list."""
        hwChannel = None
        if ctx.guild:
            # Not a pm
            hwChannel = self.settings.getServerStat(ctx.guild,
                                                    "HardwareChannel")
            if not (not hwChannel or hwChannel == ""):
                # We need the channel id
                if not str(hwChannel) == str(ctx.channel.id):
                    msg = 'This isn\'t the channel for that...'
                    for chan in ctx.guild.channels:
                        if str(chan.id) == str(hwChannel):
                            msg = 'This isn\'t the channel for that.  Take the hardware talk to the **{}** channel.'.format(
                                chan.name)
                    await ctx.send(msg)
                    return
                else:
                    hwChannel = self.bot.get_channel(hwChannel)
        if not hwChannel:
            # Nothing set - pm
            hwChannel = ctx.author

        # Make sure we're not already in a parts transaction
        if str(ctx.author.id) in self.hwactive:
            await ctx.send(
                "You're already in a hardware session!  You can leave with `{}cancelhw`"
                .format(ctx.prefix))
            return

        buildList = self.settings.getGlobalUserStat(ctx.author, "Hardware")
        if buildList == None:
            buildList = []
        if not len(buildList):
            # No parts!
            msg = 'You have no builds on file!  You can add some with the `{}newhw` command.'.format(
                ctx.prefix)
            await ctx.send(msg)
            return
        buildList = sorted(buildList, key=lambda x: x['Name'].lower())

        mainBuild = None

        # Get build by name first - then by number
        if build is not None:
            for b in buildList:
                if b['Name'].lower() == build.lower():
                    # Found it
                    mainBuild = b
                    break

            if not mainBuild:
                try:
                    build = int(build) - 1
                    if build >= 0 and build < len(buildList):
                        mainBuild = buildList[build]
                except:
                    pass
        else:
            # No build passed - get the main if it exists
            for b in buildList:
                if b['Main']:
                    mainBuild = b
                    break

        if not mainBuild:
            msg = "I couldn't find that build or number."
            await ctx.send(msg)
            return

        # Set our HWActive flag
        hw_id = self.gen_id()
        self.hwactive[str(ctx.author.id)] = hw_id

        # Post the dm reaction
        if hwChannel == ctx.author and ctx.channel != ctx.author.dm_channel:
            await ctx.message.add_reaction("📬")

        # Here, we have a build
        bname = Utils.suppressed(ctx, mainBuild['Name'])

        msg = 'Alright, *{}*, what do you want to rename "{}" to?'.format(
            DisplayName.name(ctx.author), bname)
        while True:
            try:
                buildName = await self.prompt(hw_id, ctx, msg, hwChannel,
                                              DisplayName.name(ctx.author))
            except:
                # Can't send to the destination
                self._stop_hw(ctx.author)
                if hwChannel == ctx.author:
                    # Must not accept pms
                    await ctx.send(
                        "It looks like you don't accept pms.  Please enable them and try again."
                    )
                return
            if not buildName:
                self._stop_hw(ctx.author)
                return
            buildExists = False
            for build in buildList:
                if build['Name'].lower() == buildName.content.lower():
                    mesg = 'It looks like you already have a build by that name, *{}*.  Try again.'.format(
                        DisplayName.name(ctx.author))
                    await hwChannel.send(mesg)
                    buildExists = True
                    break
            if not buildExists:
                mainBuild['Name'] = buildName.content
                # Flush settings to all servers
                self.settings.setGlobalUserStat(ctx.author, "Hardware",
                                                buildList)
                break
        bname2 = Utils.suppressed(ctx, buildName.content)
        msg = '*{}*, {} was renamed to {} successfully!'.format(
            DisplayName.name(ctx.author), bname, bname2)
        self._stop_hw(ctx.author)
        await hwChannel.send(msg)
Example #22
0
	async def taginfo(self, ctx, *, name : str = None):
		"""Displays info about a tag from the tag list."""

		channel = ctx.message.channel
		author  = ctx.message.author
		server  = ctx.message.guild

		# Check if we're suppressing @here and @everyone mentions
		if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
			suppress = True
		else:
			suppress = False

		if not name:
			msg = 'Usage: `{}taginfo "[tag name]"`'.format(ctx.prefix)
			await channel.send(msg)
			return

		tagList = self.settings.getServerStat(server, "Tags")
		if not tagList or tagList == []:
			msg = 'No tags in list!  You can add some with the `{}addtag "[tag name]" [tag]` command!'.format(ctx.prefix)
			await channel.send(msg)
			return

		for atag in tagList:
			if atag['Name'].lower() == name.lower():
				currentTime = int(time.time())
				msg = '**{}:**'.format(atag['Name'])
				try:
					memID = DisplayName.memberForID(atag['CreatedID'], server)
				except KeyError as e:
					memID = None
				if memID:
					msg = '{}\nCreated By: *{}*'.format(msg, DisplayName.name(memID))
				else:
					try:	
						msg = '{}\nCreated By: *{}*'.format(msg, atag['CreatedBy'])
					except KeyError as e:
						msg = '{}\nCreated By: `UNKNOWN`'.format(msg)
				try:
					createdTime = int(atag['Created'])
					timeString  = ReadableTime.getReadableTimeBetween(createdTime, currentTime)
					msg = '{}\nCreated : *{}* ago'.format(msg, timeString)
				except KeyError as e:
					pass
				try:
					msg = '{}\nUpdated By: *{}*'.format(msg, atag['UpdatedBy'])
				except KeyError as e:
					pass
				try:
					createdTime = atag['Updated']
					createdTime = int(createdTime)
					timeString  = ReadableTime.getReadableTimeBetween(createdTime, currentTime)
					msg = '{}\nUpdated : *{}* ago'.format(msg, timeString)
				except:
					pass
				# Check for suppress
				if suppress:
					msg = Nullify.clean(msg)
				await channel.send(msg)
				return

		msg = 'Tag "*{}*" not found!'.format(name)
		# Check for suppress
		if suppress:
			msg = Nullify.clean(msg)
		await channel.send(msg)
Example #23
0
    async def rawhw(self, ctx, *, user: str = None, build=None):
        """Lists the raw markdown for either the user's default build - or the passed build."""
        if not user:
            user = "******".format(ctx.author.name, ctx.author.discriminator)

        # Let's check for username and build name
        parts = user.split()

        memFromName = None
        buildParts = None

        for j in range(len(parts)):
            # Reverse search direction
            i = len(parts) - 1 - j

            # Name = 0 up to i joined by space
            nameStr = ' '.join(parts[0:i])
            buildStr = ' '.join(parts[i:])

            memFromName = DisplayName.memberForName(nameStr, ctx.guild)
            if memFromName:
                buildList = self.settings.getGlobalUserStat(
                    memFromName, "Hardware")
                if buildList == None:
                    buildList = []
                for build in buildList:
                    if build['Name'].lower() == buildStr.lower():
                        # Ha! Found it!
                        buildParts = build
                        break
                if buildParts:
                    # We're in business
                    break
                else:
                    memFromName = None

        if not memFromName:
            # Try again with numbers
            for j in range(len(parts)):
                # Reverse search direction
                i = len(parts) - 1 - j

                # Name = 0 up to i joined by space
                nameStr = ' '.join(parts[0:i])
                buildStr = ' '.join(parts[i:])

                memFromName = DisplayName.memberForName(nameStr, ctx.guild)
                if memFromName:
                    buildList = self.settings.getGlobalUserStat(
                        memFromName, "Hardware")
                    if buildList == None:
                        buildList = []
                    buildList = sorted(buildList,
                                       key=lambda x: x['Name'].lower())
                    try:
                        buildStr = int(buildStr) - 1
                        if buildStr >= 0 and buildStr < len(buildList):
                            buildParts = buildList[buildStr]
                    except Exception:
                        memFromName = None
                        buildParts = None
                    if buildParts:
                        # We're in business
                        break
                    else:
                        memFromName = None

        if not memFromName:
            # One last shot - check if it's a build for us
            buildList = self.settings.getGlobalUserStat(ctx.author, "Hardware")
            if buildList == None:
                buildList = []
            buildList = sorted(buildList, key=lambda x: x['Name'].lower())
            for build in buildList:
                if build['Name'].lower() == user.lower():
                    memFromName = ctx.author
                    buildParts = build
                    break
            if not memFromName:
                # Okay - *this* time is the last - check for number
                try:
                    user_as_build = int(user) - 1
                    if user_as_build >= 0 and user_as_build < len(buildList):
                        buildParts = buildList[user_as_build]
                        memFromName = ctx.author
                except Exception:
                    pass

        if not memFromName:
            # Last check for a user passed as the only param
            memFromName = DisplayName.memberForName(user, ctx.guild)

        if not memFromName:
            # We couldn't find them :(
            msg = "I couldn't find that user/build combo..."
            return await ctx.send(msg)

        if buildParts == None:
            # Check if that user has no builds
            buildList = self.settings.getGlobalUserStat(
                memFromName, "Hardware")
            if buildList == None:
                buildList = []
            if not len(buildList):
                # No parts!
                msg = '*{}* has no builds on file!  They can add some with the `{}newhw` command.'.format(
                    DisplayName.name(memFromName), ctx.prefix)
                return await ctx.send(msg)

            # Must be the default build
            for build in buildList:
                if build['Main']:
                    buildParts = build
                    break

            if not buildParts:
                # Well... uh... no defaults
                msg = "I couldn't find that user/build combo..."
                return await ctx.send(msg)

        # At this point - we *should* have a user and a build
        p = discord.utils.escape_markdown(buildParts['Hardware'])
        msg = "__**{}'s {} (Raw Markdown):**__\n\n{}".format(
            DisplayName.name(memFromName), buildParts['Name'], p)
        await ctx.send(Utils.suppressed(ctx, msg))
Example #24
0
	async def addtag(self, ctx, name : str = None, *, tag : str = None):
		"""Add a tag to the tag list."""

		# Check if we're suppressing @here and @everyone mentions
		if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
			suppress = True
		else:
			suppress = False

		channel = ctx.message.channel
		author  = ctx.message.author
		server  = ctx.message.guild

		# Check for role requirements
		requiredRole = self.settings.getServerStat(server, "RequiredTagRole")
		if requiredRole == "":
			#admin only
			isAdmin = author.permissions_in(channel).administrator
			if not isAdmin:
				await channel.send('You do not have sufficient privileges to access this command.')
				return
		else:
			#role requirement
			hasPerms = False
			for role in author.roles:
				if str(role.id) == str(requiredRole):
					hasPerms = True
			if not hasPerms and not ctx.message.author.permissions_in(ctx.message.channel).administrator:
				await channel.send('You do not have sufficient privileges to access this command.')
				return

		# Passed role requirements!
		if name == None or tag == None:
			msg = 'Usage: `{}addtag "[tag name]" [tag]`'.format(ctx.prefix)
			await channel.send(msg)
			return

		tagList = self.settings.getServerStat(server, "Tags")
		if not tagList:
			tagList = []

		found = False
		currentTime = int(time.time())	
		for atag in tagList:
			if atag['Name'].lower() == name.lower():
				# The tag exists!
				msg = '*{}* updated!'.format(name)
				atag['URL'] = tag
				atag['UpdatedBy'] = DisplayName.name(author)
				atag['UpdatedID'] = author.id
				atag['Updated'] = currentTime
				found = True
		if not found:	
			tagList.append({"Name" : name, "URL" : tag, "CreatedBy" : DisplayName.name(author), "CreatedID": author.id, "Created" : currentTime})
			msg = '*{}* added to tag list!'.format(name)

		self.settings.setServerStat(server, "Tags", tagList)
		# Check for suppress
		if suppress:
			msg = Nullify.clean(msg)
		await channel.send(msg)
Example #25
0
    async def highfive(self, ctx, *, member: str = None):
        """It's like clapping with 2 people!"""

        authorName = DisplayName.name(ctx.message.author)

        # Check if we're eating nothing
        if member == None:
            nothingList = [
                'you stand alone for an eternity, hand raised up - desperate for any sort of recognition...',
                'with a wild swing you throw your hand forward - the momentum carries you to the ground and you just lay there - high fiveless...',
                'the only sound you hear as a soft *whoosh* as your hand connects with nothing...'
            ]

            randnum = random.randint(0, len(nothingList) - 1)
            msg = '*{}*, {}'.format(authorName, nothingList[randnum])
            msg = Nullify.clean(msg)
            await ctx.channel.send(msg)
            return

        # Check if we're eating a member
        memberCheck = DisplayName.memberForName(member, ctx.message.guild)
        if memberCheck:
            # We're eating a member - let's do a bot-check
            if memberCheck.id == self.bot.user.id:
                # It's me!
                memberList = [
                    'the sky erupts with 1\'s and 0\'s as our hands meet in an epic high five of glory!',
                    'you beam up to the cloud and receive a quick high five from me before downloading back to Earth.',
                    'I unleash a fork-bomb of high five processes!',
                    '01001000011010010110011101101000001000000100011001101001011101100110010100100001'
                ]
            elif memberCheck.id == ctx.message.author.id:
                # We're eating... ourselves?
                memberList = [
                    'ahh - high fiving yourself, classy...',
                    'that\'s uh... that\'s just clapping...',
                    'you run in a large circle - *totally* high fiving all your friends...',
                    'now you\'re at both ends of a high five!'
                ]
            else:
                memName = DisplayName.name(memberCheck)
                memberList = [
                    'you and *{}* jump up for an epic high five - freeze-framing as the credits roll and some wicked 80s synth plays out.'
                    .format(memName),
                    'you and *{}* elevate to a higher plane of existence in wake of that tremendous high five!'
                    .format(memName),
                    'a 2 hour, 3 episode anime-esque fight scene unfolds as you and *{}* engage in a world-ending high five!'
                    .format(memName),
                    'it *was* tomorrow - before you and *{}* high fived with enough force to spin the Earth in reverse!'
                    .format(memName),
                    'like two righteous torpedoes - you and *{}* connect palms, subsequently deafening everyone in a 300-mile radius!'
                    .format(memName)
                ]
            randnum = random.randint(0, len(memberList) - 1)
            msg = '*{}*, {}'.format(authorName, memberList[randnum])
            msg = Nullify.clean(msg)
            await ctx.channel.send(msg)
            return

        # Assume we're eating something else
        itemList = [
            'neat... you just high fived *{}*.'.format(member),
            'your hand flops through the air - hitting *{}* with a soft thud.'.
            format(member),
            'you reach out a hand, gently pressing your palm to *{}*.  A soft *"high five"* escapes your lips as a tear runs down your cheek...'
            .format(member),
            'like an open-handed piston of ferocity - you drive your palm into *{}*.'
            .format(member)
        ]

        randnum = random.randint(0, len(itemList) - 1)
        msg = '*{}*, {}'.format(authorName, itemList[randnum])
        msg = Nullify.clean(msg)
        await ctx.channel.send(msg)
        return
Example #26
0
	async def feed(self, ctx, food : int = None):
		"""Feed the bot some xp!"""
		# feed the bot, and maybe you'll get something in return!
		msg = 'Usage: `{}feed [xp reserve feeding]`'.format(ctx.prefix)
		
		channel = ctx.message.channel
		author  = ctx.message.author
		server  = ctx.message.guild
		
		if food == None:
			await channel.send(msg)
			return
			
		if not type(food) == int:
			await channel.send(msg)
			return

		isAdmin    = author.permissions_in(channel).administrator
		checkAdmin = self.settings.getServerStat(ctx.message.guild, "AdminArray")
		# Check for bot admin
		isBotAdmin      = False
		for role in ctx.message.author.roles:
			for aRole in checkAdmin:
				# Get the role that corresponds to the id
				if str(aRole['ID']) == str(role.id):
					isBotAdmin = True
					break
		botAdminAsAdmin = self.settings.getServerStat(server, "BotAdminAsAdmin")
		adminUnlim = self.settings.getServerStat(server, "AdminUnlimited")
		reserveXP  = self.settings.getUserStat(author, server, "XPReserve")
		minRole    = self.settings.getServerStat(server, "MinimumXPRole")
		requiredXP = self.settings.getServerStat(server, "RequiredXPRole")
		isKill     = self.settings.getServerStat(server, "Killed")
		hunger     = int(self.settings.getServerStat(server, "Hunger"))
		xpblock    = self.settings.getServerStat(server, "XpBlockArray")

		approve = True
		decrement = True

		# Check Food

		if food > int(reserveXP):
			approve = False
			msg = 'You can\'t feed me *{:,}*, you only have *{:,}* xp reserve!'.format(food, reserveXP)
			
		if food < 0:
			msg = 'You can\'t feed me less than nothing! You think this is funny?!'
			approve = False
			# Avoid admins gaining xp
			decrement = False
			
		if food == 0:
			msg = 'You can\'t feed me *nothing!*'
			approve = False
			
		#if author.top_role.position < int(minRole):
			#approve = False
			#msg = 'You don\'t have the permissions to feed me.'
		
		# RequiredXPRole
		if not self._can_xp(author, server):
			approve = False
			msg = 'You don\'t have the permissions to feed me.'

		# Check bot admin
		if isBotAdmin and botAdminAsAdmin:
			# Approve as admin
			approve = True
			if adminUnlim:
				# No limit
				decrement = False
			else:
				if food < 0:
					# Don't decrement if negative
					decrement = False
				if food > int(reserveXP):
					# Don't approve if we don't have enough
					msg = 'You can\'t feed me *{:,}*, you only have *{:,}* xp reserve!'.format(food, reserveXP)
					approve = False
			
		# Check admin last - so it overrides anything else
		if isAdmin:
			# No limit - approve
			approve = True
			if adminUnlim:
				# No limit
				decrement = False
			else:
				if food < 0:
					# Don't decrement if negative
					decrement = False
				if food > int(reserveXP):
					# Don't approve if we don't have enough
					msg = 'You can\'t feed me *{:,}*, you only have *{:,}* xp reserve!'.format(food, reserveXP)
					approve = False
			
		# Check if we're blocked
		if ctx.author.id in xpblock:
			msg = "You can't feed the bot!"
			approve = False
		else:
			for role in ctx.author.roles:
				if role.id in xpblock:
					msg = "Your role cannot feed the bot!"
					approve = False

		if approve:
			# Feed was approved - let's take the XPReserve right away
			# Apply food - then check health
			hunger -= food
			
			self.settings.setServerStat(server, "Hunger", hunger)
			takeReserve = -1*food
			if decrement:
				self.settings.incrementStat(author, server, "XPReserve", takeReserve)

			if isKill:
				# Bot's dead...
				msg = '*{}* carelessly shoves *{:,} xp* into the carcass of *{}*... maybe resurrect them first next time?'.format(DisplayName.name(author), food, DisplayName.serverNick(self.bot.user, server))
				await channel.send(msg)
				return
			
			# Bet more, less chance of winning, but more winnings!
			chanceToWin = 50
			payout = int(food*2)
			
			# 1/chanceToWin that user will win - and payout is double the food
			randnum = random.randint(1, chanceToWin)
			if randnum == 1:
				# YOU WON!!
				self.settings.incrementStat(author, server, "XP", int(payout))
				msg = '*{}\'s* offering of *{:,}* has made me feel *exceptionally* generous.  Please accept this *magical* package with *{:,} xp!*'.format(DisplayName.name(author), food, int(payout))
				
				# Got XP - let's see if we need to promote
				await CheckRoles.checkroles(author, channel, self.settings, self.bot)
			else:
				msg = '*{}* fed me *{:,} xp!* Thank you, kind soul! Perhaps I\'ll spare you...'.format(DisplayName.name(author), food)
		
			if hunger <= -150:
				# Kill the bot here
				self.settings.setServerStat(server, "Killed", True)
				self.settings.setServerStat(server, "KilledBy", author.id)
				msg = '{}\n\nI am kill...\n\n*{}* did it...'.format(msg, DisplayName.name(author))			
			elif hunger <= -100:
				msg = '{}\n\nYou *are* going to kill me...  Stop *now* if you have a heart!'.format(msg)
			elif hunger <= -75:
				msg = '{}\n\nI\'m looking fat to an extremely unhealthy degree... maybe you should think about *my* health?'.format(msg)
			elif hunger <= -50:
				msg = '{}\n\nI\'m obese :( ... Eating is my enemy right now.'.format(msg)
			elif hunger <= -25:
				msg = '{}\n\nI\'m kinda fat... Diet time?'.format(msg)	
			elif hunger <= -10:
				msg = '{}\n\nI\'m getting pudgy... I may get fat if you keep going.'.format(msg)
			elif hunger <= -1:
				msg = '{}\n\nI\'m getting stuffed... maybe I should take a break from eating...'.format(msg)
			elif hunger == 0:
				msg = '{}\n\nIf you keep feeding me, I *may* get fat...'.format(msg)
		
		await channel.send(msg)
Example #27
0
 async def hastemp(self, ctx, *, member = None):
     """Displays any temp roles the passed user has, and the remaining time."""
     # Check for admin status
     isAdmin = ctx.author.permissions_in(ctx.channel).administrator
     if not isAdmin:
         checkAdmin = self.settings.getServerStat(ctx.guild, "AdminArray")
         for role in ctx.author.roles:
             for aRole in checkAdmin:
                 # Get the role that corresponds to the id
                 if str(aRole['ID']) == str(role.id):
                     isAdmin = True
     if not isAdmin:
         await ctx.send("You do not have permission to use this command.")
         return
     # Check if we're suppressing @here and @everyone mentions
     if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
         suppress = True
     else:
         suppress = False
     # Get the array
     try:
         promoArray = self.settings.getServerStat(server, "TempRoleList")
     except Exception:
         promoArray = []
     if member == None:
         member = ctx.author
     else:
         member_name = member
         member = DisplayName.memberForName(member, ctx.guild)
         if not member:
             msg = 'I couldn\'t find *{}*...'.format(member_name)
             # Check for suppress
             if suppress:
                 msg = Nullify.clean(msg)
             await ctx.send(msg)
             return
     # Got the member - let's check for roles
     temp_roles = self.settings.getUserStat(member, ctx.guild, "TempRoles")
     if not len(temp_roles):
         await ctx.send("*{}* has no logged temp roles!".format(DisplayName.name(member)))
         return
     roleText = "**__Current Temp Roles For {}:__**\n\n".format(DisplayName.name(member))
     c = time.time()
     for arole in temp_roles:
         # Get current role name based on id
         foundRole = False
         timeleft = arole["Cooldown"]-int(time.time())
         for role in ctx.guild.roles:
             if str(role.id) == str(arole['ID']):
                 # We found it
                 foundRole = True
                 if not "AddedBy" in arole:
                     added = "automatically"
                 else:
                     add_user = DisplayName.name(DisplayName.memberForID(arole["AddedBy"], ctx.guild))
                     if not add_user:
                         add_user = str(arole["AddedBy"])
                     added = "by {}".format(add_user)
                 roleText = '{}**{}** - added {} - *{}* remain\n'.format(roleText, role.name, added, ReadableTime.getReadableTimeBetween(0, timeleft))
         if not foundRole:
             roleText = '{}**{}** (removed from server)\n'.format(roleText, arole['Name'])
     # Check for suppress
     if suppress:
         roleText = Nullify.clean(roleText)
     await ctx.send(roleText)
Example #28
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.server
		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").lower() == "yes":
			suppress = True
		else:
			suppress = False
		
		isAdmin = author.permissions_in(channel).administrator
		# Only allow admins to change server stats
		if not isAdmin:
			await self.bot.send_message(channel, '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 self.bot.send_message(ctx.message.channel, 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 self.bot.send_message(ctx.message.channel, msg)
					return
				role = roleCheck["Role"]
				xp   = roleCheck["Int"]

		if xp == None:
			await self.bot.send_message(channel, usage)
			return
		if not type(xp) is int:
			await self.bot.send_message(channel, 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 aRole['ID'] == role.id:
				# We found it - throw an error message and return
				msg = '**{}** is already in the list.  Required xp: *{}*'.format(role.name, aRole['XP'])
				# Check for suppress
				if suppress:
					msg = Nullify.clean(msg)
				await self.bot.send_message(channel, 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 self.bot.send_message(channel, msg)
		return
Example #29
0
    async def temp(self, ctx, member = None, role = None, *, cooldown = None):
        """Gives the passed member the temporary role for the passed amount of time - needs quotes around member and role (bot-admin only)."""
        # Check if we're suppressing @here and @everyone mentions
        if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
            suppress = True
        else:
            suppress = False

        isAdmin = ctx.message.author.permissions_in(ctx.message.channel).administrator
        if not isAdmin:
            checkAdmin = self.settings.getServerStat(ctx.message.guild, "AdminArray")
            for arole in ctx.message.author.roles:
                for aRole in checkAdmin:
                    # Get the role that corresponds to the id
                    if str(aRole['ID']) == str(arole.id):
                        isAdmin = True
        # Only allow admins to change server stats
        if not isAdmin:
            await ctx.channel.send('You do not have sufficient privileges to access this command.')
            return

        if member == None or role == None:
            msg = 'Usage: `{}temp "[member]" "[role]" [cooldown]`'.format(ctx.prefix)
            await ctx.channel.send(msg)
            return

        # Get member and role
        member_from_name = DisplayName.memberForName(member, ctx.guild)
        role_from_name   = DisplayName.roleForName(role, ctx.guild)

        if not member_from_name and not role_from_name:
            msg = "I couldn't find either the role or member..."
            await ctx.send(msg)
            return

        if not member_from_name:
            msg = 'I couldn\'t find *{}*...'.format(member)
            # Check for suppress
            if suppress:
                msg = Nullify.clean(msg)
            await ctx.send(msg)
            return

        # Don't allow us to temp admins or bot admins
        isAdmin = member_from_name.permissions_in(ctx.channel).administrator
        if not isAdmin:
            checkAdmin = self.settings.getServerStat(ctx.guild, "AdminArray")
            for arole in member_from_name.roles:
                for aRole in checkAdmin:
                    # Get the role that corresponds to the id
                    if str(aRole['ID']) == str(arole.id):
                        isAdmin = True
        # Only allow admins to change server stats
        if isAdmin:
            await ctx.channel.send("You can't apply temp roles to other admins or bot-admins.")
            return

        if not role_from_name:
            msg = 'I couldn\'t find *{}*...'.format(role)
            # Check for suppress
            if suppress:
                msg = Nullify.clean(msg)
            await ctx.send(msg)
            return

        # Make sure our role is in the list
        promoArray = self.settings.getServerStat(ctx.guild, "TempRoleList")
        if not role_from_name.id in [int(x["ID"]) for x in promoArray]:
            # No dice
            await ctx.send("That role is not in the temp role list!")
            return

        if cooldown == None:
            await ctx.send("You must specify a time greater than 0 seconds.")
            return

        if not cooldown == None:
            # Get the end time
            end_time = None
            try:
                # Get current time - and end time
                currentTime = int(time.time())
                cal         = parsedatetime.Calendar()
                time_struct, parse_status = cal.parse(cooldown)
                start       = datetime(*time_struct[:6])
                end         = time.mktime(start.timetuple())
                # Get the time from now to end time
                end_time = end-currentTime
            except:
                pass
            if end_time == None:
                # We didn't get a time
                await ctx.send("That time value is invalid.")
                return
            # Set the cooldown
            cooldown = end_time

        if cooldown < 1:
            await ctx.send("You must specify a time greater than 0 seconds.")
            return

        message = await ctx.send("Applying...")

        # Here we have a member, role, and end time - apply them!
        user_roles = self.settings.getUserStat(member_from_name, ctx.guild, "TempRoles")
        # Check and see if we're overriding a current time
        found = False
        temp_role = {}
        for r in user_roles:
            if int(r["ID"]) == role_from_name.id:
                # Already have it - update the cooldown
                r["Cooldown"] = cooldown + int(time.time()) if cooldown != None else cooldown
                r["AddedBy"] = ctx.author.id
                temp_role = r
                found = True
                break
        if not found:
            # Add it anew
            temp_role["ID"] = role_from_name.id
            temp_role["Cooldown"] = cooldown + int(time.time()) if cooldown != None else cooldown
            temp_role["AddedBy"] = ctx.author.id
            user_roles.append(temp_role)
            self.settings.setUserStat(member_from_name, ctx.guild, "TempRoles", user_roles)
        if not role_from_name in member_from_name.roles:
            self.settings.role.add_roles(member_from_name, [role_from_name])
        if not cooldown == None:
            # We have a cooldown
            msg = "*{}* has been given **{}** for *{}*.".format(
                DisplayName.name(member_from_name),
                role_from_name.name,
                ReadableTime.getReadableTimeBetween(0, cooldown)
            )
            pm = "You have been given **{}** in *{}* for *{}*".format(
                role_from_name.name,
                ctx.guild.name,
                ReadableTime.getReadableTimeBetween(0, cooldown)
            )
            self.loop_list.append(self.bot.loop.create_task(self.check_temp_roles(member_from_name, temp_role)))
        else:
            msg = "*{}* has been given **{}** *until further notice*.".format(
                DisplayName.name(member_from_name),
                role_from_name.name
            )
            pm = "You have been given **{}** in *{} until further notice*.".format(
                role_from_name.name,
                ctx.guild.name
            )
        # Announce it
        if suppress:
            msg = Nullify.clean(msg)
        await message.edit(content=msg)
        # Check if we pm
        if self.settings.getServerStat(ctx.guild, "TempRolePM"):
            try:
                await member_from_name.send(pm)
            except:
                pass
Example #30
0
    async def removexprole(self, ctx, *, role=None):
        """Removes a role from the xp promotion/demotion system (admin only)."""

        author = ctx.message.author
        server = ctx.message.guild
        channel = ctx.message.channel

        usage = 'Usage: `{}removexprole [role]`'.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 role == None:
            await channel.send(usage)
            return

        if type(role) is str:
            if role == "everyone":
                role = "@everyone"
            # It' a string - the hope continues
            # Let's clear out by name first - then by role id
            promoArray = self.settings.getServerStat(server, "PromotionArray")

            for aRole in promoArray:
                # Get the role that corresponds to the name
                if aRole['Name'].lower() == role.lower() or str(
                        aRole["ID"]) == str(role):
                    # We found it - let's remove it
                    promoArray.remove(aRole)
                    self.settings.setServerStat(server, "PromotionArray",
                                                promoArray)
                    msg = '**{}** removed successfully.'.format(aRole['Name'])
                    msg = Utils.suppressed(ctx, msg)
                    await channel.send(msg)
                    return
            # At this point - no name
            # Let's see if it's a role that's had a name change

            roleCheck = DisplayName.roleForName(role, server)
            if roleCheck:
                # We got a role
                # If we're here - then the role is an actual role
                promoArray = self.settings.getServerStat(
                    server, "PromotionArray")

                for aRole in promoArray:
                    # Get the role that corresponds to the id
                    if str(aRole['ID']) == str(roleCheck.id):
                        # We found it - let's remove it
                        promoArray.remove(aRole)
                        self.settings.setServerStat(server, "PromotionArray",
                                                    promoArray)
                        msg = '**{}** removed successfully.'.format(
                            aRole['Name'])
                        msg = Utils.suppressed(ctx, msg)
                        await channel.send(msg)
                        return

            # If we made it this far - then we didn't find it
            msg = '{} not found in list.'.format(role)
            msg = Utils.suppressed(ctx, msg)
            await channel.send(msg)
            return

        # If we're here - then the role is an actual role - I think?
        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 - let's remove it
                promoArray.remove(aRole)
                self.settings.setServerStat(server, "PromotionArray",
                                            promoArray)
                msg = '**{}** removed successfully.'.format(aRole['Name'])
                msg = Utils.suppressed(ctx, msg)
                await channel.send(msg)
                return

        # If we made it this far - then we didn't find it
        msg = '{} not found in list.'.format(role.name)
        msg = Utils.suppressed(ctx, msg)
        await channel.send(msg)