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()
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
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)
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)
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)
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)