// ==UserScript==
// @name 摸鱼派聊天室
// @namespace https://lemon-cxh.github.io/
// @version 1.19
// @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 https://update.greasyfork.icu/scripts/436485/%E6%91%B8%E9%B1%BC%E6%B4%BE%E8%81%8A%E5%A4%A9%E5%AE%A4.user.js
// @updateURL https://update.greasyfork.icu/scripts/436485/%E6%91%B8%E9%B1%BC%E6%B4%BE%E8%81%8A%E5%A4%A9%E5%AE%A4.meta.js
// ==/UserScript==
(function() {
'use strict';
const URL = 'https://fishpi.cn';
const CHAT_URL = URL + '/cr';
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;
function setTitleAndIcon() {
document.querySelector('head link[rel*="icon"]').href = 'https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196';
document.querySelector('head title').innerText = 'Questionst - Stack Overflow';
}
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;
});
// 一言
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);
chatWsHandler(o) && realOnMessage(event);
};
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("请求失败");
}
});
}
setTitleAndIcon()
if (CHAT_URL === window.location.href) {
webSocketHook();
addMenu();
} else {
window.onload = () => {
unsafeWindow.Util.closeAlert()
}
}
})();