// ==UserScript==
// @name 摸鱼派聊天室
// @namespace https://lemon-cxh.github.io/
// @version 1.1
// @description 摸鱼派聊天室,防撤回、抢红包、自动清屏、一言、机器人聊天、自动+1、弹框查看图片
// @author Lemon
// @match https://pwl.icu/cr
// @icon https://www.google.com/s2/favicons?domain=pwl.icu
// @connect https://v1.hitokoto.cn
// @connect http://api.qingyunke.com
// @run-at document-start
// @grant unsafeWindow
// @grant GM_xmlhttpRequest
// @license MIT
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
const OPEN_PACKET_URL = 'https://pwl.icu/chat-room/red-packet/open';
const HISTORY_MESSAGE_URL = 'https://pwl.icu/chat-room/more';
const HITOKOTO_URL = 'https://v1.hitokoto.cn/?c=e&c=f&c=j';
const AI_ELEMENT_ID = 'aiCheckbox';
var aiEnable = false;
const PLUS_ONE_ID = 'pulsOne';
var plusOneEnable = true;
var previousMessage = '';
var previousPlusOneMessage = '';
var clearChatRoomElement;
const MESSAGE_MAX = 30;
var messageCount = 0;
unsafeWindow.redPacketMap = new Map();
function webSocketHook() {
unsafeWindow.WebSocket = new Proxy(unsafeWindow.WebSocket, {
construct(target, args) {
let obj = new target(...args);
return new Proxy(obj, proxyHandler);
}
})
};
function requestSend() {
XMLHttpRequest.prototype.mySend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(data) {
this.addEventListener('load', function() {
if (this.responseURL === OPEN_PACKET_URL) {
showMoney(this.response);
unsafeWindow.Util.closeAlert();
return;
}
if (-1 !== this.responseURL.indexOf(HISTORY_MESSAGE_URL)) {
queryRedPacketOnHistory(this.response);
return;
}
}, false);
this.mySend.apply(this, arguments);
}
}
function addMenu() {
document.onreadystatechange = function(){
if(document.readyState == 'complete'){
let e = document.getElementById('redPacketBtn').parentNode.children[3];
clearChatRoomElement = e.children[0];
// AI聊天机器人
let ai = document.createElement("button");
ai.setAttribute('style', 'margin-right: 6px');
ai.innerHTML = '机器人';
e.insertBefore(ai, e.firstChild);
document.getElementById(AI_ELEMENT_ID).addEventListener( 'change', function() {
aiEnable = this.checked;
});
// 自动加一
let plusOne = document.createElement("button");
plusOne.setAttribute('style', 'margin-right: 6px');
plusOne.innerHTML = '+1';
e.insertBefore(plusOne, e.firstChild);
plusOne = document.getElementById(PLUS_ONE_ID);
plusOne.checked = true;
plusOne.addEventListener( 'change', function() {
plusOneEnable = 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();
unsafeWindow.ChatRoom.showImg = id => {
alert('
' + document.getElementById(id).outerHTML + '
')
}
}
}
}
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);
switch (o.type) {
case 'redPacketStatus':
delayOpenRedPacket(o);
realOnMessage(event);
break;
case 'revoke':
preventRevoke(o.oId);
return;
case 'msg':
messageCount++;
if (isRedPacketMessage(o.content)) {
delayOpenRedPacket(o);
} else {
chat(o);
}
realOnMessage(event);
if (hasImg(o)) {
addImgClick(o.oId)
}
clearChatRoom();
break;
}
};
// 查询历史记录是否有红包
function queryRedPacketOnHistory(data) {
console.log('查询历史记录中是否有未领取红包');
let o = JSON.parse(data);
if (!o.data) {
return;
}
o.data.forEach(e => {
if (isRedPacketMessage(e.content) && notOpenRedPacket(e.content)) {
openRedPacket(e.oId);
console.log('历史消息中有未领取红包');
}
})
}
// 是否是红包信息
function isRedPacketMessage(s) {
return -1 !== s.indexOf('"msgType":"redPacket"');
}
// 是否还有未打开的红包
function notOpenRedPacket(content) {
let o = JSON.parse(content);
return o.got < o.count && o.who.every(e => unsafeWindow.Label.currentUserName != e.userName);
}
function delayOpenRedPacket(oId) {
if (unsafeWindow.ChatRoom) {
setTimeout(() => {
openRedPacket(oId);
}, 3000 + Math.round(Math.random() * 100));
}
}
// 弹窗提示抢红包信息
function showMoney(data) {
let o = JSON.parse(data);
let usesrMoney = -1;
o.who.forEach(e => {
console.log(e.userName + ' 抢到了:' + e.userMoney + '积分');
if (e.userName === unsafeWindow.Label.currentUserName) {
usesrMoney = e.userMoney;
}
});
console.log('____________________')
usesrMoney > -1 ? notice('抢到了:' + usesrMoney + '积分') : notice('很遗憾没有抢到红包');
}
// 清屏
function clearChatRoom() {
if (messageCount > MESSAGE_MAX) {
clearChatRoomElement.click();
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 -= 20;
}
function addImgClick(oId) {
let imgs = document.getElementById('chatroom' + oId).querySelector('.vditor-reset').querySelectorAll('img');
imgs.forEach((e, index) => {
e.setAttribute('onclick', 'ChatRoom.showImg("img' + oId + index + '")');
e.setAttribute('id', 'img' + oId + index);
})
}
function hasImg(o) {
return -1 !== o.content.indexOf('![]()