Пример #1
0
    async def on_message(self, message, **kwargs):
        client = self.client

        prefix = kwargs.get("prefix")
        lang = kwargs.get("lang")

        # Check if this is a valid command
        if not is_valid_command(message.content, commands, prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*matches):
            for match in matches:
                if message.content.startswith(match):
                    return True

            return False

        # Global owner filter

        if not self.handler.is_bot_owner(message.author.id):
            await message.channel.send(self.trans.get("PERM_OWNER", lang))
            return

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

            srv = utils.find(lambda b: b.id == s_id, client.guilds)

            if not srv:
                await message.channel.send("No such guild. " + 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 message.channel.send(to_send)

        # nano.dev.test_exception
        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 message.channel.send("Stats", embed=emb)

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

        # nano.dev.leave_server
        elif startswith("nano.dev.leave_server"):
            try:
                sid = int(message.content[len("nano.dev.leave_server "):])
            except ValueError:
                await message.channel.send("Not a number.")
                return

            srv = await self.client.get_guild(sid)
            await srv.leave()
            await message.channel.send("Left {}".format(srv.id))

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

            await message.channel.send("Re-downloaded data...")

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

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

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

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

        # nano.restart
        elif startswith("nano.restart"):
            await message.channel.send("**DED, but gonna come back**")

            await client.logout()

            self.shutdown_mode = "restart"
            return "shutdown"

        # nano.kill
        elif startswith("nano.kill"):
            await message.channel.send("**DED**")

            await client.logout()

            self.shutdown_mode = "exit"
            return "shutdown"

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

            await client.change_presence(activity=Game(name=str(status)))
            await message.channel.send("Status changed " + StandardEmoji.THUMBS_UP)

        # nano.dev.translations.reload
        elif startswith("nano.dev.translations.reload"):
            self.trans.reload_translations()

            await message.channel.send(StandardEmoji.PERFECT)

        # nano.dev.test_default_channel
        elif startswith("nano.dev.test_default_channel"):
            df = await self.default_channel(message.guild)

            if not df:
                await message.channel.send("No default channel? w a t")
                return

            await message.channel.send("Default channel is {}, sending test message".format(df.mention))
            await df.send("This is a test message. Apparently everything is ok.")

        # nano.dev.announce
        elif startswith("nano.dev.announce"):
            await message.channel.send("Sending... ")
            ann = message.content[len("nano.dev.announce "):]

            s = []
            for g in self.client.guilds:
                try:
                    d_chan = await self.default_channel(g)
                    await d_chan.send(ann)
                    log_to_file("Sent announcement for {}".format(g.name))
                    s.append(g.name)
                except DiscordException:
                    log_to_file("Couldn't send announcement for {}".format(g.name))

            await message.channel.send("Sent to {} servers".format(len(s)))

        # nano.dev.userdetective

        elif startswith("nano.dev.userdetective"):
            param = str(message.content[len(prefix + "nano.dev.userdetective"):])

            # Number
            if param.isdigit():
                user = self.client.get_user(int(param))
                if not user:
                    await message.channel.send("No user with such ID.")
                    return
            elif len(message.mentions) > 0:
                user = message.mentions[0]
            else:
                members = [user for user in self.client.get_all_members()
                           if user.name == param]

                if not members:
                    await message.channel.send("No users with that name.")
                    return

                user = members[0]

            srv_in_common = 0
            server_table_temp = []
            # Loop though servers and find ones the user is in
            for srv in self.client.guilds:
                mem = srv.get_member(user.id)
                if mem:
                    srv_in_common += 1
                    server_table_temp.append("{}: {}".format(srv.name, mem.display_name))


            join_time_ago = int((datetime.now() - user.created_at).total_seconds())
            join_time_ago = resolve_time(join_time_ago, "en")

            embed = Embed(title="{}#{}{}".format(user.name, user.discriminator, ":robot:" if user.bot else ""), description="ID: {}".format(user.id))
            embed.add_field(name="Joined Discord", value="**{}** ago\nISO time: {}".format(join_time_ago, user.created_at))
            embed.add_field(name="Avatar url", value=user.avatar_url_as(format="png"))
            embed.add_field(name="Servers in common", value="**{}** on this shard:\n```http\n{}```".format(srv_in_common, "\n".join(server_table_temp)))

            await message.channel.send(embed=embed)
Пример #2
0
    async def on_message(self, message, **kwargs):
        trans = self.trans

        prefix = kwargs.get("prefix")
        lang = kwargs.get("lang")

        # Check if this is a valid command
        if not is_valid_command(message.content, commands, prefix):
            return
        else:
            self.stats.add(MESSAGE)

        def startswith(*matches):
            for match in matches:
                if message.content.startswith(match):
                    return True

            return False

        # !remind me in [time]:[text] or [time] to [text]
        if startswith(prefix + "remind me in"):
            try:
                r_time, text = await self.parse_parameters(
                    message,
                    len(prefix) + 13, lang,
                    trans.get("MSG_REMINDER_WU_ME",
                              lang).format(prefix=prefix))
            # Raised when reminder content is too long
            except ValueError:
                await message.channel.send(
                    trans.get("MSG_REMINDER_TOO_LONG_CONTENT",
                              lang).format(REM_MAX_CONTENT))
                return

            resp = self.reminder.set_reminder(message.author, message.author,
                                              text, r_time, lang)

            # Too many reminders going on
            if resp == -1:
                await message.channel.send(
                    trans.get("MSG_REMINDER_LIMIT_EXCEEDED",
                              lang).format(DEFAULT_REMINDER_LIMIT))

            # Invalid range
            elif resp is False:
                await message.channel.send(
                    trans.get("MSG_REMINDER_INVALID_RANGE",
                              lang).format(REM_MIN_DURATION, REM_MAX_DAYS))

            # Everything valid
            else:
                await message.channel.send(trans.get("MSG_REMINDER_SET", lang))

        # !remind here in [time]:[reminder]
        elif startswith(prefix + "remind here in"):
            try:
                r_time, text = await self.parse_parameters(
                    message,
                    len(prefix) + 13, lang,
                    trans.get("MSG_REMINDER_WU_HERE",
                              lang).format(prefix=prefix))
            # Raised when reminder content is too long
            except ValueError:
                await message.channel.send(
                    trans.get("MSG_REMINDER_TOO_LONG_CONTENT",
                              lang).format(REM_MAX_CONTENT))
                return

            resp = self.reminder.set_reminder(message.channel,
                                              message.author,
                                              text,
                                              r_time,
                                              lang,
                                              reminder_type=REMINDER_CHANNEL)

            if resp == -1:
                await message.channel.send(
                    trans.get("MSG_REMINDER_LIMIT_EXCEEDED",
                              lang).format(DEFAULT_REMINDER_LIMIT))

            elif resp is False:
                await message.channel.send(
                    trans.get("MSG_REMINDER_INVALID_RANGE",
                              lang).format(REM_MIN_DURATION, REM_MAX_DAYS))

            else:
                await message.channel.send(trans.get("MSG_REMINDER_SET", lang))

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

            if not reminders:
                await message.channel.send(
                    trans.get("MSG_REMINDER_LIST_NONE", lang))
                return

            rem = []
            rem_literal = trans.get("MSG_REMINDER_LIST_L", lang)

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

                cont = self.filter(reminder.get("raw"), message.author)

                # Zero or negative number
                if ttl <= 0:
                    when = trans.get("MSG_REMINDER_SOON", lang)
                else:
                    when = resolve_time(ttl, lang)

                rem.append(rem_literal.format(cont, when))

            await message.channel.send(
                trans.get("MSG_REMINDER_LIST", lang).format("\n\n".join(rem)))

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

            if not r_name:
                await message.channel.send(
                    trans.get("ERROR_INVALID_CMD_ARGUMENTS", lang))
                return

            if r_name == "all":
                self.reminder.remove_all_reminders(message.author.id)
                await message.channel.send(
                    trans.get("MSG_REMINDER_DELETE_ALL", lang))
                return

            else:
                r_id = self.reminder.find_id_from_content(
                    message.author.id, r_name)

                # No reminder with such content
                if not r_id:
                    await message.channel.send(
                        trans.get("MSG_REMINDER_DELETE_NONE", lang))
                else:
                    self.reminder.remove_reminder(message.author.id, r_id)
                    await message.channel.send(
                        trans.get("MSG_REMINDER_DELETE_SUCCESS", lang))

        # !remind help
        elif startswith(prefix + "remind"):
            await message.channel.send(
                trans.get("MSG_REMINDER_HELP", lang).format(prefix=prefix))