summaryrefslogtreecommitdiff
path: root/swiftstory/Client.py
diff options
context:
space:
mode:
authorOlivier Gayot <olivier.gayot@sigexec.com>2020-05-27 20:50:16 +0200
committerOlivier Gayot <olivier.gayot@sigexec.com>2020-05-28 01:00:57 +0200
commit05235c8df61b0cd6bf588ee15a924576cb10aa0a (patch)
tree820706b25287b1c877d47fb3e7dad18731d988c9 /swiftstory/Client.py
parent40d54a78a6cfb510bfca30d9ab5cdb01f7956548 (diff)
Don't use coroutines for functions sending notifications
Functions which generate notifications for clients were all making use of await and async. This is not great because if we add a notification somewhere, we need to change the function to a coroutine and update all invocations (recursively changing all functions to coroutines). Instead, we now add a task to the event loop whenever a notification needs to be generated. This allows to drop the await and async specifiers from mostly everywhere. On the downside, it means that if we send a notification to n clients, we have to register n tasks. Signed-off-by: Olivier Gayot <olivier.gayot@sigexec.com>
Diffstat (limited to 'swiftstory/Client.py')
-rw-r--r--swiftstory/Client.py38
1 files changed, 21 insertions, 17 deletions
diff --git a/swiftstory/Client.py b/swiftstory/Client.py
index bc347f9..5116f51 100644
--- a/swiftstory/Client.py
+++ b/swiftstory/Client.py
@@ -1,3 +1,4 @@
+import asyncio
import websockets
from swiftstory.Status import error
@@ -12,7 +13,7 @@ class Client:
self.socket = socket
self.player = None
- async def join_game(self, game_name, lang):
+ def join_game(self, game_name, lang):
if self.game is not None:
return error('You are already in a game')
@@ -25,27 +26,27 @@ class Client:
if game is None:
return error('Invalid language')
- return await game.try_join(self)
+ return game.try_join(self)
- async def play_white_card(self, card_id):
+ def play_white_card(self, card_id):
if self.game is None:
return error('You have to join a game first')
- return await self.game.try_play_card(self.player, card_id)
+ return self.game.try_play_card(self.player, card_id)
- async def pick_black_card(self):
+ def pick_black_card(self):
if self.game is None:
return error('You have to join a game first')
- return await self.game.try_become_judge(self.player)
+ return self.game.try_become_judge(self.player)
- async def collect_cards(self):
+ def collect_cards(self):
if self.game is None:
error('You have to join a game first')
- return await self.game.try_collect_cards(self.player)
+ return self.game.try_collect_cards(self.player)
- async def designate_card(self, card_id):
+ def designate_card(self, card_id):
if self.game is None:
return error('You have to join a game first')
- return await self.game.try_designate_card(self.player, card_id)
+ return self.game.try_designate_card(self.player, card_id)
def view_player_cards(self):
if self.game is None:
@@ -62,12 +63,15 @@ class Client:
return error('You have to join a game first')
return self.game.try_view_black_card(self.player)
- async def send_notification(self, message):
- try:
- await self.socket.send(message)
- except websockets.exceptions.ConnectionClosed:
- print("Recipient has disconnected.")
+ def register_notification(self, message):
+ async def f():
+ try:
+ await self.socket.send(message)
+ except websockets.exceptions.ConnectionClosed:
+ print("Recipient has disconnected.")
- async def disconnect(self):
+ asyncio.create_task(f())
+
+ def disconnect(self):
if self.player is not None:
- await self.game.disconnect(self.player)
+ self.game.disconnect(self.player)