コード例 #1
0
    async def on_message(self, message, **kwargs):
        assert isinstance(message, Message)
        client = self.client

        prefix = kwargs.get("prefix")

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*args):
            for a in args:
                if message.content.startswith(a):
                    return True

            return False

        if startswith(prefix + "tf"):
            if not self.tf.success:
                await client.send_message(
                    message.channel,
                    "This command is currently unavailable. Apologies.")
                return

            item_name = message.content[len(prefix + "tf "):]

            item = self.tf.get_item_by_name(str(item_name))

            if not item:
                await client.send_message(
                    message.channel,
                    "An item with that name *does not exist*.".format(
                        item_name))
                self.stats.add(WRONG_ARG)
                return

            ls = []
            for qu in item.get_all_qualities():
                down = qu.get(list(qu.keys())[0])
                dt = "__**{}**__: `{} {}`".format(
                    get_quality_name(list(qu.keys())[0]),
                    down.get("price").get("value"),
                    "ref" if down.get("price").get("currency") == "metal" else
                    down.get("price").get("currency"))
                ls.append(dt)

            det = """**{}** *(on bp.tf)*\n\n{}""".format(
                item.name, "\n".join(ls))
            await client.send_message(message.channel, det)
コード例 #2
0
    async def on_message(self, message, **kwargs):
        assert isinstance(message, Message)
        assert isinstance(self.stats, NanoStats)

        prefix = kwargs.get("prefix")
        client = self.client

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        # Loop over simple commands
        for trigger, response in simple_commands.items():
            if message.content.startswith(trigger.replace("_", prefix)):
                await client.send_message(message.channel, response)
                self.stats.add(MESSAGE)

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        # Other commands
        if startswith(prefix + "kappa"):
            await client.send_file(message.channel,
                                   "data/images/kappasmall.png")

            self.stats.add(IMAGE_SENT)

        elif startswith(prefix + "cat"):
            await client.send_file(message.channel, "data/images/cattypo.gif")

            self.stats.add(IMAGE_SENT)

        elif startswith(prefix + "randomgif"):
            random_gif = self.gif.screensaver().media_url
            await client.send_message(message.channel, str(random_gif))

            self.stats.add(IMAGE_SENT)

        elif startswith(prefix + "rip"):
            if len(message.mentions) == 1:
                ripperoni = message.mentions[0].mention

            elif len(message.mentions) == 0:
                ripperoni = message.content[len(prefix + "rip "):]

            else:
                ripperoni = ""

            ripperoni = self.nano.get_plugin("commons").get(
                "instance").at_everyone_filter(ripperoni, message.author,
                                               message.server)

            prays = self.stats.get_amount(PRAYER)
            await client.send_message(
                message.channel,
                "Rest in pepperoni{}{}.\n`{}` *prayers said so far*...".format(
                    ", " if ripperoni else "", ripperoni, prays))

            self.stats.add(PRAYER)
コード例 #3
0
ファイル: wiki.py プロジェクト: tyblackbird/Nano
    async def on_message(self, message, **kwargs):
        assert isinstance(message, Message)

        prefix = kwargs.get("prefix")
        client = self.client

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        if startswith(prefix + "wiki", prefix + "define"):
            if startswith(prefix + "wiki"):
                search = str(message.content)[len(prefix + "wiki "):]

            elif startswith(prefix + "define"):
                search = str(message.content)[len(prefix + "define "):]

            else:
                return

            if not search or search == " ":  # If empty args
                await client.send_message(
                    message.channel,
                    "Please include a word you want to define.")
                return

            try:
                answer = wikipedia.summary(search,
                                           sentences=parser.get(
                                               "wiki", "sentences"),
                                           auto_suggest=True)
                await client.send_message(
                    message.channel, "**{} :** \n".format(search) + answer)

            except wikipedia.exceptions.PageError:
                await client.send_message(message.channel,
                                          "No definitions found.")

            except wikipedia.exceptions.DisambiguationError:
                await client.send_message(
                    message.channel,
                    "Got multiple definitions of {}, please be more specific (somehow)."
                    .format(search))

        elif startswith(prefix + "urban"):
            search = str(message.content)[len(prefix + "urban "):]
            define = requests.get(
                "http://www.urbandictionary.com/define.php?term={}".format(
                    search))
            answer = BeautifulSoup(define.content,
                                   "html.parser").find("div",
                                                       attrs={
                                                           "class": "meaning"
                                                       }).text

            # Check if there are no definitions
            if str(answer).startswith("\nThere aren't any"):
                await client.send_message(message.channel,
                                          "No definition found")

            else:
                await client.send_message(
                    message.channel,
                    "**" + message.content[7:] + "** *:*" + answer)
コード例 #4
0
    async def on_message(self, message, **kwargs):
        # Things
        assert isinstance(message, Message)
        client = self.client

        # Prefixes
        prefix = kwargs.get("prefix")

        # Custom commands registered for the server
        server_commands = self.handler.get_custom_commands(
            message.channel.server)

        # Checks for server specific commands
        for command in server_commands:
            # UPDATE 2.1.4: not .startswith anymore!
            if str(message.content) == command:
                # Maybe same replacement logic in the future update?
                # /todo implement advanced replacement logic
                await client.send_message(message.channel,
                                          server_commands.get(command))
                self.stats.add(MESSAGE)

                return

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        # A shortcut
        def startswith(*msg):
            for b in msg:
                if message.content.startswith(b):
                    return True

            return False

        # COMMANDS

        # !hello
        if startswith(prefix + "hello"):
            if len(message.mentions) >= 1:
                await client.send_message(message.channel,
                                          "Hi " + message.mentions[0].mention)
            elif len(message.mentions) == 0:
                await client.send_message(message.channel,
                                          "Hi " + message.author.mention)

        # !uptime
        elif startswith(prefix + "uptime"):
            d = datetime(
                1, 1, 1) + timedelta(seconds=time.time() - self.nano.boot_time)
            uptime = "I have been tirelessly answering people for\n" \
                     "**{} days, {} hours, {} minutes and {} seconds!**".format(d.day - 1, d.hour, d.minute, d.second)

            await client.send_message(message.channel, uptime)

        # !nano, nano.info
        elif startswith((prefix + "nano", "nano.info")):
            await client.send_message(
                message.channel,
                nano_info.replace("<version>", self.nano.version))

        # !github
        elif startswith(prefix + "github"):
            await client.send_message(message.channel, nano_github)

        # !roll
        elif startswith(prefix + "roll"):
            if startswith(prefix + "roll"):
                num = message.content[len(prefix + "roll "):]
            else:
                num = message.content[len(prefix + "rng "):]

            if not str(num).isnumeric():
                await client.send_message(message.channel, "Not a number.")
                return

            rn = randint(0, int(num))
            result = "**{}**. {}".format(rn,
                                         "**GG**" if rn == int(num) else "")

            await client.send_message(
                message.channel,
                "{}, you rolled {}".format(message.author.mention, result))

        # !dice
        elif startswith(prefix + "dice"):
            rn = randint(1, 6)
            await client.send_message(
                message.channel,
                "{}, the dice shows... **{}**".format(message.author.mention,
                                                      rn))

        # !ping
        elif startswith(prefix + "ping"):
            base_time = datetime.now() - message.timestamp
            base_taken = int(divmod(base_time.total_seconds(), 60)[1] * 100)

            a = await client.send_message(message.channel, PING_MSG)
            self.pings[a.id] = [
                time.monotonic(), message.channel.id, base_taken
            ]

            await client.add_reaction(a, "\U0001F44D")
            self.stats.add(PING)

        # !decide
        elif startswith(prefix + "decide"):
            cut = str(message.content)[len(prefix + "decide "):]

            if len(cut.split("|")) == 1:
                await client.send_message(
                    message.channel,
                    "Guess what? It's " + str(cut) + ". **ba dum tss.**")

            else:
                split = cut.split("|")
                rn = randint(0, len(split) - 1)
                await client.send_message(
                    message.channel,
                    "**drum roll**... I have decided: {}".format(split[rn]))

        # !8ball
        elif startswith(prefix + "8ball"):
            answer = eight_ball[randint(0, len(eight_ball) - 1)]
            await client.send_message(
                message.channel, "The magic 8ball says: *{}*.".format(answer))

        # !quote
        elif startswith(prefix + "quote"):
            chosen = str(quotes[randint(0, len(quotes) - 1)])

            # Find the part where the author is mentioned
            place = chosen.rfind("–")
            await client.send_message(
                message.channel, "{}\n- __{}__".format(chosen[:place],
                                                       chosen[place + 1:]))

        # !invite
        elif startswith(prefix + "invite", "nano.invite"):
            application = await client.application_info()

            # Most of the permissions that Nano uses
            perms = "1543765079"
            url = "<https://discordapp.com/oauth2/" \
                  "authorize?client_id={}&scope=bot&permissions={}>".format(application.id, perms)

            await client.send_message(message.channel,
                                      invite.replace("<link>", url))

        # !avatar
        elif startswith(prefix + "avatar"):
            # Selects the proper user
            if len(message.mentions) == 0:
                name = str(str(message.content)[len(prefix + "avatar "):])
                member = utils.find(lambda m: m.name == name,
                                    message.channel.server.members)
            else:
                member = message.mentions[0]

            if not member:
                member = message.author

            url = member.avatar_url

            if url:
                await client.send_message(
                    message.channel,
                    "**{}**'s avatar: {}".format(member.name, url))
            else:
                await client.send_message(
                    message.channel,
                    "**{}** does not have an avatar. {}".format(
                        member.name, StandardEmoji.EXPRESSIONLESS))

        # !say
        elif startswith(prefix + "say"):
            if not self.handler.is_mod(message.author, message.server):
                await client.send_message(message.channel,
                                          StandardEmoji.WARNING + not_mod)
                return "return"

            content = str(message.content[len(prefix + "say "):]).strip(" ")

            if len(message.channel_mentions) != 0:
                channel = message.channel_mentions[0]
                content = content.replace(channel.mention, "").strip(" ")
            else:
                channel = message.channel

            content = self.at_everyone_filter(content, message.author,
                                              message.server)

            await client.send_message(channel, content)

            await self.log_say_command(message, content, prefix)

        # !selfrole [role name]
        elif startswith(prefix + "selfrole"):
            role = str(message.content[len(prefix + "selfrole"):]).strip(" ")
            s_role = self.handler.get_selfrole(message.server.id)

            if is_disabled(s_role):
                await client.send_message(
                    message.channel, StandardEmoji.WARNING +
                    " This feature is not enabled on this server.")
            elif (role != s_role) and len(message.role_mentions) == 0:
                await client.send_message(
                    message.channel, StandardEmoji.CROSS + " Wrong role name.")
            else:
                if len(message.role_mentions) != 0:
                    role = message.role_mentions[0]
                else:
                    role = utils.find(lambda r: r.name == s_role,
                                      message.server.roles)

                if not role:
                    return

                # If user already has the role, remove it
                if role in message.author.roles:
                    await client.remove_roles(message.author, role)
                    await client.send_message(
                        message.channel, StandardEmoji.PERFECT +
                        " Removed **{}** from your list of roles.".format(
                            s_role))
                else:
                    await client.add_roles(message.author, role)
                    await client.send_message(message.channel,
                                              StandardEmoji.PERFECT)
コード例 #5
0
ファイル: voting.py プロジェクト: tyblackbird/Nano
    async def on_message(self, message, **kwargs):
        assert isinstance(message, Message)
        assert isinstance(self.handler, ServerHandler)
        client = self.client
        prefix = kwargs.get("prefix")

        if not is_valid_command(message.content, valid_commands, prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*args):
            for a in args:
                if message.content.startswith(a):
                    return True

            return False

        if startswith(prefix + "vote start"):
            if not self.handler.can_use_restricted_commands(message.author, message.channel.server):
                await client.send_message(message.content, "You are not permitted to use this command.")

                self.stats.add(WRONG_PERMS)
                return

            if self.vote.in_progress(message.channel.server):
                await client.send_message(message.channel, "A vote is already in progress.")
                return

            vote_content = message.content[len(prefix + "vote start "):]

            self.vote.start_vote(message.author.name, message.channel.server, vote_content)

            ch = []
            n = 1
            for this in self.vote.get_content(message.channel.server):
                ch.append("{}. {}".format(n, this))
                n += 1

            ch = "\n".join(ch).strip("\n")

            await client.send_message(message.channel, "**{}**\n"
                                                       "```{}```".format(self.vote.get_vote_header(message.channel.server), ch))

        elif startswith(prefix + "vote end"):
            if not self.handler.can_use_restricted_commands(message.author, message.channel.server):
                await client.send_message(message.channel, "You are not permitted to use this command.")

                self.stats.add(WRONG_PERMS)
                return

            if not self.vote.in_progress(message.channel.server):
                await client.send_message(message.channel, "There is no vote in progress.")
                return

            votes = self.vote.get_votes(message.channel.server)
            header = self.vote.get_vote_header(message.channel.server)
            content = self.vote.get_content(message.channel.server)

            # Actually end the voting
            self.vote.end_voting(message.channel.server)

            # Put results together
            cn = ["{} - `{} votes`".format(a, votes[a]) for a in content]

            combined = "Vote ended:\n__{}__\n\n{}".format(header, "\n".join(cn))

            await client.send_message(message.channel, combined)

        elif startswith(prefix + "vote"):
            # Get the choice, but tell the author if he/she didnt supply a number
            try:
                choice = int(message.content[len(prefix + "vote "):])
            except ValueError:
                m = await client.send_message(message.channel, "Vote argument must be a number.")
                await asyncio.sleep(1.5)
                await client.delete_message(m)
                return

            if (not choice) or (not self.vote.in_progress(message.channel.server)):
                return

            res = self.vote.plus_one(choice, message.author.id, message.channel.server)

            if res == -1:
                msg = await client.send_message(message.channel, "Cheater :smile:")

                await asyncio.sleep(1)
                await client.delete_message(msg)

            elif res:
                msg = await client.send_message(message.channel, ":ok_hand:")

                await asyncio.sleep(1.5)
                await client.delete_message(msg)

            self.stats.add(VOTE)
