aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/cogs/codeblock/cog.py43
-rw-r--r--bot/cogs/codeblock/instructions.py2
-rw-r--r--bot/cogs/codeblock/parsing.py4
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