diff --git a/bot.py b/bot.py
index 74b9a23..efab1b3 100644
--- a/bot.py
+++ b/bot.py
@@ -9,7 +9,7 @@ from modules.common.boot_notice import post_boot_notice
# Version consists of:
# Major.Enhancement.Minor.Patch.Test (Test is alphanumeric; doesn’t trigger auto update)
-VERSION = "0.4.0.0.a4"
+VERSION = "0.4.0.0.a5"
# ---------- Env loading ----------
diff --git a/modules/docs_site/docs_site.py b/modules/docs_site/docs_site.py
index 63abc34..f989d9a 100644
--- a/modules/docs_site/docs_site.py
+++ b/modules/docs_site/docs_site.py
@@ -634,6 +634,9 @@ _HTML = """
.flag-emoji { height:1em; width:auto; vertical-align:-0.18em; border-radius:2px; display:inline-block; }
footer { margin-top:16px; color:var(--muted); font-size:12px; text-align:center; }
footer .line { margin:4px 0; }
+ footer a { color: var(--fg); text-decoration: none; border-bottom: 1px dotted #334155; }
+ footer a:hover { text-decoration: underline; }
+
/* Copy modal */
#copyModal { position: fixed; inset: 0; display:none; align-items:center; justify-content:center; z-index: 10; }
@@ -720,11 +723,13 @@ _HTML = """
-
+
@@ -866,7 +871,7 @@ function openCopyModal(text) {
}
function moduleSansPrefix(r) {
const m = r.module || '';
- return m.replace(/^modules?\\./, '');
+ return m.replace(/^modules?\./, '').replace(/^discord\.ext\./, '');
}
async function shareFor(r) {
@@ -1152,6 +1157,28 @@ class _DocsHandler(BaseHTTPRequestHandler):
schema = build_command_schema(self.bot)
inline = json.dumps(_to_primitive(schema), ensure_ascii=False, separators=(",", ":"))
html = html.replace("", f"")
+
+ # Inject support link + visibility
+ support_url = getattr(_DocsHandler, "support_url", "") or ""
+ support_label = getattr(_DocsHandler, "support_label", "Buy me a ☕")
+ vis = "block" if support_url else "none"
+
+ html = (html
+ .replace("__SUPPORT_URL__", support_url)
+ .replace("__SUPPORT_LABEL__", support_label)
+ .replace("__SUPPORT_VIS__", vis)
+ )
+
+ # Fallback to values stored on the cog (we’ll wire them below in _start_server)
+ support_url = support_url or getattr(_DocsHandler, "support_url", "")
+ support_label = support_label or getattr(_DocsHandler, "support_label", "Buy me a ☕")
+ vis = "block" if support_url else "none"
+
+ html = (html
+ .replace("__SUPPORT_URL__", support_url)
+ .replace("__SUPPORT_LABEL__", support_label)
+ .replace("__SUPPORT_VIS__", vis)
+ )
except Exception:
traceback.print_exc()
self.wfile.write(html.encode("utf-8"))
@@ -1188,6 +1215,8 @@ class _DocsHandler(BaseHTTPRequestHandler):
def _start_server(bot: commands.Bot, host: str, port: int, title: str):
_DocsHandler.bot = bot
_DocsHandler.title = title
+ _DocsHandler.support_url = getattr(bot, "docs_support_url", None)
+ _DocsHandler.support_label = getattr(bot, "docs_support_label", None)
_DocsHandler.force_ready = os.getenv("SHAI_OFFLINE", "").lower() in {"1", "true", "yes"}
httpd = ThreadingHTTPServer((host, port), _DocsHandler)
@@ -1207,9 +1236,19 @@ class DocsSite(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
r = cfg(bot)
+
self.host = r.get("docs_host", "0.0.0.0") # SHAI_DOCS_HOST
self.port = r.int("docs_port", 8910) # SHAI_DOCS_PORT
self.title = r.get("docs_title", "ShaiWatcher Commands") # SHAI_DOCS_TITLE
+
+ # Support link config
+ self.support_url = r.get("docs_support_url", "https://throne.com/ookamikuntv/item/39590391-c582-4c5d-8795-fe6f1925eaae")
+ self.support_label = r.get("docs_support_label", "Buy me a ☕")
+
+ # Expose to handler via bot (read in _start_server)
+ self.bot.docs_support_url = self.support_url
+ self.bot.docs_support_label = self.support_label
+
_start_server(self.bot, self.host, self.port, self.title)
def force_ready(self, value: bool = True):