コード例 #6
0
ファイル: help.py プロジェクト: dilip-krishnan/Nano
    async def on_message(self, message, *_, **kwargs):
        assert isinstance(message, Message)
        client = self.client

        prefix = kwargs.get("prefix")

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        # A shortcut
        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        # !help and @Nanos
        if message.content.strip(" ") == (prefix + "help"):
            await client.send_message(message.channel,
                                      help_nano.replace(">", prefix))

            self.stats.add(HELP)

        # @Nano help
        elif self.client.user in message.mentions:
            un_mentioned = str(message.content[21:])
            if un_mentioned == "" or un_mentioned == " ":
                await client.send_message(message.channel,
                                          help_nano.replace(">", prefix))

            self.stats.add(HELP)

        # !cmds or !commands
        elif startswith(prefix + "cmds", prefix + "commands"):
            await client.send_message(
                message.channel,
                "Commands and their explanations can be found here: "
                "http://nanobot.pw/commands.html")

            self.stats.add(HELP)

        # !help simple
        elif startswith(prefix + "help simple"):
            await client.send_message(message.channel,
                                      help_simple.replace("_", prefix))

            self.stats.add(HELP)

        # !help [command]
        elif startswith(prefix + "help"):
            search = str(message.content)[len(prefix + "help "):]

            self.stats.add(HELP)

            def get_command_info(cmd):
                # Normal commands
                cmd1 = self.commands.get(
                    str(cmd.replace(prefix, "_").strip(" ")))
                if cmd1 is not None:
                    cmd_name = cmd.replace(prefix, "")

                    description = cmd1.get("desc")

                    use = cmd1.get("use")
                    if use:
                        use = cmd1.get("use").replace(
                            "[command]", prefix + cmd_name
                            if not cmd_name.startswith("nano.") else cmd_name)

                    alias = cmd1.get("alias")
                    if alias:
                        alias = cmd1.get("alias").replace("_", prefix)

                    emb = Embed(colour=Colour.blue())

                    emb.add_field(name="Description", value=description)

                    if use:
                        emb.add_field(name="Use", value=use, inline=False)
                    if alias:
                        emb.add_field(name="Aliases",
                                      value=alias,
                                      inline=False)

                    self.stats.add(HELP)
                    return "**{}**".format(cmd_name), emb

                if not cmd1:
                    self.stats.add(WRONG_ARG)
                    return None, None

            # Allows for !help ping AND !help !ping
            if search.startswith(prefix) or search.startswith("nano."):
                name, embed = get_command_info(search)

                if name:
                    await client.send_message(message.channel,
                                              name,
                                              embed=embed)

                else:
                    await client.send_message(
                        message.channel, "Command could not be found.\n"
                        "**(Use: `>help [command]`)**".replace(">", prefix))

            else:
                name, embed = get_command_info(prefix + search)

                if name:
                    await client.send_message(message.channel,
                                              name,
                                              embed=embed)

                else:
                    await client.send_message(
                        message.channel, "Command could not be found.\n"
                        "**(Use: `>help [command]`)**".replace(">", prefix))

        # !notifydev
        elif startswith(prefix + "report", prefix + "suggest"):
            if startswith(prefix + "report"):
                report = message.content[len(prefix + "report "):]
                typ = "Report"

            elif startswith(prefix + "suggest"):
                report = message.content[len(prefix + "suggest "):]
                typ = "Suggestion"

            else:
                return

            # Disallow empty reports
            if not report.strip(" "):
                await client.send_message(
                    message.channel, "You cannot submit an empty report.")
                return

            # Cooldown implementation
            if not self.last_times.get(message.author.id):
                self.last_times[message.author.id] = time.time()
            else:
                # 300 seconds --> 5 minute cooldown
                if (time.time() - self.last_times[message.author.id]) < 300:
                    await client.send_message(
                        message.channel,
                        "You are being rate limited. Try again in 5 minutes.")
                    return

                else:
                    self.last_times[message.author.id] = time.time()

            # Find Nano Lounge (or whatever is in settings.ini under Dev)
            dev_server = utils.get(client.servers, id=self.nano.dev_server)
            # Timestamp
            ts = datetime.now().strftime("%d.%m.%Y %H:%M:%S")

            # 'Compiled' report
            comp = "{} from {} ({}):\n```{}```\n**__Timestamp__**: `{}`\n**__Server__**: `{}` ({} members)\n" \
                   "**__Server Owner__**: {}".format(typ, message.author.name, message.author.id, report, ts,
                                                     message.channel.server.name, message.channel.server.member_count,
                                                     "Yes" if message.author.id == message.channel.server.owner.id
                                                     else message.channel.server.owner.id)

            # Saves the submission
            await save_submission(
                comp.replace(
                    message.author.mention,
                    "{} ({})\n".format(message.author.name,
                                       message.author.id)))

            await client.send_message(dev_server.owner, comp)
            await client.send_message(
                message.channel, "**Thank you** for your *{}*.".format(
                    "submission" if typ == "Report" else "suggestion"))

        # !bug
        elif startswith(prefix + "bug"):
            await client.send_message(message.channel,
                                      nano_bug.replace("_", prefix))
コード例 #7
0
    async def on_message(self, message, **kwargs):
        # Things
        assert isinstance(message, Message)
        client = self.client

        # Prefixes
        prefix = kwargs.get("prefix")

        # Custom commands registered for the server
        server_commands = self.handler.get_custom_commands(
            message.channel.server)

        # Checks for server specific commands
        for command in server_commands:
            if str(message.content).startswith(command):
                # Maybe same replacement logic in the future update?
                # /todo implement advanced replacement logic
                await client.send_message(message.channel,
                                          server_commands.get(command))
                self.stats.add(MESSAGE)

                return

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        # A shortcut
        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        # COMMANDS

        # !hello
        if startswith(prefix + "hello"):
            if len(message.mentions) >= 1:
                await client.send_message(message.channel,
                                          "Hi " + message.mentions[0].mention)
            elif len(message.mentions) == 0:
                await client.send_message(message.channel,
                                          "Hi " + message.author.mention)

        # !uptime
        elif startswith(prefix + "uptime"):
            d = datetime(
                1, 1, 1) + timedelta(seconds=time.time() - self.nano.boot_time)
            uptime = "I have been tirelessly answering people for\n" \
                     "**{} days, {} hours, {} minutes and {} seconds!**".format(d.day - 1, d.hour, d.minute, d.second)

            await client.send_message(message.channel, uptime)

        # !nano, nano.info
        elif startswith((prefix + "nano", "nano.info")):
            await client.send_message(
                message.channel,
                nano_info.replace("<version>", self.nano.version))

        # !github
        elif startswith(prefix + "github"):
            await client.send_message(message.channel, nano_github)

        # !roll
        elif startswith((prefix + "roll", prefix + "rng")):
            if startswith(prefix + "roll"):
                num = message.content[len(prefix + "roll "):]
            else:
                num = message.content[len(prefix + "rng "):]

            if not str(num).isnumeric():
                await client.send_message(message.channel, "Not a number.")
                return

            rn = randint(0, int(num))
            result = "**{}**. {}".format(rn,
                                         "**GG**" if rn == int(num) else "")

            await client.send_message(
                message.channel,
                "{}, you rolled {}".format(message.author.mention, result))

        # !dice
        elif startswith(prefix + "dice"):
            rn = randint(1, 6)
            await client.send_message(
                message.channel,
                "{}, the dice shows... **{}**".format(message.author.mention,
                                                      rn))

        # !ping
        elif startswith(prefix + "ping"):
            await client.send_message(message.channel, "**Pong!**")

            self.stats.add(PING)

        # !decide
        elif startswith(prefix + "decide"):
            cut = str(message.content)[len(prefix + "decide "):]

            if len(cut.split("|")) == 1:
                await client.send_message(
                    message.channel,
                    "Guess what? It's " + str(cut) + ". **ba dum tss.**")

            else:
                split = cut.split("|")
                rn = randint(0, len(split) - 1)
                await client.send_message(
                    message.channel,
                    "**drum roll**... I have decided: {}".format(split[rn]))

        # !8ball
        elif startswith(prefix + "8ball"):
            answer = eight_ball[randint(0, len(eight_ball) - 1)]
            await client.send_message(
                message.channel, "The magic 8ball says: *{}*.".format(answer))

        # !quote
        elif startswith(prefix + "quote"):
            chosen = str(quotes[randint(0, len(quotes) - 1)])

            # Find the part where the author is mentioned
            place = chosen.rfind("–")
            await client.send_message(
                message.channel, "{}\n__{}__".format(chosen[:place],
                                                     chosen[place:]))

        # !invite
        elif startswith(prefix + "invite", "nano.invite"):
            application = await client.application_info()

            # Most of the permissions that Nano uses
            perms = str("0x510917638")
            url = "https://discordapp.com/oauth2/" \
                  "authorize?client_id={}&scope=bot&permissions={}".format(application.id, perms)

            await client.send_message(message.channel,
                                      invite.replace("<link>", url))

        # !avatar
        elif startswith(prefix + "avatar"):
            # Selects the proper user
            if len(message.mentions) == 0:
                name = str(str(message.content)[len(prefix + "avatar "):])
                member = utils.find(lambda m: m.name == name,
                                    message.channel.server.members)
            else:
                member = message.mentions[0]

            if not member:
                member = message.author

            url = member.avatar_url

            if url:
                await client.send_message(
                    message.channel,
                    "**{}**'s avatar: {}".format(member.name, url))
            else:
                await client.send_message(
                    message.channel,
                    "**{}** does not have an avatar. :expressionless:".format(
                        member.name))

        # !say
        elif startswith(prefix + "say"):
            content = message.content[len(prefix + "say "):]

            content = self.at_everyone_filter(content, message.author,
                                              message.server)

            await client.send_message(message.channel, content)
