Devast.io - chat-logger

TL;DR

目前为 2024-11-04 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Devast.io - chat-logger
  3. // @namespace https://tampermonkey.net/
  4. // @version 0.1
  5. // @description TL;DR
  6. // @author https://greasyfork.org/ja/users/705684
  7. // @match *://devast.io/
  8. // @match *://devast.io/*/
  9. // @icon https://www.google.com/s2/favicons?sz=64&domain=devast.io
  10. // @license GPL-3.0-or-later
  11. // @grant none
  12. // @require https://update.greasyfork.org/scripts/515720/1477456/util.js
  13. // ==/UserScript==
  14.  
  15. (() => {
  16. ((ws) => {
  17. window.window.WebSocket = class extends ws {
  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. }
  32. }
  33. };
  34. })(window.window.WebSocket);
  35.  
  36. const chat = new (class {
  37. constructor() {
  38. this.elm = document.createElement('div');
  39. Object.assign(this.elm.style, {
  40. position: 'fixed',
  41. left: '30vw',
  42. width: '40vw',
  43. height: '15vh',
  44. backgroundColor: 'rgba(0, 0, 0, 0.1)',
  45. overflow: 'auto',
  46. padding: '0.5em',
  47. userSelect: 'none',
  48. });
  49. this.count = 0;
  50. }
  51. make() {
  52. document.body.append(this.elm);
  53. }
  54. async log(author, text) {
  55. const wrapper = document.createElement('div');
  56. const random = await window.pseudoRandomBy(author);
  57. Object.assign(wrapper.style, {
  58. backgroundColor:
  59. this.count++ % 2 ? 'rgba(0, 0, 0, 0.3)' : 'rgba(63, 63, 63, 0.3)',
  60. color: `hsl(${360 * random | 0} 100% 50%)`,
  61. padding: '0 0.5em',
  62. });
  63. const authorHolder = document.createElement('span');
  64. const textHolder = document.createElement('span');
  65. this.elm.append(wrapper);
  66. wrapper.append(authorHolder);
  67. wrapper.append(textHolder);
  68. authorHolder.innerText = `${author}: `;
  69. textHolder.innerText = `${text} (${window.formatTime()})`;
  70. this.elm.scrollTop = this.elm.scrollHeight;
  71. }
  72. })();
  73.  
  74. const listenWebSocket = (ws) => {
  75. ws.addEventListener('message', (e) => {
  76. if (typeof e.data === 'string') {
  77. // JSON
  78. parseJSON(e.data);
  79. } else if (typeof e.data === 'object') {
  80. // ArrayBuffer
  81. }
  82. });
  83. };
  84.  
  85. const parseJSON = (data) => {
  86. const arr = JSON.parse(data);
  87. switch (arr[0]) {
  88. case 0: {
  89. // chat
  90. const id = arr[1];
  91. const author = `${players.nicknames[id]}#${id}`;
  92. chat.log(author, arr[2]);
  93. console.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. })();