intuitive token validation in config

This commit is contained in:
rambros 2026-03-08 00:29:00 +05:30
parent d5fbe5fa08
commit b2fbac4622
2 changed files with 18 additions and 6 deletions

View file

@ -12,7 +12,7 @@ class AppConfig(BaseModel):
discord_bot_token: Optional[str] = Field(default=None) discord_bot_token: Optional[str] = Field(default=None)
discord_server_id: Optional[str] = Field(default=None) discord_server_id: Optional[str] = Field(default=None)
tool_mode: str = Field(default="direct_transfer") # direct_transfer | backup_transfer | backup_only tool_mode: str = Field(default="direct_transfer") # direct_transfer | backup_transfer | backup_only
target_platform: str = Field(default="none") # fluxer | stoat | none target_platform: str = Field(default="fluxer") # fluxer | stoat | none
target_bot_token: Optional[str] = Field(default=None) target_bot_token: Optional[str] = Field(default=None)
target_server_id: Optional[str] = Field(default=None) target_server_id: Optional[str] = Field(default=None)
target_api_url: Optional[str] = Field(default="default") target_api_url: Optional[str] = Field(default="default")

View file

@ -221,13 +221,13 @@ class ConfigScreen(Screen):
password=True, password=True,
placeholder="Paste Bot Token here" placeholder="Paste Bot Token here"
) )
yield Button("Fetch", id="btn_fetch_guilds", variant="primary") yield Button("Validate", id="btn_fetch_guilds", variant="primary")
yield Label("Server ID:", classes="field_label") yield Label("Server ID:", classes="field_label")
yield Select( yield Select(
options=[], options=[],
id="inp_discord_server", id="inp_discord_server",
prompt="Select a Server" prompt="Validate Bot Token"
) )
# ── Reaper Mode ────────────────────────────────────────── # ── Reaper Mode ──────────────────────────────────────────
@ -253,7 +253,7 @@ class ConfigScreen(Screen):
# ── Target Platform (hidden for backup_only) ───────────── # ── Target Platform (hidden for backup_only) ─────────────
with Vertical(id="target_section"): with Vertical(id="target_section"):
yield Label("Target Platform", classes="section_title") yield Label("Target Platform", classes="section_title")
cur_plat = self.config.target_platform or "none" cur_plat = self.config.target_platform or "fluxer"
with RadioSet(id="plat_radio"): with RadioSet(id="plat_radio"):
yield RadioButton( yield RadioButton(
"Fluxer", "Fluxer",
@ -273,13 +273,13 @@ class ConfigScreen(Screen):
password=True, password=True,
placeholder="Paste Target Bot Token" placeholder="Paste Target Bot Token"
) )
yield Button("Fetch", id="btn_fetch_target_servers", variant="primary") yield Button("Validate", id="btn_fetch_target_servers", variant="primary")
yield Label("Community / Server ID:", classes="field_label") yield Label("Community / Server ID:", classes="field_label")
yield Select( yield Select(
options=[], options=[],
id="inp_target_server", id="inp_target_server",
prompt="Select a Community/Server" prompt="Validate Bot Token"
) )
yield Label("Target API URL:", classes="field_label") yield Label("Target API URL:", classes="field_label")
@ -319,12 +319,16 @@ class ConfigScreen(Screen):
guilds = await DiscordReader.fetch_guilds(token) guilds = await DiscordReader.fetch_guilds(token)
if not guilds: if not guilds:
self.query_one("#btn_fetch_guilds", Button).variant = "warning"
self.query_one("#inp_discord_server", Select).prompt = "No servers found"
if not initial: if not initial:
self.notify("No Discord servers found or invalid token.", severity="warning") self.notify("No Discord servers found or invalid token.", severity="warning")
return return
self.query_one("#btn_fetch_guilds", Button).variant = "success"
options = [(name, gid) for name, gid in guilds] options = [(name, gid) for name, gid in guilds]
select_widget = self.query_one("#inp_discord_server", Select) select_widget = self.query_one("#inp_discord_server", Select)
select_widget.prompt = "Select a server"
select_widget.set_options(options) select_widget.set_options(options)
# Restore saved value if it exists in the fetched list # Restore saved value if it exists in the fetched list
@ -332,6 +336,8 @@ class ConfigScreen(Screen):
if saved_id and any(gid == saved_id for _, gid in guilds): if saved_id and any(gid == saved_id for _, gid in guilds):
select_widget.value = saved_id select_widget.value = saved_id
except Exception as e: except Exception as e:
self.query_one("#btn_fetch_guilds", Button).variant = "warning"
self.query_one("#inp_discord_server", Select).prompt = "Invalid token"
if not initial: if not initial:
self.notify(f"Failed to fetch Discord servers: {e}", severity="error") self.notify(f"Failed to fetch Discord servers: {e}", severity="error")
@ -359,17 +365,23 @@ class ConfigScreen(Screen):
return return
except Exception as e: except Exception as e:
logger.error(f"Failed to fetch {platform} servers: {e}") logger.error(f"Failed to fetch {platform} servers: {e}")
self.query_one("#btn_fetch_target_servers", Button).variant = "warning"
self.query_one("#inp_target_server", Select).prompt = "Invalid token"
if not initial: if not initial:
self.notify(f"Failed to fetch {platform} servers: {e}", severity="error") self.notify(f"Failed to fetch {platform} servers: {e}", severity="error")
return return
if not servers: if not servers:
self.query_one("#btn_fetch_target_servers", Button).variant = "warning"
self.query_one("#inp_target_server", Select).prompt = "No servers found"
if not initial: if not initial:
self.notify(f"No {platform} servers found or invalid token.", severity="warning") self.notify(f"No {platform} servers found or invalid token.", severity="warning")
return return
self.query_one("#btn_fetch_target_servers", Button).variant = "success"
options = [(label, sid) for label, sid in servers] options = [(label, sid) for label, sid in servers]
select_widget = self.query_one("#inp_target_server", Select) select_widget = self.query_one("#inp_target_server", Select)
select_widget.prompt = "Select a server"
select_widget.set_options(options) select_widget.set_options(options)
# Restore saved value # Restore saved value