コード例 #8
0
ファイル: developer.py プロジェクト: dilip-krishnan/Nano
    async def on_message(self, message, **kwargs):
        if not is_valid_command(message.content, valid_commands, prefix=kwargs.get("prefix")):
            return
        else:
            self.stats.add(MESSAGE)

        assert isinstance(message, Message)
        client = self.client

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        # Global owner filter
        assert isinstance(self.handler, (RedisServerHandler, LegacyServerHandler))

        if not self.handler.is_bot_owner(message.author.id):
            await client.send_message(message.channel, StandardEmoji.WARNING + "You are not permitted to use this feature. (must be bot owner)")
            return


        # nano.dev.get_servers
        if startswith("nano.dev.get_servers"):
            # fixme message is still too long
            servers = ["{} ({} u) - `{}`".format(srv.name, srv.member_count, srv.id) for srv in client.servers]

            final = ["\n".join(a) for a in [servers[i:i+1000] for i in range(0, len(servers), 1000)]]

            for chunk in final:
                await client.send_message(message.channel, chunk)

        # nano.dev.server_info [id]
        elif startswith("nano.dev.server_info"):
            s_id = message.content[len("nano.dev.server_info "):]

            srv = utils.find(lambda s: s.id == s_id, client.servers)

            if not srv:
                await client.send_message(message.channel, "Error. " + StandardEmoji.CROSS)
                return

            nano_data = self.handler.get_server_data(srv)
            to_send = "{}\n```css\nMember count: {}\nChannels: {}\nOwner: {}```\n" \
                      "*Settings*: ```{}```".format(srv.name, srv.member_count, ",".join([ch.name for ch in srv.channels]), srv.owner.name, nano_data)

            await client.send_message(message.channel, to_send)

        # nano.dev.test_error
        elif startswith("nano.dev.test_exception"):
            int("abcdef")

        # nano.dev.embed_test
        elif startswith("nano.dev.embed_test"):
            emb = Embed(title="Stats", colour=Colour.darker_grey())
            emb.add_field(name="Messages Sent", value="sample messages")

            await client.send_message(message.channel, "Stats", embed=emb)

        # nano.dev.backup
        elif startswith("nano.dev.backup"):
            self.backup.manual_backup()
            await client.send_message(message.channel, "Backup completed " + StandardEmoji.PERFECT)

        # nano.dev.leave_server
        elif startswith("nano.dev.leave_server"):
            sid = int(message.content[len("nano.dev.leave_server "):])

            srv = utils.find(lambda a: a.id == sid, client.servers)
            await client.leave_server(srv)
            await client.send_message(message.channel, "Left {}".format(srv.name))

        # nano.dev.tf.reload
        elif startswith("nano.dev.tf.clean"):
            self.nano.get_plugin("tf2").get("instance").tf.request()

            await client.send_message(message.channel, "Re-downloaded data...")

        # nano.dev.plugin.reload
        elif startswith("nano.dev.plugin.reload"):
            name = str(message.content)[len("nano.dev.plugin.reload "):]

            v_old = self.nano.get_plugin(name).get("plugin").NanoPlugin.version
            s = await self.nano.reload_plugin(name)
            v_new = self.nano.get_plugin(name).get("plugin").NanoPlugin.version

            if s:
                await client.send_message(message.channel, "Successfully reloaded **{}**\n"
                                                           "From version *{}* to *{}*.".format(name, v_old, v_new))
            else:
                await client.send_message(message.channel, "Something went wrong, check the logs.")

        # nano.dev.servers.clean
        elif startswith("nano.dev.servers.clean"):
            self.handler.delete_server_by_list([s.id for s in self.client.servers])

        elif startswith("nano.dev.server.leave"):
            s_id = int(str(message.content)[len("nano.dev.server.leave "):])
            serv = Object(id=s_id)

            if not serv:
                await client.send_messsage(message.channel, "Could not leave server: does not exist")
            else:
                await client.leave_server(serv)
                await client.send_message(message.channel, StandardEmoji.PERFECT + " Left {}".format(serv.id))

        # nano.reload
        elif startswith("nano.reload"):
            self.handler.reload()

            await client.send_message(message.channel, "Refreshed server data {} {}".format(StandardEmoji.MUSCLE, StandardEmoji.SMILE))

        # nano.restart
        elif startswith("nano.restart"):
            m = await client.send_message(message.channel, "Restarting...")

            await client.send_message(message.channel, "**DED**")
            await client.delete_message(m)

            await client.logout()

            self.mode = "restart"
            return "shutdown"

        # nano.kill
        elif startswith("nano.kill"):
            await client.send_message(message.channel, "**DED**")

            await client.logout()

            self.mode = "exit"
            return "shutdown"

        # nano.playing
        elif startswith("nano.playing"):
            status = message.content[len("nano.playing "):]

            await client.change_presence(game=Game(name=str(status)))

            await client.send_message(message.channel, "Status changed " + StandardEmoji.THUMBS_UP)
コード例 #9
0
    async def on_message(self, message, **kwargs):
        assert isinstance(message, Message)

        client = self.client
        prefix = kwargs.get("prefix")

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        if startswith(prefix + "steam"):
            if startswith(prefix + "steam friends "):
                uid = str(message.content)[len(prefix + "steam friends "):]

                # Friend search
                await client.send_typing(message.channel)
                try:
                    username, friends = self.steam.get_friends(uid)
                except ValueError:
                    await client.send_message(message.channel, NOT_WHOLE_URL)
                    return
                except (steamapi.errors.APIFailure,
                        steamapi.errors.APIException):
                    await client.send_message(
                        message.channel,
                        "Something went wrong. User could have a private profile. "
                        + StandardEmoji.CRY)
                    reraise()
                    return

                if not username:
                    await client.send_message(message.channel,
                                              "User **does not exist**.")
                    self.stats.add(WRONG_ARG)
                    return

                if not friends:
                    await client.send_message(
                        message.channel,
                        "Could not fetch friends (probably because the user has a private profile."
                    )
                    self.stats.add(WRONG_ARG)
                    return

                friends = ["`" + friend + "`" for friend in friends]

                await client.send_message(
                    message.channel, "*User:* **{}**\n\n*Friends:* {}".format(
                        username, ", ".join(friends)))

            elif startswith(prefix + "steam games"):
                uid = str(message.content)[len(prefix + "steam games "):]

                # Game search
                await client.send_typing(message.channel)

                try:
                    username, games = self.steam.get_owned_games(uid)
                except ValueError:
                    await client.send_message(message.channel, NOT_WHOLE_URL)
                    return
                except (steamapi.errors.APIFailure,
                        steamapi.errors.APIException):
                    await client.send_message(
                        message.channel,
                        "Something went wrong. User could have a private profile. "
                        + StandardEmoji.CRY)
                    reraise()
                    return

                if not username:
                    await client.send_message(message.channel,
                                              "User **does not exist**.")
                    self.stats.add(WRONG_ARG)
                    return

                if not games:
                    await client.send_message(
                        message.channel,
                        "Could not fetch games (probably because the user has a private profile."
                    )
                    self.stats.add(WRONG_ARG)
                    return

                games = ["`{}`".format(game) for game in games]

                try:
                    await client.send_message(
                        message.channel,
                        "*User:* **{}**:\n\n*Owned games:* {}".format(
                            username, ", ".join(games)))
                except HTTPException:
                    await client.send_message(
                        message.channel,
                        "This message can not fit onto Discord: **user has too many games to display (lol)**"
                    )

            elif startswith(prefix + "steam user "):
                uid = str(message.content)[len(prefix + "steam user "):]

                # Basic search
                await client.send_typing(message.channel)

                try:
                    steam_user = self.steam.get_user(uid)
                except ValueError:
                    await client.send_message(message.channel, NOT_WHOLE_URL)
                    return
                except (steamapi.errors.APIFailure,
                        steamapi.errors.APIException):
                    await client.send_message(
                        message.channel,
                        "Something went wrong. User could have a private profile. "
                        + StandardEmoji.CRY)
                    reraise()
                    return

                if not steam_user:
                    await client.send_message(message.channel,
                                              "User **does not exist**.")
                    self.stats.add(WRONG_ARG)
                    return

                try:
                    info = "User: **{}**\n```css\nStatus: {}\nLevel: {}\nGames: {} owned (including free games)\nFriends: {}```\n" \
                           "Direct link: http://steamcommunity.com/id/{}/".format(steam_user.name, "Online" if steam_user.state else "Offline",
                                                                                  steam_user.level, len(steam_user.games), len(steam_user.friends), uid)
                except AttributeError:
                    await client.send_message(
                        message.channel,
                        "Could not display user info. This can happen when the user has a private profile. "
                        + StandardEmoji.FROWN)
                    return

                if len(info) > 2000:
                    await client.send_message(
                        message.channel,
                        "This message can not fit onto Discord: **user has too many friends to display (lol)**"
                    )

                else:
                    await client.send_message(message.channel, info)

            elif startswith(prefix + "steam") or startswith(prefix +
                                                            "steam help"):
                await client.send_message(
                    message.channel,
                    "**Steam commands:**\n`_steam user community_url`, `_steam friends community_url`, `_steam games community_url`"
                    .replace("_", prefix))
コード例 #10
0
    async def on_message(self, message, **kwargs):
        assert isinstance(message, Message)

        prefix = kwargs.get("prefix")
        client = self.client

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        if startswith(prefix + "wiki", prefix + "define"):
            if startswith(prefix + "wiki"):
                search = str(message.content)[len(prefix + "wiki "):]

            elif startswith(prefix + "define"):
                search = str(message.content)[len(prefix + "define "):]

            else:
                return

            if not search or search == " ":  # If empty args
                await client.send_message(
                    message.channel,
                    "Please include a word you want to define.")
                return

            try:
                answer = wikipedia.summary(search,
                                           sentences=parser.get(
                                               "wiki", "sentences"),
                                           auto_suggest=True)
                await client.send_message(
                    message.channel, "**{} :** \n".format(search) + answer)

            except wikipedia.exceptions.PageError:
                await client.send_message(message.channel,
                                          "No definitions found.")

            except wikipedia.exceptions.DisambiguationError:
                await client.send_message(
                    message.channel,
                    "Got multiple definitions of {}, please be more specific (somehow)."
                    .format(search))

            except wikipedia.exceptions.WikipediaException as e:
                if str(e).startswith(QUERY_TOO_LONG):
                    await client.send_message(
                        message.channel,
                        "Search query is too long: 300 is the maximum length (you searched with {})"
                        .format(len(search)))

        elif startswith(prefix + "urban"):
            search = str(message.content)[len(prefix + "urban "):]

            async with aiohttp.ClientSession() as session:
                async with session.get(
                        "http://www.urbandictionary.com/define.php?term={}".
                        format(search)) as resp:
                    define = await resp.text()

            try:
                answer = BeautifulSoup(define,
                                       "html.parser").find("div",
                                                           attrs={
                                                               "class":
                                                               "meaning"
                                                           }).text
            except AttributeError:
                await client.send_message(message.channel,
                                          "No definition found")
                return

            # Check if there are no definitions
            if str(answer).startswith("\nThere aren't any"):
                await client.send_message(message.channel,
                                          "No definition found")

            else:

                if (len(answer) + len(search)) > 1900:
                    await client.send_message(
                        message.channel,
                        StandardEmoji.WARNING + "Definition is too long!")
                    return

                content = "**{}** *:* {}".format(search, answer)
                await client.send_message(message.channel, content)
コード例 #11
0
ファイル: reminder.py プロジェクト: dilip-krishnan/Nano
    async def on_message(self, message, **kwargs):
        client = self.client
        prefix = kwargs.get("prefix")

        assert isinstance(message, Message)
        assert isinstance(client, Client)

        if not is_valid_command(message.content, valid_commands, prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        # !remind me in [time]:[reminder]
        if startswith(prefix + "remind me in"):
            args = str(message.content)[len(prefix + "remind me in "):].strip().split(":")

            if len(args) != 2:
                await client.send_message(message.channel, "Incorrect command use. See `_help remind me in` for usage".replace("_", prefix))
                self.stats.add(WRONG_ARG)
                return

            content = str(args[1]).strip(" ")

            if not args[0].isnumeric():
                if "[" in args[0]:
                    # When people actually do !remind here in [1h 32min]: omg why
                    await client.send_message(message.channel, "Do not use **[** and **]** ! Try again without them.")
                    return

                ttr = convert_to_seconds(args[0])
            else:
                ttr = int(args[0])

            resp = self.reminder.set_reminder(message.author, message.author, content, ttr, reminder_type=REMINDER_PERSONAL)

            if resp == -1:
                await client.send_message(message.channel, EXCEEDED_REMINDER_LIMIT)

            elif resp is False:
                await client.send_message(message.channel, "Not a valid time range (5 seconds to 2 days")

            else:
                await client.send_message(message.channel, "Reminder set :)")

        # !remind here in [time]:[reminder]
        elif startswith(prefix + "remind here in"):
            args = str(message.content)[len(prefix + "remind here in "):].strip().split(":")

            if len(args) != 2:
                await client.send_message(message.channel, "Incorrect command use. See `_help remind here in` for usage".replace("_", prefix))
                self.stats.add(WRONG_ARG)
                return

            content = str(args[1]).strip(" ")

            if not args[0].isnumeric():
                try:
                    ttr = convert_to_seconds(args[0])
                except ValueError:
                    await client.send_message(message.channel, "Please do not use partial minutes/hours/days etc.. (such as 1.7 days - use `1d 16h 48min` instead {}".format(StandardEmoji.WINK))
                    return
            else:
                ttr = int(args[0])

            resp = self.reminder.set_reminder(message.channel, message.author, content, ttr, reminder_type=REMINDER_CHANNEL)

            if resp == -1:
                await client.send_message(message.channel, EXCEEDED_REMINDER_LIMIT)

            elif resp is False:
                await client.send_message(message.channel, "Not a valid time range (5 seconds to 2 days")

            else:
                await client.send_message(message.channel, "Reminder set :)")

        # !remind list
        elif startswith(prefix + "remind list", prefix + "reminder list"):
            reminders = self.reminder.get_reminders(message.author.id)

            if not reminders:
                await client.send_message(message.channel, "You don't have any reminders.")
                return

            rem = []
            for reminder in reminders.values():
                # Gets the remaining time
                ttl = reminder.get("time_target") - time.time()

                cont = self.nano.get_plugin("commons").get("instance").at_everyone_filter(reminder.get("raw"), message.author, message.server)

                if (ttl != abs(ttl)) or ttl == 0:
                    when = "**soon™**"
                else:
                    when = "in **{}**".format(resolve_time(ttl))

                rem.append("➤ {} ({})".format(cont, when))

            await client.send_message(message.channel, "Your reminders:\n" + "\n".join(rem))

        # !remind remove
        elif startswith(prefix + "remind remove"):
            r_name = message.content[len(prefix + "remind remove"):].strip()

            if r_name == "all":
                self.reminder.remove_all_reminders(message.author)
                await client.send_message(message.channel, "All reminders have been deleted. " + StandardEmoji.PERFECT)

            else:
                r_resp = self.reminder.remove_reminder(message.author.id, r_name)

                if not r_resp:
                    await client.send_message(message.channel, "No reminder with such content.")
                else:
                    await client.send_message(message.channel, "Reminder removed.")

        # !remind help
        elif startswith(prefix + "remind", prefix + "remind help"):
            await client.send_message(message.channel, remind_help.replace("_", prefix))
コード例 #12
0
    async def on_message(self, message, **kwargs):
        assert isinstance(message, Message)
        client = self.client

        prefix = kwargs.get("prefix")

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*args):
            for a in args:
                if message.content.startswith(a):
                    return True

            return False

        if startswith(prefix + "osu"):
            username = message.content[len(prefix + "osu "):]

            t_start = time.time()

            user = self.osu.get_user(username)

            if not user:
                await client.send_message(message.channel,
                                          "User does not exist.")
                return

            # About inverting: this inverts the number before and after the splitting
            def prepare(this):
                if not type(this) in (float, int):
                    return None

                return invert_str(",".join(
                    split_every(str(invert_num(this)), 3)))

            global_rank = prepare(user.world_rank)
            country_rank = prepare(user.country_rank)

            total_score = prepare(user.total_score)
            ranked_score = prepare(user.ranked_score)

            try:
                acc = str(round(float(user.accuracy), 2)) + " %"
            except TypeError:
                await client.send_message(message.channel,
                                          ":warning: Something went wrong...")
                return

            pp_amount = str(int(float(user.pp)))

            osu_level = int(float(user.level))
            avatar_url = "http://a.ppy.sh/{}".format(user.id)

            # Color is determined by the level range
            if osu_level < 10:
                color = Colour.darker_grey()
            elif osu_level < 25:
                color = Colour.light_grey()
            elif osu_level < 40:
                color = Colour.dark_teal()
            elif osu_level < 50:
                color = Colour.teal()
            elif osu_level < 75:
                color = Colour.dark_purple()
            elif osu_level < 100:
                color = Colour.purple()
            # Only the masters get the gold ;)
            else:
                color = Colour.gold()

            desc = "**Level**: {}\n**Rank**: \n\t" \
                   "**Global**:            #{}\n\t" \
                   "**Country** (**{}**): #{}\n" \
                   "Total PP: **{}**".format(osu_level, global_rank, user.country, country_rank, pp_amount)

            embed = Embed(url=user.profile_url, description=desc, colour=color)
            embed.set_author(name=user.name)
            embed.set_thumbnail(url=avatar_url)

            embed.add_field(name="Total score", value=total_score)
            embed.add_field(name="Ranked score", value=ranked_score)
            embed.add_field(name="Average accuracy", value=acc)

            delta = int((time.time() - t_start) * 1000)
            embed.set_footer(text="Search took {} ms".format(delta))

            try:
                await client.send_message(message.channel, embed=embed)
            except errors.HTTPException:
                await client.send_message(
                    message.channel,
                    "Something went wrong " + StandardEmoji.THINKING)
