comm.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. $(function() {
  2. var connection = null;
  3. var nick = null;
  4. var self_player = null;
  5. // when creating a word
  6. var question = null;
  7. var char_list = null;
  8. // when guessing results
  9. var wordlist = null;
  10. var questionlist = null;
  11. function validate_word(word) {
  12. var allowedChars = [" ", "-", "'"]
  13. var countmap = {};
  14. for (var i = 0; i < char_list.length; i++) {
  15. var upper = char_list[i].toUpperCase();
  16. if (countmap[upper] == null) {
  17. countmap[upper] = 0;
  18. }
  19. countmap[upper] += 1;
  20. }
  21. var uppercase_word = word.toUpperCase();
  22. for (var i = 0; i < uppercase_word.length; i++) {
  23. var upper = uppercase_word.charAt(i);
  24. var count = countmap[upper];
  25. if (allowedChars.includes(upper))
  26. continue;
  27. if (count != null) {
  28. if (count <= 0) {
  29. return false;
  30. }
  31. countmap[upper] = count - 1;
  32. }
  33. else {
  34. return false;
  35. }
  36. }
  37. return word.length > 0;
  38. }
  39. $('#join').click(function() {
  40. var game_id = $('#gameId').val();
  41. nick = $('#nick').val();
  42. var msg = {
  43. join: {
  44. game_id: game_id,
  45. nick: nick,
  46. }
  47. };
  48. send(msg);
  49. });
  50. $('#create').click(function() {
  51. var game_id = $('#gameId').val();
  52. nick = $('#nick').val();
  53. var msg = {
  54. create_game: {
  55. game_id: game_id,
  56. nick: nick,
  57. }
  58. };
  59. send(msg);
  60. });
  61. $('#leave-lobby').click(function() {
  62. var msg = "leave_lobby";
  63. send(msg);
  64. });
  65. $('#ready-button').click(function() {
  66. var msg = "ready";
  67. if (self_player != null && self_player.ready) {
  68. msg = "unready";
  69. }
  70. send(msg);
  71. });
  72. $('#createform').submit(function(ev) {
  73. ev.preventDefault();
  74. var word = $('#word').val();
  75. if (validate_word(word)) {
  76. var msg = {
  77. submit_word: {
  78. word: word
  79. }
  80. };
  81. send(msg);
  82. }
  83. else {
  84. statusMessage("Please use only given characters");
  85. }
  86. });
  87. $('#guessingform').submit(function(ev) {
  88. ev.preventDefault();
  89. var list = getDragAnswers();
  90. var msg = {
  91. submit_guess: {
  92. guesses: list
  93. }
  94. };
  95. send(msg);
  96. });
  97. function connect(initial_message) {
  98. if (connection != null) {
  99. disconnect();
  100. }
  101. var uri = 'ws://' + window.location.host + '/ws/';
  102. connection = new WebSocket(uri);
  103. connection.onopen = function() {
  104. connection.send(JSON.stringify(initial_message));
  105. };
  106. connection.onmessage = function(e) {
  107. onReceive(e);
  108. };
  109. connection.onclose = function() {
  110. };
  111. }
  112. function send(message) {
  113. if (connection != null) {
  114. connection.send(JSON.stringify(message));
  115. }
  116. else {
  117. connect(message);
  118. }
  119. }
  120. function disconnect() {
  121. connection.close();
  122. connection = null;
  123. }
  124. function onReceive(msg) {
  125. var obj = JSON.parse(msg.data);
  126. if (obj.game_not_found != null) {
  127. statusMessage("Game \"" + obj.game_not_found.game_id + "\" not found");
  128. }
  129. else if (obj.game_already_exists != null) {
  130. statusMessage("Game \"" + obj.game_already_exists.game_id + "\" already exists");
  131. }
  132. else if (obj.left_lobby != null) {
  133. setView('login');
  134. $('#lobby-control').hide();
  135. }
  136. else if (obj.player_list != null) {
  137. updatePlayerList(obj.player_list);
  138. }
  139. else if (obj.game_state != null) {
  140. updatePlayerList(obj.game_state.players);
  141. var gs = obj.game_state;
  142. if (gs.state_data === "starting") {
  143. setView('starting');
  144. }
  145. else if (gs.state_data.creating != null) {
  146. var creating = gs.state_data.creating;
  147. var chars = creating.available_chars;
  148. question = creating.question;
  149. char_list = chars;
  150. $('#question-box').html(creating.question);
  151. $('#letter-box').html(chars.join(" "));
  152. $('#word').val("");
  153. setView('creating');
  154. }
  155. else if (gs.state_data.guessing != null) {
  156. var guesses = gs.state_data.guessing;
  157. displayGuessing(guesses);
  158. }
  159. }
  160. else if (obj.round_result != null) {
  161. displayResult(obj.round_result);
  162. }
  163. else {
  164. statusMessage("Unknown message retrieved");
  165. }
  166. }
  167. function displayGuessing(guesses) {
  168. var sub_words = guesses.submitted_words;
  169. var questions = guesses.questions;
  170. questionlist = questions;
  171. wordlist = sub_words.map(pair => pair[0]);
  172. setupDraggame(questionlist, wordlist);
  173. setView('guessing');
  174. }
  175. function displayResult(result) {
  176. var sol = result.solutions;
  177. var solution_dict = {};
  178. for (var i = 0; i < sol.length; i++) {
  179. solution_dict[sol[i][0]] = sol[i][1];
  180. }
  181. var $table = $('<table/>');
  182. $table.addClass('result-table');
  183. var $row = $("<tr/>");
  184. $row.append($("<th/>"));
  185. for(var i = 0; i < result.words.length; i++) {
  186. var $wordline = $("<th/>");
  187. $wordline.text(result.words[i]);
  188. $row.append($wordline);
  189. }
  190. $table.append($row);
  191. for(var i = 0; i < result.questions.length; i++) {
  192. var $row = $("<tr/>");
  193. var $header = $("<th/>");
  194. $header.text(result.questions[i]);
  195. $row.append($header);
  196. for(var j = 0; j < result.words.length; j++) {
  197. var $cell = $("<td/>");
  198. if (solution_dict[result.words[j]] == result.questions[i]) {
  199. $cell.addClass("result-correct");
  200. }
  201. else {
  202. $cell.addClass("result-wrong");
  203. }
  204. $cell.text(result.guesses[j][i]);
  205. $row.append($cell);
  206. }
  207. $table.append($row);
  208. }
  209. $('#guesses-table').html("");
  210. $('#guesses-table').append($table);
  211. $('#points-table').html("");
  212. var $header = $("<tr/>");
  213. var $points = $("<tr/>");
  214. var pl = result.point_list;
  215. for(var i = 0; i < pl.length; i++) {
  216. var $htd = $("<td/>"); $htd.text(pl[i][0]);
  217. var $ptd = $("<td/>"); $ptd.text(pl[i][1]);
  218. $header.append($htd);
  219. $points.append($ptd);
  220. }
  221. $('#points-table').append($header);
  222. $('#points-table').append($points);
  223. setView('results');
  224. }
  225. function updateReadyStates(player) {
  226. self_player = player;
  227. if (player.ready) {
  228. $("#ready-button").addClass("button-unready");
  229. $("#ready-button").removeClass("button-ready");
  230. $("#submit-word").addClass("button-unready");
  231. $("#submit-word").removeClass("button-ready");
  232. $("#submit-guess").addClass("button-unready");
  233. $("#submit-guess").removeClass("button-ready");
  234. } else {
  235. $("#ready-button").addClass("button-ready");
  236. $("#ready-button").removeClass("button-unready");
  237. $("#submit-word").addClass("button-ready");
  238. $("#submit-word").removeClass("button-unready");
  239. $("#submit-guess").addClass("button-ready");
  240. $("#submit-guess").removeClass("button-unready");
  241. }
  242. }
  243. function updatePlayerList(players) {
  244. $('#player-list').text("");
  245. for (var i = 0; i < players.length; i++) {
  246. var playerclass = players[i].ready ? "player-ready" : "player-unready";
  247. var $pitem = $('<p/>');
  248. $pitem.addClass(playerclass);
  249. $pitem.text(players[i].nick + " (" + players[i].points + ")");
  250. $('#player-list').append($pitem);
  251. if (players[i].nick == nick) {
  252. updateReadyStates(players[i]);
  253. }
  254. }
  255. $('#lobby-control').show();
  256. }
  257. function setView(view) {
  258. $('#loginform').hide();
  259. $('#startingform').hide();
  260. $('#creating').hide();
  261. $('#guessing').hide();
  262. $('#results').hide();
  263. switch (view) {
  264. case 'login':
  265. $('#loginform').show();
  266. break;
  267. case 'starting':
  268. $('#startingform').show();
  269. $('#results').show();
  270. break;
  271. case 'creating':
  272. $('#creating').show();
  273. break;
  274. case 'guessing':
  275. $('#guessing').show();
  276. break;
  277. case 'results':
  278. $('#results').show();
  279. break;
  280. }
  281. }
  282. function statusMessage(message) {
  283. $('#status').html(message);
  284. setTimeout(function () {
  285. $('#status').html("");
  286. }, 4000);
  287. }
  288. });