// ==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()
}
}
})();