From 34c41196d3e74515786cff5fe767eadababdc6b5 Mon Sep 17 00:00:00 2001
From: Nils G <nils.gondermann@ruhr-uni-bochum.de>
Date: Sat, 18 Apr 2020 13:52:34 +0200
Subject: [PATCH] Add handling of different websocket packet types and split
 websocket handling into own include

---
 modules/websocket_util.py    |  2 +-
 views/game/index.html        | 35 ++------------------------
 views/include/websocket.html | 48 ++++++++++++++++++++++++++++++++++++
 3 files changed, 51 insertions(+), 34 deletions(-)
 create mode 100644 views/include/websocket.html

diff --git a/modules/websocket_util.py b/modules/websocket_util.py
index a96fe69..7ad84d7 100644
--- a/modules/websocket_util.py
+++ b/modules/websocket_util.py
@@ -4,7 +4,7 @@ from gluon.contrib.websocket_messaging import websocket_send
 from http_util import GET_HOST
 
 def WEBSOCKET_SEND(_room, _type, _data):
-    websocket_send(current.request.env.wsgi_url_scheme + '://' + GET_HOST() + ':8888', _data, '67c371fd204fbcbf9742310d1a9d951bcca1aa86', _room.code)
+    websocket_send(current.request.env.wsgi_url_scheme + '://' + GET_HOST() + ':8888', _type + ":" + _data, '67c371fd204fbcbf9742310d1a9d951bcca1aa86', _room.code)
 
 def GET_URL(_room):
     if current.request.env.wsgi_url_scheme == "https":
diff --git a/views/game/index.html b/views/game/index.html
index 45e22c6..78175b6 100644
--- a/views/game/index.html
+++ b/views/game/index.html
@@ -24,37 +24,6 @@
     $(document).ready(function(){
         render(name, role, JSON.parse('{{=XML(room_record.roles)}}'));
     });
-
-
-    //Websocket connection
-    $(document).ready(function(){
-
-        if ('WebSocket' in window) {
-            var ws = new WebSocket("{{=GET_URL(room_record)}}");
-            ws.onopen = function () {
-                ws.initialConnect = true;
-            };
-            ws.onmessage = function(e) {
-                set_info(e.data);
-                render(name, role, JSON.parse(e.data));
-            };
-            ws.onerror = function(e) {
-                set_error("{{=T('Error')}}: "+e);
-            };
-            ws.onclose = function () {
-                if(ws.initialConnect) {
-                    window.setTimeout(function() {
-                        set_error("{{=T('WebSocket has closed')}}. {{=T('Please refresh this website')}}.");
-                    }, 1000);
-                } else {
-                    set_error("{{=T('WebSocket server is not responding')}}.");
-                }
-            };
-        } else {
-            /* not supported */
-            set_error("{{=T('WebSocket is not supported by your browser')}}.");
-        }
-
-    });
-
 </script>
+
+{{include 'include/websocket.html'}}
diff --git a/views/include/websocket.html b/views/include/websocket.html
new file mode 100644
index 0000000..298eee3
--- /dev/null
+++ b/views/include/websocket.html
@@ -0,0 +1,48 @@
+<script type="text/javascript">
+    //Websocket connection
+    $(document).ready(function(){
+
+        if ('WebSocket' in window) {
+            var ws = new WebSocket("{{=GET_URL(room_record)}}");
+            ws.onopen = function () {
+                ws.initialConnect = true;
+            };
+            ws.onmessage = function(e) {
+                var firstColon = e.data.indexOf(":");
+                if(firstColon === -1) {
+                    set_error("{{=T('Invalid WebSocket data received')}}: '" + e.data + "'");
+                    return;
+                }
+
+                var type = e.data.substring(0, firstColon);
+                var data = e.data.substring(firstColon + 1);
+
+                switch(type) {
+                    case "roles":
+                        render(name, role, JSON.parse(data));
+                        break;
+                    default:
+                        set_error("{{=T('Invalid WebSocket data received')}}: '" + type + "'");
+                        return;
+                }
+
+            };
+            ws.onerror = function(e) {
+                set_error("{{=T('Error')}}: "+e);
+            };
+            ws.onclose = function () {
+                if(ws.initialConnect) {
+                    window.setTimeout(function() {
+                        set_error("{{=T('WebSocket has closed')}}. {{=T('Please refresh this website')}}.");
+                    }, 1000);
+                } else {
+                    set_error("{{=T('WebSocket server is not responding')}}.");
+                }
+            };
+        } else {
+            /* not supported */
+            set_error("{{=T('WebSocket is not supported by your browser')}}.");
+        }
+
+    });
+</script>
-- 
GitLab