main.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. const socket = io();
  2. $(() => {
  3. socket.on('serverHandshake', onServerHandshake);
  4. socket.on('serverLogin', onServerLogin);
  5. socket.on('serverKick', onServerKick);
  6. });
  7. function onServerHandshake() {
  8. resetChatListeners();
  9. resetLoginListeners();
  10. var template = $('#chat-login-template').html();
  11. $('#chat-host').empty();
  12. $('#chat-host').append(template);
  13. $('#chat-login-form').submit((e) => {
  14. e.preventDefault();
  15. console.debug('submit login form', e);
  16. socket.emit('login', $('#chat-login-form .username').val(), $('#chat-login-form .password').val());
  17. return false;
  18. });
  19. socket.on('usernameInvalid', () => {
  20. $('#chat-login-form .username').focus();
  21. $('#chat-host .loginError').text('Username invalid.');
  22. });
  23. socket.on('usernameTaken', () => {
  24. $('#chat-login-form .username').focus();
  25. $('#chat-host .loginError').text('Username already in use.');
  26. });
  27. socket.on('passwordRequired', () => {
  28. $('#chat-login-form .passwordWrapper').css('display', '');
  29. $('#chat-login-form .password').focus();
  30. $('#chat-host .loginError').text('Für diesen reservierten Benutzer ist ein Passwort erforderlich.');
  31. });
  32. socket.on('passwordWrong', () => {
  33. $('#chat-login-form .passwordWrapper').css('display', '');
  34. $('#chat-login-form .password').focus();
  35. $('#chat-host .loginError').text('Das eingegebene Passwort ist ungültig.');
  36. });
  37. }
  38. function onServerLogin(user) {
  39. resetChatListeners();
  40. resetLoginListeners();
  41. var template;
  42. if (user.admin) {
  43. template = $('#chat-admin-template').html()
  44. } else {
  45. template = $('#chat-template').html()
  46. }
  47. $('#chat-host').empty();
  48. $('#chat-host').append(template);
  49. $('#chat-host .messageField').focus();
  50. socket.on('usersUpdated', (userList) => {
  51. $('#chat-host .main .userlist').empty();
  52. userList.sort((userA, userB) => userA.name.localeCompare(userB.name));
  53. userList.sort((userA, userB) => {
  54. if (userA.admin && !userB.admin) {
  55. return Number.MIN_SAFE_INTEGER;
  56. } else if (!userA.admin && userB.admin) {
  57. return Number.MAX_SAFE_INTEGER;
  58. }
  59. return 0;
  60. });
  61. for (let listUser of userList) {
  62. let userString = listUser.name;
  63. if (listUser.admin) {
  64. userString = '👑 ' + userString;
  65. }
  66. const userListEl = $('<li>');
  67. userListEl.text(userString);
  68. if (user.admin) {
  69. const kickBtn = $('<button class="kickBtn">🥾</button>');
  70. kickBtn.click(() => onKickUser(listUser));
  71. userListEl.append(kickBtn);
  72. }
  73. $('#chat-host .main .userlist').append(userListEl);
  74. }
  75. });
  76. if (user.admin) {
  77. socket.on('bannedUpdated', (bannedList) => {
  78. $('#chat-host .main .bannedlist').empty();
  79. for (let bannedItem of bannedList) {
  80. const bannedListEl = $('<li>');
  81. bannedListEl.text(bannedItem.ip + ' (' + bannedItem.user.name + ')');
  82. const removeBtn = $('<button class="removeBtn">✖</button>');
  83. removeBtn.click(() => onLiftBan(bannedItem.ip));
  84. bannedListEl.append(removeBtn);
  85. $('#chat-host .main .bannedlist').append(bannedListEl);
  86. }
  87. });
  88. }
  89. socket.on('message', (msg, user, timestamp) => {
  90. const messageWrapper = $('<li class="userMsg">');
  91. const timeEl = $('<span class="time">');
  92. timeEl.text(new Date(timestamp).toLocaleTimeString());
  93. timeEl.prop('title', new Date(timestamp).toLocaleString());
  94. messageWrapper.append(timeEl);
  95. const userEl = $('<span class="user">');
  96. let userString = user.name + ':';
  97. if (user.admin) {
  98. userString = '👑 ' + userString;
  99. }
  100. userEl.text(userString);
  101. messageWrapper.append(userEl);
  102. const messageEl = $('<span class="message">');
  103. messageEl.text(msg)
  104. messageWrapper.append(messageEl);
  105. appendMessage(messageWrapper);
  106. });
  107. socket.on('userJoined', (msg) => {
  108. appendMessage($('<li class="systemMsg user joined">').text(msg + ' hat den Chat betreten.'));
  109. });
  110. socket.on('userLeft', (msg) => {
  111. appendMessage($('<li class="systemMsg user left">').text(msg + ' hat den Chat verlassen.'));
  112. });
  113. $('#chat-host .messageForm').submit((e) => {
  114. e.preventDefault();
  115. socket.emit('message', $('#chat-host .messageForm .messageField').val());
  116. $('#chat-host .messageForm .messageField').val('');
  117. $('#chat-host .messageForm .messageField').focus();
  118. return false;
  119. });
  120. $("#chat-host .messageField").keypress((e) => {
  121. if(e.key == 'Enter' && !e.shiftKey) {
  122. e.preventDefault();
  123. $('#chat-host .messageForm').submit();
  124. return false;
  125. }
  126. });
  127. }
  128. function onServerKick() {
  129. resetChatListeners();
  130. resetLoginListeners();
  131. var template = $('#chat-kick-template').html();
  132. $('#chat-host').empty();
  133. $('#chat-host').append(template);
  134. }
  135. function resetChatListeners() {
  136. socket.removeAllListeners('usersUpdated');
  137. socket.removeAllListeners('message');
  138. socket.removeAllListeners('userJoined');
  139. socket.removeAllListeners('userLeft');
  140. }
  141. function resetLoginListeners() {
  142. socket.removeAllListeners('usernameInvalid');
  143. socket.removeAllListeners('usernameTaken');
  144. socket.removeAllListeners('passwordRequired');
  145. socket.removeAllListeners('passwordWrong');
  146. }
  147. function appendMessage(element) {
  148. const messagesListEl = $('#chat-host .main .messages')[0];
  149. const scrollMax = messagesListEl.scrollHeight - messagesListEl.clientHeight;
  150. const scrolled = messagesListEl.scrollTop != scrollMax;
  151. $('#chat-host .main .messages').append(element);
  152. if (!scrolled) {
  153. messagesListEl.scrollTop = messagesListEl.scrollHeight - messagesListEl.clientHeight;
  154. }
  155. }
  156. function onKickUser(user) {
  157. if (confirm('Möchten Sie den Benutzer "' + user.name + '" wirklich bannen?\nDies wird sich auf alle Benutzer mit der gleichen IP-Adresse auswirken.')) {
  158. socket.emit('requestKick', user);
  159. }
  160. }
  161. function onLiftBan(ip) {
  162. socket.emit('requestLiftBan', ip);
  163. }