// ==UserScript== // @name 摸鱼派聊天室 // @namespace https://lemon-cxh.github.io/ // @version 1.16 // @description 摸鱼派聊天室,防撤回、自动清屏、一言、小冰游戏 // @author Lemon // @match https://fishpi.cn/cr // @match https://fishpi.cn // @icon https://www.google.com/s2/favicons?domain=pwl.icu // @connect v1.hitokoto.cn // @run-at document-start // @grant unsafeWindow // @grant GM_xmlhttpRequest // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; const URL = 'https://fishpi.cn'; const CHAT_URL = URL + '/cr'; const GAME_URL = "wss://game.yuis.cc"; const HITOKOTO_URL = 'https://v1.hitokoto.cn/?c=e&c=f&c=j'; const REVOKE_ID = 'revokeCheckbox'; var revokeEnable = false; const MESSAGE_MAX = 60; var messageCount = 0; const MEDICATE_ID = 'medicate'; let medicateEnable = false let gameOnline = false; function webSocketHook() { unsafeWindow.WebSocket = new Proxy(unsafeWindow.WebSocket, { construct(target, args) { let obj = new target(...args); return new Proxy(obj, proxyHandler); } }) }; function addMenu() { document.onreadystatechange = function(){ if(document.readyState == 'complete'){ let e = document.getElementById('redPacketBtn').parentNode.children[3]; // 防撤回 let revoke = document.createElement("button"); revoke.setAttribute('style', 'margin-right: 6px'); revoke.innerHTML = '防撤回'; e.insertBefore(revoke, e.firstChild); document.getElementById(REVOKE_ID).addEventListener( 'change', function() { revokeEnable = this.checked; }); // 自动用药 let medicate = document.createElement("button"); medicate.setAttribute('style', 'margin-right: 6px'); medicate.innerHTML = '买/用药'; e.insertBefore(medicate, e.firstChild); document.getElementById(MEDICATE_ID).addEventListener( 'change', function() { medicateEnable = this.checked; }); // 一言 e = document.getElementById('breezemoonInput').parentNode; let hitokoto = document.createElement("button"); hitokoto.innerHTML = '一言'; hitokoto.setAttribute('class', 'green'); e.insertBefore(hitokoto, e.lastChild.nextSibling); hitokoto.onclick = () => sendHitokoto(); } } } let proxyHandler = { get(target, property) { let value = target[property] if ((typeof value) === 'function') { value = value.bind(target) } return value }, set(target, property, value) { if (property === 'onmessage') { let realOnMessage = value; value = function(event) { analyzeMessage(event, realOnMessage); } } target[property] = value return value } }; // 解析消息 function analyzeMessage(event, realOnMessage) { var o = JSON.parse(event.data); if (event.origin === GAME_URL) { gameWsHandler(o); realOnMessage(event); } else { chatWsHandler(o) && realOnMessage(event); } }; function gameWsHandler(data) { console.log(data) if (!gameOnline && data.type === 'gameMsg' && !data.ck) { sendGameMsg('登录 123456') return } if (!gameOnline && data.ck) { gameOnline = true; sendGameMsg('信息') return } if (data.type === 'gameMsg' && (data.msg.indexOf('吐纳结束') >= 0 || data.msg.indexOf('你历练回来啦') >= 0)){ sendGameMsg('信息') return } let index = data.msg.indexOf('吐纳次数:'); if (index >= 0) { let splitIndex = data.msg.indexOf('/', index + 5); let start = parseInt(data.msg.substring(index + 5, splitIndex)); let max = parseInt(data.msg.substring(splitIndex + 1, data.msg.indexOf('
', splitIndex))); if (start < max) { sendGameMsg('吐纳') return } } index = data.msg.indexOf('历练次数:'); if (index >= 0) { let splitIndex = data.msg.indexOf('/', index + 5); let start = parseInt(data.msg.substring(index + 5, splitIndex)); let max = parseInt(data.msg.substring(splitIndex + 1, data.msg.indexOf('
', splitIndex))); if (start < max) { if (medicateEnable) { sendGameMsg('购买 引魔香') sendGameMsg('购买 大力丸') sendGameMsg('使用 引魔香') sendGameMsg('使用 大力丸') } sendGameMsg('历练') return } } } function chatWsHandler(data) { switch (data.type) { case 'revoke': if (revokeEnable) { preventRevoke(data.oId); return false; } break; case 'msg': messageCount++; clearChatRoom(); return true; break; default: return true; } } function sendGameMsg(msg) { let e = document.getElementsByClassName('ice-chat-input')[0] e.value = msg unsafeWindow.ChatRoom.sendIceMsg() e.value = '' } // 清屏 function clearChatRoom() { if (messageCount > MESSAGE_MAX) { document.getElementById('chats').innerHTML=''; unsafeWindow.page = 0; unsafeWindow.ChatRoom.more(); messageCount = 0; } } // 防撤回 function preventRevoke(oId) { let source = document.getElementById('chatroom' + oId); if (!source) { return; } let href = source.firstElementChild.getAttribute('href'); let child = document.createElement("div"); child.setAttribute('style', 'color: rgb(50 50 50);margin-bottom: 10px;text-align: center;'); child.innerHTML = '' + href.substring(8) + '想要撤回消息'; source.parentNode.insertBefore(child, source); messageCount--; } // 发送一言 function sendHitokoto() { GM_xmlhttpRequest({ method: "GET", url: HITOKOTO_URL, onload: function(response){ if (response.status === 200) { let o = JSON.parse(response.response); document.getElementById('breezemoonInput').value = o.hitokoto; } }, onerror: function(response){ console.log("请求失败"); } }); } if (CHAT_URL === window.location.href) { webSocketHook(); addMenu(); } else { window.onload = () => { unsafeWindow.Util.closeAlert() } } })();