コード例 #13
0
ファイル: server.py プロジェクト: dilip-krishnan/Nano
    async def on_message(self, message, **kwargs):
        assert isinstance(message, discord.Message)

        prefix = kwargs.get("prefix")
        client = self.client

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        # !status
        if startswith(prefix + "status"):
            server_count = 0
            members = 0
            channels = 0

            # Iterate though servers and add up things
            for server in client.servers:

                server_count += 1
                members += int(server.member_count)
                channels += len(server.channels)

            embed = discord.Embed(name="Stats",
                                  colour=discord.Colour.dark_blue())
            embed.add_field(name="Servers",
                            value="{} servers".format(server_count),
                            inline=True)
            embed.add_field(name="Users",
                            value="{} members".format(members),
                            inline=True)
            embed.add_field(name="Channels",
                            value="{} channels".format(channels),
                            inline=True)

            await client.send_message(message.channel,
                                      "**Stats**",
                                      embed=embed)

        # !debug
        elif startswith(prefix + "debug", prefix + "stats more"):
            # Some more debug data

            if ((self.lt - time.time()) <
                    360) and not self.handler.is_bot_owner(message.author.id):
                return
            else:
                self.lt = time.time()

            # CPU
            cpu = psutil.cpu_percent(interval=0.5)

            # RAM
            def check_ram():
                nano_process = psutil.Process(os.getpid())
                return round(nano_process.memory_info()[0] / float(2**20),
                             1)  # Converts to MB

            mem_before = check_ram()
            # Attempt garbage collection
            gc.collect()

            mem_after = check_ram()
            garbage = round(mem_after - mem_before, 2)

            # OTHER
            d = datetime(
                1, 1, 1) + timedelta(seconds=time.time() - self.nano.boot_time)
            uptime = "{} days, {}:{}:{}".format(d.day - 1, d.hour, d.minute,
                                                d.second)

            nano_version = self.nano.version
            discord_version = discord.__version__

            reminders = self.nano.get_plugin("reminder").get(
                "instance").reminder.get_reminder_amount()
            polls = self.nano.get_plugin("voting").get(
                "instance").vote.get_vote_amount()

            embed = discord.Embed(colour=discord.Colour.green())

            embed.add_field(name="Nano version", value=nano_version)
            embed.add_field(name="discord.py", value=discord_version)
            embed.add_field(name="RAM usage",
                            value="{} MB (garbage collected {} MB)".format(
                                mem_after, garbage))
            embed.add_field(name="CPU usage", value="{} %".format(cpu))
            embed.add_field(name="Ongoing reminders", value=str(reminders))
            embed.add_field(name="Ongoing votes", value=str(polls))

            # Balances some stats
            if isinstance(self.handler, RedisServerHandler):
                redis_mem = self.handler.db_info("memory").get(
                    "used_memory_human")
                embed.add_field(name="Redis memory",
                                value=redis_mem,
                                inline=False)

                redis_size = self.handler.db_size()
                embed.add_field(name="Redis keys", value=redis_size)

            else:
                embed.add_field(name="Uptime", value=uptime)

            await client.send_message(message.channel,
                                      "**Debug data:**",
                                      embed=embed)

        # !stats
        elif startswith(prefix + "stats"):
            file = self.stats.get_data()

            messages = file.get("msgcount")
            wrong_args = file.get("wrongargcount")
            sleeps = file.get("timesslept")
            wrong_permissions = file.get("wrongpermscount")
            helps = file.get("peoplehelped")
            votes = file.get("votesgot")
            pings = file.get("timespinged")
            imgs = file.get("imagessent")

            embed = discord.Embed(colour=discord.Colour.gold())

            embed.add_field(name="Messages sent", value=messages)
            embed.add_field(name="Wrong arguments got", value=wrong_args)
            embed.add_field(name="Command abuses tried",
                            value=wrong_permissions)
            embed.add_field(name="People Helped", value=helps)
            embed.add_field(name="Images sent", value=imgs)
            embed.add_field(name="Votes got", value=votes)
            embed.add_field(name="Times slept", value=sleeps)
            embed.add_field(name="Times Pong!-ed", value=pings)
            # Left out "images uploaded" because there was no use

            await client.send_message(message.channel,
                                      "**Stats**",
                                      embed=embed)

        # !prefix
        elif startswith(prefix + "prefix"):
            await client.send_message(message.channel, "You guessed it!")

        # nano.prefix
        elif startswith("nano.prefix"):
            await client.send_message(
                message.channel,
                "The prefix on this server is **{}**".format(prefix))

        # !members
        elif startswith(prefix + "members"):
            ls = [member.name for member in message.channel.server.members]

            members = "*__Members__*:\n\n{}".format(", ".join(
                ["`{}`".format(mem)
                 for mem in ls])) + "\nTotal: **{}** members".format(len(ls))

            if len(members) > 2000:
                # Only send the number if the message is too long.
                await client.send_message(
                    message.channel,
                    "This guild has a total number of **{}** members".format(
                        len(ls)))

            else:
                await client.send_message(message.channel, members)

        # !server
        elif startswith(prefix + "server"):
            user_count = message.server.member_count
            users_online = len([
                user.id for user in message.server.members
                if user.status == user.status.online
            ])

            v_level = message.server.verification_level
            if v_level == v_level.none:
                v_level = "None"
            elif v_level == v_level.low:
                v_level = "Low"
            elif v_level == v_level.medium:
                v_level = "Medium"
            else:
                v_level = "High (╯°□°)╯︵ ┻━┻"

            channels = len(message.server.channels)
            text_chan = len([
                chan.id for chan in message.server.channels
                if chan.type == chan.type.text
            ])
            voice_chan = len([
                chan.id for chan in message.server.channels
                if chan.type == chan.type.voice
            ])

            # Teal Blue
            embed = discord.Embed(colour=discord.Colour(0x3F51B5),
                                  description="ID: *{}*".format(
                                      message.server.id))

            if message.server.icon:
                embed.set_author(name=message.server.name,
                                 icon_url=message.server.icon_url)
                embed.set_thumbnail(url=message.server.icon_url)
            else:
                embed.set_author(name=message.server.name)

            embed.set_footer(
                text="Server created at {}".format(message.server.created_at))

            embed.add_field(name="Members [{} total]".format(user_count),
                            value="{} online".format(users_online))
            embed.add_field(name="Channels [{} total]".format(channels),
                            value="{} voice | {} text".format(
                                voice_chan, text_chan))
            embed.add_field(name="Verification level", value=v_level)
            embed.add_field(
                name="Roles",
                value="{} custom".format(len(message.server.roles) - 1))
            embed.add_field(name="Server Owner",
                            value="{}#{} ID:{}".format(
                                message.server.owner.name,
                                message.server.owner.discriminator,
                                message.server.owner.id))

            await client.send_message(message.channel,
                                      "**Server info:**",
                                      embed=embed)
コード例 #14
0
    async def on_message(self, message, *_, **kwargs):
        assert isinstance(message, Message)
        client = self.client

        prefix = kwargs.get("prefix")

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        # A shortcut
        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        # !help and @Nano
        if message.content.strip(" ") == (prefix + "help"):
            await client.send_message(message.channel, help_nano)

            self.stats.add(HELP)

        # @Nano help
        elif self.client.user in message.mentions:
            un_mentioned = str(message.content[21:])
            if un_mentioned == "" or un_mentioned == " ":
                await client.send_message(message.channel, help_nano)

            self.stats.add(HELP)

        # !cmds or !commands
        elif startswith(prefix + "cmds", prefix + "commands"):
            await client.send_message(
                message.channel,
                "A 'complete' list of commands is available here: https://github.com/DefaltSimon/Nano/wiki/Commands"
            )

            self.stats.add(HELP)

        # !help simple
        elif startswith(prefix + "help simple"):
            await client.send_message(message.channel, help_simple)

            self.stats.add(HELP)

        # !help [command]
        elif startswith(prefix + "help"):
            search = str(message.content)[len(prefix + "help "):]

            self.stats.add(HELP)

            def get_command_info(cmd):

                # Normal commands
                cmd1 = cmd_help_normal.get(
                    str(cmd.replace(prefix, "_").strip(" ")))
                if cmd1 is not None:
                    cmd_name = search.replace(prefix, "")

                    description = cmd1.get("desc")
                    use = cmd1.get("use")
                    alias = cmd1.get("alias")

                    preset = "Command: **{}**\n```css\n" \
                             "Description: {}{}{}```".format(cmd_name, description, "\n" + use if use else "", "\n" + alias if alias else "")

                    self.stats.add(HELP)
                    return preset

                # Admin commands
                cmd2 = cmd_help_admin.get(
                    str(cmd.replace(prefix, "_").strip(" ")))
                if cmd2 is not None:
                    cmd_name = search.replace(prefix, "")

                    description = cmd2.get("desc")
                    use = cmd2.get("use")
                    alias = cmd2.get("alias")

                    preset = "Command: **{}** (admin only)\n```css\n" \
                             "Description: {}{}{}```".format(cmd_name, description, "\n" + use if use else "", "\n" + alias if alias else "")

                    self.stats.add(HELP)
                    return preset

                # Owner commands
                cmd3 = cmd_help_owner.get(
                    str(cmd.replace(prefix, "_").strip(" ")))
                if cmd3 is not None:
                    cmd_name = search.replace(prefix, "")

                    description = cmd3.get("desc")
                    use = cmd3.get("use")
                    alias = cmd3.get("alias")

                    preset = "Command: **{}** (owner only)\n```css\n" \
                             "Description: {}{}{}```".format(cmd_name, description, "\n" + use if use else "", "\n" + alias if alias else "")

                    self.stats.add(HELP)
                    return preset

                if not cmd1 or not cmd2 or not cmd3:
                    self.stats.add(WRONG_ARG)
                    return None

            # Allows for !help ping AND !help !ping
            if search.startswith(prefix):
                res = get_command_info(search)

                if res:
                    await client.send_message(message.channel, res)

                else:
                    await client.send_message(
                        message.channel, "Command could not be found.\n"
                        "**(Use: `>help command`)**".replace(">", prefix))

            else:
                res = get_command_info(prefix + search)

                if res:
                    await client.send_message(message.channel, res)

                else:
                    await client.send_message(
                        message.channel, "Command could not be found.\n"
                        "**(Use: `>help command`)**".replace(">", prefix))

        # !notifydev
        elif startswith(prefix + "notifydev", prefix + "suggest"):
            if startswith(prefix + "notifydev"):
                report = message.content[len(prefix + "notifydev "):]
                typ = "Report"

            elif startswith(prefix + "suggest"):
                report = message.content[len(prefix + "suggest "):]
                typ = "Suggestion"

            else:
                return

            dev_server = utils.get(client.servers, id=self.nano.dev_server)

            # Timestamp
            ts = datetime.now().strftime("%d.%m.%Y %H:%M:%S")

            # 'Compiled' report
            comp = "{} from {} ({}):\n```{}```\n**__Timestamp__**: `{}`\n**__Server__**: `{}` ({} members)\n" \
                   "**__Server Owner__**: {}".format(typ, message.author.name, message.author.id, report, ts,
                                                     message.channel.server.name, message.channel.server.member_count,
                                                     "Yes" if message.author.id == message.channel.server.owner.id
                                                     else message.channel.server.owner.id)

            # Saves the submission to disk
            save_submission(
                comp.replace(
                    message.author.mention,
                    "{} ({})\n".format(message.author.name,
                                       message.author.id)))

            await client.send_message(dev_server.owner, comp)
            await client.send_message(
                message.channel, "**Thank you** for your *{}*.".format(
                    "submission" if typ == "Report" else "suggestion"))

        # !bug
        elif startswith(prefix + "bug"):
            await client.send_message(message.channel,
                                      nano_bug.replace("_", prefix))
