comm.js 7.9 KB

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