Beispiel #1
0
def onCommand(message_in):
    if message_in.command == 'eat':
        author = displayname.name(message_in.author)
        member = message_in.body.strip()

        # Check if we're eating nothing
        if member == "":
            nothingList = ['you sit quietly and eat *nothing*...',
                            'you\'re *sure* there was something to eat, so you just chew on nothingness...',
                            'there comes a time when you need to realize that you\'re just chewing nothing for the sake of chewing.  That time is now.']

            randnum = random.randint(0, len(nothingList) - 1)
            return message.message('*{}*, {}'.format(author, nothingList[randnum]))

        # Check if we're eating a member
        memberCheck = displayname.memberForName(member, message_in.server)
        if memberCheck:
            # We're eating a member - let's do a bot-check
            if memberCheck.id == message_in.server.me.id:
                # It's me!
                memberList = ['you try to eat *me* - but unfortunately, I saw it coming - your jaw hangs open as I deftly sidestep.',
                                'your mouth hangs open for a brief second before you realize that *I\'m* eating *you*.',
                                'I\'m a bot.  You can\'t eat me.',
                                'your jaw clamps down on... wait... on nothing, because I\'m *digital!*.',
                                'what kind of bot would I be if I let you eat me?']

            elif memberCheck.id == message_in.author.id:
                # We're eating...  ourselves?
                memberList = ['you clamp down on your own forearm - not surprisingly, it hurts.',
                                'you place a finger into your mouth, but *just can\'t* force yourself to bite down.',
                                'you happily munch away, but can now only wave with your left hand.',
                                'wait - you\'re not a sandwich!',
                                'you might not be the smartest...']

            else:
                memName = displayname.name(memberCheck)
                memberList = ['you unhinge your jaw and consume *{}* in one bite.'.format(memName),
                                'you try to eat *{}*, but you just can\'t quite do it - you spit them out, the taste of failure hanging in your mouth...'.format(memName),
                                'you take a quick bite out of *{}*.  They probably didn\'t even notice.'.format(memName),
                                'you sink your teeth into *{}\'s* shoulder - they turn to face you, eyes wide as you try your best to scurry away and hide.'.format(memName),
                                'your jaw clamps down on *{}* - a satisfying *crunch* emanates as you finish your newest meal.'.format(memName)]
            randnum = random.randint(0, len(memberList) - 1)
            return message.message('*{}*, {}'.format(author, memberList[randnum]))

        # Assume we're eating something else
        itemList = ['you take a big chunk out of *{}*. *Delicious.*'.format(member),
                        'your teeth sink into *{}* - it tastes satisfying.'.format(member),
                        'you rip hungrily into *{}*, tearing it to bits!'.format(member),
                        'you just can\'t bring yourself to eat *{}* - so you just hold it for awhile...'.format(member),
                        'you attempt to bite into *{}*, but you\'re clumsier than you remember - and fail...'.format(member),]

        randnum = random.randint(0, len(itemList) - 1)
        return message.message('*{}*, {}'.format(author, itemList[randnum]))