コード例 #15
0
    async def on_message(self, message, **kwargs):
        assert isinstance(message, Message)
        client = self.client

        prefix = kwargs.get("prefix")

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*args):
            for a in args:
                if message.content.startswith(a):
                    return True

            return False

        # !cat gif/jpg/png
        if startswith(prefix + "cat"):
            args = str(message.content[len(prefix + "cat"):]).strip(" ")

            # GIF is the default type!
            type_ = "gif"
            if len(args) != 0:
                if args == "jpg":
                    type_ = "jpg"
                elif args == "png":
                    type_ = "png"

            pic = await self.cat.random_cat(type_)

            if not pic:
                await client.send_message(
                    message.channel, "Could not get a random cat picture... " +
                    StandardEmoji.CRY)
            else:
                await client.send_message(message.channel, pic)

            self.stats.add(IMAGE_SENT)

        # !xkcd random/number/latest
        elif startswith(prefix + "xkcd"):
            args = str(message.content[len(prefix + "xkcd"):]).strip(" ")

            # Decides mode
            fetch = "random"
            if len(args) != 0:
                if is_number(args):
                    # Check if number is valid
                    if int(args) > self.xkcd.last_num:
                        await client.send_message(
                            message.channel,
                            "Such XKCD number does not exist.")
                        return
                    else:
                        fetch = "number"
                elif args == "random":
                    # Already random mode
                    pass
                else:
                    fetch = "latest"

            if fetch == "random":
                xkcd = await self.xkcd.get_random_xkcd()
            elif fetch == "number":
                xkcd = await self.xkcd.get_xkcd_by_number(args)
            else:
                xkcd = await self.xkcd.get_latest_xkcd()

            if not xkcd:
                await client.send_message(
                    message.channel,
                    "Could not fetch xkcd " + StandardEmoji.CRY +
                    ". Error has been logged for inspection.")
                log_to_file("XKCD: string {}, fetch: {}, got None".format(
                    args, fetch))
            else:
                await client.send_message(
                    message.channel,
                    "**XKCD number {}:**\n{}".format(xkcd.num, xkcd.img))

        # !joke (yo mama/chuck norris)
        elif startswith(prefix + "joke"):
            arg = str(message.content[len(prefix + "joke"):]).strip(" ")

            if arg.lower() == "yo mama":
                joke = await self.joke.get_joke(0)
            elif arg.lower() == "chuck norris":
                joke = await self.joke.get_joke(1)
            else:
                # Already random
                joke = await self.joke.get_joke()

            if not joke:
                await client.send_message(
                    message.channel,
                    "Could not get a proper joke... " + StandardEmoji.CRY)
                return

            await client.send_message(message.channel, str(joke))
コード例 #16
0
ファイル: voting.py プロジェクト: dilip-krishnan/Nano
    async def on_message(self, message, **kwargs):
        assert isinstance(message, Message)
        assert isinstance(self.handler, ServerHandler)
        client = self.client
        prefix = kwargs.get("prefix")

        if not is_valid_command(message.content, valid_commands, prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*args):
            for a in args:
                if message.content.startswith(a):
                    return True

            return False

        # !vote start
        if startswith(prefix + "vote start"):
            if not self.handler.can_use_restricted_commands(message.author, message.channel.server):
                await client.send_message(message.channel, "You are not permitted to use this command.")

                self.stats.add(WRONG_PERMS)
                return

            if self.vote.in_progress(message.channel.server):
                await client.send_message(message.channel, IN_PROGRESS)
                return

            vote_content = message.content[len(prefix + "vote start "):]
            base = str(vote_content).split("\"")

            if len(base) != 3:
                await client.send_message(message.channel, "Incorrect usage. Check {}help vote start for info.".format(prefix))
                self.stats.add(WRONG_ARG)
                return

            title = str(base[1])
            vote_items = str(base[2]).split("|")
            vote_items = [a.strip(" ") for a in list(vote_items)]

            if len(vote_items) > VOTE_ITEM_LIMIT:
                await client.send_message(message.channel, StandardEmoji.WARNING + " Too many vote options "
                                                                                   "(max is **{}**, you put *{}*)".format(VOTE_ITEM_LIMIT, len(vote_items)))
                return

            if (len(title) + sum([len(a) for a in vote_items])) > VOTE_ITEM_MAX_LENGTH:
                await client.send_message(message.channel, StandardEmoji.WARNING + " The whole thing is too long! (max is {}, you have {}".format(VOTE_ITEM_MAX_LENGTH, sum([len(a) for a in vote_items])))

            self.vote.start_vote(message.author.name, message.server.id, title, vote_items)

            ch = "\n".join(["{}. {}".format(en + 1, ch) for en, ch in
                            enumerate(self.vote.get_choices(message.server.id))]).strip("\n")

            await client.send_message(message.channel, "Vote started:\n**{}**\n"
                                                       "```js\n{}```".format(self.vote.get_vote_title(message.server.id), ch))

        # !vote end
        elif startswith(prefix + "vote end"):
            if not self.handler.can_use_restricted_commands(message.author, message.server):
                await client.send_message(message.channel, "You are not permitted to use this command.")

                self.stats.add(WRONG_PERMS)
                return

            if not self.vote.in_progress(message.server):
                await client.send_message(message.channel, NO_VOTE)
                return

            votes = self.vote.get_votes(message.server.id)
            title = self.vote.get_vote_title(message.server.id)

            embed = Embed(title=title, colour=Colour(0x303F9F),
                          description="(In total, {} people voted)".format(sum(votes.values())))
            embed.set_footer(text="Voting ended")

            for name, val in votes.items():
                embed.add_field(name=name, value="{} votes".format(val))

            try:
                await client.send_message(message.channel, "Vote ended:", embed=embed)
            except errors.HTTPException as e:
                await client.send_message(message.channel, "Something went wrong when trying to end voting. It has been logged and will be inspected.")
                log_to_file("VOTING ({}): {}".format(e, embed.to_dict()))
                return

            # Actually end the voting
            self.vote.end_voting(message.server)

        # !vote status
        elif startswith(prefix + "vote status"):
            if not self.vote.in_progress(message.server):
                await client.send_message(message.channel, NO_VOTE)
                return

            header = self.vote.get_vote_title(message.server.id)
            votes = sum(self.vote.get_votes(message.server.id).values())

            if votes == 0:
                vote_disp = "no-one has voted yet"
            elif votes == 1:
                vote_disp = "only one person has voted"
            else:
                vote_disp = "{} people have voted".format(votes)

            await client.send_message(message.channel, "**Vote:** \"{}\"\n```So far, {}.```".format(header, vote_disp))

        # !vote
        elif startswith(prefix + "vote"):
            # Ignore if there is no vote going on instead of getting an exception
            if not self.vote.in_progress(message.server):
                print("not in progress")
                return

            # Get the choice, but tell the author if he/she didn't supply a number
            try:
                choice = int(message.content[len(prefix + "vote "):]) - 1
            except ValueError:
                m = await client.send_message(message.channel, "Vote argument must be a number.")
                await asyncio.sleep(1.5)
                await client.delete_message(m)
                return

            if choice < 0:
                return

            res = self.vote.plus_one(choice, message.author.id, message.channel.server)

            if res == -1:
                msg = await client.send_message(message.channel, "Cheater " + StandardEmoji.SMILE)

                await asyncio.sleep(1)
                await client.delete_message(msg)

            elif res:
                await client.add_reaction(message, OK_EMOJI)

            else:
                msg = await client.send_message(message.channel, "Something went wrong... " + StandardEmoji.FROWN2)

                await asyncio.sleep(1)
                await client.delete_message(msg)

            self.stats.add(VOTE)
コード例 #17
0
ファイル: server.py プロジェクト: tyblackbird/Nano
    async def on_message(self, message, **kwargs):
        assert isinstance(message, discord.Message)
        assert isinstance(self.stats, NanoStats)

        prefix = kwargs.get("prefix")
        client = self.client

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        # !status
        if startswith(prefix + "status"):
            server_count = 0
            members = 0
            channels = 0

            # Iterate though servers and add up things
            for server in client.servers:

                server_count += 1
                members += int(server.member_count)
                channels += len(server.channels)

            stats = "**Stats**\n\nServers: `{}`\nUsers: `{}`\nChannels: `{}`".format(
                server_count, members, channels)

            await client.send_message(message.channel, stats)

        # !debug
        elif startswith(prefix + "debug", prefix + "stats more"):
            # Some more debug data

            # RAM
            def check_ram():
                nano_process = psutil.Process(os.getpid())
                return round(nano_process.memory_info()[0] / float(2**20),
                             1)  # Converts to MB

            mem_before = check_ram()
            # Attempt garbage collection
            gc.collect()

            mem_after = check_ram()
            garbage = round(mem_after - mem_before, 2)

            # CPU
            cpu = psutil.cpu_percent(interval=0.5)

            # OTHER
            d = datetime(
                1, 1, 1) + timedelta(seconds=time.time() - self.nano.boot_time)
            uptime = "{} days, {}:{}:{}".format(d.day - 1, d.hour, d.minute,
                                                d.second)

            nano_version = self.nano.version
            discord_version = discord.__version__

            reminders = len(
                self.nano.get_plugin("reminder").get(
                    "instance").reminder.reminders)
            polls = len(
                self.nano.get_plugin("voting").get("instance").vote.progress)

            debug_data = """```
Nano:                  {}
discord.py:            {}
RAM usage:             {} MB (garbage collected {} MB)
Cpu usage:             {} %
Uptime:                {}
Current reminders:     {}
Current votes:         {}```""".format(nano_version, discord_version,
                                       mem_after, garbage, cpu, uptime,
                                       reminders, polls)

            await client.send_message(message.channel, debug_data)

        # !stats
        elif startswith(prefix + "stats"):
            file = self.stats.get_data()

            messages = file.get("msgcount")
            wrong_args = file.get("wrongargcount")
            sleeps = file.get("timesslept")
            wrong_permissions = file.get("wrongpermscount")
            helps = file.get("peoplehelped")
            images = file.get("imagessent")
            votes = file.get("votesgot")
            pings = file.get("timespinged")

            to_send = "**Stats**\n```python\n{} messages sent\n{} people yelled at because of wrong args\n" \
                      "{} people denied because of wrong permissions\n{} people helped\n{} votes got\n{} times slept\n" \
                      "{} images uploaded\n{} times Pong!-ed```".format(messages, wrong_args, wrong_permissions,
                                                                        helps, votes, sleeps, images, pings)

            await client.send_message(message.channel, to_send)

        # !prefix
        elif startswith(prefix + "prefix"):
            await client.send_message(message.channel, "You guessed it!")

        # nano.prefix
        elif startswith("nano.prefix"):
            await client.send_message(
                message.channel,
                "The prefix on this server is **{}**".format(prefix))

        # !members
        elif startswith(prefix + "members"):
            ls = [member.name for member in message.channel.server.members]

            members = "*__Members__*:\n\n{}".format(", ".join(
                ["`{}`".format(mem)
                 for mem in ls])) + "\nTotal: **{}** members".format(len(ls))

            if len(members) > 2000:
                # Only send the number if the message is too long.
                await client.send_message(
                    message.channel,
                    "This guild has a total number of **{}** members".format(
                        len(ls)))

            else:
                await client.send_message(message.channel, members)
