clean token validation code

This commit is contained in:
rambros 2026-02-20 13:53:40 +05:30
parent 5dbcac68b6
commit e37d8b2ab0

View file

@ -1,8 +1,5 @@
import sys import sys
import asyncio import asyncio
import select
import termios
import tty
from rich.console import Console from rich.console import Console
from rich.prompt import Prompt, Confirm from rich.prompt import Prompt, Confirm
from rich.panel import Panel from rich.panel import Panel
@ -26,34 +23,7 @@ class MigrationCLI:
self.progress_callback_task = None self.progress_callback_task = None
self.tokens_valid = False self.tokens_valid = False
async def _check_skip(self):
"""Non-blocking check for 'S' key press."""
if not sys.stdin.isatty():
return False
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setcbreak(fd)
while True:
if select.select([sys.stdin], [], [], 0.05)[0]:
char = sys.stdin.read(1).lower()
if char == 's':
return True
await asyncio.sleep(0.05)
except Exception:
return False
finally:
# Shift back to old settings immediately
termios.tcsetattr(fd, termios.TCSANOW, old_settings)
async def validate_config(self): async def validate_config(self):
console.print("[yellow]press (S) to skip[/yellow]")
# Save terminal settings for safety
fd = sys.stdin.fileno() if sys.stdin.isatty() else None
old_settings = termios.tcgetattr(fd) if fd is not None else None
self.validation_results = { self.validation_results = {
"discord_token": False, "discord_bot_name": None, "discord_token": False, "discord_bot_name": None,
"discord_server": False, "discord_server_name": None, "discord_server": False, "discord_server_name": None,
@ -64,33 +34,16 @@ class MigrationCLI:
discord_task = asyncio.create_task(self.engine.discord_reader.validate()) discord_task = asyncio.create_task(self.engine.discord_reader.validate())
fluxer_task = asyncio.create_task(self.engine.fluxer_writer.validate()) fluxer_task = asyncio.create_task(self.engine.fluxer_writer.validate())
skip_task = asyncio.create_task(self._check_skip())
try: try:
with console.status("[yellow]Validating tokens...[/yellow]"): with console.status("[yellow]Validating tokens...[/yellow]"):
start_time = asyncio.get_event_loop().time() start_time = asyncio.get_event_loop().time()
done, pending = await asyncio.wait( done, pending = await asyncio.wait(
[discord_task, fluxer_task, skip_task], [discord_task, fluxer_task],
timeout=5.0, timeout=3.0,
return_when=asyncio.FIRST_COMPLETED return_when=asyncio.ALL_COMPLETED
) )
if skip_task in done and skip_task.result():
console.print("[yellow]Validation skipped by user.[/yellow]")
for t in [discord_task, fluxer_task]: t.cancel()
return
# Wait a bit more for validations if they are almost done
elapsed = asyncio.get_event_loop().time() - start_time
remaining = max(0, 5.0 - elapsed)
if not (discord_task.done() and fluxer_task.done()) and remaining > 0:
done2, pending2 = await asyncio.wait(
[discord_task, fluxer_task],
timeout=remaining,
return_when=asyncio.ALL_COMPLETED
)
done.update(done2)
# Process Discord Result # Process Discord Result
if discord_task in done: if discord_task in done:
try: try:
@ -106,7 +59,7 @@ class MigrationCLI:
except Exception as e: except Exception as e:
console.print(f"[bold red]Discord validation failed with error: {e}[/bold red]") console.print(f"[bold red]Discord validation failed with error: {e}[/bold red]")
else: else:
console.print("[bold red]Discord bot token validation timed out after 5 seconds.[/bold red]") console.print("[bold red]Discord bot token validation timed out after 3 seconds.[/bold red]")
discord_task.cancel() discord_task.cancel()
# Process Fluxer Result # Process Fluxer Result
@ -124,7 +77,7 @@ class MigrationCLI:
except Exception as e: except Exception as e:
console.print(f"[bold red]Fluxer validation failed with error: {e}[/bold red]") console.print(f"[bold red]Fluxer validation failed with error: {e}[/bold red]")
else: else:
console.print("[bold red]Fluxer bot token validation timed out after 5 seconds.[/bold red]") console.print("[bold red]Fluxer bot token validation timed out after 3 seconds.[/bold red]")
fluxer_task.cancel() fluxer_task.cancel()
self.tokens_valid = all(self.validation_results.values()) self.tokens_valid = all(self.validation_results.values())
@ -132,19 +85,7 @@ class MigrationCLI:
except Exception as e: except Exception as e:
console.print(f"[bold red]Validation system failure: {e}[/bold red]") console.print(f"[bold red]Validation system failure: {e}[/bold red]")
finally: finally:
# Crucial: Ensure the skip check task is dead and terminal is restored # Ensure tasks are cleaned up
if not skip_task.done():
skip_task.cancel()
try:
await skip_task
except asyncio.CancelledError:
pass
# Additional safety: manually restore terminal if somehow it's still weird
if fd is not None and old_settings is not None:
termios.tcsetattr(fd, termios.TCSANOW, old_settings)
# Ensure other tasks are also cleaned up
for t in [discord_task, fluxer_task]: for t in [discord_task, fluxer_task]:
if not t.done(): t.cancel() if not t.done(): t.cancel()