您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
TL;DR
- // ==UserScript==
- // @name Devast.io - chat-logger
- // @namespace https://tampermonkey.net/
- // @version 0.3
- // @description TL;DR
- // @author https://greasyfork.org/ja/users/705684
- // @match *://devast.io/
- // @match *://devast.io/*/
- // @match *://devasio.github.io/Devast/
- // @icon https://www.google.com/s2/favicons?sz=64&domain=devast.io
- // @license GPL-3.0-or-later
- // @grant none
- // @require https://update.greasyfork.org/scripts/515720/1477822/util.js
- // ==/UserScript==
- (() => {
- window.WebSocket = class extends window.WebSocket {
- constructor(...args) {
- super(...args);
- listenWebSocket(this);
- chat.make();
- }
- send(data) {
- super.send(data);
- if (typeof data === 'string') {
- // JSON
- const arr = JSON.parse(data);
- if (arr[0] === 1) {
- chat.log('you', arr[1]);
- }
- } else {
- // binary
- }
- }
- };
- const chat = new (class {
- constructor() {
- this.elm = document.createElement('div');
- Object.assign(this.elm.style, {
- position: 'fixed',
- left: '30vw',
- width: '40vw',
- height: '15vh',
- backgroundColor: 'rgba(0, 0, 0, 0.1)',
- overflow: 'auto',
- padding: '0.5em',
- userSelect: 'none',
- });
- this.count = 0;
- }
- make() {
- document.body.append(this.elm);
- }
- async log(author, text) {
- const wrapper = document.createElement('div');
- const random = await window.pseudoRandomBy(author);
- Object.assign(wrapper.style, {
- backgroundColor:
- this.count++ % 2 ? 'rgba(0, 0, 0, 0.3)' : 'rgba(63, 63, 63, 0.3)',
- color: `hsl(${360 * random | 0} 100% 50%)`,
- padding: '0 0.5em',
- });
- const authorHolder = document.createElement('span');
- const textHolder = document.createElement('span');
- this.elm.append(wrapper);
- wrapper.append(authorHolder);
- wrapper.append(textHolder);
- authorHolder.innerText = `${author}: `;
- textHolder.innerText = `${text} (${window.formatTime()})`;
- this.elm.scrollTop = this.elm.scrollHeight;
- }
- })();
- const listenWebSocket = (ws) => {
- ws.addEventListener('message', (e) => {
- if (typeof e.data === 'string') {
- // JSON
- parseJSON(e.data);
- } else if (typeof e.data === 'object') {
- // ArrayBuffer
- }
- });
- };
- const parseJSON = (data) => {
- const arr = JSON.parse(data);
- switch (arr[0]) {
- case 0: {
- // chat
- const id = arr[1];
- const author = `${players.nicknames[id]}#${id}`;
- chat.log(author, arr[2]);
- break;
- }
- case 1: // new player
- players.join(arr[1], arr[3]);
- break;
- case 2: // nicknames token
- players.nicknames = arr;
- break;
- case 3: // alert
- break;
- case 4: // new team
- break;
- case 5: // team name
- break;
- }
- };
- const players = new (class {
- constructor() {
- this.nicknames = null;
- }
- join(id, nickname) {
- this.nicknames[id] = nickname;
- }
- })();
- })();