コード例 #18
0
ファイル: steam.py プロジェクト: tyblackbird/Nano
    async def on_message(self, message, **kwargs):
        assert isinstance(message, Message)

        client = self.client
        prefix = kwargs.get("prefix")

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        if startswith(prefix + "steam"):
            if startswith(prefix + "steam friends "):
                uid = str(message.content)[len(prefix + "steam friends "):]

                # Friend search
                await client.send_typing(message.channel)
                username, friends = self.steam.get_friends(uid)

                friends = ["`" + friend + "`" for friend in friends]

                if not username:
                    await client.send_message(message.channel,
                                              "User **does not exist**.")
                    # stat.pluswrongarg()
                    return

                await client.send_message(
                    message.channel, "*User:* **{}**\n\n*Friends:* {}".format(
                        username, ", ".join(friends)))

            elif startswith(prefix + "steam games"):
                uid = str(message.content)[len(prefix + "steam games "):]

                # Game search
                await client.send_typing(message.channel)
                username, games = self.steam.get_owned_games(uid)

                if not username:
                    await client.send_message(message.channel,
                                              "User **does not exist**.")
                    # stat.pluswrongarg()
                    return

                games = ["`{}`".format(game) for game in games]

                try:
                    await client.send_message(
                        message.channel,
                        "*User:* **{}**:\n\n*Owned games:* {}".format(
                            username, ", ".join(games)))
                except HTTPException:
                    await client.send_message(
                        message.channel,
                        "This message can not fit onto Discord: **user has too many games to display (lol)**"
                    )

            elif startswith(prefix + "steam user "):
                uid = str(message.content)[len(prefix + "steam user "):]

                # Basic search
                await client.send_typing(message.channel)
                steam_user = self.steam.get_user(uid)

                if not steam_user:
                    await client.send_message(message.channel,
                                              "User **does not exist**.")
                    # stat.pluswrongarg()
                    return

                info = "User: **{}**\n```css\nStatus: {}\nLevel: {}\nGames: {} owned (including free games)\nFriends: {}```\n" \
                       "Direct link: http://steamcommunity.com/id/{}/".format(steam_user.name, "Online" if steam_user.state else "Offline",
                                                                              steam_user.level, len(steam_user.games), len(steam_user.friends), uid)

                try:
                    await client.send_message(message.channel, info)

                except HTTPException:
                    await client.send_message(
                        message.channel,
                        "This message can not fit onto Discord: **user has too many friends to display (lol)**"
                    )

            elif startswith(prefix + "steam") or startswith(prefix +
                                                            "steam help"):
                await client.send_message(
                    message.channel,
                    "**Steam commands:**\n`_steam user community_url`, `_steam friends community_url`, `_steam games community_url`"
                    .replace("_", prefix))
コード例 #19
0
ファイル: fun.py プロジェクト: dilip-krishnan/Nano
    async def on_message(self, message, **kwargs):
        assert isinstance(message, Message)

        prefix = kwargs.get("prefix")
        client = self.client

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        # Loop over simple commands
        for trigger, response in simple_commands.items():
            if message.content.startswith(trigger.replace("_", prefix)):
                await client.send_message(message.channel, response)
                self.stats.add(MESSAGE)

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        # Other commands
        if startswith(prefix + "kappa"):
            await client.send_file(message.channel,
                                   "data/images/kappasmall.png")

            self.stats.add(IMAGE_SENT)

        elif startswith(prefix + "randomgif"):
            # Check if giphy is enabled
            if not self.giphy_enabled:
                return

            random_gif = self.gif.screensaver().media_url
            await client.send_message(message.channel, str(random_gif))

            self.stats.add(IMAGE_SENT)

        elif startswith(prefix + "meme", prefix + "caption"):
            # Check if imgflip is enabled
            if not self.imgflip_enabled:
                return

            if startswith(prefix + "meme"):
                query = message.content[len(prefix + "meme "):]
            elif startswith(prefix + "caption"):
                query = message.content[len(prefix + "caption "):]
            else:
                # u wot pycharm
                return

            middle = [str(a).strip(" ") for a in str(query).split("|")]

            if len(middle) != 3:
                await client.send_message(
                    message.channel,
                    "Incorrect usage. See _help caption/_help meme for info".
                    replace("_", prefix))
                return

            name = middle[0]
            top = middle[1]
            bottom = middle[2]
            meme = await self.generator.caption_meme(name, top, bottom)

            if not meme:
                await client.send_message(message.channel,
                                          "Meme is non-existent. rip")
            else:
                await client.send_message(message.channel, meme)

        elif startswith(prefix + "rip"):
            if len(message.mentions) == 1:
                ripperoni = message.mentions[0].mention

            elif len(message.mentions) == 0:
                ripperoni = message.content[len(prefix + "rip "):]

            else:
                ripperoni = ""

            ripperoni = self.nano.get_plugin("commons").get(
                "instance").at_everyone_filter(ripperoni, message.author,
                                               message.server)

            prays = self.stats.get_amount(PRAYER)
            await client.send_message(
                message.channel,
                "Rest in pepperoni{}{}.\n`{}` *prayers said so far*...".format(
                    ", " if ripperoni else "", ripperoni, prays))

            self.stats.add(PRAYER)