async def onCommand(message_in):
    if message_in.command == 'plugins':
        plugin_list = []
        for plugin_in in Bot.plugins:
            plugin_list.append(plugin_in.name)
        return message.Message(body='```{}```'.format(', '.join(plugin_list)))

    if message_in.command == 'commands' or message_in.command == 'help':
        cmd_names = []
        cmd_descs = []
        for botcommand in Bot.commands:
            if botcommand.devcommand != True:
                cmd_names.append(botcommand.name)
                cmd_descs.append(botcommand.shortdesc)
        cmd_list = []
        pad_len = len(max(cmd_names, key=len))
        for index, value in enumerate(cmd_names):
            cmd_list.append('{} - {}'.format(cmd_names[index].ljust(pad_len),
                                             cmd_descs[index]))
        return message.Message(body='```{}```'.format('\n'.join(cmd_list)))

    if message_in.command == 'info':
        sha = git.git_commit()
        track = git.git_branch()
        remote = git.get_remote()
        link = git.get_url()
        if track == 'master':
            embed = discord.Embed(color=discord.Color.red())
        elif track == 'unstable':
            embed = discord.Embed(color=discord.Color.gold())
        elif track == 'stable':
            embed = discord.Embed(color=discord.Color.green())
        else:
            embed = discord.Embed(color=discord.Color.light_grey())
        embed.set_author(
            name='Project StarBot v0.2.0-{} on track {}'.format(
                sha[:7], track),
            url=link,
            icon_url=
            'https://pbs.twimg.com/profile_images/616309728688238592/pBeeJQDQ.png'
        )
        embed.add_field(name="Bot Team Alpha",
                        value="CorpNewt\nSydney Erickson\nGoldfish64")
        embed.add_field(
            name="Source Code",
            value=
            "Interested in poking around inside the bot?\nClick on the link above!"
        )
        embed.set_footer(text="Pulled from {}".format(remote))
        return message.Message(embed=embed)

    if message_in.command == 'plugintree':
        dups = commands_detect_dups()
        plugin_string = '```\n'
        for plugin_in in Bot.plugins:
            plugin_string += '{}\n'.format(plugin_in.name)
            plugin_commands = len(plugin_in.commands)
            index = 0
            for command_in in plugin_in.commands:
                index += 1
                if plugin_commands != index:
                    if command_in.name in dups:
                        plugin_string += '├ {} <-- duplicate\n'.format(
                            command_in.name)
                    else:
                        plugin_string += '├ {}\n'.format(command_in.name)
                else:
                    if command_in.name in dups:
                        plugin_string += '└ {} <-- duplicate\n'.format(
                            command_in.name)
                    else:
                        plugin_string += '└ {}\n'.format(command_in.name)
        plugin_string += '```'
        return message.Message(body=plugin_string)

    if message_in.command == 'uptime':
        time_current = int(time.time())
        time_str = readableTime.getReadableTimeBetween(Bot.startTime,
                                                       time_current)
        return message.Message(body='I\'ve been up for *{}*.'.format(time_str))

    if message_in.command == 'hostinfo':
        # Get information about host environment.
        time_current = int(time.time())

        # CPU stats.
        cpu_threads = os.cpu_count()
        cpu_usage = psutil.cpu_percent(interval=1)

        # Memory stats.
        mem_stats = psutil.virtual_memory()
        mem_percent = mem_stats.percent
        mem_used = convert_size(mem_stats.used)
        mem_total = convert_size(mem_stats.total)

        # Platform info.
        platform_current = platform.platform()

        # Python version info.
        pyver_major = sys.version_info.major
        pyver_minor = sys.version_info.minor
        pyver_micro = sys.version_info.micro
        pyver_release = sys.version_info.releaselevel

        # Storage info.
        stor = psutil.disk_usage('/')
        stor_used = convert_size(stor.used)
        stor_total = convert_size(stor.total)
        stor_free = convert_size(stor.total - stor.used)

        # Format hostinfo with OS, CPU, RAM, storage, and other bot info.
        msg = '***{}\'s*** **Home:**\n'.format(
            displayname.name(message_in.server.me))
        msg += '```Host OS       : {}\n'.format(platform_current)
        msg += 'Host Python   : {}.{}.{} {}\n'.format(pyver_major, pyver_minor,
                                                      pyver_micro,
                                                      pyver_release)
        if not isinstance(cpu_threads, int):
            msg += 'Host CPU usage: {}% of {}\n'.format(
                cpu_usage, platform.machine())
        elif cpu_threads > 1:
            msg += 'Host CPU usage: {}% of {} ({} threads)\n'.format(
                cpu_usage, platform.machine(), cpu_threads)
        else:
            msg += 'Host CPU usage: {}% of {} ({} thread)\n'.format(
                cpu_usage, platform.machine(), cpu_threads)
        msg += 'Host RAM      : {} ({}%) of {}\n'.format(
            mem_used, mem_percent, mem_total)
        msg += 'Host storage  : {} ({}%) of {} - {} free\n'.format(
            stor_used, stor.percent, stor_total, stor_free)
        msg += 'Hostname      : {}\n'.format(platform.node())
        msg += 'Host uptime   : {}```'.format(
            readableTime.getReadableTimeBetween(psutil.boot_time(),
                                                time.time()))

        # Return completed message.
        return message.Message(body=msg)

    if message_in.command == 'cpuinfo':
        # Get CPU usage and create string for message.
        cpu_pcts = psutil.cpu_percent(interval=0.1, percpu=True)
        cpu_pct_str = '{}\n'.format(platform.processor())
        cpu_threads = psutil.cpu_count()
        cpu_cores = psutil.cpu_count(logical=False)
        cpu_arch = platform.machine()
        # First, check to see if we can accurately determine the number of physical cores. If not, omit the core count.
        if not cpu_cores:
            if cpu_threads > 1:
                cpu_pct_str += '{} threads of {}'.format(cpu_threads, cpu_arch)
            else:
                cpu_pct_str += '{} thread of {}'.format(cpu_threads, cpu_arch)
        elif cpu_cores > 1:  # Multiple cores.
            cpu_pct_str += '{} threads - {} cores of {}'.format(
                cpu_threads, cpu_cores, cpu_arch)
        else:
            if psutil.cpu_count() > 1:  # Multiple threads, single core.
                cpu_pct_str += '{} threads - {} core of {}'.format(
                    cpu_threads, cpu_cores, cpu_arch)
            else:  # Single thread, single core.
                cpu_pct_str += '{} thread - {} core of {}'.format(
                    cpu_threads, cpu_cores, cpu_arch)

        # Build CPU usage graph.
        cpu_pct_str += '\n\n'
        for index, value in enumerate(cpu_pcts):
            cpu_pct_str += 'CPU {}: {}\n'.format(
                str(index), progressBar.makeBar(cpu_pcts[index]))

        # Return completed message.
        return message.Message(body='```{}```'.format(cpu_pct_str))

    if message_in.command == 'setprefix':
        if settings.owners_check(message_in.author.id):
            prefix = message_in.body.split(' ', 1)[-1]
            settings.prefix_set(message_in.server.id, prefix)
            return message.Message(body='Prefix set to {}'.format(prefix))
        else:
            return message.Message(body='Only my owner can set the prefix!')

    if message_in.command == 'getprefix':
        return message.Message(body='Prefix is {}'.format(
            settings.prefix_get(message_in.server.id)))

    if message_in.command == 'speedtest':
        if settings.owners_check(message_in.author.id):
            speed = pyspeedtest.SpeedTest()
            msg = '**Speed Test Results:**\n'
            msg += '```\n'
            msg += '    Ping: {}\n'.format(round(speed.ping(), 2))
            msg += 'Download: {}MB/s\n'.format(
                round(speed.download() / 1024 / 1024, 2))
            msg += '  Upload: {}MB/s```'.format(
                round(speed.upload() / 1024 / 1024, 2))
            return message.Message(body=msg)
        else:
            return message.Message(
                body='You do not have permisison to run a speedtest.')

    if message_in.command == "addowner":
        if settings.owners_get():
            try:
                if settings.owners_check(message_in.author.id):
                    member = message_in.body.strip()
                    new_member = displayname.memberForName(
                        member, message_in.server)

                    if settings.owners_check(new_member.id):
                        return message.Message(
                            body="User is already an owner.")
                    elif new_member.bot:
                        return message.Message(body="Bots cannot be owners.")
                    else:
                        settings.owners_add(new_member.id)
                        return message.Message(
                            body="Added owner successfully.")
                else:
                    return message.Message(
                        body="You aren't an owner of the bot.")
            except AttributeError:
                return message.Message(body="Invalid user.")
        else:
            settings.owners_add(message_in.author.id)
            return message.Message(
                body=
                "You have successfully claimed yourself as the first owner!")

    if message_in.command == 'owners':
        owners = []
        if not settings.owners_get():
            return message.Message(body='I have no owners')
        for owner in settings.owners_get():
            user = displayname.memberForID(str(owner), message_in.server)
            if user:
                owners.append(str(user.name))
            else:
                owners.append(str(owner))
        owner_list = ', '.join(owners)
        return message.Message(body=owner_list)

    if message_in.command == SERVERSCMD:
        # Get server count.
        servercount = len(Bot.client.servers)

        # Return message.
        if servercount == 1:
            return message.Message(
                "I am a member of **{} server**!".format(servercount))
        else:
            return message.Message(
                "I am a member of **{} servers**!".format(servercount))

    if message_in.command == 'messages':
        # Get server.
        server = message_in.server

        # If the server is null, show error.
        if not server:
            return message.Message("This is not a server. :wink:")

        msg_count = Bot.messagesSinceStart
        msg_count_server = logging.message_count_get(server.id)
        msg = "I've witnessed *{} messages* since I started and *{} messages* overall!"
        return message.Message(msg.format(msg_count, msg_count_server))

    if message_in.command == 'invite':

        class perm_admin:
            value = 8

        return message.Message(
            body=discord.utils.oauth_url(Bot.client.user.id, perm_admin))

    if message_in.command == NICKNAMECMD:
        if message_in.channel.permissions_for(
                message_in.author).manage_nicknames:
            # Change nickname.
            await Bot.client.change_nickname(message_in.server.me,
                                             message_in.body.strip())
            # if message_in.server.me.nick:
            #    return message.Message("My new nickname in this server is **{}**".format(message_in.server.me.nick))
            #else:
            #   return message.Message("My nickname has been removed.")
            return message.Message("My nickname has been changed.")
        else:
            return message.Message(
                "You cannot change nicknames on this server.")

    if message_in.command == 'ping':
        return message.Message(body='PONG! Bot is up!')
