I am trying outwebsockets using the python async frameworkaiohttp.Basically I have created a game which will include multiple players and they will be able to chat using web sockets. There could be multiple game rooms and a player will be in a single room at a time.I believe I have the implementation right.Please look into it.
from aiohttp import web, WSMsgTypefrom bson.objectid import ObjectIdfrom models import Gameroutes = web.RouteTableDef()@routes.get('/ws/{game_id}/{player_id}')async def create(request): game_id = request.match_info['game_id'] player_id = request.match_info['player_id'] ws_current = web.WebSocketResponse() ws_ready = ws_current.can_prepare(request) if not ws_ready.ok: msg = "Sorry, something went wrong!" return web.json_response({'error': msg}) await ws_current.prepare(request) query = {'_id': ObjectId(game_id), 'active': True} game = await Game.find_game(query=query, db=request.app['mongodb']) if game is None: msg = "Game over, start a new game" await ws_current.send_json({'action': 'error', 'name': player_id, 'msg': game_id}) await ws_current.close() return if not any(player_id == str(player['_id']) for player in game['players']): msg = "You have not joined the game" await ws_current.send_json({'action': 'error', 'name': player_id, 'msg': msg}) await ws_current.close() return await ws_current.send_json({'action': 'connect', 'name': player_id}) # notify other players that a new player has joined for player in game['players']: if str(player['_id']) in request.app['websockets']: player_ws = request.app['websockets'][str(player['_id'])] await player_ws.send_json({'action': 'join', 'name': player_id}) request.app['websockets'][player_id] = ws_current while True: msg = await ws_current.receive() if msg.type == WSMsgType.text: if msg.data == 'close': await ws_current.close() else: for player in game['players']: if str(player['_id']) in request.app['websockets']: player_ws = request.app['websockets'][str( player['_id'])] if player_ws is not ws_current: await player_ws.send_json( {'action': 'sent', 'name': player_id, 'text': msg.data}) elif msg.type == WSMsgType.ERROR: print('ws connection closed with exception %s' % ws_current.exception()) else: break if player_id in request.app['websockets']: del request.app['websockets'][player_id] # notify other players that the player has left for player in game['players']: if str(player['_id']) in request.app['websockets']: player_ws = request.app['websockets'][str(player['_id'])] await player_ws.send_json({'action': 'disconnect', 'name': player_id}) return ws_currentBut the code doesn't look very good or pythonic as they say. Could you please help me out with this and also if there are things I should change with the logic as well.
- \$\begingroup\$What is
web? I have a feeling it's notPyPI's web package and I know of no such packages called web in the stdlib. Searching for it is also nigh impossible, since "web" is so generic. Without this information it would be impossible for me to answer this question.\$\endgroup\$2020-05-23 13:11:59 +00:00CommentedMay 23, 2020 at 13:11 - \$\begingroup\$@Peilonrayz It is just a module of aiohttp. I will update the question with the imports.\$\endgroup\$doctorsherlock– doctorsherlock2020-05-23 14:16:32 +00:00CommentedMay 23, 2020 at 14:16
You mustlog in to answer this question.
Explore related questions
See similar questions with these tags.
