diff options
Diffstat (limited to '')
| -rw-r--r-- | bot/cogs/codeblock/cog.py | 43 | ||||
| -rw-r--r-- | bot/cogs/codeblock/instructions.py | 2 | ||||
| -rw-r--r-- | bot/cogs/codeblock/parsing.py | 4 | 
3 files changed, 42 insertions, 7 deletions
diff --git a/bot/cogs/codeblock/cog.py b/bot/cogs/codeblock/cog.py index 80d5adff3..c1b2b1c68 100644 --- a/bot/cogs/codeblock/cog.py +++ b/bot/cogs/codeblock/cog.py @@ -15,22 +15,53 @@ log = logging.getLogger(__name__)  class CodeBlockCog(Cog, name="Code Block"): -    """Detect improperly formatted code blocks and suggest proper formatting.""" +    """ +    Detect improperly formatted Markdown code blocks and suggest proper formatting. + +    There are four basic ways in which a code block is considered improperly formatted: + +    1. The code is not within a code block at all +        * Ignored if the code is not valid Python or Python REPL code +    2. Incorrect characters are used for backticks +    3. A language for syntax highlighting is not specified +        * Ignored if the code is not valid Python or Python REPL code +    4. A syntax highlighting language is incorrectly specified +        * Ignored if the language specified doesn't look like it was meant for Python +        * This can go wrong in two ways: +            1. Spaces before the language +            2. No newline immediately following the language + +    Messages with 3 or fewer lines overall are ignored. Each code block is subject to this threshold +    as well i.e. the text between the ticks must be greater than 3 lines. Detecting multiple code +    blocks is supported. However, if at least one code block is correct, then instructions will not +    be sent even if others are incorrect. When multiple incorrect code blocks are found, only the +    first one is used as the basis for the instructions sent. + +    When an issue is detected, an embed is sent containing specific instructions on fixing what +    is wrong. If the user edits their message to fix the code block, the instructions will be +    removed. If they fail to fix the code block with an edit, the instructions will be updated to +    show what is still incorrect after the user's edit. The embed can be manually deleted with a +    reaction. Otherwise, it will automatically be removed after 5 minutes. + +    The cog only detects messages in whitelisted channels. Channels may also have a 300-second +    cooldown on the instructions being sent. See `__init__` for which channels are whitelisted or +    have cooldowns enabled. Note that all help channels are also whitelisted with cooldowns enabled. +    """      def __init__(self, bot: Bot):          self.bot = bot -        # Stores allowed channels plus epoch time since last call. +        # Stores allowed channels plus epoch times since the last instructional messages sent.          self.channel_cooldowns = {              Channels.python_discussion: 0,          } -        # These channels will also work, but will not be subject to cooldown +        # These channels will also work, but will not be subject to a cooldown.          self.channel_whitelist = (              Channels.bot_commands,          ) -        # Stores improperly formatted Python codeblock message ids and the corresponding bot message +        # Maps users' messages to the messages the bot sent with instructions.          self.codeblock_message_ids = {}      @staticmethod @@ -73,7 +104,7 @@ class CodeBlockCog(Cog, name="Code Block"):          return (time.time() - self.channel_cooldowns.get(channel.id, 0)) < 300      def is_valid_channel(self, channel: discord.TextChannel) -> bool: -        """Return True if `channel` is a help channel, may be on cooldown, or is whitelisted.""" +        """Return True if `channel` is a help channel, may be on a cooldown, or is whitelisted."""          log.trace(f"Checking if #{channel} qualifies for code block detection.")          return (              self.is_help_channel(channel) @@ -137,7 +168,7 @@ class CodeBlockCog(Cog, name="Code Block"):      @Cog.listener()      async def on_raw_message_edit(self, payload: RawMessageUpdateEvent) -> None: -        """Delete the instructions message if an edited message had its code blocks fixed.""" +        """Delete the instructional message if an edited message had its code blocks fixed."""          if payload.message_id not in self.codeblock_message_ids:              log.trace(f"Ignoring message edit {payload.message_id}: message isn't being tracked.")              return diff --git a/bot/cogs/codeblock/instructions.py b/bot/cogs/codeblock/instructions.py index 880572d58..80f82ef34 100644 --- a/bot/cogs/codeblock/instructions.py +++ b/bot/cogs/codeblock/instructions.py @@ -1,3 +1,5 @@ +"""This module generates and formats instructional messages about fixing Markdown code blocks.""" +  import logging  from typing import Optional diff --git a/bot/cogs/codeblock/parsing.py b/bot/cogs/codeblock/parsing.py index 6fa6811cc..1bdb3b492 100644 --- a/bot/cogs/codeblock/parsing.py +++ b/bot/cogs/codeblock/parsing.py @@ -1,3 +1,5 @@ +"""This module provides functions for parsing Markdown code blocks.""" +  import ast  import logging  import re @@ -63,7 +65,7 @@ def find_code_blocks(message: str) -> Optional[Sequence[CodeBlock]]:      """      Find and return all Markdown code blocks in the `message`. -    Code blocks with 3 or less lines are excluded. +    Code blocks with 3 or fewer lines are excluded.      If the `message` contains at least one code block with valid ticks and a specified language,      return None. This is based on the assumption that if the user managed to get one code block  |