76 lines
2.5 KiB
Python
76 lines
2.5 KiB
Python
"""Main entry point for the Terminal Chat application."""
|
|
|
|
import asyncio
|
|
import os
|
|
import argparse
|
|
|
|
from chatapp.models import UserConnection
|
|
from chatapp.chat_server import ChatServer
|
|
from chatapp.ui import TerminalChatApp
|
|
from chatapp.ssh_server import start_ssh_server
|
|
|
|
|
|
# Global chat server instance
|
|
chat_server = ChatServer()
|
|
|
|
|
|
async def start_terminal_chat(username: str):
|
|
"""Start a TerminalChatApp for a single local user.
|
|
|
|
This creates a UserConnection attached to an asyncio.Queue, registers
|
|
the user on the chat_server, runs the textual app asynchronously, and
|
|
ensures the user is removed when the app exits.
|
|
"""
|
|
message_queue = asyncio.Queue()
|
|
user_conn = UserConnection(username, message_queue)
|
|
chat_server.add_user(username, user_conn)
|
|
|
|
try:
|
|
app = TerminalChatApp(username, message_queue, chat_server)
|
|
await app.run_async()
|
|
finally:
|
|
chat_server.remove_user(username)
|
|
|
|
|
|
def main():
|
|
"""Main entry point with argument parsing."""
|
|
parser = argparse.ArgumentParser(description="Run Terminal Chat locally or via SSH")
|
|
parser.add_argument("--ssh", action="store_true", help="Start SSH server mode")
|
|
parser.add_argument("--host", default="0.0.0.0", help="Host to bind SSH server to (default: 0.0.0.0)")
|
|
parser.add_argument("--port", type=int, default=8022, help="Port for SSH server (default: 8022)")
|
|
parser.add_argument("--username", help="Username to use for the local terminal chat")
|
|
args = parser.parse_args()
|
|
|
|
if args.ssh:
|
|
# SSH server mode
|
|
try:
|
|
asyncio.run(start_ssh_server(args.host, args.port, chat_server))
|
|
except KeyboardInterrupt:
|
|
print("\nSSH server stopped")
|
|
raise SystemExit(0)
|
|
except Exception as exc:
|
|
print(f"Error starting SSH server: {exc}")
|
|
raise SystemExit(1)
|
|
else:
|
|
# Local terminal mode
|
|
username = args.username or os.getenv("USER") or os.getenv("USERNAME")
|
|
if not username:
|
|
try:
|
|
username = input("Enter username: ").strip()
|
|
except KeyboardInterrupt:
|
|
raise SystemExit(1)
|
|
|
|
if not username:
|
|
print("A username is required to start the chat.")
|
|
raise SystemExit(1)
|
|
|
|
try:
|
|
asyncio.run(start_terminal_chat(username))
|
|
except Exception as exc:
|
|
print(f"Error while running Terminal Chat: {exc}")
|
|
raise
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|