Update server.py
Browse files
server.py
CHANGED
|
@@ -1,12 +1,8 @@
|
|
| 1 |
import random
|
| 2 |
import json
|
| 3 |
import socketio
|
| 4 |
-
from flask import Flask, jsonify
|
| 5 |
import eventlet
|
| 6 |
-
import threading
|
| 7 |
-
from nats.aio.client import Client as NATS
|
| 8 |
-
import asyncpg
|
| 9 |
-
import asyncio
|
| 10 |
|
| 11 |
eventlet.monkey_patch()
|
| 12 |
|
|
@@ -14,39 +10,10 @@ sio = socketio.Server(cors_allowed_origins='*')
|
|
| 14 |
app = Flask(__name__)
|
| 15 |
app.wsgi_app = socketio.WSGIApp(sio, app.wsgi_app)
|
| 16 |
|
| 17 |
-
DB_DSN = "postgresql://postgres:postgres@pgbouncer:6432/postgres"
|
| 18 |
-
NATS_URL = "nats://nats:4222"
|
| 19 |
-
|
| 20 |
WAITING_PLAYERS = []
|
| 21 |
PLAYER_DATA = {}
|
| 22 |
GAME_STATES = {}
|
| 23 |
|
| 24 |
-
nats_client = NATS()
|
| 25 |
-
loop = asyncio.new_event_loop()
|
| 26 |
-
asyncio.set_event_loop(loop)
|
| 27 |
-
|
| 28 |
-
async def init_db():
|
| 29 |
-
return await asyncpg.create_pool(dsn=DB_DSN)
|
| 30 |
-
|
| 31 |
-
db_pool = loop.run_until_complete(init_db())
|
| 32 |
-
|
| 33 |
-
async def publish_event(event_type, data):
|
| 34 |
-
message = json.dumps({'type': event_type, 'data': data})
|
| 35 |
-
await nats_client.publish("checkers", message.encode())
|
| 36 |
-
|
| 37 |
-
async def subscribe():
|
| 38 |
-
async def message_handler(msg):
|
| 39 |
-
event = json.loads(msg.data.decode())
|
| 40 |
-
if event['type'] == 'opponent_move':
|
| 41 |
-
sio.emit('opponent_move', event['data']['move'], room=event['data']['room'], skip_sid=event['data']['sid'])
|
| 42 |
-
elif event['type'] == 'game_over':
|
| 43 |
-
sio.emit('game_over', event['data'], room=event['data']['room'])
|
| 44 |
-
elif event['type'] == 'opponent_disconnected':
|
| 45 |
-
sio.emit('opponent_disconnected', room=event['data']['room'])
|
| 46 |
-
|
| 47 |
-
await nats_client.connect(servers=[NATS_URL], loop=loop)
|
| 48 |
-
await nats_client.subscribe("checkers", cb=message_handler)
|
| 49 |
-
|
| 50 |
def init_board():
|
| 51 |
board = [[None for _ in range(8)] for _ in range(8)]
|
| 52 |
for row in range(3):
|
|
@@ -79,7 +46,7 @@ def get_valid_moves(board, row, col, color, is_king):
|
|
| 79 |
|
| 80 |
@app.route('/')
|
| 81 |
def index():
|
| 82 |
-
return
|
| 83 |
|
| 84 |
@app.route('/state')
|
| 85 |
def game_state():
|
|
@@ -166,18 +133,18 @@ def move(sid, data):
|
|
| 166 |
|
| 167 |
flat = sum(board, [])
|
| 168 |
if all(p not in flat for p in ['r', 'R']):
|
| 169 |
-
|
| 170 |
del GAME_STATES[room]
|
| 171 |
return
|
| 172 |
if all(p not in flat for p in ['b', 'B']):
|
| 173 |
-
|
| 174 |
del GAME_STATES[room]
|
| 175 |
return
|
| 176 |
|
| 177 |
state['board'] = board
|
| 178 |
state['turn'] = 'black' if turn == 'red' else 'red'
|
| 179 |
GAME_STATES[room] = state
|
| 180 |
-
|
| 181 |
|
| 182 |
@sio.event
|
| 183 |
def disconnect(sid):
|
|
@@ -192,8 +159,7 @@ def disconnect(sid):
|
|
| 192 |
del PLAYER_DATA[psid]
|
| 193 |
if room in GAME_STATES:
|
| 194 |
del GAME_STATES[room]
|
| 195 |
-
|
| 196 |
|
| 197 |
if __name__ == '__main__':
|
| 198 |
-
threading.Thread(target=lambda: loop.run_until_complete(subscribe()), daemon=True).start()
|
| 199 |
eventlet.wsgi.server(eventlet.listen(('0.0.0.0', 5000)), app)
|
|
|
|
| 1 |
import random
|
| 2 |
import json
|
| 3 |
import socketio
|
| 4 |
+
from flask import Flask, render_template, jsonify
|
| 5 |
import eventlet
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
|
| 7 |
eventlet.monkey_patch()
|
| 8 |
|
|
|
|
| 10 |
app = Flask(__name__)
|
| 11 |
app.wsgi_app = socketio.WSGIApp(sio, app.wsgi_app)
|
| 12 |
|
|
|
|
|
|
|
|
|
|
| 13 |
WAITING_PLAYERS = []
|
| 14 |
PLAYER_DATA = {}
|
| 15 |
GAME_STATES = {}
|
| 16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
def init_board():
|
| 18 |
board = [[None for _ in range(8)] for _ in range(8)]
|
| 19 |
for row in range(3):
|
|
|
|
| 46 |
|
| 47 |
@app.route('/')
|
| 48 |
def index():
|
| 49 |
+
return render_template('client.html')
|
| 50 |
|
| 51 |
@app.route('/state')
|
| 52 |
def game_state():
|
|
|
|
| 133 |
|
| 134 |
flat = sum(board, [])
|
| 135 |
if all(p not in flat for p in ['r', 'R']):
|
| 136 |
+
sio.emit('game_over', {'winner': 'black', 'room': room}, room=room)
|
| 137 |
del GAME_STATES[room]
|
| 138 |
return
|
| 139 |
if all(p not in flat for p in ['b', 'B']):
|
| 140 |
+
sio.emit('game_over', {'winner': 'red', 'room': room}, room=room)
|
| 141 |
del GAME_STATES[room]
|
| 142 |
return
|
| 143 |
|
| 144 |
state['board'] = board
|
| 145 |
state['turn'] = 'black' if turn == 'red' else 'red'
|
| 146 |
GAME_STATES[room] = state
|
| 147 |
+
sio.emit('opponent_move', {'move': data, 'room': room, 'sid': sid}, room=room, skip_sid=sid)
|
| 148 |
|
| 149 |
@sio.event
|
| 150 |
def disconnect(sid):
|
|
|
|
| 159 |
del PLAYER_DATA[psid]
|
| 160 |
if room in GAME_STATES:
|
| 161 |
del GAME_STATES[room]
|
| 162 |
+
sio.emit('opponent_disconnected', room=room)
|
| 163 |
|
| 164 |
if __name__ == '__main__':
|
|
|
|
| 165 |
eventlet.wsgi.server(eventlet.listen(('0.0.0.0', 5000)), app)
|