Exemple #1
0
    async def plugins_registry_compact(self, ctx):
        """
        Shows a compact view of all plugins within the registry.
        """
        if ctx.guild.id == 722367471662923846:
            return

        await self.populate_registry()

        registry = sorted(self.registry.items(), key=lambda elem: elem[0])

        pages = [""]

        for plugin_name, details in registry:
            details = self.registry[plugin_name]
            user, repo = details["repository"].split("/", maxsplit=1)
            branch = details.get("branch")

            plugin = Plugin(user, repo, plugin_name, branch)

            desc = discord.utils.escape_markdown(
                details["description"].replace("\n", ""))

            name = f"[`{plugin.name}`]({plugin.link})"
            fmt = f"{name} - {desc}"

            if plugin_name in self.loaded_plugins:
                limit = 75 - len(plugin_name) - 4 - 8 + len(name)
                if limit < 0:
                    fmt = plugin.name
                    limit = 75
                fmt = truncate(fmt, limit) + "[loaded]\n"
            else:
                limit = 75 - len(plugin_name) - 4 + len(name)
                if limit < 0:
                    fmt = plugin.name
                    limit = 75
                fmt = truncate(fmt, limit) + "\n"

            if len(fmt) + len(pages[-1]) <= 2048:
                pages[-1] += fmt
            else:
                pages.append(fmt)

        embeds = []

        for page in pages:
            embed = discord.Embed(color=self.bot.main_color, description=page)
            embed.set_author(name="Plugin Registry",
                             icon_url=self.bot.user.avatar_url)
            embeds.append(embed)

        paginator = EmbedPaginatorSession(ctx, *embeds)
        await paginator.run()
Exemple #2
0
    async def vplugins_registry_compact(self, ctx):
        """
        Mostra una versione compatta del registro.
        """

        await self.populate_vregistry()

        registry = sorted(self.registry.items(), key=lambda elem: elem[0])

        pages = [""]

        for vplugin_name, details in registry:
            details = self.registry[vplugin_name]
            user, repo = details["repository"].split("/", maxsplit=1)
            branch = details.get("branch")

            plugin = Plugina(user, repo, vplugin_name, branch)

            desc = discord.utils.escape_markdown(
                details["description"].replace("\n", ""))

            name = f"[`{plugin.name}`]({plugin.link})"
            fmt = f"{name} - {desc}"

            if vplugin_name in self.loaded_plugins:
                limit = 75 - len(vplugin_name) - 4 - 8 + len(name)
                if limit < 0:
                    fmt = plugin.name
                    limit = 75
                fmt = truncate(fmt, limit) + "[loaded]\n"
            else:
                limit = 75 - len(vplugin_name) - 4 + len(name)
                if limit < 0:
                    fmt = plugin.name
                    limit = 75
                fmt = truncate(fmt, limit) + "\n"

            if len(fmt) + len(pages[-1]) <= 2048:
                pages[-1] += fmt
            else:
                pages.append(fmt)

        embeds = []

        for page in pages:
            embed = discord.Embed(color=self.bot.main_color, description=page)
            embed.set_author(name="Registro plugin",
                             icon_url=self.bot.user.avatar_url)
            embeds.append(embed)

        paginator = EmbedPaginatorSession(ctx, *embeds)
        await paginator.run()
    def embed(self) -> Embed:
        """
        Embed: the formatted `Embed` of this `Version`.
        """
        embed = Embed(color=self.bot.main_color, description=self.description)
        embed.set_author(
            name=f"v{self.version} - Changelog", icon_url=self.bot.user.avatar_url, url=self.url,
        )

        for name, value in self.fields.items():
            embed.add_field(name=name, value=truncate(value, 1024), inline=False)
        embed.set_footer(text=f"Current version: v{self.bot.version}")
        embed.set_thumbnail(url=self.bot.user.avatar_url)
        return embed