コード例 #20
0
ファイル: admin.py プロジェクト: tyblackbird/Nano
    async def on_message(self, message, **kwargs):
        prefix = kwargs.get("prefix")
        client = self.client
        handler = self.handler

        assert isinstance(message, Message)
        assert isinstance(handler, ServerHandler)
        assert isinstance(client, Client)

        # Check if this is a valid command
        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        if not handler.can_use_restricted_commands(message.author,
                                                   message.channel.server):
            await client.send_message(
                message.channel, WARNING +
                " You do not have the correct permissions to use this command (must be a server admin)."
            )
            return

        # !welcomemsg
        if startswith(prefix + "welcomemsg"):
            change = message.content[len(prefix + "welcomemsg "):]
            handler.update_var(message.channel.server.id, "welcomemsg", change)

            await client.send_message(
                message.channel, "Welcome message has been updated :smile:")

        # !banmsg
        elif startswith(prefix + "banmsg"):
            change = message.content[len(prefix + "banmsg "):]
            handler.update_var(message.channel.server.id, "banmsg", change)

            await client.send_message(message.channel,
                                      "Ban message has been updated :smile:")

        # !kickmsg
        elif startswith(prefix + "kickmsg"):
            change = message.content[len(prefix + "kickmsg "):]
            handler.update_var(message.channel.server.id, "kickmsg", change)

            await client.send_message(message.channel,
                                      "Kick message has been updated :smile:")

        # !leavemsg
        elif startswith(prefix + "leavemsg"):
            change = message.content[len(prefix + "leavemsg "):]
            handler.update_var(message.channel.server.id, "leavemsg", change)

            await client.send_message(
                message.channel, "Leave message has been updated :smile:")

        # !nuke
        elif startswith(prefix + "nuke"):
            amount = str(message.content)[len(prefix + "nuke "):]

            try:
                amount = int(amount) + 1  # Includes the sender's message
            except ValueError:
                await client.send_message(message.channel, "Must be a number.")
                return

            await client.delete_message(message)

            await client.send_message(
                message.channel,
                "Purging last {} messages... :boom:".format(amount - 1))
            await client.purge_from(message.channel, limit=amount)

            # Show success
            m = await client.send_message(
                message.channel,
                "Purged {} messages {}".format(CHECK_MARK, amount - 1))
            # Wait 1.5 sec and delete the message
            await asyncio.sleep(1.5)
            await client.delete_message(m)

        # !kick
        elif startswith(prefix + "kick"):
            if len(message.mentions) >= 1:
                user = message.mentions[0]

            else:
                user_name = str(str(message.content)[len(prefix + "kick "):])

                user = utils.find(lambda u: u.name == str(user_name),
                                  message.channel.server.members)

            if not user:
                return

            await client.kick(user)
            await client.send_message(
                message.channel,
                handler.get_var(message.channel.server.id,
                                "kickmsg").replace(":user", user.name))

        # !ban
        elif startswith(prefix + "ban"):
            if len(message.mentions) >= 1:
                user = message.mentions[0]

            else:
                user_name = str(str(message.content)[len(prefix + "ban "):])

                user = utils.find(lambda u: u.name == str(user_name),
                                  message.channel.server.members)

            if not user:
                return

            await client.send_message(
                message.channel, "Are you sure you want to ban " + user.name +
                "? Confirm by replying 'CONFIRM'.")

            followup = await client.wait_for_message(author=message.author,
                                                     channel=message.channel,
                                                     timeout=15,
                                                     content="CONFIRM")

            if followup is None:
                await client.send_message(
                    message.channel,
                    "Confirmation not received, NOT banning :upside_down:")

            else:
                await client.ban(user, delete_message_days=0)
                await client.send_message(
                    message.channel,
                    handler.get_var(message.channel.server.id,
                                    "banmsg").replace(":user", user.name))

        # !unban
        # but wait, you cant really mention the person so this is practically useless lmao
        #elif startswith(prefix + "unban"):
        #    if len(message.mentions) >= 1:
        #        user = message.mentions[0]
        #
        #    else:
        #        user_name = str(str(message.content)[len(prefix + "kick "):])
        #
        #        user = utils.find(lambda u: u.name == str(user_name), message.channel.server.members)
        #
        #    if not user:
        #        return
        #
        #    await client.unban(user)
        #    await client.send_message(message.channel, "{} has been unbanned.".format(user.name))

        # !softban
        elif startswith(prefix + "softban"):

            if len(message.mentions) == 0:
                await client.send_message(
                    message.channel,
                    "Please mention the member you want to softban.")
                return

            user = message.mentions[0]
            tim = message.content[len(prefix + "softban "):].replace(
                "<@{}>".format(user.id), "").strip()

            await client.ban(user)

            self.timer.set_softban(message.channel.server, user, tim)

            await client.send_message(
                message.channel, "{} has been softbanned.".format(user.name))

        # !mute list
        elif startswith(prefix + "mute list"):
            mutes = handler.mute_list(message.server)

            if mutes:
                final = "Muted members: \n" + ", ".join(
                    ["`{}`".format(u) for u in mutes])
            else:
                final = "No members are muted."

            await client.send_message(message.channel, final)

        # !mute
        elif startswith(prefix + "mute"):
            if len(message.mentions) == 0:
                await client.send_message(
                    message.channel,
                    "Please mention the member you want to mute.")
                return

            user = message.mentions[0]

            handler.mute(user)

            await client.send_message(
                message.channel,
                "**{}** can now not speak here. :zipper_mouth:".format(
                    user.name))

        # !unmute
        elif startswith(prefix + "unmute"):
            if len(message.mentions) == 0:
                await client.send_message(
                    message.channel,
                    "Please mention the member you want to unmute.")
                return

            user = message.mentions[0]

            handler.unmute(user)

            await client.send_message(
                message.channel,
                "**{}** can now speak here again :rofl:".format(user.name))

        # !user
        elif startswith(prefix + "user"):
            # Selects the proper user
            if len(message.mentions) == 0:
                name = message.content[len(prefix + "user "):]
                member = utils.find(lambda u: u.name == name,
                                    message.channel.server.members)

            else:
                member = message.mentions[0]

            # If the member does not exist
            if not member:
                await client.send_message(message.channel,
                                          "Member does not exist.")
                return

            # Gets info
            name = member.name
            mid = member.id
            avatar = str(member.avatar_url)

            is_bot = ":robot:" if member.bot else ""

            role = member.top_role
            account_created = member.created_at
            status = "Online" if member.status.online or member.status.idle else "Offline"

            # Filter @everyone out
            if role == "@everyone":
                role = "None"

            # 'Compiles' info
            final = "User: **{}** #{} {}\n➤ Status: {}\n➤ Id: `{}`\n➤ Avatar: {}\n\n➤ Top role_: **{}**\n" \
                    "➤ Created at: `{}`".format(name, member.discriminator, is_bot, status, mid,
                                                avatar, role, account_created)

            await client.send_message(message.channel, final)

        # !role
        elif startswith(prefix + "role"):
            # This selects the proper user
            if len(message.mentions) == 0:
                await client.send_message(message.channel,
                                          "Please mention someone.")
                return

            elif len(message.mentions) >= 2:
                await client.send_message(
                    message.channel,
                    "Please mention only one person at a time.")
                return

            else:
                user = message.mentions[0]

            # Checks if the user is permitted to change this role (can only change roles lower in the hierarchy)
            def is_lower(user_role, selected_role):
                return user_role.position >= selected_role.position

            # Combines both
            def can_change_role(member_a, selected_role):
                return is_lower(member_a.top_role, selected_role)

            # Branching

            if startswith(prefix + "role " + "add "):
                a_role = str(
                    message.content[len(prefix +
                                        "role add "):]).split("<")[0].strip()
                role = utils.find(lambda r: r.name == a_role,
                                  message.channel.server.roles)

                if not can_change_role(message.author, role):
                    await client.send_message(message.channel, error_hierarchy)
                    return

                await client.add_roles(user, role)
                await client.send_message(message.channel,
                                          "Done " + CHECK_MARK)

            elif startswith(prefix + "role " + "remove "):
                a_role = str(message.content[len(prefix +
                                                 "role remove "):]).split(
                                                     "<")[0].strip()
                role = utils.find(lambda r: r.name == a_role,
                                  message.channel.server.roles)

                if not can_change_role(message.author, role):
                    await client.send_message(message.channel, error_hierarchy)
                    return

                await client.remove_roles(user, role)
                await client.send_message(message.channel,
                                          "Done " + CHECK_MARK)

            elif startswith(prefix + "role " + "replaceall "):
                a_role = str(message.content[len(prefix +
                                                 "role replaceall "):]).split(
                                                     "<")[0].strip()
                role = utils.find(lambda r: r.name == a_role,
                                  message.channel.server.roles)

                if not can_change_role(message.author, role):
                    await client.send_message(message.channel, error_hierarchy)
                    return

                await client.replace_roles(user, role)
                await client.send_message(message.channel,
                                          "Done " + CHECK_MARK)

        # !cmd add
        elif startswith(prefix + "cmd add"):
            try:
                cut = str(message.content)[len(prefix +
                                               "cmd add "):].split("|")

                if len(cut) != 2:
                    await client.send_message(
                        message.channel,
                        "Incorrect parameters.\n`_cmd add trigger|response`".
                        replace("_", prefix))
                    return

                handler.update_command(message.server, cut[0], cut[1])

                await client.send_message(message.channel,
                                          "Command '{}' added.".format(cut[0]))

            except (KeyError or IndexError):
                await client.send_message(
                    message.channel,
                    ":no_entry_sign: Wrong args, separate command and response with |"
                )

        # !cmd remove
        elif startswith(prefix + "cmd remove"):
            cut = str(message.content)[len(prefix + "cmd remove "):]
            handler.remove_command(message.server, cut)

            await client.send_message(message.channel, "Ok " + CHECK_MARK)

        # !cmd list
        elif startswith(prefix + "cmd list"):
            custom_cmds = handler.get_custom_commands(message.server)

            if not custom_cmds:
                await client.send_message(
                    message.channel, "No custom commands on this server. "
                    "Add one with `_cmd add trigger|response`!".replace(
                        "_", prefix))

                return

            final = "\n".join([
                "{} : {}".format(name, content)
                for name, content in custom_cmds.items()
            ])

            await client.send_message(
                message.channel, "*Custom commands:*\n```" + final + "```")

        # nano.settings
        elif startswith("nano.settings"):
            try:
                cut = str(message.content)[len("nano.settings "):].rsplit(
                    " ", 1)
            except IndexError:
                return

            try:
                value = handler.update_moderation_settings(
                    message.channel.server, cut[0], get_decision(cut[1]))
            except IndexError:
                # stat.pluswrongarg()
                return

            if get_decision(cut[0],
                            ("word filter", "filter words", "wordfilter")):
                await client.send_message(
                    message.channel, "Word filter {}".format(
                        CHECK_MARK if value else CROSS_MARK))

            elif get_decision(cut[0],
                              ("spam filter", "spamfilter", "filter spam")):
                await client.send_message(
                    message.channel, "Spam filter {}".format(
                        CHECK_MARK if value else CROSS_MARK))

            elif get_decision(
                    cut[0], ("filterinvite", "filterinvites", "invite removal",
                             "invite filter", "invitefilter")):
                await client.send_message(
                    message.channel, "Invite filter {}".format(
                        CHECK_MARK if value else CROSS_MARK))

        # nano.displaysettings
        elif startswith("nano.displaysettings"):
            settings = handler.get_server_data(message.server.id)

            blacklisted_c = ",".join(settings.get("blacklisted"))
            if not blacklisted_c:
                blacklisted_c = "None"

            spam_filter = "On" if settings.get("filterspam") else "Off"
            word_filter = "On" if settings.get("filterwords") else "Off"
            invite_filter = "On" if settings.get("filterinvite") else "Off"

            log_channel = settings.get("logchannel") if settings.get(
                "logchannel") else "None"

            msg_join = settings.get("welcomemsg")
            msg_leave = settings.get("leavemsg")
            msg_ban = settings.get("banmsg")
            msg_kick = settings.get("kickmsg")

            final = """**Settings for current server:**```css
Blacklisted channels: {}
Spam filter: {}
Word filter: {}
Invite removal: {}
Log channel: {}
Prefix: {}```
Messages:
➤ Join: `{}`
➤ Leave: `{}`
➤ Ban: `{}`
➤ Kick: `{}`""".format(blacklisted_c, spam_filter,
                       word_filter, invite_filter, log_channel,
                       settings.get("prefix"), msg_join, msg_leave, msg_ban,
                       msg_kick)

            await client.send_message(message.channel, final)

        # nano.admins add
        elif startswith("nano.admins add"):
            if len(message.mentions) == 0:
                await client.send_message(
                    message.channel,
                    "Please mention the person you want to add.")
                return

            elif len(message.mentions) == 1:
                member = message.mentions[0]

            else:
                await client.send_message(message.channel, "One at a time :)")
                return

            handler.add_admin(message.server, member)

            await client.send_message(
                message.channel, "Added **{}** to admins.".format(member.name))

        # nano.admins remove
        elif startswith("nano.admins remove"):
            if len(message.mentions) == 0:
                await client.send_message(
                    message.channel,
                    "Please mention the person you want to add.")
                return

            elif len(message.mentions) == 1:
                member = message.mentions[0]

            else:
                await client.send_message(message.channel, "One at a time :)")
                return

            handler.remove_admin(message.server, member)

            await client.send_message(
                message.channel,
                "Removed **{}** from admins".format(member.name))

        # nano.admins list
        elif startswith("nano.admins list"):
            admins = handler.get_admins(message.server)

            if len(admins) == 0:
                await client.send_message(
                    message.channel,
                    "There are no Nano admins on this server.")

            else:
                final = ""

                for usr in admins:
                    user = utils.find(lambda u: u.id == usr,
                                      message.channel.server.members)
                    final += "{}, ".format(user.name)

                # Remove last comma and space
                final = final.strip(", ")

                if len(admins) == 1:
                    await client.send_message(
                        message.channel,
                        "**" + final + "** is the only admin here.")
                else:
                    await client.send_message(message.channel,
                                              "**Admins:** " + final)

        # nano.reset
        elif startswith("nano.serverreset"):
            await client.send_message(
                message.channel, WARNING +
                " Are you sure you want to reset all Nano-related sever settings to default? Confirm by replying 'CONFIRM'."
            )

            followup = await client.wait_for_message(author=message.author,
                                                     channel=message.channel,
                                                     timeout=15,
                                                     content="CONFIRM")

            if followup is None:
                await client.send_message(
                    message.channel,
                    "Confirmation not received, NOT resetting :upside_down:")

            handler.server_setup(message.server)

            await client.send_message(message.channel,
                                      "Reset. :white_check_mark: ")

        # !setup, nano.setup
        elif startswith(prefix + "setup", "nano.setup"):
            auth = message.author

            async def timeout(msg):
                await client.send_message(
                    msg.channel,
                    "You ran out of time :upside_down: (FYI: the timeout is 35 seconds)"
                )

            msg_intro = "**SERVER SETUP**\nYou have started the server setup. It consists of a few steps, " \
                        "where you will be prompted to answer.\n**Let's get started, shall we?**"
            await client.send_message(message.channel, msg_intro)
            await asyncio.sleep(2)

            # FIRST MESSAGE
            msg_one = "Do you want to reset all bot-related settings for this server?\n" \
                      "(this includes spam and swearing protection, admin list, blacklisted channels, \n" \
                      "log channel, prefix, welcome, ban and kick message). **yes / no**"
            await client.send_message(message.channel, msg_one)

            # First check

            def check_yes1(msg):
                # yes or no
                if str(msg.content).lower().strip(" ") == "yes":
                    handler.server_setup(message.channel.server)

                return True

            ch1 = await client.wait_for_message(timeout=35,
                                                author=auth,
                                                check=check_yes1)
            if ch1 is None:
                timeout(message)
                return

            # SECOND MESSAGE
            msg_two = "What prefix would you like to use for all commands?\n" \
                      "Type that prefix.\n(prefix example: **!** 'translates to' `!help`, `!ping`, ...)"
            await client.send_message(message.channel, msg_two)

            # Second check, does not need yes/no filter
            ch2 = await client.wait_for_message(timeout=35, author=auth)
            if ch2 is None:
                timeout(message)
                return

            if ch2.content:
                handler.change_prefix(message.channel.server,
                                      str(ch2.content).strip(" "))

            # THIRD MESSAGE
            msg_three = "What would you like me to say when a person joins your server?\n" \
                        "Reply with that message or with None if you want to disable welcome messages. \n" \
                        "(:user translates to a mention of the joined user; for example -> :user, welcome to this server!)"
            await client.send_message(message.channel, msg_three)

            ch3 = await client.wait_for_message(timeout=35, author=auth)
            if ch3 is None:
                timeout(message)
                return

            if ch3.content.strip(" ").lower() == "none":
                handler.update_var(message.server.id, "welcomemsg", None)
            else:
                handler.update_var(message.server.id, "welcomemsg",
                                   str(ch3.content))

            # FOURTH MESSAGE
            msg_four = """Would you like me to filter spam? **yes / no**"""
            await client.send_message(message.channel, msg_four)

            # Fourth check

            def check_yes3(msg):
                # yes or no

                if str(msg.content).lower().strip(" ") == "yes":
                    handler.update_moderation_settings(message.channel.server,
                                                       "filterspam", True)
                else:
                    handler.update_moderation_settings(message.channel.server,
                                                       "filterspam", False)

                return True

            ch3 = await client.wait_for_message(timeout=35,
                                                author=auth,
                                                check=check_yes3)
            if ch3 is None:
                timeout(message)
                return

            # FIFTH MESSAGE
            msg_five = """Would you like me to filter swearing? **yes / no**"""
            await client.send_message(message.channel, msg_five)

            # Fifth check check

            def check_yes4(msg):
                # yes or no

                if str(msg.content).lower().strip(" ") == "yes":
                    handler.update_moderation_settings(message.channel.server,
                                                       "filterwords", True)
                else:
                    handler.update_moderation_settings(message.channel.server,
                                                       "filterwords", False)

                return True

            ch4 = await client.wait_for_message(timeout=35,
                                                author=auth,
                                                check=check_yes4)
            if ch4 is None:
                timeout(message)
                return

            msg_final = """**This concludes the basic server setup.**
But there are a few more settings to set up if you need'em:
➤ channel blacklisting - `nano.blacklist add/remove channel_name`
➤ kick message - `_kickmsg message`
➤ ban message - `_banmsg message`

The prefix can simply be changed again with `nano.changeprefix prefix`.
Admin commands can only be used by people with a role named "Nano Admin". If you do not want to assign roles, use `nano.admins add @mention`.

You and all admins can also add/remove/list custom commands with `_cmd add/remove/list command|response`.
For a list of all commands, use `_cmds`.""".replace("_", str(ch2.content))

            await client.send_message(message.channel, msg_final)
