async def event_stream(request): auth = request.headers.get("Authorization") if auth is None: return web.HTTPForbidden() token = auth[auth.find("Bearer") + 7:] if token not in BOT_TOKENS: log.error("BOT account auth with token %s failed" % token) return web.HTTPForbidden() user_agent = request.headers.get("User-Agent") username = user_agent[user_agent.find("user:"******"users"] seeks = request.app["seeks"] sockets = request.app["websockets"] games = request.app["games"] db = request.app["db"] resp = web.StreamResponse() resp.content_type = "text/plain" await resp.prepare(request) if username in users: bot_player = users[username] # After BOT lost connection it may have ongoing games # We notify BOT and he can ask to create new game_streams # to continue those games for gameId in bot_player.game_queues: if gameId in games and games[gameId].status == STARTED: await bot_player.event_queue.put(games[gameId].game_start) else: bot_player = User(bot=True, username=username) users[bot_player.username] = bot_player doc = await db.user.find_one({"_id": username}) if doc is None: result = await db.user.insert_one({ "_id": username, "first_name": None, "last_name": None, "country": None, "title": "BOT", }) print("db insert user result %s" % repr(result.inserted_id)) bot_player.bot_online = True log.info("+++ BOT %s connected" % bot_player.username) loop = asyncio.get_event_loop() pinger_task = loop.create_task( bot_player.pinger(sockets, seeks, users, games)) request.app["tasks"].add(pinger_task) # inform others # TODO: do we need this at all? await lobby_broadcast(sockets, get_seeks(seeks)) # send "challenge" and "gameStart" events from event_queue to the BOT while bot_player.online: answer = await bot_player.event_queue.get() try: if request.protocol.transport.is_closing(): log.error( "BOT %s request.protocol.transport.is_closing() == True ..." % username) break else: await resp.write(answer.encode("utf-8")) await resp.drain() except Exception: log.error("BOT %s event_stream is broken..." % username) break pinger_task.cancel() await bot_player.clear_seeks(sockets, seeks) return resp