Exemple #4
0
    async def _close(self,
                     closer,
                     silent=False,
                     delete_channel=True,
                     message=None,
                     scheduled=False):
        try:
            self.manager.cache.pop(self.id)
        except KeyError as e:
            logger.error("Thread already closed: %s.", e)
            return

        await self.cancel_closure(all=True)

        # Cancel auto closing the thread if closed by any means.

        self.bot.config["subscriptions"].pop(str(self.id), None)
        self.bot.config["notification_squad"].pop(str(self.id), None)

        # Logging
        if self.channel:
            log_data = await self.bot.api.post_log(
                self.channel.id,
                {
                    "open": False,
                    "title": match_title(self.channel.topic),
                    "closed_at": str(datetime.utcnow()),
                    "nsfw": self.channel.nsfw,
                    "close_message": message if not silent else None,
                    "closer": {
                        "id": str(closer.id),
                        "name": closer.name,
                        "discriminator": closer.discriminator,
                        "avatar_url": str(closer.avatar_url),
                        "mod": True,
                    },
                },
            )
        else:
            log_data = None

        if isinstance(log_data, dict):
            prefix = self.bot.config["log_url_prefix"].strip("/")
            if prefix == "NONE":
                prefix = ""
            log_url = f"{self.bot.config['log_url'].strip('/')}{'/' + prefix if prefix else ''}/{log_data['key']}"

            if log_data["title"]:
                sneak_peak = log_data["title"]
            elif log_data["messages"]:
                content = str(log_data["messages"][0]["content"])
                sneak_peak = content.replace("\n", "")
            else:
                sneak_peak = "No content"

            if self.channel.nsfw:
                _nsfw = "NSFW-"
            else:
                _nsfw = ""

            desc = f"[`{_nsfw}{log_data['key']}`]({log_url}): "
            desc += truncate(sneak_peak, max=75 - 13)
        else:
            desc = "Could not resolve log url."
            log_url = None

        embed = discord.Embed(description=desc, color=self.bot.error_color)

        if self.recipient is not None:
            user = f"{self.recipient} (`{self.id}`)"
        else:
            user = f"`{self.id}`"

        if self.id == closer.id:
            _closer = "the Recipient"
        else:
            _closer = f"{closer} ({closer.id})"

        embed.title = user

        event = "Thread Closed as Scheduled" if scheduled else "Thread Closed"
        # embed.set_author(name=f"Event: {event}", url=log_url)
        embed.set_footer(text=f"{event} by {_closer}",
                         icon_url=closer.avatar_url)
        embed.timestamp = datetime.utcnow()

        tasks = [self.bot.config.update()]

        if self.bot.log_channel is not None and self.channel is not None:
            tasks.append(self.bot.log_channel.send(embed=embed))

        # Thread closed message

        embed = discord.Embed(
            title=self.bot.config["thread_close_title"],
            color=self.bot.error_color,
        )
        if self.bot.config["show_timestamp"]:
            embed.timestamp = datetime.utcnow()

        if not message:
            if self.id == closer.id:
                message = self.bot.config["thread_self_close_response"]
            else:
                message = self.bot.config["thread_close_response"]

        message = self.bot.formatter.format(
            message,
            closer=closer,
            loglink=log_url,
            logkey=log_data["key"] if log_data else None)

        embed.description = message
        footer = self.bot.config["thread_close_footer"]
        embed.set_footer(text=footer, icon_url=self.bot.guild.icon_url)

        if not silent and self.recipient is not None:
            tasks.append(self.recipient.send(embed=embed))

        if delete_channel:
            tasks.append(self.channel.delete())

        await asyncio.gather(*tasks)
        self.bot.dispatch("thread_close", self, closer, silent, delete_channel,
                          message, scheduled)
