From 34e9af2f94c34980c5048f19255a8993eb64a03b Mon Sep 17 00:00:00 2001 From: NotSoToothless <67082114+FURRO404@users.noreply.github.com> Date: Wed, 13 May 2026 23:55:44 -0700 Subject: [PATCH] make TSSBOT/start_bot.py a real Discord bot and reuse SREBOT venv (#1227) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TSSBOT/start_bot.py: replace the print-and-idle stub with a minimal discord.py Client (commands.Bot with default+message_content intents). Loads TSSBOT/.env via python-dotenv, reads DISCORD_KEY, logs on_ready, handles SIGTERM/SIGINT cleanly. Aborts with a clear error if the token is missing instead of silently exit-looping. - TSSBOT/ecosystem.config.js: switch the default interpreter from system python3 to SREBOT's venv (../SREBOT/.venv/bin/python). Both bots share BOTS/SHARED and the same baseline deps (discord.py, dotenv, …); split into a dedicated TSSBOT/.venv only when the dependency sets diverge. Co-authored-by: Claude Opus 4.7 (1M context) --- ecosystem.config.js | 9 +++++---- start_bot.py | 40 ++++++++++++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/ecosystem.config.js b/ecosystem.config.js index a2a352a..e189de3 100644 --- a/ecosystem.config.js +++ b/ecosystem.config.js @@ -4,10 +4,11 @@ require('dotenv').config(); // you need to point at a different checkout (e.g. local dev). const DEPLOY_PATH = process.env.TSSBOT_DEPLOY_PATH || __dirname; -// Default to system python until TSSBOT grows its own dependency set. -// When BOT/botscript.py lands, create TSSBOT/.venv and switch this to -// `${DEPLOY_PATH}/.venv/bin/python`. -const PY_INTERPRETER = process.env.TSSBOT_PY_INTERPRETER || 'python3'; +// Reuse SREBOT's venv by default — both bots share BOTS/SHARED and most +// runtime deps (discord.py, dotenv, etc.). Split into TSSBOT/.venv once +// the dep sets diverge meaningfully. +const PY_INTERPRETER = + process.env.TSSBOT_PY_INTERPRETER || `${DEPLOY_PATH}/../SREBOT/.venv/bin/python`; module.exports = { apps: [ diff --git a/start_bot.py b/start_bot.py index 91f0322..7062c53 100644 --- a/start_bot.py +++ b/start_bot.py @@ -1,8 +1,9 @@ #!/usr/bin/env python3 -"""Entry point for TSSBOT. Skeleton — idles until BOT/botscript.py is wired.""" +"""Entry point for TSSBOT. Connects to Discord and idles until commands land.""" +import logging +import os import signal import sys -import time from pathlib import Path # Make TSSBOT root and BOTS/SHARED importable. @@ -10,15 +11,42 @@ _HERE = Path(__file__).resolve().parent sys.path.insert(0, str(_HERE)) sys.path.insert(0, str(_HERE.parent / "SHARED")) +import discord +from discord.ext import commands +from dotenv import load_dotenv + +load_dotenv(dotenv_path=_HERE / ".env") + +logging.basicConfig( + level=logging.INFO, + format="[%(asctime)s] [%(levelname)s] [tssbot] %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", +) +log = logging.getLogger("tssbot") + def _handle_signal(signum, _frame): - print(f"[tssbot] received signal {signum}, exiting") + log.info(f"received signal {signum}, exiting") sys.exit(0) +TOKEN = os.environ.get("DISCORD_KEY", "").strip() + +intents = discord.Intents.default() +intents.message_content = True +bot = commands.Bot(command_prefix="!", intents=intents) + + +@bot.event +async def on_ready(): + log.info(f"logged in as {bot.user} (id={bot.user.id if bot.user else '?'})") + log.info(f"connected to {len(bot.guilds)} guild(s)") + + if __name__ == "__main__": signal.signal(signal.SIGTERM, _handle_signal) signal.signal(signal.SIGINT, _handle_signal) - print("[tssbot] skeleton booted — replace with real bot once BOT/botscript.py exists") - while True: - time.sleep(60) + if not TOKEN: + log.error("DISCORD_KEY not set in TSSBOT/.env — aborting") + sys.exit(1) + bot.run(TOKEN, log_handler=None)