Beispiel #3
0
async def onCommand(message_in):
    '''Run plugin commands.'''

    # Get user.
    if message_in.server:
        me = message_in.server.me
    else:
        me = message_in.channel.me

    # Lenny.
    if message_in.command == LENNYCMD:
        # Create message.
        msg = "( ͡° ͜ʖ ͡°)"

        # Append extra on if needed.
        if message_in.body.strip():
            msg += "\n" + message_in.body.strip()

        # Return message.
        return message.Message(msg, delete=True)

    # Shrug.
    if message_in.command == SHRUGCMD:
        # Create message.
        msg = r"¯\_(ツ)_/¯"

        # Append extra on if needed.
        if message_in.body.strip():
            msg += "\n" + message_in.body.strip()

        # Return message.
        return message.Message(msg, delete=True)

    # Tableflip.
    if message_in.command == TABLEFLIPCMD:
        # Create message.
        msg = "(╯°□°)╯︵ ┻━┻"

        # Append extra on if needed.
        if message_in.body.strip():
            msg += "\n" + message_in.body.strip()

        # Return message.
        return message.Message(msg, delete=True)

    # Fart.
    if message_in.command == FARTCMD:
        # Make farts.
        fart_list = [
            "Poot", "Prrrrt", "Thhbbthbbbthhh", "Plllleerrrrffff", "Toot",
            "Blaaaaahnk", "Squerk"
        ]
        randnum = random.randint(0, len(fart_list) - 1)
        msg = '{}'.format(fart_list[randnum])

        # Append extra on if needed.
        if message_in.body.strip():
            msg += "\n" + message_in.body.strip()

        # Return fart message.
        return message.Message(msg, delete=True)

    if message_in.command == BETACMD:
        return message.Message(body='It looks like something went wrong',
                               file="beta.jpg")

    if message_in.command == EATCMD:
        author = displayname.name(message_in.author)
        member = message_in.body.strip()
        if message_in.server:
            mem_check = displayname.memberForName(member,
                                                  message_in.server.members,
                                                  me)
        else:
            mem_check = displayname.memberForName(
                member, message_in.channel.recipients, me)

        # Check if we're eating nothing
        if member == "":
            msg_list = [
                'you sit quietly and eat *nothing*...',
                'you\'re *sure* there was something to eat, so you just chew on nothingness...',
                'there comes a time when you need to realize that you\'re just chewing nothing for the sake of chewing.  That time is now.'
            ]
        elif mem_check:
            # We're eating a member - let's do a bot-check
            if mem_check.id == me.id:
                # It's me!
                msg_list = [
                    'you try to eat *me* - but unfortunately, I saw it coming - your jaw hangs open as I deftly sidestep.',
                    'your mouth hangs open for a brief second before you realize that *I\'m* eating *you*.',
                    'I\'m a bot.  You can\'t eat me.',
                    'your jaw clamps down on... wait... on nothing, because I\'m *digital!*.',
                    'what kind of bot would I be if I let you eat me?'
                ]

            elif mem_check.id == message_in.author.id:
                # We're eating...  ourselves?
                msg_list = [
                    'you clamp down on your own forearm - not surprisingly, it hurts.',
                    'you place a finger into your mouth, but *just can\'t* force yourself to bite down.',
                    'you happily munch away, but can now only wave with your left hand.',
                    'wait - you\'re not a sandwich!',
                    'you might not be the smartest...'
                ]

            else:
                mem_name = displayname.name(mem_check)
                msg_list = [
                    'you unhinge your jaw and consume *{}* in one bite.'.
                    format(mem_name),
                    'you try to eat *{}*, but you just can\'t quite do it - you spit them out, the taste of failure hanging in your mouth...'
                    .format(mem_name),
                    'you take a quick bite out of *{}*.  They probably didn\'t even notice.'
                    .format(mem_name),
                    'you sink your teeth into *{}\'s* shoulder - they turn to face you, eyes wide as you try your best to scurry away and hide.'
                    .format(mem_name),
                    'your jaw clamps down on *{}* - a satisfying *crunch* emanates as you finish your newest meal.'
                    .format(mem_name)
                ]
        else:
            msg_list = [
                'you take a big chunk out of *{}*. *Delicious.*'.format(
                    member),
                'your teeth sink into *{}* - it tastes satisfying.'.format(
                    member),
                'you rip hungrily into *{}*, tearing it to bits!'.format(
                    member),
                'you just can\'t bring yourself to eat *{}* - so you just hold it for awhile...'
                .format(member),
                'you attempt to bite into *{}*, but you\'re clumsier than you remember - and fail...'
                .format(member)
            ]

        randnum = random.randint(0, len(msg_list) - 1)
        return message.Message('*{}*, {}'.format(author, msg_list[randnum]))
