blob: d7ed0d292706c810f9c46bdb123cf5a62419b60f (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
import traceback
import threading
import logging
import json
from flask import Flask
from flask import render_template
from flask_sockets import Sockets
from rmq import Rmq
# Load app
app = Flask(__name__)
app.jinja_env.auto_reload = True
sockets = Sockets(app)
# Logging
gunicorn_logger = logging.getLogger('gunicorn.error')
app.logger.handlers = gunicorn_logger.handlers
app.logger.setLevel(gunicorn_logger.level)
log = app.logger
@app.route('/')
def index():
return render_template('index.html')
@sockets.route('/ws/<snekboxid>')
def websocket_route(ws, snekboxid):
localdata = threading.local()
localdata.thread_ws = ws
rmq = Rmq()
def message_handler(ch, method, properties, body, thread_ws):
msg = body.decode('utf-8')
log.debug(f"message_handler: {msg}")
thread_ws.send(msg)
ch.basic_ack(delivery_tag=method.delivery_tag)
consumer_parameters = {'queue': snekboxid,
'callback': message_handler,
'thread_ws': localdata.thread_ws}
consumer = threading.Thread(target=rmq.consume, kwargs=consumer_parameters)
consumer.daemon = True
consumer.start()
try:
while not ws.closed:
message = ws.receive()
if message:
snek_msg = json.dumps({snekboxid: message})
log.info(f"User {snekboxid} sends message\n{message.strip()}")
rmq.publish(snek_msg)
except Exception:
log.info(traceback.format_exc())
finally:
if not ws.closed:
ws.close()
if __name__ == '__main__':
from gevent import pywsgi
from geventwebsocket.handler import WebSocketHandler
server = pywsgi.WSGIServer(('0.0.0.0', 5000), app, handler_class=WebSocketHandler)
server.serve_forever()
|