first stable version
This commit is contained in:
131
pyws.py
131
pyws.py
@@ -3,10 +3,11 @@ import game
|
||||
from room import Room, sendTo
|
||||
|
||||
import asyncio
|
||||
import datetime
|
||||
import random
|
||||
import websockets
|
||||
from json import dumps, loads
|
||||
from json import dumps, loads
|
||||
|
||||
import ssl
|
||||
|
||||
connected = {-1: []}
|
||||
character = dict()
|
||||
@@ -18,6 +19,7 @@ for i in range(len(name)):
|
||||
|
||||
sad = None
|
||||
fut = None
|
||||
wait_fut = [0, 0]
|
||||
async def wait(websocket, *cors, timeout=45, futs=None):
|
||||
if futs != None:
|
||||
fut_cor = futs
|
||||
@@ -25,37 +27,31 @@ async def wait(websocket, *cors, timeout=45, futs=None):
|
||||
fut_cor = [cor() for cor in cors]
|
||||
done, pending = await asyncio.wait(fut_cor,
|
||||
return_when=asyncio.FIRST_EXCEPTION, timeout=timeout)
|
||||
#print(done, pending)
|
||||
|
||||
#print("Futures:", done, pending)
|
||||
if pending:
|
||||
#print("coroutine doesn't finish its work")
|
||||
pass
|
||||
for task in pending:
|
||||
task.cancel()
|
||||
|
||||
if len(done):
|
||||
return list(done)[0].result()
|
||||
else:
|
||||
#print("SADDDDD")
|
||||
return
|
||||
def random_room():
|
||||
global connected, rooms
|
||||
try:
|
||||
print(rooms)
|
||||
except:
|
||||
rooms = list(connected)
|
||||
rooms.remove(-1)
|
||||
print(rooms)
|
||||
while len(rooms)>=1:
|
||||
enter = random.choice(rooms)
|
||||
print("rooms", enter, rooms)
|
||||
rooms.remove(enter)
|
||||
if list(done)[0].exception() == None:
|
||||
return list(done)[0].result()
|
||||
else:
|
||||
return "exception"
|
||||
def random_room(room_list):
|
||||
|
||||
while len(room_list)>=1:
|
||||
enter = random.choice(room_list)
|
||||
print("rooms", enter, room_list)
|
||||
if len(connected[enter]) < 2:
|
||||
return enter
|
||||
while 1:
|
||||
enter = random.randint(1, 99999)
|
||||
if enter not in connected:
|
||||
rooms.append(enter)
|
||||
return enter
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
async def enter_room(websocket):
|
||||
global connected ,sad, fut
|
||||
|
||||
@@ -66,7 +62,7 @@ async def enter_room(websocket):
|
||||
|
||||
message = await wait(websocket, websocket.recv)
|
||||
if message == "n":
|
||||
room_id = random_room()
|
||||
room_id = random_room(room_list)
|
||||
else:
|
||||
room_id = int(message)
|
||||
|
||||
@@ -91,15 +87,16 @@ async def enter_room(websocket):
|
||||
|
||||
for ws in connected[room_id]:
|
||||
ws.status = Room.PLAYING
|
||||
wsene = connected[room_id].players[0] if connected[room_id].players[1] is websocket else connected[room_id].players[1]
|
||||
await ws.send(dumps({"room": room_id, "cur": websocket.player.name, "ene": wsene.player.name}))
|
||||
wsene = connected[room_id].players[0] if connected[room_id].players[1] is ws else connected[room_id].players[1]
|
||||
await ws.send(dumps({"room": room_id, "cur": ws.player.name, "ene": wsene.player.name}))
|
||||
await ws.send(dumps({"msg": "firstAttack", "data": [players[0].player.name], "hand": ws.player.hand}))
|
||||
|
||||
fut.cancel()
|
||||
for ws_list, message in Room.start_turn(*players):
|
||||
await sendTo(message, *ws_list)
|
||||
async def handler(websocket, path):
|
||||
global connected,sad, fut
|
||||
global connected,sad, fut, wait_fut, rooms
|
||||
print("initialize")
|
||||
# Register.
|
||||
connected[-1].append(websocket)
|
||||
websocket.status = Room.CONNECTED
|
||||
@@ -113,7 +110,8 @@ async def handler(websocket, path):
|
||||
websocket.player = game.Player(name[int(choice)-1], card.default_deck)
|
||||
|
||||
websocket.status = Room.MATCHING
|
||||
except:
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return # close the connection
|
||||
|
||||
|
||||
@@ -130,41 +128,92 @@ async def handler(websocket, path):
|
||||
print("SAD", "FIRST" if websocket == sad else "SECOND")
|
||||
|
||||
fut = asyncio.ensure_future(websocket.recv())
|
||||
|
||||
try:
|
||||
message = await wait(websocket, timeout=100000, futs=[fut])
|
||||
message = await wait(websocket, timeout=100, futs=[fut])
|
||||
print(message)
|
||||
print(fut)
|
||||
if message == "e":
|
||||
connected[websocket.room].player_delete(websocket)
|
||||
|
||||
await websocket.send("You have left Room "+str(connected[websocket.room]))
|
||||
del websocket.room
|
||||
del connected[websocket.room]
|
||||
del websocket.room
|
||||
connected[-1].append(websocket)
|
||||
websocket.status = Room.MATCHING
|
||||
elif message == "exception":
|
||||
break
|
||||
except asyncio.CancelledError:
|
||||
pass
|
||||
|
||||
print("SADDDDDD", "FIRST" if websocket == sad else "SECOND")
|
||||
|
||||
elif websocket.status == Room.PLAYING:
|
||||
print("wait for message", "FIRST" if websocket == sad else "SECOND")
|
||||
message = await wait(websocket, websocket.recv, timeout=100000)
|
||||
print("received message", "FIRST" if websocket == sad else "SECOND")
|
||||
|
||||
try:
|
||||
enemy = 0 if websocket == connected[websocket.room].players[1] else 1
|
||||
wait_fut[(enemy+1)%2] = asyncio.ensure_future(websocket.recv())
|
||||
|
||||
print("wait for", "FIRST" if websocket == sad else "SECOND")
|
||||
message = await wait(websocket, timeout=30, futs=[wait_fut[(enemy+1)%2]])
|
||||
print("received message", message)
|
||||
print("FIRST" if websocket == sad else "SECOND", ":", message)
|
||||
if message == "exception":
|
||||
break
|
||||
message_to_send = connected[websocket.room].process(websocket, message)
|
||||
for ws_list, message in message_to_send:
|
||||
await sendTo(message, *ws_list)
|
||||
if message_to_send != []:
|
||||
try:
|
||||
if loads(message_to_send[-1][1])['msg'] == 'win': # 取最後一筆訊息的msg
|
||||
connected[websocket.room].player_delete(websocket)
|
||||
break
|
||||
except KeyError:
|
||||
pass
|
||||
wait_fut[enemy].cancel() # 取消另一方的await
|
||||
|
||||
message_to_send = connected[websocket.room].process(websocket, message)
|
||||
for ws_list, message in message_to_send:
|
||||
await sendTo(message, *ws_list)
|
||||
|
||||
except asyncio.CancelledError:
|
||||
print("FIRST" if websocket == sad else "SECOND", "was Canceled\n\n")
|
||||
|
||||
|
||||
|
||||
elif websocket.status == Room.DISCONNECT:
|
||||
break
|
||||
finally:
|
||||
# Unregister.
|
||||
try:
|
||||
connected[websocket.room].player_delete(websocket)
|
||||
|
||||
if websocket not in connected[websocket.room]:
|
||||
connected[websocket.room].players[0].status = Room.DISCONNECT
|
||||
wait_fut[0].cancel()
|
||||
wait_fut[1].cancel()
|
||||
|
||||
else:
|
||||
if connected[websocket.room].player_delete(websocket):
|
||||
await connected[websocket.room].players[0].send(dumps({"msg": "eneDisconn", "data": [connected[websocket.room].players[0].player.name]}))
|
||||
connected[websocket.room].players[0].status = Room.DISCONNECT
|
||||
wait_fut[0].cancel()
|
||||
wait_fut[1].cancel()
|
||||
|
||||
# it will leave the loop and disconnect
|
||||
|
||||
|
||||
if len(connected[websocket.room]) == 0: # clear the dictionary
|
||||
print("delete")
|
||||
del connected[websocket.room]
|
||||
|
||||
except:
|
||||
connected[-1].remove(websocket)
|
||||
|
||||
print(connected)
|
||||
|
||||
|
||||
|
||||
"""cert = ssl.SSLContext()
|
||||
cert = ssl.SSLContext()
|
||||
cert.load_cert_chain("/etc/letsencrypt/live/stoneapp.tech/fullchain.pem","/etc/letsencrypt/live/stoneapp.tech/privkey.pem")
|
||||
start_server = websockets.serve(handler, '10.128.0.2', 8787,ssl=cert)"""
|
||||
start_server = websockets.serve(handler, '10.128.0.2', 8787,ssl=cert)
|
||||
|
||||
start_server = websockets.serve(handler, '127.0.0.1', 9000)
|
||||
#start_server = websockets.serve(handler, '127.0.0.1', 9000)
|
||||
asyncio.get_event_loop().run_until_complete(start_server)
|
||||
asyncio.get_event_loop().run_forever()
|
||||
|
||||
Reference in New Issue
Block a user