コード例 #21
0
    async def on_message(self, message, **kwargs):
        assert isinstance(message, Message)

        client = self.client
        prefix = kwargs.get("prefix")

        if not is_valid_command(message.content, valid_commands, prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        if startswith(prefix + "imdb"):
            # The process can take some time so we show that something is happening
            await client.send_typing(message.channel)

            if startswith(prefix + "imdb plot") or startswith(prefix + "imdb story"):
                if startswith(prefix + "imdb plot"):
                    search = str(message.content[len(prefix + "imdb plot "):])
                else:
                    search = str(message.content[len(prefix + "imdb story "):])

                data = self.imdb.get_page_by_name(search)

                if not data:
                    await client.send_message(message.channel, "No results.")
                    return

                if data.type == PERSON:
                    return
                else:
                    await client.send_message(message.channel,
                                              "**{}**'s story\n```{}```".format(data.name, data.storyline))

            elif startswith(prefix + "imdb search"):
                search = str(message.content[len(prefix + "imdb search "):])
                data = self.imdb.get_page_by_name(search)

                if not data:
                    await client.send_message(message.channel, "No results.")
                    return

                if data.type == MOVIE:
                    st = """**{}** ({})\n\nLength: `{}`\nGenres: {}\nRating: **{}/10**\n\nDirector: *{}*\nSummary:
                    ```{}```""".format(data.name, data.year, data.length, str("`" + "`, `".join(data.genres) + "`"),
                                       data.rating, data.director, data.summary)

                elif data.type == SERIES:
                    st = """**{}** series\n\nGenres: {}\nRating: **{}/10**\n\nDirector: *{}*\nSummary:
                    ```{}```""".format(data.name, str("`" + "`, `".join(data.genres) + "`"), data.rating,
                                       data.director, data.summary)

                elif data.type == PERSON:
                    st = """**{}**\n\nKnown for: {}\nIMDB Rank: **{}**\n\nShort bio:
                    ```{}```""".format(data.name, str("`" + "`, `".join(data.known_for) + "`"), data.rank, data.short_bio)

                else:
                    return

                # Send the details
                await client.send_message(message.channel, st)

            elif startswith(prefix + "imdb trailer"):
                search = str(message.content[len(prefix + "imdb trailer "):])
                data = self.imdb.get_page_by_name(search)

                if not data:
                    await client.send_message(message.channel, "No results.")
                    return

                if data.type == PERSON:
                    return

                await client.send_message(message.channel,
                                          "**{}**'s trailer on IMDB: {}".format(data.name, data.trailer))

            elif startswith(prefix + "imdb rating"):
                search = str(message.content[len(prefix + "imdb rating "):])
                data = self.imdb.get_page_by_name(search)

                if not data:
                    await client.send_message(message.channel, "No results.")
                    return

                if not data.type == MOVIE:
                    await client.send_message(message.channel, "Only movies have Metascores.")
                    return

                await client.send_message(message.channel,
                                          "**{}**'s ratings on IMDB\nUser ratings: __{} out of 10__\n"
                                          "Metascore: __{}__".format(data.name, data.rating, data.metascore))

            else:
                await client.send_message(message.channel,
                                          "**IMDB help**\n\n`_imdb search [name or title]`, `_imdb plot [title]`, "
                                          "`_imdb trailer [title]`, `_imdb rating [title]`".replace("_", prefix))
コード例 #22
0
    async def on_message(self, message, **kwargs):
        prefix = kwargs.get("prefix")
        client = self.client
        mc = self.mc

        assert isinstance(client, Client)
        assert isinstance(message, Message)

        if not is_valid_command(message.content, valid_commands, prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        if startswith(prefix + "mc", prefix + "minecraft"):
            if startswith(prefix + "mc help", prefix + "minecraft help"):
                # Help message
                await client.send_message(message.channel,
                                          "**Minecraft**\n```css\n"
                                          "_mc name/id:meta - search for items and display their details```".replace("_", prefix))
                return

            elif startswith(prefix + "mc "):
                da = message.content[len(prefix + "mc "):]
            elif startswith(prefix + "minecraft "):
                da = message.content[len(prefix + "minecraft "):]

            else:
                return

            # Determines if arg is id or name
            if len(str(da).split(":")) > 1:
                typ = ITEM_ID_PAIR

            else:
                try:
                    int(da)
                    typ = ITEM_ID
                except ValueError:
                    typ = ITEM_NAME

            # Requests item data from minecraft plugin
            if typ == ITEM_ID_PAIR or typ == ITEM_ID:
                data = mc.id_to_data(da)
            else:
                # Check for groupings
                if mc.get_group_by_name(da):
                    data = mc.get_group_by_name(da)

                else:
                    data = mc.name_to_data(str(da))

            if not data:
                await client.send_message(message.channel, "**No item with that name/id**")
                self.stats.add(WRONG_ARG)
                return

            if not isinstance(data, list):
                details = "**{}**```css\nId: {}:{}```".format(data.get("name"), data.get("type"), data.get("meta"))

                # Details are uploaded simultaneously with the picture
                try:
                    with open("plugins/mc/{}-{}.png".format(data.get("type"), data.get("meta") or 0), "rb") as pic:
                        await client.send_file(message.channel, pic, content=details)
                        self.stats.add(IMAGE_SENT)
                except FileNotFoundError:
                    await client.send_message(message.channel, details)
                    self.stats.add(IMAGE_SENT)

            else:
                combined = []
                for item in data:
                    details = "**{}**```css\nId: {}:{}```".format(item.get("name"), item.get("type"), item.get("meta"))
                    combined.append(details)

                await client.send_message(message.channel, "".join(combined))
コード例 #23
0
    async def on_message(self, message, **kwargs):
        assert isinstance(message, Message)

        client = self.client
        prefix = kwargs.get("prefix")

        if not is_valid_command(message.content, valid_commands,
                                prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        if startswith((prefix + "imdb"), (prefix + "tmdb")):
            # The process can take some time so we show that something is happening
            await client.send_typing(message.channel)

            if startswith((prefix + "imdb plot"), (prefix + "tmdb plot")):
                search = str(message.content[len(prefix + "imdb plot "):])

                try:
                    data = await self.tmdb.search_multi(search)
                except tmdbie.TMDbException:
                    await client.send_message(
                        message.channel, "Something went wrong... Try again?")
                    raise

                if not data:
                    await client.send_message(message.channel, "No results.")
                    return

                if data.media_type not in ["tv", "movie"]:
                    await client.send_message(
                        message.channel,
                        "You can't get the plot of a person " +
                        StandardEmoji.SMILE)
                    return

                try:
                    info = "**{}**'s story\n```{}```".format(
                        data.title, data.overview)

                    await client.send_message(message.channel, info)
                except AttributeError:
                    await client.send_message(
                        message.channel,
                        "This title seems to have a missing plot description.")

            elif startswith((prefix + "imdb search"),
                            (prefix + "tmdb search")):
                search = str(message.content[len(prefix + "imdb search "):])

                try:
                    data = await self.tmdb.search_multi(search)
                except tmdbie.TMDbException:
                    await client.send_message(
                        message.channel, "Something went wrong... Try again?")
                    raise

                if not data:
                    await client.send_message(message.channel, "No results.")
                    return

                if data.media_type in ["tv", "movie"]:
                    info = []

                    # Step-by-step adding - some data might be missing
                    try:
                        media_type = "series" if data.media_type == "tv" else ""

                        info.append("**{}** {}\n".format(
                            data.title, media_type))
                    except AttributeError:
                        pass

                    try:
                        genres = "`{}`".format("`, `".join(data.genres))
                        info.append("Genres: {}".format(genres))
                    except AttributeError:
                        pass

                    try:
                        info.append("Average rating: **{}/10**".format(
                            data.vote_average))
                    except AttributeError:
                        pass

                    if data.media_type == "tv":
                        try:
                            info.append("Seasons: **{}**".format(
                                len(data.seasons)))
                        except AttributeError:
                            pass

                    try:
                        info.append("\nSummary:\n```{}```\n".format(
                            data.overview))
                    except AttributeError:
                        pass

                    try:
                        if data.poster:
                            info.append("Poster: {}".format(data.poster))
                    except AttributeError:
                        pass

                    # Compile together info that is available
                    media_info = "\n".join(info)

                else:
                    await client.send_message(
                        "Person search is not yet supported.")
                    return

                # Send the details
                try:
                    await client.send_message(message.channel, media_info)
                except errors.HTTPException:
                    await client.send_message(
                        message.channel,
                        "Something went wrong, please report it to the dev, preferably with a screenshot. Thanks!"
                    )

            elif startswith((prefix + "imdb trailer"),
                            (prefix + "tmdb trailer")):
                search = str(message.content[len(prefix + "imdb trailer "):])

                try:
                    data = await self.tmdb.search_multi(search)
                except tmdbie.TMDbException:
                    await client.send_message(
                        message.channel, "Something went wrong... Try again?")
                    raise

                if not data:
                    await client.send_message(message.channel, "No results.")
                    return

                try:
                    await client.send_message(
                        message.channel,
                        "**{}**'s trailers on IMDB:\n\n{}".format(
                            data.title, data.trailer))
                except AttributeError:
                    await client.send_message(
                        message.channel,
                        "This title appears to have no trailer on IMDb. ")

            elif startswith((prefix + "imdb rating"),
                            (prefix + "tmdb rating")):
                search = str(message.content[len(prefix + "imdb rating "):])

                try:
                    data = await self.tmdb.search_multi(search)
                except tmdbie.TMDbException:
                    await client.send_message(
                        message.channel, "Something went wrong... Try again?")
                    raise

                if not data:
                    await client.send_message(message.channel, "No results.")
                    return

                try:
                    content = "**{}**'s ratings\n\nUser ratings on TMDb: __**{}** out of 10__".format(
                        data.title, data.vote_average)
                    await client.send_message(message.channel, content)
                except AttributeError:
                    await client.send_message(
                        message.channel,
                        "It appears that this title does not have any ratings. Weird."
                    )

            else:
                await client.send_message(
                    message.channel,
                    "**TMDb/IMDb help**\n\n`_imdb search [name or title]`, `_imdb plot [title]`, "
                    "`_imdb trailer [title]`, `_imdb rating [title]`".replace(
                        "_", prefix))
コード例 #24
0
ファイル: reminder.py プロジェクト: tyblackbird/Nano
    async def on_message(self, message, **kwargs):
        client = self.client
        prefix = kwargs.get("prefix")

        assert isinstance(message, Message)
        assert isinstance(client, Client)

        if not is_valid_command(message.content, valid_commands, prefix=prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        # !remind me in [time]:[reminder]
        if startswith(prefix + "remind me in"):
            args = str(message.content)[len(prefix + "remind me in "):].strip().split(":")

            if not args[0].isnumeric():
                ttr = convert_to_seconds(args[0])
            else:
                ttr = int(args[0])

            resp = self.reminder.set_reminder(message.author, message.author, args[1], ttr)

            if resp == -1:
                await client.send_message(message.channel,
                                          "You have exceeded the maximum amount of reminders (**1** at once).")

            elif resp is False:
                await client.send_message(message.channel, "Not a valid time range (5 seconds to 2 days")

            else:
                await client.send_message(message.channel, "Reminder set :)")

        # !remind here in [time]:[reminder]
        elif startswith(prefix + "remind here in"):
            args = str(message.content)[len(prefix + "remind here in "):].strip().split(":")

            if not args[0].isnumeric():
                ttr = convert_to_seconds(args[0])
            else:
                ttr = int(args[0])

            resp = self.reminder.set_reminder(message.channel, message.author, args[1].strip(), ttr)

            if resp == -1:
                await client.send_message(message.channel,
                                          "You have exceeded the maximum amount of reminders (**1** at once).")

            elif resp is False:
                await client.send_message(message.channel, "Not a valid time range (5 seconds to 2 days")

            else:
                await client.send_message(message.channel, "Reminder set :)")

        # !remind list
        elif startswith(prefix + "remind list", prefix + "reminder list"):
            reminders = self.reminder.get_reminders(message.author)

            if not reminders:
                await client.send_message(message.channel, "You have not set any reminders.")
                return

            rem = []
            for reminder in reminders:
                # Gets the remaining time
                ttl = reminder.get("time_target") - time.time()

                cont = self.nano.get_plugin("commons").get("instance").at_everyone_filter(reminder.get("raw"), message.author, message.server)

                rem.append("➤ {} (in **{}**)".format(cont, resolve_time(ttl)))

            await client.send_message(message.channel, "Your reminders:\n" + "\n".join(rem))

        # !remind remove
        elif startswith(prefix + "remind remove"):
            r_name = message.content[len(prefix + "remind remove"):].strip()

            if r_name == "all":
                self.reminder.remove_all_reminders(message.author)

            else:
                r_resp = self.reminder.remove_reminder(message.author, r_name)

                if not r_resp:
                    await client.send_message(message.channel, "No reminder with such content.")
                else:
                    await client.send_message(message.channel, "Reminder removed.")

        # !remind help
        elif startswith(prefix + "remind", prefix + "remind help"):
            await client.send_message(message.channel, remind_help.replace("_", prefix))
コード例 #25
0
    async def on_message(self, message, **kwargs):
        if not is_valid_command(
                message.content, valid_commands, prefix=kwargs.get("prefix")):
            return
        else:
            self.stats.add(MESSAGE)

        assert isinstance(message, Message)
        client = self.client

        def startswith(*msg):
            for a in msg:
                if message.content.startswith(a):
                    return True

            return False

        # Global owner filter
        assert isinstance(self.handler, ServerHandler)

        if not self.handler.is_bot_owner(message.author.id):
            await client.send_message(
                message.channel,
                "You are not permitted to use this feature. (must be bot owner)"
            )
            return

        # nano.dev.get_servers
        if startswith("nano.dev.get_servers"):
            # /fixme message is still too long
            servers = [
                "{} ({} u) - `{}`".format(srv.name, srv.member_count, srv.id)
                for srv in client.servers
            ]

            final = [
                "\n".join(a) for a in
                [servers[i:i + 1500] for i in range(0, len(servers), 1500)]
            ]

            for chunk in final:
                await client.send_message(message.channel, chunk)

        # nano.dev.server_info [id]
        elif startswith("nano.dev.server_info"):
            id = message.content[len("nano.dev.server_info "):]

            srv = utils.find(lambda s: s.id == id, client.servers)

            if not srv:
                await client.send_message(message.channel, "Error. :x:")
                return

            nano_data = self.handler.get_server_data(srv.id)
            to_send = "{}\n```css\nMember count: {}\nChannels: {}\nOwner: {}```\n" \
                      "*Settings*: ```{}```".format(srv.name, srv.member_count, ",".join([ch.name for ch in srv.channels]), srv.owner.name, nano_data)

            await client.send_message(message.channel, to_send)

        # nano.dev.test_error
        elif startswith("nano.dev.test_error"):
            int("abcdef")

        # nano.dev.backup
        elif startswith("nano.dev.backup"):
            self.backup.manual_backup()
            await client.send_message(message.channel,
                                      "Backup completed :ok_hand:")

        # nano.reload
        elif startswith("nano.reload"):
            self.handler.reload()

            await client.send_message(message.channel,
                                      "Refreshed :muscle: :smile:")

        # nano.restart
        elif startswith("nano.restart"):
            m = await client.send_message(message.channel, "Restarting...")

            await client.send_message(message.channel, "**DED**")
            await client.delete_message(m)

            await client.logout()

            self.mode = "restart"
            return "shutdown"

        # nano.kill
        elif startswith("nano.kill"):
            await client.send_message(message.channel, "**DED**")

            await client.logout()

            self.mode = "exit"
            return "shutdown"

        # nano.playing
        elif startswith("nano.playing"):
            status = message.content[len("nano.playing "):]

            await client.change_presence(game=Game(name=str(status)))

            await client.send_message(message.channel, "Status changed :+1:")