Skip to content

Commit ac99953

Browse files
committed
fix: resolve bot lifecycle conflicts, fix reconfigure button, redesign GUI with Apple-style minimalism
- Add missing _lock, client, server, transcriber, tts attributes to BotHandler - Proper bot startup/shutdown lifecycle to prevent Telegram polling conflicts - Fix reconfigure button to stop bot, reload settings, and show setup - Complete GUI redesign with Apple-style light minimalist design
1 parent 9ca2cf4 commit ac99953

3 files changed

Lines changed: 372 additions & 169 deletions

File tree

src/opencode_telegram_bot/bot/handler.py

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,39 +42,46 @@ def __init__(
4242
settings: Any,
4343
bot_settings: BotSettings,
4444
session_manager: SessionManager,
45-
scheduler: TaskScheduler,
45+
scheduler: TaskScheduler | None = None,
46+
client: OpenCodeClient | None = None,
47+
server: OpenCodeServer | None = None,
4648
) -> None:
4749
self.settings = settings
4850
self.bot_settings = bot_settings
4951
self.session_manager = session_manager
5052
self.scheduler = scheduler
51-
self.client = OpenCodeClient(
53+
self._lock = asyncio.Lock()
54+
self._cached_providers: list[dict[str, Any]] = []
55+
self._cached_agents: list[dict[str, Any]] = []
56+
self._cached_commands: list[dict[str, Any]] = []
57+
58+
self.client = client or OpenCodeClient(
5259
base_url=settings.opencode_api_url,
5360
username=settings.opencode_server_username,
5461
password=settings.opencode_server_password or None,
5562
)
56-
self.server = OpenCodeServer(
57-
command=settings.opencode_command,
63+
64+
self.server = server or OpenCodeServer(
65+
command=settings.opencode_command or "opencode",
5866
work_dir=settings.opencode_work_dir or None,
5967
)
68+
6069
self.transcriber = VoiceTranscriber(
61-
api_url=settings.stt_api_url,
62-
api_key=settings.stt_api_key,
63-
model=settings.stt_model,
64-
language=settings.stt_language,
70+
api_url=getattr(settings, "stt_api_url", ""),
71+
api_key=getattr(settings, "stt_api_key", ""),
72+
model=getattr(settings, "stt_model", "whisper-large-v3-turbo"),
73+
language=getattr(settings, "stt_language", ""),
6574
)
75+
6676
self.tts = TextToSpeech(
67-
api_url=settings.tts_api_url,
68-
api_key=settings.tts_api_key,
69-
model=settings.tts_model,
70-
voice=settings.tts_voice,
77+
api_url=getattr(settings, "tts_api_url", ""),
78+
api_key=getattr(settings, "tts_api_key", ""),
79+
model=getattr(settings, "tts_model", "gpt-4o-mini-tts"),
80+
voice=getattr(settings, "tts_voice", "alloy"),
7181
)
72-
self._lock = asyncio.Lock()
73-
self._cached_providers: list[dict[str, Any]] = []
74-
self._cached_agents: list[dict[str, Any]] = []
75-
self._cached_commands: list[dict[str, Any]] = []
7682

77-
self.scheduler.register_callback("run_task", self._run_scheduled_task)
83+
if self.scheduler is not None:
84+
self.scheduler.register_callback("run_task", self._run_scheduled_task)
7885

7986
def _locale(self) -> str:
8087
return self.settings.bot_locale or "en"

0 commit comments

Comments
 (0)