Exemple #5
0
    async def _close(self,
                     closer,
                     silent=False,
                     delete_channel=True,
                     message=None,
                     scheduled=False):
        del self.manager.cache[self.id]

        await self.cancel_closure()

        if str(self.id) in self.bot.config.subscriptions:
            del self.bot.config.subscriptions[str(self.id)]

        # Logging
        log_data = await self.bot.api.post_log(
            self.channel.id, {
                'open': False,
                'closed_at': str(datetime.utcnow()),
                'close_message': message if not silent else None,
                'closer': {
                    'id': str(closer.id),
                    'name': closer.name,
                    'discriminator': closer.discriminator,
                    'avatar_url': closer.avatar_url,
                    'mod': True
                }
            })

        if log_data is not None and isinstance(log_data, dict):
            if self.bot.self_hosted:
                log_url = f"{self.bot.config.log_url.strip('/')}/" \
                    f"logs/{log_data['key']}"
            else:
                log_url = f"https://logs.modmail.tk/{log_data['key']}"

            if log_data['messages']:
                content = str(log_data['messages'][0]['content'])
                sneak_peak = content.replace('\n', '')
            else:
                sneak_peak = 'No content'

            desc = f"[`{log_data['key']}`]({log_url}): "
            desc += truncate(sneak_peak, max=75 - 13)
        else:
            desc = "Could not resolve log url."

        embed = discord.Embed(description=desc, color=discord.Color.red())

        if self.recipient is not None:
            user = f"{self.recipient} (`{self.id}`)"
        else:
            user = f'`{self.id}`'

        embed.title = user

        event = 'Thread Closed as Scheduled' if scheduled else 'Thread Closed'
        # embed.set_author(name=f'Event: {event}', url=log_url)
        embed.set_footer(text=f'{event} by {closer} ({closer.id})')
        embed.timestamp = datetime.utcnow()

        tasks = [self.bot.config.update()]

        if self.bot.log_channel:
            tasks.append(self.bot.log_channel.send(embed=embed))

        # Thread closed message

        embed = discord.Embed(title='Thread Closed',
                              color=discord.Color.red(),
                              timestamp=datetime.utcnow())

        if not message:
            message = f'{closer.mention} has closed this Modmail thread.'
        embed.description = message
        embed.set_footer(text='Replying will create a new thread',
                         icon_url=self.bot.guild.icon_url)

        if not silent and self.recipient is not None:
            tasks.append(self.recipient.send(embed=embed))

        if delete_channel:
            tasks.append(self.channel.delete())

        await asyncio.gather(*tasks)
Exemple #6
0
    async def _close(self, closer, silent=False, delete_channel=True,
                     message=None, scheduled=False):
        del self.manager.cache[self.id]

        await self.cancel_closure()

        if str(self.id) in self.bot.config.subscriptions:
            del self.bot.config.subscriptions[str(self.id)]

        # Logging
        log_data = await self.bot.api.post_log(self.channel.id, {
            'open': False,
            'closed_at': str(datetime.utcnow()),
            'close_message': message if not silent else None,
            'closer': {
                'id': str(closer.id),
                'name': closer.name,
                'discriminator': closer.discriminator,
                'avatar_url': str(closer.avatar_url),
                'mod': True
            }
        })

        if log_data is not None and isinstance(log_data, dict):
            prefix = os.getenv('LOG_URL_PREFIX', '/logs')
            if prefix == 'NONE':
                prefix = ''
            log_url = f"{self.bot.config.log_url.strip('/')}{prefix}/{log_data['key']}"

            if log_data['messages']:
                content = str(log_data['messages'][0]['content'])
                sneak_peak = content.replace('\n', '')
            else:
                sneak_peak = 'No content'

            desc = f"[`{log_data['key']}`]({log_url}): "
            desc += truncate(sneak_peak, max=75 - 13)
        else:
            desc = "Could not resolve log url."
            log_url = None

        embed = discord.Embed(description=desc, color=discord.Color.red())

        if self.recipient is not None:
            user = f"{self.recipient} (`{self.id}`)"
        else:
            user = f'`{self.id}`'

        if self.id == closer.id:
            _closer = 'the recipent'
        else:
            _closer = f'{closer} ({closer.id})'

        embed.title = user

        event = 'Thread Closed as Scheduled' if scheduled else 'Thread Closed'
        # embed.set_author(name=f'Event: {event}', url=log_url)
        embed.set_footer(text=f'{event} by {_closer}')
        embed.timestamp = datetime.utcnow()

        tasks = [
            self.bot.config.update()
        ]

        try:
            tasks.append(self.bot.log_channel.send(embed=embed))
        except (ValueError, AttributeError):
            pass

        # Thread closed message

        embed = discord.Embed(
            title=self.bot.config.get('thread_close_title', 'Thread Closed'),
            color=discord.Color.red(),
            timestamp=datetime.utcnow())

        if not message:
            if self.id == closer.id:
                message = self.bot.config.get(
                    'thread_self_close_response',
                    'You have closed this Modmail thread.'
                )
            else:
                message = self.bot.config.get(
                    'thread_close_response',
                    '{closer.mention} has closed this Modmail thread.'
                )

        message = message.format(closer=closer, loglink=log_url,
                                 logkey=log_data['key'])

        embed.description = message
        footer = self.bot.config.get('thread_close_footer',
                                     'Replying will create a new thread')
        embed.set_footer(text=footer,
                         icon_url=self.bot.guild.icon_url)

        if not silent and self.recipient is not None:
            tasks.append(self.recipient.send(embed=embed))

        if delete_channel:
            tasks.append(self.channel.delete())

        await asyncio.gather(*tasks)
