mirror of
https://github.com/simon987/bingo.git
synced 2025-12-15 00:09:18 +00:00
102 lines
3.3 KiB
Python
102 lines
3.3 KiB
Python
from threading import Lock
|
|
|
|
from flask import Flask, request, session
|
|
from flask_socketio import Namespace, join_room, leave_room, SocketIO, emit, rooms, close_room, disconnect
|
|
|
|
from common import config
|
|
|
|
app = Flask(__name__)
|
|
app.config['SECRET_KEY'] = 'secret!'
|
|
|
|
# TODO: test mode mode "threading", "eventlet" or "gevent"
|
|
socketio = SocketIO(app, async_mode=None)
|
|
|
|
# TODO: wth is that?!
|
|
thread = None
|
|
thread_lock = Lock()
|
|
|
|
@app.route("/")
|
|
def page_index():
|
|
return "Hello, world"
|
|
|
|
|
|
def background_thread():
|
|
"""Example of how to send server generated events to clients."""
|
|
count = 0
|
|
while True:
|
|
socketio.sleep(10)
|
|
count += 1
|
|
socketio.emit('my_response',
|
|
{'data': 'Server generated event', 'count': count},
|
|
namespace='/test')
|
|
|
|
|
|
# When class-based namespaces are used, any events received by the server are dispatched to a method named as the
|
|
# event name with the on_ prefix. For example, event my_event will be handled by a method named on_my_event
|
|
|
|
class BingoNamespace(Namespace):
|
|
|
|
def on_my_event(self, message):
|
|
session['receive_count'] = session.get('receive_count', 0) + 1
|
|
emit('my_response',
|
|
{'data': message['data'], 'count': session['receive_count']})
|
|
|
|
def on_my_broadcast_event(self, message):
|
|
session['receive_count'] = session.get('receive_count', 0) + 1
|
|
emit('my_response',
|
|
{'data': message['data'], 'count': session['receive_count']},
|
|
broadcast=True)
|
|
|
|
def on_join(self, message):
|
|
join_room(message['room'])
|
|
session['receive_count'] = session.get('receive_count', 0) + 1
|
|
emit('my_response',
|
|
{'data': 'In rooms: ' + ', '.join(rooms()),
|
|
'count': session['receive_count']})
|
|
|
|
def on_leave(self, message):
|
|
leave_room(message['room'])
|
|
session['receive_count'] = session.get('receive_count', 0) + 1
|
|
emit('my_response',
|
|
{'data': 'In rooms: ' + ', '.join(rooms()),
|
|
'count': session['receive_count']})
|
|
|
|
def on_close_room(self, message):
|
|
session['receive_count'] = session.get('receive_count', 0) + 1
|
|
emit('my_response', {'data': 'Room ' + message['room'] + ' is closing.',
|
|
'count': session['receive_count']},
|
|
room=message['room'])
|
|
close_room(message['room'])
|
|
|
|
def on_my_room_event(self, message):
|
|
session['receive_count'] = session.get('receive_count', 0) + 1
|
|
emit('my_response',
|
|
{'data': message['data'], 'count': session['receive_count']},
|
|
room=message['room'])
|
|
|
|
def on_disconnect_request(self):
|
|
session['receive_count'] = session.get('receive_count', 0) + 1
|
|
emit('my_response',
|
|
{'data': 'Disconnected!', 'count': session['receive_count']})
|
|
disconnect()
|
|
|
|
def on_my_ping(self):
|
|
emit('my_pong')
|
|
|
|
def on_connect(self):
|
|
global thread
|
|
with thread_lock:
|
|
if thread is None:
|
|
thread = socketio.start_background_task(background_thread)
|
|
emit('my_response', {'data': 'Connected', 'count': 0})
|
|
|
|
def on_disconnect(self):
|
|
print('Client disconnected', request.sid)
|
|
|
|
if __name__ == "__main__":
|
|
socketio.run(
|
|
app=app,
|
|
port=config["API_PORT"],
|
|
host=config["API_HOST"],
|
|
)
|