comm.js 8.2 KB

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