Devast.io - chat-logger

TL;DR

  1. // ==UserScript==
  2. // @name Devast.io - chat-logger
  3. // @namespace https://tampermonkey.net/
  4. // @version 0.3
  5. // @description TL;DR
  6. // @author https://greatest.deepsurf.us/ja/users/705684
  7. // @match *://devast.io/
  8. // @match *://devast.io/*/
  9. // @match *://devasio.github.io/Devast/
  10. // @icon https://www.google.com/s2/favicons?sz=64&domain=devast.io
  11. // @license GPL-3.0-or-later
  12. // @grant none
  13. // @require https://update.greatest.deepsurf.us/scripts/515720/1477822/util.js
  14. // ==/UserScript==
  15.  
  16. (() => {
  17. window.WebSocket = class extends window.WebSocket {
  18. constructor(...args) {
  19. super(...args);
  20. listenWebSocket(this);
  21. chat.make();
  22. }
  23. send(data) {
  24. super.send(data);
  25. if (typeof data === 'string') {
  26. // JSON
  27. const arr = JSON.parse(data);
  28. if (arr[0] === 1) {
  29. chat.log('you', arr[1]);
  30. }
  31. } else {
  32. // binary
  33. }
  34. }
  35. };
  36.  
  37. const chat = new (class {
  38. constructor() {
  39. this.elm = document.createElement('div');
  40. Object.assign(this.elm.style, {
  41. position: 'fixed',
  42. left: '30vw',
  43. width: '40vw',
  44. height: '15vh',
  45. backgroundColor: 'rgba(0, 0, 0, 0.1)',
  46. overflow: 'auto',
  47. padding: '0.5em',
  48. userSelect: 'none',
  49. });
  50. this.count = 0;
  51. }
  52. make() {
  53. document.body.append(this.elm);
  54. }
  55. async log(author, text) {
  56. const wrapper = document.createElement('div');
  57. const random = await window.pseudoRandomBy(author);
  58. Object.assign(wrapper.style, {
  59. backgroundColor:
  60. this.count++ % 2 ? 'rgba(0, 0, 0, 0.3)' : 'rgba(63, 63, 63, 0.3)',
  61. color: `hsl(${360 * random | 0} 100% 50%)`,
  62. padding: '0 0.5em',
  63. });
  64. const authorHolder = document.createElement('span');
  65. const textHolder = document.createElement('span');
  66. this.elm.append(wrapper);
  67. wrapper.append(authorHolder);
  68. wrapper.append(textHolder);
  69. authorHolder.innerText = `${author}: `;
  70. textHolder.innerText = `${text} (${window.formatTime()})`;
  71. this.elm.scrollTop = this.elm.scrollHeight;
  72. }
  73. })();
  74.  
  75. const listenWebSocket = (ws) => {
  76. ws.addEventListener('message', (e) => {
  77. if (typeof e.data === 'string') {
  78. // JSON
  79. parseJSON(e.data);
  80. } else if (typeof e.data === 'object') {
  81. // ArrayBuffer
  82. }
  83. });
  84. };
  85.  
  86. const parseJSON = (data) => {
  87. const arr = JSON.parse(data);
  88. switch (arr[0]) {
  89. case 0: {
  90. // chat
  91. const id = arr[1];
  92. const author = `${players.nicknames[id]}#${id}`;
  93. chat.log(author, arr[2]);
  94. break;
  95. }
  96. case 1: // new player
  97. players.join(arr[1], arr[3]);
  98. break;
  99. case 2: // nicknames token
  100. players.nicknames = arr;
  101. break;
  102. case 3: // alert
  103. break;
  104. case 4: // new team
  105. break;
  106. case 5: // team name
  107. break;
  108. }
  109. };
  110.  
  111. const players = new (class {
  112. constructor() {
  113. this.nicknames = null;
  114. }
  115. join(id, nickname) {
  116. this.nicknames[id] = nickname;
  117. }
  118. })();
  119. })();