Exemple #7
0
    async def _close(self,
                     closer,
                     silent=False,
                     delete_channel=True,
                     message=None,
                     scheduled=False):
        del self.manager.cache[self.id]

        await self.cancel_closure()

        if str(self.id) in self.bot.config.subscriptions:
            del self.bot.config.subscriptions[str(self.id)]

        # Logging
        log_data = await self.bot.api.post_log(
            self.channel.id,
            {
                "open": False,
                "closed_at": str(datetime.utcnow()),
                "close_message": message if not silent else None,
                "closer": {
                    "id": str(closer.id),
                    "name": closer.name,
                    "discriminator": closer.discriminator,
                    "avatar_url": str(closer.avatar_url),
                    "mod": True,
                },
            },
        )

        if log_data is not None and isinstance(log_data, dict):
            prefix = os.getenv("LOG_URL_PREFIX", "/logs")
            if prefix == "NONE":
                prefix = ""
            log_url = f"{self.bot.config.log_url.strip('/')}{prefix}/{log_data['key']}"

            if log_data["messages"]:
                content = str(log_data["messages"][0]["content"])
                sneak_peak = content.replace("\n", "")
            else:
                sneak_peak = "No content"

            desc = f"[`{log_data['key']}`]({log_url}): "
            desc += truncate(sneak_peak, max=75 - 13)
        else:
            desc = "Could not resolve log url."
            log_url = None

        embed = discord.Embed(description=desc, color=discord.Color.red())

        if self.recipient is not None:
            user = f"{self.recipient} (`{self.id}`)"
        else:
            user = f"`{self.id}`"

        if self.id == closer.id:
            _closer = "the Recipient"
        else:
            _closer = f"{closer} ({closer.id})"

        embed.title = user

        event = "Thread Closed as Scheduled" if scheduled else "Thread Closed"
        # embed.set_author(name=f'Event: {event}', url=log_url)
        embed.set_footer(text=f"{event} by {_closer}")
        embed.timestamp = datetime.utcnow()

        tasks = [self.bot.config.update()]

        try:
            tasks.append(self.bot.log_channel.send(embed=embed))
        except (ValueError, AttributeError):
            pass

        # Thread closed message

        embed = discord.Embed(
            title=self.bot.config.get("thread_close_title", "Thread Closed"),
            color=discord.Color.red(),
            timestamp=datetime.utcnow(),
        )

        if not message:
            if self.id == closer.id:
                message = self.bot.config.get(
                    "thread_self_close_response",
                    "You have closed this Modmail thread.")
            else:
                message = self.bot.config.get(
                    "thread_close_response",
                    "{closer.mention} has closed this Modmail thread.",
                )

        message = message.format(closer=closer,
                                 loglink=log_url,
                                 logkey=log_data["key"])

        embed.description = message
        footer = self.bot.config.get("thread_close_footer",
                                     "Replying will create a new thread")
        embed.set_footer(text=footer, icon_url=self.bot.guild.icon_url)

        if not silent and self.recipient is not None:
            tasks.append(self.recipient.send(embed=embed))

        if delete_channel:
            tasks.append(self.channel.delete())

        await asyncio.gather(*tasks)