Source code for aiogbclient.main

"""файл для запуска клиентского приложения в цикле"""
import argparse
import asyncio
import signal
import sys

from PyQt5 import Qt, QtWidgets
#from PyQt5.QtCore import QEventLoop
from quamash import QEventLoop  # asyncio works fine with pyqt5 loop

from aiogbclient.utils.client_proto import ChatClientProtocol, ClientAuth
from aiogbclient.ui.windows import LoginWindow, ContactsWindow
from aiogbclient.client_config import DB_PATH, PORT


[docs]class ConsoleClientApp: """Console Client""" def __init__(self, parsed_args, db_path): self.args = parsed_args self.db_path = db_path self.ins = None
[docs] def main(self): # create event loop loop = asyncio.get_event_loop() for signame in ('SIGINT', 'SIGTERM'): loop.add_signal_handler(getattr(signal, signame), loop.stop) # authentication process auth = ClientAuth(db_path=self.db_path) while True: usr = self.args["user"] or input('username: ') passwrd = self.args["password"] or input('password: ') auth.username = usr auth.password = passwrd is_auth = auth.authenticate() if is_auth: break else: print('wrong username/password') # Each client will create a new protocol instance tasks = [] client_ = ChatClientProtocol(db_path=self.db_path, loop=loop, tasks=tasks, username=usr, password=passwrd) # connect to our server try: coro = loop.create_connection(lambda: client_, self.args["addr"], self.args["port"]) transport, protocol = loop.run_until_complete(coro) except ConnectionRefusedError: print('Error. wrong server') exit(1) # Serve requests until Ctrl+C try: task = asyncio.ensure_future(client_.get_from_console()) # create Task from coroutine tasks.append(task) loop.run_until_complete(task) except KeyboardInterrupt: pass except Exception as e: # todo need to destroy get_from_console task somehow print(e) finally:
loop.close()
[docs]class GuiClientApp: """GUI Client""" def __init__(self, parsed_args, db_path): self.args = parsed_args self.db_path = db_path self.ins = None
[docs] def main(self): # create event loop app = Qt.QApplication(sys.argv) loop = QEventLoop(app) asyncio.set_event_loop(loop) # NEW must set the event loop # authentication process auth_ = ClientAuth(db_path=self.db_path) login_wnd = LoginWindow(auth_instance=auth_) if login_wnd.exec_() == QtWidgets.QDialog.Accepted: # Each client will create a new protocol instance client_ = ChatClientProtocol(db_path=self.db_path, loop=loop, username=login_wnd.username, password=login_wnd.password) # create Contacts window wnd = ContactsWindow(client_instance=client_, user_name=login_wnd.username) client_.gui_instance = wnd # reference from protocol to GUI, for msg update with loop: # cleaning old instances del auth_ del login_wnd # connect to our server try: coro = loop.create_connection(lambda: client_, self.args["addr"], self.args["port"]) server = loop.run_until_complete(coro) except ConnectionRefusedError: print('Error. wrong server') exit(1) # start GUI client wnd.show() client_.get_from_gui() # asyncio.ensure_future(client_.get_from_gui(loop)) # Serve requests until Ctrl+C try: loop.run_forever() except KeyboardInterrupt: pass except Exception:
pass if __name__ == '__main__': def parse_args(): parser = argparse.ArgumentParser(description="Client settings") parser.add_argument("--user", default="user1", type=str) parser.add_argument("--password", default="123", type=str) parser.add_argument("--addr", default="127.0.0.1", type=str) parser.add_argument("--port", default=PORT, type=int) parser.add_argument('--nogui', action='store_true') return vars(parser.parse_args()) args = parse_args() if args['nogui']: # start consoles server a = ConsoleClientApp(args, DB_PATH) a.main() else: # start GUI client a = GuiClientApp(args, DB_PATH) a.main()