コード例 #1
0
ファイル: app.py プロジェクト: iho/mixera
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