Beispiel #4
0
async def onCommand(message_in):
    # Initialize Database

    database.init()
    OffsetTable = Table('offsets', TableTypes.pGlobal)

    # Get user.
    if message_in.server:
        me = message_in.server.me
    else:
        me = message_in.channel.me

    if message_in.command == 'setoffset':
        # Normalize offset

        offsetstr = message_in.body.strip()

        if offsetstr == "":
            return message.Message(
                'Incorrect Offset format. Has to be in +/-HH:MM!')

        if offsetstr[0] == '+':
            prefix = '+'
        else:
            prefix = ''

        try:
            hours, minutes = map(int, offsetstr.split(':'))
        except Exception:
            try:
                hours = int(offsetstr)
                minutes = 0
            except Exception:
                return message.Message(
                    'Incorrect Offset format. Has to be in +/-HH:MM!')
        normalizedoffset = '{}{}:{}'.format(prefix, hours, minutes)

        # Set Offset in Database

        # Try to update Offset if it exists
        existingOffset = Table.search(OffsetTable, 'id',
                                      '{}'.format(message_in.author.id))

        if existingOffset != None:
            existingOffset.edit(
                dict(id=message_in.author.id, offset=normalizedoffset))
        else:
            # Create new entry
            Table.insert(
                OffsetTable,
                dict(id=message_in.author.id, offset=normalizedoffset))
            # Get time right now

        # Return time along with offset
        timeutc = datetime.datetime.utcnow()
        # Apply offset

        if hours > 0:
            # Apply positive offset
            timedelta = datetime.timedelta(hours=hours, minutes=minutes)
            newTime = timeutc + timedelta
        elif hours < 0:
            # Apply negative offset
            timedelta = datetime.timedelta(hours=(-1 * hours),
                                           minutes=(-1 * minutes))
            newTime = timeutc - timedelta
        else:
            # No offset
            newTime = timeutc

        return message.Message(
            'Your UTC offset has been set to *{}*, for which the time is {}.'.
            format(normalizedoffset, newTime.strftime("%I:%M %p")))

    if message_in.command == 'time':
        memberOrOffset = message_in.body.strip()

        # Check whose time we need (or if we got an offset)

        if not memberOrOffset:
            member = message_in.author
        else:
            # Try to get a user first
            member = displayname.memberForName(memberOrOffset,
                                               message_in.server, me)

        if member:
            existingOffset = Table.search(OffsetTable, 'id',
                                          '{}'.format(member.id))

            # Check if entry exists
            try:
                offset = existingOffset.data[1]
            except Exception:
                return message.Message(
                    '*{}* didn\'t set an offset. Set an offset with `!setoffset (offset)`.'
                    .format(displayname.name(member)))
        else:
            # Assume input is offset
            offset = memberOrOffset

        offset = offset.replace('+', '')

        # Split time string by : and get hour/minute values
        try:
            hours, minutes = map(int, offset.split(':'))
        except Exception:
            try:
                hours = int(offset)
                minutes = 0
            except Exception:
                return message.Message(
                    'Invalid offset format. Has to be in +/-HH:MM!')

        # Get time right now
        timeutc = datetime.datetime.utcnow()
        # Apply offset

        if hours > 0:
            # Apply positive offset
            offsetmsg = 'UTC+{}'.format(offset)
            timedelta = datetime.timedelta(hours=hours, minutes=minutes)
            newTime = timeutc + timedelta
        elif hours < 0:
            # Apply negative offset
            offsetmsg = 'UTC{}'.format(offset)
            timedelta = datetime.timedelta(hours=(-1 * hours),
                                           minutes=(-1 * minutes))
            newTime = timeutc - timedelta
        else:
            # No offset
            newTime = t

        if member:
            msg = '{}; where *{}* is, it\'s currently *{}*'.format(
                offsetmsg, displayname.name(member),
                newTime.strftime("%I:%M %p"))
        else:
            msg = '{} is currently *{}*'.format(offsetmsg,
                                                newTime.strftime("%I:%M %p"))
        # Say message
        return message.Message(msg)
Beispiel #5
0
async def on_member_unban(server, user):
    # Announce unban.
    await Bot.client.send_message(server,
                                  content=displayname.name(user) +
                                  " got unbanned from **" + server.name +
                                  "**.")
Beispiel #6
0
async def on_member_ban(member):
    # Announce ban.
    await Bot.client.send_message(member.server,
                                  content=displayname.name(member) +
                                  " got banned from **" + member.server.name +
                                  "**.")
Beispiel #7
0
async def on_member_remove(member):
    # Say goodbye to user.
    await Bot.client.send_message(member.server,
                                  content="Goodbye *" +
                                  displayname.name(member) + "*, **" +
                                  member.server.name + "** will miss you!")