async def wshandler(request): pool = request.app['db_pool'] resp = WebSocketResponse() ok, protocol = resp.can_start(request) if not ok: with open(WS_FILE, 'rb') as fp: return Response(body=fp.read(), content_type='text/html') await resp.prepare(request) print('Someone joined.') for ws in request.app['sockets']: ws.send_str('Someone joined') request.app['sockets'].append(resp) while True: msg = await resp.receive() try: data = json.loads(msg.data) except: data = '' def broadcast(message): message = json.dumps(message) for ws in request.app['sockets']: if ws is not resp: ws.send_str(msg.data) def reply(message): message = json.dumps(message) resp.send_str(message) if msg.tp == MsgType.text: if isinstance(data, dict) and data.get('type'): if data['type'] == 'message': print(resp.user) await db.create_message(pool, data, resp.user['id'] ) response = {'type': 'message', 'status': None} user_to_id = data.get('to') if user_to_id: for ws in request.app['sockets']: user = getattr(ws, 'user') if user['id'] == user_to_id: response['status'] = 'online' reply(response) data['from'] = resp.user['id'] reply(data) broadcast(data) elif data['type'] == 'login': res = {'type': 'login', 'logined': False} print(data) user = await db.check_password(pool, data) print(user) if user: res['logined'] = True del user['password'] resp.user = user reply(res) elif data['type'] == 'register': user = await db.create_user(pool, data) res = {'type': 'register', 'logined': False} if user: res['logined'] = True user.update(data) del user['password'] resp.user = user reply(res) else: reply({'error': 'Message type is incorect'}) else: reply({'error': 'Cannot parse request message'}) else: break request.app['sockets'].remove(resp) print('Someone disconnected.') for ws in request.app['sockets']: ws.send_str('Someone disconnected.') return resp