// ==UserScript==
// @name Cutemon机器人 Rebuild
// @namespace Cutemon
// @version 4.53
// @description 暗中做个机器人岂不美哉_(¦3」∠)_
// @author Cutemon
// @include /https?:\/\/live\.bilibili\.com\/h5\/\d+\/rebuild\??.*/
// @require https://static.hdslb.com/live-static/libs/jquery/jquery-1.11.3.min.js
// @grant none
// ==/UserScript==
(function() {
console.log(`Cutemon机器人ver_4.53|・ω・`)`);
let CUTE_ROBOT = {
init: () => {
try {
// 拦截弹幕服务器连接
const webSocketConstructor = WebSocket.prototype.constructor;
WebSocket.prototype.constructor = (url, protocols) => {
if (url === 'wss://broadcastlv.chat.bilibili.com/sub')
return webSocketConstructor(url, protocols);
throw new Error();
};
} catch (err) {}
try {
// 拦截直播流
window.fetch = () =>
new Promise(() => {
throw new Error();
});
} catch (err) {}
try {
// 清空页面元素和节点
// $('html').remove();
$('body').html(CUTE_INTERFACE.html);
} catch (err) {}
try {
// 获取用户token
CUTE_DATA.USER_INFO.token = CUTE_API.getCookie('bili_jct');
// $.ajaxSetup({
// crossDomain: true,
// xhrFields: {
// withCredentials: true
// },
// data: {
// csrf: CUTE_DATA.USER_INFO.token,
// csrf_token: CUTE_DATA.USER_INFO.token
// }
// });
} catch (err) {}
try {
} catch (err) {}
},
// 连接弹幕websocket
connect: {
common: () => {
CUTE_DATA.reconnect = true;
if (
CUTE_API.danmakuWebSocket.room &&
CUTE_API.danmakuWebSocket.room.roomid
) {
// console.log(typeof CUTE_API.danmakuWebSocket.room);
CUTE_ROBOT.disconnect();
setTimeout(() => {
CUTE_ROBOT.connect.common();
}, 3e3);
} else {
// 为textarea添加新行数的插件
$.fn.autoHeightTextareaDefaults = {
rows: 0,
minRows: 0,
maxRows: null,
HIDDEN_STYLE: `
height:0 !important;
visibility:hidden !important;
overflow:hidden !important;
position:absolute !important;
z-index:-1000 !important;
top:0 !important;
right:0 !important;
`,
CONTEXT_STYLE: [
'letter-spacing',
'line-height',
'padding-top',
'padding-bottom',
'font-family',
'font-weight',
'font-size',
'text-rendering',
'text-transform',
'width',
'text-indent',
'padding-left',
'padding-right',
'border-width',
'box-sizing'
],
calculateNodeStyling: function(targetElement) {
var _this = this;
// 获取设置在当前textarea上的css属性
var style = window.getComputedStyle(targetElement);
var boxSizing = style.getPropertyValue(
'box-sizing'
);
var paddingSize =
parseFloat(
style.getPropertyValue('padding-bottom')
) +
parseFloat(
style.getPropertyValue('padding-top')
);
var borderSize =
parseFloat(
style.getPropertyValue(
'border-bottom-width'
)
) +
parseFloat(
style.getPropertyValue('border-top-width')
);
var contextStyle = _this.CONTEXT_STYLE
.map(function(value) {
return (
value +
':' +
style.getPropertyValue(value)
);
})
.join(';');
return {
contextStyle,
paddingSize,
borderSize,
boxSizing
};
},
mainAlgorithm: function(
hiddenTextarea,
textareaElement
) {
var _this = this;
/**
* 主要的算法依据
* @param {string} textareaElement : textarea的DOM对象
*/
var {
paddingSize,
borderSize,
boxSizing,
contextStyle
} = _this.calculateNodeStyling(textareaElement);
// 将获取到得当前得textarea的css属性作用于隐藏的textarea
hiddenTextarea.setAttribute(
'style',
_this.HIDDEN_STYLE + contextStyle
);
// 将当前的textarea的value设置到隐藏的textarea上面
hiddenTextarea.value =
textareaElement.value ||
textareaElement.placeholder ||
'';
// 获取隐藏的textarea的height
var height = hiddenTextarea.scrollHeight;
if (boxSizing === 'border-box') {
height = height + borderSize;
} else if (boxSizing === 'content-box') {
height = height - paddingSize;
}
hiddenTextarea.value = '';
var singleRowHeight =
hiddenTextarea.scrollHeight - paddingSize;
// 如果设置有最小行数和最大行数时的判断条件,如果没有设置则取rows为最小行数
var minRows;
var dataRows = $(textareaElement).attr('rows');
var dataMinRows = $(textareaElement).attr(
'data-min-rows'
);
if (dataRows > 0 && dataMinRows > 0) {
minRows = Math.max(dataRows, dataMinRows);
} else if (dataRows > 0) {
minRows = dataRows;
} else if (dataMinRows > 0) {
minRows = dataMinRows;
} else {
minRows = 1;
}
var maxRows = $(textareaElement).attr(
'data-max-rows'
)
? $(textareaElement).attr('data-max-rows')
: null;
if (_this.rows && _this.minRows) {
minRows = Math.max(
_this.rows,
_this.minRows,
minRows
);
} else if (_this.rows) {
minRows = Math.max(_this.rows, minRows);
} else if (_this.minRows) {
minRows = Math.max(_this.minRows, minRows);
}
if (_this.maxRows && maxRows !== null) {
maxRows = Math.min(_this.maxRows, maxRows);
} else if (_this.maxRows) {
maxRows = _this.maxRows;
}
if (minRows !== null) {
var minHeight = singleRowHeight * minRows;
if (boxSizing === 'border-box') {
minHeight =
minHeight + paddingSize + borderSize;
}
height = Math.max(minHeight, height);
}
if (maxRows !== null) {
var maxHeight = singleRowHeight * maxRows;
if (boxSizing === 'border-box') {
maxHeight =
maxHeight + paddingSize + borderSize;
}
height = Math.min(maxHeight, height);
}
// 将得到的height的高度设置到当前的textarea上面
$(textareaElement).css('height', height + 'px');
}
};
$.fn.autoHeightTextarea = function(options) {
options = $.extend(
{},
$.fn.autoHeightTextareaDefaults,
options
);
this.each(function(index, textareaElement) {
var hiddenTextarea;
// 进入页面的初始化操作
if (!hiddenTextarea) {
hiddenTextarea = document.createElement(
'textarea'
);
document.body.appendChild(hiddenTextarea);
}
options.mainAlgorithm(
hiddenTextarea,
textareaElement
);
hiddenTextarea.parentNode &&
hiddenTextarea.parentNode.removeChild(
hiddenTextarea
);
hiddenTextarea = null;
$(textareaElement)
.on('focus', function() {
if (!hiddenTextarea) {
hiddenTextarea = document.createElement(
'textarea'
);
document.body.appendChild(
hiddenTextarea
);
hiddenTextarea.setAttribute(
'style',
options.HIDDEN_STYLE
);
}
})
.on('input', function() {
options.mainAlgorithm(
hiddenTextarea,
textareaElement
);
})
.on('blur', function() {
// 删除掉无用的隐藏的textarea
hiddenTextarea.parentNode &&
hiddenTextarea.parentNode.removeChild(
hiddenTextarea
);
hiddenTextarea = null;
});
});
return this;
};
// 获取房间信息
CUTE_MODULE.room.info();
// 获取用户信息
CUTE_MODULE.user.info();
// 获取循环广告列表
CUTE_MODULE.ad.get();
// 获取关键词自动回复列表
CUTE_MODULE.keyword.reply.get();
// 连接弹幕服务器
CUTE_API.danmakuWebSocket
.start(CUTE_DATA.ROOM_INFO.room_id)
.then(CUTE_DANMAKU_MGR);
// 启动感谢关注循环
if (
CUTE_DATA.ROOM_INFO.short_id != 164725 &&
CUTE_DATA.ROOM_INFO.short_id != 22557 &&
CUTE_DATA.ROOM_INFO.short_id != 3 &&
CUTE_DATA.ROOM_INFO.short_id != 8324350
) {
CUTE_DATA.INTERVAL.checkFollowerItv = setInterval(
CUTE_MODULE.room.follower.latest,
10e3
);
}
// 第二天0点执行记录粉丝数
let waitTime =
new Date().setHours(24, 0, 0, 0) - new Date() + 10000;
setTimeout(CUTE_MODULE.room.follower.record, waitTime);
return CUTE_ROBOT.connect;
}
},
sleep_mode: () => {
// console.log(this);
CUTE_DATA.reconnect = true;
if (
CUTE_API.danmakuWebSocket.room &&
CUTE_API.danmakuWebSocket.room.roomid
) {
// console.log(typeof CUTE_API.danmakuWebSocket.room);
CUTE_ROBOT.disconnect();
setTimeout(() => {
CUTE_ROBOT.connect.sleep_mode();
}, 3e3);
} else {
CUTE_MODULE.room.info();
CUTE_MODULE.user.info();
CUTE_API.danmakuWebSocket
.start(CUTE_DATA.ROOM_INFO.room_id)
.then(CUTE_SLEEP_MODE_MGR);
// 第二天0点执行记录粉丝数
let waitTime =
new Date().setHours(24, 0, 0, 0) - new Date() + 10000;
setTimeout(CUTE_MODULE.room.follower.record, waitTime);
}
},
chat_mode: () => {
// console.log(this);
CUTE_DATA.reconnect = true;
if (
CUTE_API.danmakuWebSocket.room &&
CUTE_API.danmakuWebSocket.room.roomid
) {
// console.log(typeof CUTE_API.danmakuWebSocket.room);
CUTE_ROBOT.disconnect();
setTimeout(() => {
CUTE_ROBOT.connect.chat_mode();
}, 3e3);
} else {
CUTE_MODULE.room.info();
CUTE_MODULE.user.info();
CUTE_API.danmakuWebSocket
.start(CUTE_DATA.ROOM_INFO.room_id)
.then(CUTE_CHAT_MODE_MGR);
}
}
},
// 断开弹幕websocket
disconnect: () => {
CUTE_API.danmakuWebSocket.disconnect();
CUTE_DATA.replyCD = 0;
CUTE_DATA.reconnect = false;
return;
},
reconnect: (waiting = 3) => {
CUTE_DATA.reconnect = true;
CUTE_API.room.info().then(response => {
if (response.code === 0) {
CUTE_DATA.ROOM_INFO.live_status = response.data.live_status;
setTimeout(() => {
if (CUTE_DATA.ROOM_INFO.live_status == 1) {
CUTE_ROBOT.connect.common();
} else {
CUTE_ROBOT.connect.sleep_mode();
}
}, waiting * 1e3);
}
});
}
};
let CUTE_DATA = {
ROOM_INFO: {
entry_id: window.location.pathname.split('/')[2],
short_id: undefined,
room_id: undefined,
ruid: undefined, // 主播的uid
uname: undefined, // 主播昵称
medal_name: undefined, // 主播勋章名
medal_id: undefined, // 主播勋章id
guard_list: [], // 主播舰队列表
live_status: undefined, // 直播状态
follower: {
// 最新关注者
latest: {
ts: undefined, // 关注时间
name: undefined // 昵称
},
record: {
ts: undefined, // 上次记录时间
num: undefined // 上次记录关注数
},
repeat: {} // 重复关注
}
},
USER_INFO: {
uid: undefined,
token: undefined
},
INTERVAL: {
reconnectItv: undefined,
checkFollowerItv: undefined,
cooldownItv: undefined,
replyItv: undefined,
queueItv: undefined,
adItv: undefined
},
danmaku_filter: [`哔哩哔哩 (゜-゜)つロ 干杯~`, `哔哩哔哩干杯( ゜- ゜)つロ`],
connecting: false,
connect_error: false,
reconnect: false,
replyText: undefined,
replyCD: undefined,
repeat_user: undefined,
blockIgnore: undefined,
send_gift_ts: undefined
};
let CUTE_INTERFACE = {
html: `
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="https://cdn.bootcss.com/jquery-toast-plugin/1.3.2/jquery.toast.min.css">
<link rel="stylesheet" href="https://s1.hdslb.com/bfs/static/blive/blfe-live-room/static/css/2.ee9e4634828b7352b7e3.vip.css">
<style type="text/css">
.color {
display: inline-block;
vertical-align: middle;
cursor: pointer;
box-sizing: border-box-box;
border: 1px solid #d0d7dd;
border-radius: 50%;
width: 20px;
height: 20px;
}
.level-0 {
border-color: #000;
}
.level-0 .label{
background-color: #000;
}
.level-0 .level {
color: #000;
}
.guard-icon {
width: 18px;
height: 18px;
background-size: cover;
}
.guard-level-1{
background-image: url('//s1.hdslb.com/bfs/static/blive/blfe-live-room/static/img/icon.guard-thumb-01.e630a67.png');
}
.guard-level-2 {
background-image: url(data:image/png;base64,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)
}
.guard-level-3 {
background-image: url(data:image/png;base64,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);
}
#danmu_send {
width: 500px;
}
.container {
margin: 20px 0 0 20px;
}
// .container div {
// margin-bottom: 10px;
// }
.m-b-10 {
margin-bottom: 10px;
}
.chat-history-panel .chat-history-list .chat-item.danmaku-item .admin-icon, .chat-history-panel .chat-history-list .chat-item.danmaku-item .anchor-icon, .chat-history-panel .chat-history-list .chat-item.danmaku-item .fans-medal-item-ctnr, .chat-history-panel .chat-history-list .chat-item.danmaku-item .guard-icon, .chat-history-panel .chat-history-list .chat-item.danmaku-item .title-label, .chat-history-panel .chat-history-list .chat-item.danmaku-item .user-level-icon {
margin-right: 5px;
}
.dp-i-block {
display: inline-block;
}
.v-middle {
vertical-align: middle;
}
.p-relative {
position: relative;
}
.u-name {
line-height: 20px;
}
.admin-icon {
background-color: #ffa340;
margin-right: 3px;
height: 14px;
padding: 0 6px;
border: 1px solid #ea9336;
border-radius: 2px;
line-height: 16px;
font-size: 12px;
color: #fff;
}
.admin-icon:before {
content: "房管";
}
.jq-toast-wrap {
width: 320px;
max-height: 80%;
overflow-y: auto;
pointer-events: auto!important;
}
.jq-toast-wrap.top-right {
top: 20px;
right: 20px;
}
.jq-toast-single{
width: initial;
}
.jq-toast-single button{
position: relative;
cursor: pointer;
background-color: #444;
color: #fff;
font-size: 12px;
padding: 2px 5px;
border: 1px solid #fff;
}
// .jq-toast-single .danmuContent{
// width: 75%;
// }
// .jq-toast-single div button:nth-of-type(1){
// right: 40px;
// top: 35px;
// }
// .jq-toast-single div button:nth-of-type(2){
// right: 2px;
// top: 35px;
// }
.jq-toast-heading {
font-weight: normal;
}
</style>
</head>
<body>
<div class="container">
<div class="m-b-10">
<h1>接入秘密指挥中心</h1>
指挥中心代号:<input type="number" placeholder="请输入指挥中心代号" id="room_entry" value="">
<button id="connect">全功能启动</button>
<button id="sleep_mode_connect">休眠模式</button>
<button id="chat_mode_connect">聊天模式</button>
<button id="disconnect">断开</button>
<button id="goToRoom">前往指挥中心</button>
<button id="guard" style="display: none;">开船</button><br /><br />
弹幕颜色:
<span class="color white" color="16777215" style="background-color: rgb(255, 255, 255);"></span>
<span class="color red" color="16738408" style="background-color: rgb(255, 104, 104);"></span>
<span class="color blue" color="6737151" style="background-color: rgb(102, 204, 255);"></span>
<span class="color purple" color="14893055" style="background-color: rgb(227, 63, 255);"></span>
<span class="color cyan" color="65532" style="background-color: rgb(0, 255, 252);"></span>
<span class="color green" color="8322816" style="background-color: rgb(126, 266, 0);"></span>
<span class="color yellow" color="16772431" style="background-color: rgb(255, 237, 79);"></span>
<span class="color orange" color="16750592" style="background-color: rgb(255, 152, 0);"></span>
<span class="color pink" color="16741274" style="background-color: rgb(255, 115, 154);"></span>
</div>
<div class="m-b-10">
<span id="setColor" style="color: #EB3941;">默认弹幕颜色为 <span class="color" style="background-color: rgb(255, 255, 255);"></span></span><br />
</div>
<div>
弹幕发送:<input type="text" id="danmu_send" placeholder="这是弹幕发射池……" maxlength="30" />
</div>
<div>
<h1>功能开关</h1>
<div>
感谢关注:
<input type="radio" name="follow" value="1" />开
<input type="radio" name="follow" value="0" />关
</div>
<div>
感谢礼物:
<input type="radio" name="gift" value="2" />所有礼物
<input type="radio" name="gift" value="1" />金瓜子礼物
<input type="radio" name="gift" value="0" />关
</div>
<div>
循环公告:
<input type="radio" name="ad" value="1" />开
<input type="radio" name="ad" value="0" />关
</div>
<div>
自动回复:
<input type="radio" name="reply" value="1" />开
<input type="radio" name="reply" value="0" />关
</div>
<div>
自动禁言:
<input type="radio" name="ban" value="1" />开
<input type="radio" name="ban" value="0" />关
</div>
<div>
复读机:
<input type="radio" name="repeat" value="1" />开
<input type="radio" name="repeat" value="0" />关
<input type="radio" name="repeat" value="2" />限定人员
</div>
<div>
复读用户名/UID:
<input id="repeat_user" type="text" />
</div>
</div>
<div>
<h1>定时轰炸系统</h1>
轰炸间隔:<input style="width: 50px;" type="number" id="intervalTime" value="300"> 秒 <span id="setTime" style="color: #EB3941; margin-left: 10px;">默认轰炸间隔为300秒</span><br /><br />
<button id="start">轰炸开启</button>
<button id="clear">任务终止</button>
<span id="switch"></span><br /><br />
投放内容:<input id="ad_new_content" style="width: 500px; margin-bottom: 5px;" type="text" value="" placeholder="请输入投放内容,最多30个字符"
maxlength="30" />
<br />
<button id="ad_new_submit">新增</button><br />
</div>
<div id="ad_arr">
</div>
<div id="log" style="position: absolute; left: 45%; top: 0; margin: 0;">
</div>
<div>
<h1>智能精确打击</h1>
打击目标:<input id="keyword" style="width: 200px; margin-bottom: 5px;" type="text" value="" maxlength="20" /><br />
智能打击内容:<input id="reply" style="width: 500px; margin-bottom: 5px;" type="text" value="" maxlength="30" /><br />
<button id="autoreply_add">新增</button><br />
</div>
<div id="autoreply_arr">
</div>
</div>
</body>
<script src="https://cdn.bootcss.com/jquery-toast-plugin/1.3.2/jquery.toast.min.js"></script>
`
};
let CUTE_API = {
baseURL: `//api.live.bilibili.com/`,
// websocket
danmakuWebSocket: (() => {
var dataStruct = [
{
name: 'Header Length',
key: 'headerLen',
bytes: 2,
offset: 4,
value: 16
},
{
name: 'Protocol Version',
key: 'ver',
bytes: 2,
offset: 6,
value: 1
},
{
name: 'Operation',
key: 'op',
bytes: 4,
offset: 8,
value: 1
},
{
name: 'Sequence Id',
key: 'seq',
bytes: 4,
offset: 12,
value: 1
}
];
var protocol = location.origin.match(/^(.+):\/\//)[1];
var wsUrl = 'ws://broadcastlv.chat.bilibili.com:2244/sub';
if (protocol === 'https') {
wsUrl = 'wss://broadcastlv.chat.bilibili.com:2245/sub';
}
function str2bytes(str) {
var bytes = new Array();
var len, c;
len = str.length;
for (var i = 0; i < len; i++) {
c = str.charCodeAt(i);
if (c >= 0x010000 && c <= 0x10ffff) {
bytes.push(((c >> 18) & 0x07) | 0xf0);
bytes.push(((c >> 12) & 0x3f) | 0x80);
bytes.push(((c >> 6) & 0x3f) | 0x80);
bytes.push((c & 0x3f) | 0x80);
} else if (c >= 0x000800 && c <= 0x00ffff) {
bytes.push(((c >> 12) & 0x0f) | 0xe0);
bytes.push(((c >> 6) & 0x3f) | 0x80);
bytes.push((c & 0x3f) | 0x80);
} else if (c >= 0x000080 && c <= 0x0007ff) {
bytes.push(((c >> 6) & 0x1f) | 0xc0);
bytes.push((c & 0x3f) | 0x80);
} else {
bytes.push(c & 0xff);
}
}
return bytes;
}
function bytes2str(array) {
var __array = array.slice(0);
var j;
var filterArray = [
[0x7f],
[0x1f, 0x3f],
[0x0f, 0x3f, 0x3f],
[0x07, 0x3f, 0x3f, 0x3f]
];
var str = '';
for (var i = 0; i < __array.length; i = i + j) {
var item = __array[i];
var number = '';
if (item >= 240) {
j = 4;
} else if (item >= 224) {
j = 3;
} else if (item >= 192) {
j = 2;
} else if (item < 128) {
j = 1;
}
var filter = filterArray[j - 1];
for (var k = 0; k < j; k++) {
var r = (__array[i + k] & filter[k]).toString(2);
var l = r.length;
if (l > 6) {
number = r;
break;
}
for (var n = 0; n < 6 - l; n++) {
r = '0' + r;
}
number = number + r;
}
str = str + String.fromCharCode(parseInt(number, 2));
}
return str;
}
function getPacket(payload) {
return str2bytes(payload);
}
function generatePacket(action, payload) {
action = action || 2; // 2心跳 或 7加入房间
payload = payload || '';
var packet = getPacket(payload);
var buff = new ArrayBuffer(packet.length + 16);
var dataBuf = new DataView(buff);
dataBuf.setUint32(0, packet.length + 16);
dataBuf.setUint16(4, 16);
dataBuf.setUint16(6, 1);
dataBuf.setUint32(8, action);
dataBuf.setUint32(12, 1);
for (var i = 0; i < packet.length; i++) {
dataBuf.setUint8(16 + i, packet[i]);
}
return dataBuf;
}
function Room() {
this.timer = null;
this.socket = null;
this.roomid = null;
}
Room.prototype = {
sendBeat: function() {
var self = this;
self.timer = setInterval(function() {
self.socket.send(generatePacket());
}, 3000);
},
close: function() {
this.socket.close();
},
destroy: function() {
clearInterval(this.timer);
this.socket = null;
this.timer = null;
this.roomid = null;
},
joinRoom: function(rid, uid) {
rid = rid || 22557;
uid = uid || 193351;
var packet = JSON.stringify({
uid: uid,
roomid: rid
});
return generatePacket(7, packet);
},
init: function(roomid) {
var self = this;
self.roomid = roomid;
var socket = new WebSocket(wsUrl);
socket.binaryType = 'arraybuffer';
socket.onopen = function(event) {
if (socket.readyState == 1) {
CUTE_MODULE.toast.success(`弹幕服务器连接成功`);
CUTE_DATA.connecting = true;
// $.toast({
// text: '弹幕服务器连接成功', // Optional heading to be shown on the toast
// icon: 'success',
// showHideTransition: 'fade', // fade, slide or plain
// allowToastClose: true, // Boolean value true or false
// hideAfter: 3000, // false to make it sticky or number representing the miliseconds as time after which toast needs to be hidden
// stack: 10, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time
// position: 'top-right', // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values
// textAlign: 'left', // Text alignment i.e. left, right or center
// loader: false // Whether to show loader or not. True by default
// });
console.log('%c 弹幕服务器连接成功', 'color: blue');
} else {
console.log(
'%c 连接失败了,错误码:' + readyState,
'color: red'
);
CUTE_API.danmakuWebSocket.disconnect();
return;
}
var join = self.joinRoom(roomid);
socket.send(join.buffer);
self.sendBeat(socket);
};
socket.onmessage = function(event) {
var dataView = new DataView(event.data);
// console.log(event.data);
var data = {};
data.packetLen = dataView.getUint32(0);
dataStruct.forEach(function(item) {
if (item.bytes === 4) {
data[item.key] = dataView.getUint32(
item.offset
);
} else if (item.bytes === 2) {
data[item.key] = dataView.getUint16(
item.offset
);
}
});
if (data.op && data.op === 5) {
data.body = [];
var packetLen = data.packetLen;
for (
var offset = 0;
offset < dataView.byteLength;
offset += packetLen
) {
packetLen = dataView.getUint32(offset);
headerLen = dataView.getUint16(offset + 4);
// console.log(dataView.byteLength,offset,packetLen,headerLen);
var recData = [];
for (
var i = offset + headerLen;
i < offset + packetLen;
i++
) {
recData.push(dataView.getUint8(i));
}
// console.log(recData);
try {
// console.log(bytes2str(recData))
let body = JSON.parse(bytes2str(recData));
console.log(body); // 弹幕、礼物、系统公告
if (
body.cmd === 'DANMU_MSG' ||
body.cmd === 'DANMU_MSG:4:0:2:2:2:0'
) {
// console.log(body.info[2][1], ':', body.info[1]) // 用户:弹幕内容
self.fn.call(null, {
cmd: body.cmd,
color: body.info[0][3],
uid: body.info[2][0],
name: body.info[2][1],
admin: body.info[2][2],
vip: body.info[2][3],
svip: body.info[2][4],
text: body.info[1],
medal_name:
body.info[3][1] || '没勋章',
medal_level: body.info[3][0] || '0',
user_level: body.info[4][0],
guard: body.info[7],
roomid: self.roomid
});
} else if (body.cmd === 'GUARD_BUY') {
self.fn.call(null, {
cmd: body.cmd,
uid: body.data.uid,
username: body.data.username,
gift_name: body.data.gift_name,
price: body.data.price,
roomid: self.roomid
});
} else if (body.cmd === 'SEND_GIFT') {
self.fn.call(null, {
cmd: body.cmd,
coin_type: body.data.coin_type,
giftName: body.data.giftName,
uname: body.data.uname,
num: body.data.num,
roomid: self.roomid
});
} else if (body.cmd === 'SPECIAL_GIFT') {
self.fn.call(null, {
cmd: body.cmd,
storm: body.data[39],
storm_id: body.data[39].id,
storm_content:
body.data[39].content,
storm_action: body.data[39].action,
roomid: self.roomid
});
} else if (
body.cmd === 'ANCHOR_LOT_START'
) {
self.fn.call(null, {
cmd: body.cmd,
anchor_id: body.data.id,
anchor_content: body.data.danmu,
require_type:
body.data.require_type,
roomid: self.roomid,
award_name: body.data.award_name,
time: body.data.time
});
} else if (body.cmd === 'ROOM_BLOCK_MSG') {
self.fn.call(null, {
cmd: body.cmd,
block_uid: body.data.uid,
block_uname: body.data.uname,
roomid: self.roomid
});
} else if (
body.cmd === 'LIVE' ||
body.cmd === 'PREPARING'
) {
self.fn.call(null, {
cmd: body.cmd,
roomid: body.roomid
});
}
data.body.push(body);
// console.log(data.body);
} catch (e) {
// console.log('tcp 校验失败,重新发送')
}
}
}
};
socket.onclose = function() {
// console.log(e);
clearInterval(self.timer);
clearInterval(CUTE_DATA.INTERVAL.reconnectItv);
clearInterval(CUTE_DATA.INTERVAL.checkFollowerItv);
clearInterval(CUTE_DATA.INTERVAL.cooldownItv);
clearInterval(CUTE_DATA.INTERVAL.replyItv);
clearInterval(CUTE_DATA.INTERVAL.adItv);
CUTE_DATA.connecting = false;
if (self) {
if (CUTE_DATA.reconnect) {
let waiting = 3;
if (CUTE_DATA.connect_error) {
waiting = 30;
CUTE_DATA.connect_error = false;
}
CUTE_API.danmakuWebSocket.reconnect(waiting);
console.log(
`%c 弹幕服务器已关闭,${waiting}秒后尝试重连`,
'color: red'
);
} else {
console.log(
`%c 弹幕服务器被手动关闭了,不会进行重连`,
'color: red'
);
}
self.destroy();
// console.log(self);
self = null;
}
// CUTE_API.danmakuWebSocket.disconnect();
};
socket.onerror = function() {
CUTE_DATA.connect_error = true;
self.close();
console.log(`%c 与弹幕服务器的连接发生了错误`, 'color: red');
};
self.socket = socket;
},
then: function(fn) {
this.fn = fn;
}
};
return {
room: null,
start: function(roomid) {
console.log('%c 正在进入房间:' + roomid + '...', 'color: blue');
this.room = new Room();
this.room.init(roomid);
return this.room;
},
disconnect: function() {
if (this.room) {
this.room.close();
}
},
reconnect: function(waiting = 3) {
let timer = setTimeout(() => {
if (!CUTE_DATA.connecting) {
CUTE_ROBOT.reconnect(waiting);
} else {
timer();
}
}, waiting * 1e3);
}
};
})(),
// ajax调用B站API
last_ajax: 0,
cnt_frequently_ajax: 0,
ajax: settings => {
if (Date.now() - CUTE_API.last_ajax < 10) {
CUTE_API.cnt_frequently_ajax++;
} else {
CUTE_API.cnt_frequently_ajax = 0;
}
CUTE_API.last_ajax = Date.now();
if (CUTE_API.cnt_frequently_ajax > 20)
throw new Error('调用BilibiliAPI太快,可能出现了bug');
if (settings.xhrFields) {
jQuery.extend(settings.xhrFields, {
withCredentials: true
});
} else {
settings.xhrFields = {
withCredentials: true
};
}
jQuery.extend(settings, {
url:
(settings.url.substr(0, 2) === '//'
? ''
: CUTE_API.baseURL) + settings.url,
method: settings.method || 'GET',
crossDomain: true,
dataType: settings.dataType || 'json'
});
return jQuery.ajax(settings);
},
// 获取用户cookie
getCookie: Name => {
var search = Name + '='; //查询检索的值
var returnvalue = ''; //返回值
if (document.cookie.length > 0) {
var sd = document.cookie.indexOf(search);
if (sd != -1) {
sd += search.length;
var end = document.cookie.indexOf(';', sd);
if (end == -1) end = document.cookie.length;
//unescape() 函数可对通过 escape() 编码的字符串进行解码。
returnvalue = unescape(document.cookie.substring(sd, end));
}
}
return returnvalue;
},
// 连接直播间初始化
user: {
info: () => {
return CUTE_API.ajax({
url: 'User/getUserInfo'
});
},
//
search: uid => {
return CUTE_API.ajax({
url: '//api.bilibili.com/x/space/acc/info',
data: {
mid: uid
}
});
},
// 勋章切换/直播间勋章
medal: {
check: () => {
return CUTE_API.ajax({
url: 'i/api/medal',
data: {
page: 1,
pageSize: 25
}
});
},
wear: () => {
CUTE_API.ajax({
url: 'i/ajaxWearFansMedal',
data: {
medal_id: CUTE_DATA.ROOM_INFO.medal_id
}
});
},
cancel: () => {
CUTE_API.ajax({
url: 'i/ajaxCancelWear'
});
}
},
// 发送
send: {
// 发送私信
msg: (receiver_id, content) => {
return CUTE_API.ajax({
method: 'POST',
url: '//api.vc.bilibili.com/web_im/v1/web_im/send_msg',
data: {
msg: {
sender_uid: CUTE_DATA.USER_INFO.uid,
receiver_id: receiver_id,
receiver_type: 1,
msg_type: 1,
content: content
},
csrf_token: CUTE_DATA.USER_INFO.token,
csrf: CUTE_DATA.USER_INFO.token
}
});
},
// 发送弹幕
danmaku: msg => {
return CUTE_API.ajax({
method: 'POST',
url: 'msg/send',
data: {
// 字体颜色:默认白色:16777215 | 姥爷红:16738408 | 姥爷蓝:6737151 | 青色:65532 | 绿色:8322816 | 黄色:16772431 | 橙色:16750592
color: 16750592,
fontsize: 25,
mode: 1,
msg: msg,
rnd: new Date().getTime(),
roomid: CUTE_DATA.ROOM_INFO.room_id,
bubble: 0,
csrf_token: CUTE_DATA.USER_INFO.token,
csrf: CUTE_DATA.USER_INFO.token
}
});
},
config: colorhex => {
return CUTE_API.ajax({
method: 'POST',
url: 'api/ajaxSetConfig',
data: {
room_id: CUTE_DATA.ROOM_INFO.room_id,
color: colorhex,
csrf_token: CUTE_DATA.USER_INFO.token,
csrf: CUTE_DATA.USER_INFO.token
}
});
}
},
// 送礼
gift: {
// 送礼物
send: msg => {
return CUTE_API.ajax({
method: 'POST',
url: 'gift/v2/gift/send',
data: {
uid: CUTE_DATA.USER_INFO.uid,
gift_id: gift_id,
ruid: CUTE_DATA.ROOM_INFO.ruid,
gift_num: gift_num,
coin_type: 'silver',
bag_id: 0,
platform: 'pc',
biz_code: 'live',
biz_id: CUTE_DATA.ROOM_INFO.room_id,
rnd: new Date().getTime(),
storm_beat_id: 0,
metadata: '',
price: 0,
csrf_token: CUTE_DATA.USER_INFO.token,
csrf: CUTE_DATA.USER_INFO.token
}
});
},
// 送礼物(从包裹)
send_bag: (gift_id, gift_num, bag_id) => {
return CUTE_API.ajax({
method: 'POST',
url: 'gift/v2/live/bag_send',
data: {
uid: CUTE_DATA.USER_INFO.uid,
gift_id: gift_id,
ruid: CUTE_DATA.ROOM_INFO.ruid,
gift_num: gift_num,
coin_type: 'silver',
bag_id: bag_id,
platform: 'pc',
biz_code: 'live',
biz_id: CUTE_DATA.ROOM_INFO.room_id,
rnd: new Date().getTime(),
storm_beat_id: 0,
metadata: '',
price: 0,
csrf_token: CUTE_DATA.USER_INFO.token,
csrf: CUTE_DATA.USER_INFO.token
}
});
},
bag_list: () => {
return CUTE_API.ajax({
method: 'GET',
url: 'xlive/web-room/v1/gift/bag_list',
data: {
t: new Date().getTime()
}
});
}
}
},
room: {
info: () => {
return CUTE_API.ajax({
url: 'room/v1/Room/get_info',
async: false,
data: {
platform: 'android',
room_id: CUTE_DATA.ROOM_INFO.entry_id
}
});
},
medal: () => {
return CUTE_API.ajax({
url: 'rankdb/v1/RoomRank/webMedalRank',
data: {
roomid: CUTE_DATA.ROOM_INFO.room_id,
ruid: CUTE_DATA.ROOM_INFO.ruid
}
});
},
guard: (page = 1) => {
return CUTE_API.ajax({
url: 'guard/topList',
data: {
page: page,
roomid: CUTE_DATA.ROOM_INFO.room_id,
ruid: CUTE_DATA.ROOM_INFO.ruid
}
});
},
followers: () => {
return CUTE_API.ajax({
url: '//api.bilibili.com/x/relation/followers',
data: {
vmid: CUTE_DATA.ROOM_INFO.ruid
}
});
},
block_user: {
check: page => {
return CUTE_API.ajax({
url: 'liveact/ajaxGetBlockList',
data: {
roomid: CUTE_DATA.ROOM_INFO.room_id,
page: page
}
});
},
search: search => {
return CUTE_API.ajax({
url: 'banned_service/v2/Silent/search_user',
data: {
search: search
}
});
},
add: (block_uid, hour) => {
return CUTE_API.ajax({
method: 'POST',
url: 'banned_service/v2/Silent/add_block_user',
data: {
roomid: CUTE_DATA.ROOM_INFO.room_id,
block_uid: block_uid,
hour: hour,
csrf_token: CUTE_DATA.USER_INFO.token,
csrf: CUTE_DATA.USER_INFO.token
}
});
// 旧接口
// return CUTE_API.ajax({
// method: 'POST',
// url: 'liveact/room_block_user',
// data: {
// roomid: CUTE_DATA.ROOM_INFO.room_id,
// method: 1,
// content: block_user,
// hour: hour,
// csrf_token: CUTE_DATA.USER_INFO.token,
// csrf: CUTE_DATA.USER_INFO.token
// }
// });
},
del: id => {
return CUTE_API.ajax({
method: 'POST',
url: 'banned_service/v1/Silent/del_room_block_user',
data: {
id: id,
roomid: CUTE_DATA.ROOM_INFO.room_id,
csrf_token: CUTE_DATA.USER_INFO.token,
csrf: CUTE_DATA.USER_INFO.token
}
});
},
del_old: id => {
// 旧接口
return CUTE_API.ajax({
method: 'POST',
url: 'live_user/v1/RoomSilent/del',
data: {
uid: uid,
id: id,
csrf_token: CUTE_DATA.USER_INFO.token,
csrf: CUTE_DATA.USER_INFO.token
}
});
}
},
silent: (minute, type, level) => {
return CUTE_API.ajax({
method: 'POST',
url: 'liveact/room_silent',
data: {
minute: minute,
room_id: CUTE_DATA.ROOM_INFO.room_id,
type: type,
level: level,
csrf_token: CUTE_DATA.USER_INFO.token,
csrf: CUTE_DATA.USER_INFO.token
}
});
}
}
};
let CUTE_MODULE = {
// 配置初始化
config: {
init: () => {
if (
Boolean(
localStorage.getItem(
`CUTE_CONFIG_${CUTE_DATA.ROOM_INFO.room_id}`
)
)
) {
CUTE_CONFIG = JSON.parse(
localStorage.getItem(
`CUTE_CONFIG_${CUTE_DATA.ROOM_INFO.room_id}`
)
);
// let switch_name = ['gift', 'follow', 'ad', 'reply', 'ban', 'coin_type'];
let radios = $('input[type="radio"]');
// console.log(radios);
for (let i = 0; i < radios.length; i++) {
// console.log(radios[i].attr('name'));
radios.eq(i).click(function() {
// console.log($(this).attr('name'));
// console.log($(this).val());
CUTE_CONFIG.MODULE_SWITCH[
$(this).attr('name')
] = Number($(this).val());
localStorage.setItem(
`CUTE_CONFIG_${CUTE_DATA.ROOM_INFO.room_id}`,
JSON.stringify(CUTE_CONFIG)
);
});
if (
CUTE_CONFIG.MODULE_SWITCH[
radios.eq(i).attr('name')
] == radios.eq(i).val()
) {
console.log(i);
radios.eq(i).prop('checked', true);
}
}
} else {
// 配置从旧的localstorage中转移
CUTE_CONFIG.KEYWORD.replyArr =
JSON.parse(
localStorage.getItem(
`auto_keyword_reply_${CUTE_DATA.ROOM_INFO
.room_id}`
)
) || [];
CUTE_CONFIG.KEYWORD.banArr =
JSON.parse(
localStorage.getItem(
`ban_keyword_${CUTE_DATA.ROOM_INFO.room_id}`
)
) || [];
CUTE_CONFIG.AD.replyArr =
JSON.parse(
localStorage.getItem(
`auto_ad_danmu_${CUTE_DATA.ROOM_INFO.room_id}`
)
) || [];
// 将配置信息存入localstorage
CUTE_MODULE.config.update();
}
// 更新主播勋章信息
CUTE_MODULE.room.medal.id();
CUTE_MODULE.room.medal.name();
// 更新房间内舰队信息
CUTE_MODULE.room.guard();
},
update: () => {
localStorage.setItem(
`CUTE_CONFIG_${CUTE_DATA.ROOM_INFO.room_id}`,
JSON.stringify(CUTE_CONFIG)
);
}
},
user: {
// 获取用户uid
info: () => {
console.log(`读取用户信息`);
return CUTE_API.user.info().then(response => {
if (response.code == 'REPONSE_OK') {
CUTE_DATA.USER_INFO.uid = response.data.uid;
}
});
}
},
room: {
// 获取room基本信息
info: () => {
console.log(`读取房间信息`);
return CUTE_API.room.info().then(response => {
if (response.code === 0) {
// 获取房间原id
CUTE_DATA.ROOM_INFO.room_id = response.data.room_id;
// 更新房间信息
CUTE_DATA.ROOM_INFO.room_id = response.data.room_id;
CUTE_DATA.ROOM_INFO.short_id = response.data.short_id;
CUTE_DATA.ROOM_INFO.ruid = response.data.uid;
CUTE_DATA.ROOM_INFO.live_status =
response.data.live_status;
// CUTE_DATA.ROOM_INFO.uname = response.data.uname;
// 执行配置初始化
CUTE_MODULE.config.init();
// gift_recorder =
// JSON.parse(
// localStorage.getItem(`gift_${CUTE_DATA.ROOM_INFO.room_id}`)
// ) || {};
console.log(
`主播uid:${CUTE_DATA.ROOM_INFO.ruid}, 直播间号:${CUTE_DATA
.ROOM_INFO.room_id}`
);
// CUTE_DATA.INTERVAL.reconnectItv = setInterval(CUTE_MODULE.reconnect(), 10e3);
}
});
},
// 获取medal_id
medal: {
id: () => {
try {
return CUTE_API.medal.check().then(response => {
if (
response.code === 0 &&
response.data.list.length > 0
) {
for (
let i = 0;
i < response.data.fansMedalList.length;
i++
) {
if (
CUTE_DATA.ROOM_INFO.short_id ==
response.data.fansMedalList[i].roomid
) {
CUTE_DATA.ROOM_INFO.medal_id =
response.data.fansMedalList[
i
].medal_id;
}
}
}
});
} catch (err) {}
},
name: () => {
try {
return CUTE_API.room.medal().then(response => {
if (response.data.list.length > 0) {
CUTE_DATA.ROOM_INFO.medal_name =
response.data.list[0].medal_name;
console.log(CUTE_DATA.ROOM_INFO.medal_name);
CUTE_MODULE.toast.success(
`本房间勋章:${CUTE_DATA.ROOM_INFO.medal_name}`
);
// $.toast({
// text: '本房间勋章:' + CUTE_DATA.ROOM_INFO.medal_name, // Text that is to be shown in the toast
// icon: 'success', // Type of toast icon
// showHideTransition: 'fade', // fade, slide or plain
// allowToastClose: true, // Boolean value true or false
// hideAfter: 3000, // false to make it sticky or number representing the miliseconds as time after which toast needs to be hidden
// stack: 10, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time
// position: 'top-right', // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values
// textAlign: 'left', // Text alignment i.e. left, right or center
// loader: false // Whether to show loader or not. True by default
// });
}
});
} catch (err) {}
}
},
// 获取guard列表
guard: page => {
return CUTE_API.room.guard(page).then(response => {
if (response.code === 0) {
if (response.data.info.now == 1) {
CUTE_DATA.ROOM_INFO.guard_list = [];
let top3 = response.data.top3;
for (let i = 0; i < top3.length; i++) {
CUTE_DATA.ROOM_INFO.guard_list.push(
top3[i].uid
);
}
}
let list = response.data.list;
for (let i = 0; i < list.length; i++) {
CUTE_DATA.ROOM_INFO.guard_list.push(list[i].uid);
}
if (response.data.info.now < response.data.info.page) {
CUTE_MODULE.room.guard(response.data.info.now + 1);
} else {
setTimeout(() => {
if (
response.data.info.num ==
CUTE_DATA.ROOM_INFO.guard_list.length
) {
CUTE_MODULE.toast.success(
`本房间舰长数:${CUTE_DATA.ROOM_INFO.guard_list
.length}`
);
// $.toast({
// text: '本房间舰长数:' + CUTE_DATA.ROOM_INFO.guard_list.length, // Text that is to be shown in the toast
// icon: 'success', // Type of toast icon
// showHideTransition: 'fade', // fade, slide or plain
// allowToastClose: true, // Boolean value true or false
// hideAfter: 3000, // false to make it sticky or number representing the miliseconds as time after which toast needs to be hidden
// stack: 10, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time
// position: 'top-right', // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values
// textAlign: 'left', // Text alignment i.e. left, right or center
// loader: false // Whether to show loader or not. True by default
// });
} else {
CUTE_MODULE.toast.failed(`舰队数据获取有误,请刷新重试`);
// $.toast({
// text: '舰队数据获取有误,请刷新重试', // Text that is to be shown in the toast
// icon: 'error', // Type of toast icon
// showHideTransition: 'fade', // fade, slide or plain
// allowToastClose: true, // Boolean value true or false
// hideAfter: false, // false to make it sticky or number representing the miliseconds as time after which toast needs to be hidden
// stack: 10, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time
// position: 'top-right', // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values
// textAlign: 'left', // Text alignment i.e. left, right or center
// loader: false // Whether to show loader or not. True by default
// });
}
}, 1e3);
}
}
});
},
// 获取关注人数
follower: {
now: () => {
return CUTE_API.room.info().then(response => {
if (response.code === 0) {
// console.log(`请求成功`);
let record = {
ts: CUTE_CONFIG.FOLLOWER.record.ts,
follower: CUTE_CONFIG.FOLLOWER.record.num
};
let now = {
ts: new Date().setHours(0, 0, 0, 0),
follower: response.data.attention,
live_status: response.data.live_status,
online: response.data.online
};
let change;
let online;
if (record.ts >= now.ts) {
// 记录时间是今天
if (now.follower >= record.follower) {
change = `(${now.follower -
record.follower}↑)`;
} else {
change = `(${record.follower -
now.follower}↓)`;
}
}
if (now.live_status != 1) {
online = `,未开播`;
} else {
online = `,气人值${response.data.online}`;
}
return CUTE_MODULE.danmaku.queue_add(
`当前粉丝数${now.follower}${change || ''}${online}`
);
}
});
},
latest: () => {
if (!CUTE_CONFIG.MODULE_SWITCH.follow) {
return;
}
return CUTE_API.room.followers().then(response => {
if (response.code === 0) {
let list = response.data.list;
let latest = CUTE_DATA.ROOM_INFO.follower.latest;
let repeat = CUTE_DATA.ROOM_INFO.follower.repeat;
let num;
if (latest.ts >= list[0].mtime) {
// console.log("没有新的关注");
return;
} else {
let follower_new = {
uid: list[0].mid,
name: list[0].uname
};
if (latest.ts) {
switch (repeat[follower_new.name]) {
case 1:
CUTE_MODULE.danmaku.queue_add(
`${follower_new.name} 你为什么又点了一次关注|・ω・`)`
);
repeat[follower_new.name]++;
break;
case 2:
CUTE_MODULE.danmaku.queue_add(
`${follower_new.name} 再玩一次你就没了|・ω・`)`
);
repeat[follower_new.name]++;
break;
case 3:
repeat[follower_new.name]++;
CUTE_MODULE.block.add(
follower_new.uid,
1,
'follow'
);
break;
case 4:
console.log('重复关注过多,不搭理这个人');
break;
default:
for (
let i = 0;
i < list.length;
i++
) {
if (latest.ts < list[i].mtime) {
// 未记录的用户加入重复关注监控列表
if (
!repeat[list[i].uname]
) {
repeat[
list[i].uname
] = 1;
}
// 新关注的用户有2人时的处理
if (i == 1) {
follower_new.name +=
',' + list[i].uname;
}
} else {
// 新关注的用户高于3人时,会在下一个循环进入这个条件,所以i取3,之后循环获取到的都会是老关注,所以break
if (i >= 3) {
num = i;
}
break;
}
}
if (num >= 3) {
CUTE_MODULE.danmaku.queue_add(
`♡ ${follower_new.name} 等${num}个小伙伴点了关注哟~`
);
} else {
CUTE_MODULE.danmaku.queue_add(
`♡ ${follower_new.name} 点了关注哟~`
);
}
break;
}
latest.ts = list[0].mtime;
latest.name = list[0].uname;
} else {
latest.ts = list[0].mtime;
latest.name = list[0].uname;
}
console.log(
CUTE_MODULE.tsFormatter(latest.ts),
latest.name
);
}
}
});
},
record: param => {
return CUTE_API.room.info().then(response => {
if (response.code === 0) {
CUTE_CONFIG.FOLLOWER = {
record: {
ts: new Date().getTime(),
num: response.data.attention
}
};
CUTE_MODULE.config.update();
if (param == 'reply') {
CUTE_MODULE.danmaku.queue_add(
`当前粉丝数为${CUTE_CONFIG.FOLLOWER.record
.num},已记录`
);
}
}
});
}
}
},
// 弹幕发送及配置
danmaku: {
list: [],
to_be_sent: [],
lastMsg: undefined,
color: e => {
let color = e.target.attributes.color.value,
colorhex = '0x' + Number(color).toString(16);
// console.log($(this)[0].outerHTML);
return CUTE_API.user.send.config(colorhex).then(
response => {
if (response.code === 0) {
$('#setColor').html(
'<span style="color: #00BE00;">弹幕颜色已设置为 ' +
e.target.outerHTML +
'</span>'
);
CUTE_MODULE.toast.success(`弹幕颜色设置成功`);
// $.toast({
// heading: '弹幕颜色设置成功',
// icon: 'success',
// hideAfter: 1500,
// stack: 10, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time
// position: 'top-right', // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values
// textAlign: 'left', // Text alignment i.e. left, right or center
// loader: false // Whether to show loader or not. True by default
// });
} else {
CUTE_MODULE.toast.failed(`弹幕颜色设置失败`);
// $.toast({
// heading: '弹幕颜色设置失败',
// text: '原因:' + response.msg,
// hideAfter: 1500,
// stack: 10, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time
// icon: 'error',
// position: 'top-right', // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values
// textAlign: 'left', // Text alignment i.e. left, right or center
// loader: false // Whether to show loader or not. True by default
// });
}
},
err => {
CUTE_MODULE.toast.failed(`网络错误:${err}`);
}
);
// .catch(err => {
// CUTE_MODULE.toast.failed(`网络错误:${err}`);
// // $.toast({
// // heading: '设置失败',
// // text: '网络错误:' + err,
// // hideAfter: 1500,
// // stack: 10, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time
// // icon: 'error',
// // position: 'top-right', // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values
// // textAlign: 'left', // Text alignment i.e. left, right or center
// // loader: false // Whether to show loader or not. True by default
// // });
// });
},
show: msg => {
if (~CUTE_DATA.danmaku_filter.indexOf(msg.text)) {
return;
}
try {
let guard = '',
admin = '',
medal = '',
user_level = `<div class="user-level-icon lv-${msg.user_level} dp-i-block p-relative v-middle">
UL ${msg.user_level}
</div>`,
user_name = `<span class="v-middle level-${msg.medal_level ==
0
? 'none'
: msg.medal_level}" title="${msg.uid}">
<span class="level u-name">
${msg.name}
</span>
</span>`;
if (msg.guard) {
guard = `<i class="guard-icon dp-i-block v-middle bg-center bg-no-repeat guard-level-${msg.guard}"></i>`;
}
if (msg.admin) {
admin = `<div class="admin-icon dp-i-block p-relative v-middle" title="这是位大人物 (=・ω・=)"></div>`;
}
if (msg.medal_level > 0) {
// console.log(msg.medal_level);
medal = `<div class="v-middle fans-medal-item level-${msg.medal_level ||
0}">
<span class="label">
${msg.medal_name}
</span>
<span class="level">
${msg.medal_level}
</span>
</div>`;
}
let ts = new Date().getTime();
let danmuSender = `<div class="v-middle">
${guard}
${admin}
${medal}
${user_level}
${user_name}
</div>`,
danmuContent = `<div class="danmuContent">
<span style="color: #${msg.color.toString(
16
)}">${msg.text}</span>
<button id="repeat${ts}">复读</button>
<button id="ban${ts}">封禁</button>
</div>`;
$.toast({
text: danmuContent, // Text that is to be shown in the toast
heading: danmuSender, // Optional heading to be shown on the toast
hideAfter: false, // false to make it sticky or number representing the miliseconds as time after which toast needs to be hidden
stack: 20, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time
position: 'top-right', // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values
textAlign: 'left', // Text alignment i.e. left, right or center
loader: false, // Whether to show loader or not. True by default
afterShown: function() {
$('#repeat' + ts).on('click', e => {
return CUTE_MODULE.danmaku.queue_add(msg.text);
});
$('#ban' + ts).on('click', e => {
return CUTE_MODULE.block.add(msg.uid, 720);
});
} // will be triggered after the toat has been shown
});
let scrollHeight = $('.jq-toast-wrap:first').prop(
'scrollHeight'
);
$('.jq-toast-wrap:first').scrollTop(scrollHeight);
} catch (err) {}
},
admin: msg => {
let keyword = ['拉黑', '权限', '记录粉丝数', '存活测试'];
for (let i = 0; i < keyword.length; i++) {
if (msg.text.indexOf(keyword[i]) == 7) {
switch (keyword[i]) {
case '拉黑':
CUTE_API.room.block_user
.search(msg.text.split('=')[1])
.then(response => {
if (response.code === 0) {
let block_uid =
response.data.items[0].uid;
let block_uname =
response.data.items[0].uname;
if (
CUTE_CONFIG.BLACKLIST.indexOf(
block_uid
) == -1
) {
CUTE_CONFIG.BLACKLIST.push(
block_uid
);
CUTE_MODULE.config.update();
CUTE_MODULE.danmaku.queue_add(
`用户 ${block_uname} 已被本机加入无视列表|・ω・`)`
);
} else {
CUTE_MODULE.danmaku.queue_add(
`该用户已经凉了,无需重复添加|・ω・`)`
);
}
} else {
console.log(response.msg);
}
});
break;
case '记录粉丝数':
CUTE_MODULE.room.follower.record('reply');
break;
case '存活测试':
CUTE_MODULE.danmaku.queue_add(
`确认存活!本机正常工作中( ˘•ω•˘ )`
);
break;
default:
CUTE_MODULE.danmaku.queue_add(
`你好,没这个指令,告辞|・ω・`)`
);
break;
}
return;
}
}
return CUTE_MODULE.danmaku.queue_add(`你好,没这个指令,告辞|・ω・`)`);
},
command: msg => {
// console.log(`command`);
let keyword = [
'全部功能',
'礼物',
'关注',
'循环公告',
'回复',
'封禁',
'高阶魔法',
'复读',
'休眠',
'唤醒',
'关机',
'重连',
'重启',
'查询粉丝数'
];
for (let i = 0; i < keyword.length; i++) {
if (msg.text.indexOf(keyword[i]) == 4) {
// console.log(`指令:${keyword[i]}`);
let param, param1, param2;
try {
param = msg.text.split('=')[1].split(',');
param1 = param[0];
param2 = param[1];
} catch (err) {}
switch (keyword[i]) {
case '全部功能':
switch (param1) {
case '0':
CUTE_CONFIG.MODULE_SWITCH.gift = 0;
CUTE_CONFIG.MODULE_SWITCH.follow = 0;
CUTE_CONFIG.MODULE_SWITCH.ad = 0;
CUTE_CONFIG.MODULE_SWITCH.reply = 0;
CUTE_MODULE.danmaku.queue_add(
`全部功能 -> 关闭`
);
break;
case '1':
CUTE_CONFIG.MODULE_SWITCH.gift = 1;
CUTE_CONFIG.MODULE_SWITCH.follow = 1;
CUTE_CONFIG.MODULE_SWITCH.ad = 1;
CUTE_CONFIG.MODULE_SWITCH.reply = 1;
CUTE_MODULE.danmaku.queue_add(
`全部功能 -> 开启`
);
break;
}
break;
case '礼物':
switch (param1) {
case '0':
CUTE_CONFIG.MODULE_SWITCH.gift = 0;
CUTE_MODULE.danmaku.queue_add(
`感谢礼物 -> 关闭`
);
break;
case '1':
CUTE_CONFIG.MODULE_SWITCH.coin_type =
'gold';
CUTE_CONFIG.MODULE_SWITCH.gift = 1;
CUTE_MODULE.danmaku.queue_add(
`感谢金瓜子礼物 -> 开启`
);
break;
case '2':
CUTE_CONFIG.MODULE_SWITCH.coin_type = undefined;
CUTE_CONFIG.MODULE_SWITCH.gift = 2;
CUTE_MODULE.danmaku.queue_add(
`感谢所有礼物 -> 开启`
);
break;
}
break;
case '关注':
switch (param1) {
case '0':
CUTE_CONFIG.MODULE_SWITCH.follow = 0;
CUTE_MODULE.danmaku.queue_add(
`感谢关注 -> 关闭`
);
break;
case '1':
CUTE_MODULE.danmaku.queue_add(
`感谢关注 -> 开启`
);
CUTE_CONFIG.MODULE_SWITCH.follow = 1;
break;
}
break;
case '循环公告':
switch (param1) {
case '0':
CUTE_CONFIG.MODULE_SWITCH.ad = 0;
CUTE_MODULE.danmaku.queue_add(
`循环公告 -> 关闭`
);
break;
case '1':
CUTE_CONFIG.MODULE_SWITCH.ad = 1;
CUTE_MODULE.danmaku.queue_add(
`循环公告 -> 开启`
);
break;
}
break;
case '回复':
switch (param1) {
case '0':
CUTE_CONFIG.MODULE_SWITCH.reply = 0;
CUTE_MODULE.danmaku.queue_add(
`关键词回复 -> 关闭`
);
break;
case '1':
CUTE_CONFIG.MODULE_SWITCH.reply = 1;
CUTE_MODULE.danmaku.queue_add(
`关键词回复 -> 开启`
);
break;
}
break;
case '封禁':
break;
case '高阶魔法':
var minute = 3,
type = 'level',
level = 1;
if (msg.text.indexOf('解除') != -1) {
minute = 3;
type = 'off';
level = 1;
} else if (param) {
for (let i = 0; i < param.length; i++) {
if (
msg.text
.split('=')
[i].indexOf('分') != -1
) {
if (param[i].split('分')[0] == 0) {
minute = 0;
} else if (
param[i].split('分')[0] <= 3
) {
minute = 3;
} else if (
param[i].split('分')[0] <= 10
) {
minute = 10;
} else if (
param[i].split('分')[0] <= 30
) {
minute = 30;
} else {
minute = 0;
}
}
if (param[i].indexOf('等级') != -1) {
type = 'level';
if (
param[i].split('等级')[1] >= 1 &&
param[i].split('等级')[1] <= 60
) {
level = param[i].split('等级')[1];
} else {
level = 1;
}
} else if (
param[i].indexOf('勋章') != -1
) {
type = 'medal';
if (
param[i].split('勋章')[1] >= 1 &&
param[i].split('勋章')[1] <= 20
) {
level = param[i].split('勋章')[1];
} else {
level = 1;
}
} else if (
param[i].indexOf('全员') != -1
) {
type = 'member';
level = 1;
}
}
}
console.log(CUTE_MODULE.room);
// 启动范围魔法
CUTE_API.room
.silent(minute, type, level)
.then(response => {
if (response.msg) {
CUTE_MODULE.danmaku.queue_add(
`高阶魔法启动失败:${response.msg}`
);
} else {
if (type == 'off') {
CUTE_MODULE.danmaku.queue_add(
`高阶魔法已解除(=・ω・=)`
);
} else {
CUTE_MODULE.danmaku.queue_add(
`成功启动高阶范围魔法打击!${minute}分钟后解除`
);
}
}
});
break;
case '复读':
switch (param1) {
case '0':
CUTE_CONFIG.MODULE_SWITCH.repeat = 0;
CUTE_MODULE.danmaku.queue_add(
`复读机 -> 关闭`
);
break;
case '1':
CUTE_CONFIG.MODULE_SWITCH.repeat = 1;
CUTE_MODULE.danmaku.queue_add(
`限制型复读机 -> 开启`
);
break;
case '2':
CUTE_CONFIG.MODULE_SWITCH.repeat = 2;
CUTE_MODULE.danmaku.queue_add(
`全员型复读机 -> 开启`
);
break;
default:
CUTE_CONFIG.MODULE_SWITCH.repeat = 2;
$('#repeat_user').val(param1);
CUTE_DATA.repeat_user = param1;
CUTE_MODULE.danmaku.queue_add(
`复读${param1} -> 开启`
);
break;
}
break;
case '唤醒':
CUTE_ROBOT.connect.common();
CUTE_MODULE.danmaku.queue_add(
`你这个居居为什么要叫醒我( ˘•ω•˘ )`
);
break;
case '关机':
CUTE_ROBOT.disconnect();
CUTE_MODULE.danmaku.queue_add(
`啊我死了,下个ID见|・ω・`)`
);
location.reload();
break;
case '休眠':
CUTE_ROBOT.connect.sleep_mode();
CUTE_MODULE.danmaku.queue_add(
`啊我睡了,谁吵醒我谁是居|・ω・`)`
);
break;
case '重连':
// $('#connect').click();
CUTE_MODULE.danmaku.queue_add(
`知道了啦,本机将重新接入|・ω・`)`
);
CUTE_ROBOT.reconnect();
break;
case '重启':
// $('#connect').click();
CUTE_MODULE.danmaku.queue_add(
`知道了啦,本机将重新运行|・ω・`)`
);
if (!CUTE_MODULE.getUrlParam('reconnect')) {
location.href = `${window.location
.href}?reconnect=1`;
} else {
window.location.reload(true);
}
break;
case '查询粉丝数':
CUTE_MODULE.room.follower.now().then();
break;
default:
CUTE_MODULE.danmaku.queue_add(
`你好,没这个指令,告辞|・ω・`)`
);
break;
}
CUTE_MODULE.config.update();
return;
}
}
return CUTE_MODULE.danmaku.queue_add(`你好,没这个指令,告辞|・ω・`)`);
},
cute: (msg, permission) => {
let keyword = [
'添词',
'删词',
'制裁',
'捞人',
'弹幕颜色',
'召唤',
'roll点',
'抽个舰长',
'送个辣条',
'求求萌萌兽把我从小黑屋里放出来吧'
];
for (let i = 0; i < keyword.length; i++) {
if (msg.text.indexOf(keyword[i]) == 4) {
// console.log(`指令:${keyword[i]}`);
let param, param1, param2;
try {
param = msg.text.split('=')[1].split(',');
param1 = param[0];
param2 = param[1];
} catch (err) {}
switch (keyword[i]) {
case '添词':
if (
permission >= CUTE_CONFIG.PERMISSION.normal
) {
CUTE_MODULE.keyword.reply.add(msg);
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:${CUTE_CONFIG
.PERMISSION.normal} |・ω・`)`
);
}
break;
case '删词':
if (
permission >=
CUTE_CONFIG.PERMISSION.superfans
) {
CUTE_MODULE.keyword.reply.delByDanmaku(msg);
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:${CUTE_CONFIG
.PERMISSION.superfans} |・ω・`)`
);
}
break;
case '制裁':
var block_user = param1;
var hour = param2 || 1;
if (
block_user == '193351' ||
block_user.indexOf('萌萌兽') != -1 ||
block_user == '我自己' ||
block_user == '我'
) {
if (msg.admin == 1) {
return CUTE_MODULE.danmaku.queue_add(
`小老弟,请收起你的骚操作,制裁不了的( ˘•ω•˘ )`
);
} else {
CUTE_MODULE.block.add(
msg.uid,
hour,
'reflect'
);
}
} else if (permission >= 170) {
hour = param2 || 720;
return CUTE_MODULE.block.search(
block_user,
hour,
'execute'
);
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:170 |・ω・`)`
);
}
break;
case '捞人':
if (permission >= 170) {
CUTE_MODULE.block.del(msg);
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:170 |・ω・`)`
);
}
break;
case '弹幕颜色':
if (permission >= CUTE_CONFIG.PERMISSION.fans) {
var colorhex;
switch (param1) {
case '红':
colorhex = '0xff6868';
break;
case '蓝':
colorhex = '0x66ccff';
break;
case '黄':
colorhex = '0xffed4f';
break;
case '绿':
colorhex = '0x7eff00';
break;
case '橙':
colorhex = '0xff9800';
break;
case '紫':
colorhex = '0xe33fff';
break;
case '白':
colorhex = '0xffffff';
break;
default:
return;
}
CUTE_API.user.send
.config(colorhex)
.then(response => {
if (response.code === 0) {
CUTE_MODULE.danmaku.queue_add(
`弹幕颜色设置成功!我${param1}了( ˘•ω•˘ )`
);
} else {
CUTE_MODULE.danmaku.queue_add(
`弹幕颜色设置失败!我没${param1}(๑•́ ₃ •̀๑)`
);
}
});
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:${CUTE_CONFIG
.PERMISSION.fans} |・ω・`)`
);
}
break;
case '召唤':
if (permission >= CUTE_CONFIG.PERMISSION.host) {
CUTE_MODULE.danmaku.queue_add(
`召唤中……请等待响应( ˘•ω•˘ )`
);
if (
window.Notification &&
Notification.permission !== 'denied'
) {
Notification.requestPermission(function(
status
) {
let isClick;
var notification = new Notification(
'受到召唤',
{
body:
CUTE_MODULE.tsFormatter(
new Date().getTime() /
1000
) +
' ' +
CUTE_DATA.ROOM_INFO
.uname +
'的直播间发起了一个召唤'
}
);
notification.onclick = function() {
isClick = 1;
return CUTE_MODULE.danmaku.queue_add(
`${msg.name}以为萌萌兽不在?太天真了!`
);
// window.open(
// "https://live.bilibili.com/" + CUTE_DATA.ROOM_INFO.short_id
// );
};
setTimeout(() => {
if (!isClick) {
return CUTE_MODULE.danmaku.queue_add(
`好的吧,萌萌兽真的不在,你召唤也没用`
);
}
}, 8e3);
});
}
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:${CUTE_CONFIG
.PERMISSION.host} |・ω・`)`
);
}
break;
case 'roll点':
if (permission >= 1) {
CUTE_MODULE.roll(msg);
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:1 |・ω・`)`
);
}
break;
case '抽个舰长':
if (
permission >= CUTE_CONFIG.PERMISSION.guard
) {
CUTE_MODULE.raffle(msg);
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:${CUTE_CONFIG
.PERMISSION.guard} |・ω・`)`
);
}
break;
case '送个辣条':
if (
permission >= CUTE_CONFIG.PERMISSION.guard
) {
CUTE_MODULE.gift.send_bag(msg);
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:${CUTE_CONFIG
.PERMISSION.guard} |・ω・`)`
);
}
break;
case '求求萌萌兽把我从小黑屋里放出来吧':
if (permission >= 1) {
let block_index = CUTE_CONFIG.BLACKLIST.indexOf(
msg.uid
);
// console.log(`block_index: ${block_index}`);
if (block_index != -1) {
CUTE_CONFIG.BLACKLIST.splice(
block_index,
1
);
CUTE_MODULE.config.update();
CUTE_MODULE.danmaku.queue_add(
`${msg.name} 已被本机大发慈悲地赦免了|・ω・`)`
);
} else {
CUTE_MODULE.danmaku.queue_add(
`求本机干啥,本机没拉黑你呀|・ω・`)`
);
}
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:1 |・ω・`)`
);
}
break;
default:
CUTE_MODULE.danmaku.queue_add(
`你好,没这个指令,告辞|・ω・`)`
);
break;
}
return;
}
}
return CUTE_MODULE.danmaku.queue_add(`你好,没这个指令,告辞|・ω・`)`);
// 切换勋章
if (
msg.text.indexOf('萌萌兽') != -1 &&
msg.text.indexOf('勋章') != -1
) {
return CUTE_MODULE.danmaku.queue_add(`勋章是什么?人家不知道呀|・ω・`)`);
}
},
query: (msg, permission) => {
let keyword = ['指令', '权限', '粉丝数', '舰长群', '真爱群'];
for (let i = 0; i < keyword.length; i++) {
if (msg.text.indexOf(keyword[i]) == 4) {
console.log(`查询:${keyword[i]}`);
switch (keyword[i]) {
case '指令':
if (permission >= CUTE_CONFIG.PERMISSION.fans) {
CUTE_MODULE.danmaku.queue_add(
`由于字数限制,指令说明请到我的动态中查看哟|・ω・`)`
);
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:${CUTE_CONFIG
.PERMISSION.fans} |・ω・`)`
);
}
break;
case '权限':
CUTE_MODULE.danmaku.queue_add(
`@${msg.name} 当前权限:${permission}`
);
break;
case '粉丝数':
if (
permission >= CUTE_CONFIG.PERMISSION.admin
) {
if (
CUTE_DATA.ROOM_INFO.short_id != 8324350
) {
CUTE_MODULE.room.follower.now();
} else {
return CUTE_MODULE.danmaku.queue_add(
`本房间禁止使用该指令|・ω・`)`
);
}
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:${CUTE_CONFIG
.PERMISSION.admin} |・ω・`)`
);
}
break;
case '舰长群':
if (
permission >= CUTE_CONFIG.PERMISSION.guard
) {
let whisperCtx = {
// 631: `欢迎来到631海豹大舰队!舰长群:870309615(可加稻叽解锁好友位哟\\n若已加入请无视~`,
189: `感谢大佬登上狐妖的小船船!舰长群:568744231,欢迎来玩♡\\n若已加入请无视~`,
223: `感谢大佬登上可可的小船船!舰长群:88479489,欢迎加入♡\\n若已加入请无视~`,
64566: `跪谢老板٩(๑^o^๑)۶对猫猫的船票支持,解锁欢乐的舰长群(823316645)快来一起玩耍吧٩(๑^o^๑)۶\\n若已加入请无视~`
};
if (
whisperCtx[CUTE_DATA.ROOM_INFO.entry_id]
) {
CUTE_MODULE.whisper(
msg.uid,
msg.username,
`{"content":"[${CUTE_MODULE.tsFormatter(
new Date() / 1000
)}] ${whisperCtx[
CUTE_DATA.ROOM_INFO.entry_id
]}"}`,
'guard'
);
} else {
console.log(
`这个直播间没有设置舰长群,不能发送私信|・ω・`)`
);
}
} else {
return CUTE_MODULE.danmaku.queue_add(
`船都没上你查什么查|・ω・`)`
);
}
break;
case '真爱群':
let msgContent;
switch (CUTE_DATA.ROOM_INFO.short_id) {
case 189:
if (permission >= 130) {
msgContent = `{"content":"[${CUTE_MODULE.tsFormatter(
new Date() / 1000
)}
] 感谢大佬一直以来对狐妖的支持!狐妖的真爱宝宝633202159,欢迎加入♡"}`;
} else {
return CUTE_MODULE.danmaku.queue_add(
`不是真爱你查什么查|・ω・`)`
);
}
break;
case 223:
if (permission >= 50) {
msgContent = `{"content":"[${CUTE_MODULE.tsFormatter(
new Date() / 1000
)}
] 感谢大佬一直以来对可可的支持!可可的真爱群727774262,欢迎加入♡。验证请填写:萌萌兽机器人"}`;
} else {
return CUTE_MODULE.danmaku.queue_add(
`不是真爱你查什么查|・ω・`)`
);
}
break;
default:
return CUTE_MODULE.danmaku.queue_add(
`这个直播间没有设置真爱群|・ω・`)`
);
}
CUTE_MODULE.whisper(
msg.uid,
msg.name,
msgContent,
'truelove'
);
break;
default:
break;
}
return;
}
}
return CUTE_MODULE.danmaku.queue_add(`你好,没这个指令,告辞|・ω・`)`);
},
send: e => {
let keyCode = e.keyCode
? e.keyCode
: e.which ? e.which : e.charCode;
if (keyCode == 13) {
// alert("响应键盘的enter事件");
// 获取时间戳
let msg = $('#danmu_send').val().trim();
if (msg) {
return CUTE_API.user.send.danmaku(msg).then(
response => {
if (!response.msg) {
CUTE_MODULE.toast.success();
$('#danmu_send').val('');
} else {
CUTE_MODULE.toast.failed(response.msg);
}
},
err => {
CUTE_MODULE.toast.failed(`网络错误:${err}`);
}
);
// .catch(err => {
// CUTE_MODULE.toast.failed(`网络错误${err}`);
// });
} else {
CUTE_MODULE.toast.failed(`发送内容不能为空`);
return;
}
}
},
queue_add: msg => {
let length = CUTE_MODULE.danmaku.to_be_sent.length;
if (msg.length > 30) {
msg = msg.substr(0, 30);
CUTE_MODULE.danmaku.queue_add(msg.substr(msg.length - 30));
}
if (length === 0) {
CUTE_MODULE.danmaku.to_be_sent.push(msg);
CUTE_MODULE.danmaku.queue_send(
CUTE_MODULE.danmaku.to_be_sent[0]
);
CUTE_MODULE.danmaku.queue_status = 1;
} else {
if (
msg != CUTE_MODULE.danmaku.to_be_sent[length - 1] ||
msg == `你好,没这个指令,告辞|・ω・`)`
) {
CUTE_MODULE.danmaku.to_be_sent.push(msg);
if (CUTE_MODULE.danmaku.queue_status === 0) {
CUTE_MODULE.danmaku.queue_send(
CUTE_MODULE.danmaku.to_be_sent[1]
);
CUTE_MODULE.danmaku.queue_status = 1;
CUTE_MODULE.danmaku.to_be_sent.shift();
}
}
}
},
queue_send: msg => {
CUTE_API.user.send.danmaku(msg).then(
response => {
if (!response.msg && !response.message) {
CUTE_MODULE.toast.success(`回复成功`);
} else {
CUTE_MODULE.toast.failed(
response.msg || response.message
);
}
let length = CUTE_MODULE.danmaku.to_be_sent.length;
setTimeout(() => {
switch (length) {
case 1:
console.log(`弹幕队列空闲中~`);
CUTE_MODULE.danmaku.queue_status = 0;
break;
default:
CUTE_MODULE.danmaku.queue_send(
CUTE_MODULE.danmaku.to_be_sent[1]
);
CUTE_MODULE.danmaku.to_be_sent.shift();
console.log(
`剩余弹幕队列:${CUTE_MODULE.danmaku
.to_be_sent}`
);
break;
}
}, 1234);
},
err => {
CUTE_MODULE.toast.failed(err);
setTimeout(() => {
switch (length) {
case 1:
console.log(`弹幕队列空闲中~`);
CUTE_MODULE.danmaku.queue_status = 0;
break;
default:
CUTE_MODULE.danmaku.queue_send(
CUTE_MODULE.danmaku.to_be_sent[1]
);
CUTE_MODULE.danmaku.to_be_sent.shift();
console.log(
`剩余弹幕队列:${CUTE_MODULE.danmaku
.to_be_sent}`
);
break;
}
}, 1111);
}
);
},
queue_status: 0,
todo: () => {
if (
msg.text.indexOf('#萌回') === 0 &&
msg.text.indexOf('&') != -1
) {
// 添加
if (
CUTE_DATA.ROOM_INFO.medal_name ||
msg.guard != 0 ||
msg.admin == 1 ||
msg.uid == 193351 ||
msg.uid == 64131034
) {
let keyword = msg.text.slice(4, msg.text.indexOf('&'));
let replyContent = msg.text.slice(
msg.text.indexOf('&') + 1
);
$('#keyword').val(keyword);
$('#reply').val(replyContent);
setTimeout(function() {
addReply(1);
}, 100);
} else {
return CUTE_MODULE.danmaku.queue_add(
`_(:з」∠)_权限不足,设置失败`
);
}
return;
}
if (msg.text.indexOf('#删回') === 0 && msg.text.length > 4) {
// 删除自动回复
if (
msg.guard != 0 ||
msg.admin == 1 ||
msg.uid == 193351 ||
msg.uid == 64131034
) {
return delReplyByDanmu(msg);
} else {
return CUTE_MODULE.danmaku.queue_add(
`_(:з」∠)_权限不足,删除失败`
);
}
}
// console.log(msg.text, keyword_reply[0].keyword);
if (
msg.text.indexOf('点歌') != -1 &&
(CUTE_DATA.ROOM_INFO.short_id == 631 ||
CUTE_DATA.ROOM_INFO.short_id == 64566) &&
msg.uid != 64131034
) {
if (msg.medal_name == CUTE_DATA.ROOM_INFO.medal_name) {
if (
msg.text.split('=')[0] == '点歌' ||
msg.text.split('=')[0] == '#点歌'
) {
return CUTE_MODULE.danmaku.queue_add(
`滴~点歌格式正确!上车成功~`
);
} else {
return CUTE_MODULE.danmaku.queue_add(
`你刚刚好像说了点歌?但是姿势好像不太对呢,要不再试试?`
);
}
} else {
return CUTE_MODULE.danmaku.queue_add(
`你是不是想点歌?只有戴上主播勋章才能点歌成功哟~`
);
}
}
}
},
// 私信发送
whisper: (receiver_id, receiver_name, content, mode) => {
return CUTE_API.user.send
.msg(receiver_id, content)
.then(response => {
if (response.code === 0) {
switch (mode) {
case 'help':
CUTE_MODULE.danmaku.queue_add(
`♡ 指令已发送给${receiver_name},请检查私信~`
);
break;
case 'truelove':
CUTE_MODULE.danmaku.queue_add(
`♡ 真爱群已发送给${receiver_name},请检查私信~`
);
break;
case 'guard':
CUTE_MODULE.danmaku.queue_add(
`♡ 舰长群已发送给${receiver_name},请检查私信~`
);
break;
default:
CUTE_MODULE.danmaku.queue_add(
`♡ 私信已发送给${receiver_name},请注意查收~`
);
break;
}
} else {
console.log(`私信发送失败:${response.msg}`);
}
});
},
// 获取/添加/删除 循环广告内容
ad: {
// 未完成
get: () => {
console.log(`读取循环公告`);
let replyArr = CUTE_CONFIG.AD.replyArr;
try {
if (replyArr.length > 0) {
$('#ad_arr').empty();
$('#intervalTime').val(CUTE_CONFIG.AD.replyTime);
for (let i = 0; i < replyArr.length; i++) {
$('#ad_arr').append(
[i + 1] +
'、<input style="width: 500px; margin-bottom: 5px;" type="text" index="' +
[i] +
'" value="' +
replyArr[i] +
'" maxlength="30"/> <button class="danmudel" index="' +
[i] +
'">删除</button><br />'
);
}
$('.danmudel').click(CUTE_MODULE.ad.del);
}
} catch (err) {}
$('#ad_arr input').blur(e => {
console.log(e);
let index = e.target.attributes.index.value,
val = e.target.value;
console.log(`内容修改:${(index, val)}`);
replyArr[index] = val;
CUTE_MODULE.config.update();
});
CUTE_MODULE.ad.run();
},
add: () => {
if (!CUTE_DATA.ROOM_INFO.room_id) {
alert('请先连接直播间再操作|・ω・`)');
return false;
}
if ($('#ad_new_content').val()) {
CUTE_CONFIG.AD.replyArr.push($('#ad_new_content').val());
CUTE_MODULE.config.update();
CUTE_MODULE.ad.get();
$('#ad_new_content').val('');
} else {
alert('广告内容不能为空|・ω・`)');
}
},
del: e => {
let index = e.target.attributes.index.value;
console.log(`删除:${index}`);
CUTE_CONFIG.AD.replyArr.splice(index, 1);
CUTE_MODULE.config.update();
CUTE_MODULE.ad.get();
},
send: () => {
return CUTE_API.room.info().then(response => {
if (response.code === 0) {
CUTE_DATA.ROOM_INFO.live_status =
response.data.live_status;
if (
CUTE_DATA.ROOM_INFO.live_status == 1 &&
CUTE_CONFIG.MODULE_SWITCH.ad
) {
$('#switch').html(
'<span style="color: #00BE00; margin-left: 10px;">定时轰炸系统已启用,指挥中心工作中_(¦3」∠)_</span>'
);
let AD = CUTE_CONFIG.AD;
return CUTE_API.user.send
.danmaku(AD.replyArr[AD.replySerial])
.then(response => {
if (response.code === 0) {
AD.replySerial < AD.replyArr.length - 1
? AD.replySerial++
: (AD.replySerial = 0);
CUTE_MODULE.config.update();
}
});
} else {
$('#switch').html(
'<span style="color: #FF9800; margin-left: 10px;">定时轰炸系统被拦截,或指挥中心正在休眠_(¦3」∠)_</span>'
);
}
return;
}
});
},
run: () => {
clearInterval(CUTE_DATA.INTERVAL.adItv); // 消除定时器的叠加
CUTE_DATA.INTERVAL.adItv = undefined; // 清空保存定时器的变量
console.log('发送间隔:' + CUTE_CONFIG.AD.replyTime);
// CUTE_MODULE.ad.send();
CUTE_DATA.INTERVAL.adItv = setInterval(
CUTE_MODULE.ad.send,
CUTE_CONFIG.AD.replyTime * 1e3
);
},
end: () => {
clearInterval(CUTE_DATA.INTERVAL.adItv);
CUTE_DATA.INTERVAL.adItv = undefined; // 清空保存定时器的变量
CUTE_CONFIG.AD.replySerial = 0;
$('#switch').html(
'<span style="color: #EB3941; margin-left: 10px;">弹幕发射已关闭_(¦3」∠)_</span>'
);
},
time: () => {
CUTE_CONFIG.AD.replyTime = $('#intervalTime').val();
$('#setTime').html(
'<span style="color: #00BE00;">发射间隔已设置为' +
CUTE_CONFIG.AD.replyTime +
'秒</span>'
);
CUTE_MODULE.config.update();
if (CUTE_DATA.INTERVAL.adItv) {
CUTE_MODULE.ad.run();
}
return;
},
interval: undefined
},
keyword: {
// 获取/添加/删除 关键词自动回复
reply: {
// 未完成
get: () => {
console.log(`读取关键词回复`);
let replyArr = CUTE_CONFIG.KEYWORD.replyArr;
// 更新配置结构,单回复转为多回复
// try {
// for (let i = 0; i < replyArr.length; i++) {
// if (typeof replyArr[i].reply == 'string') {
// replyArr[i].reply = replyArr[i].reply.split('1qaz2wsx');
// }
// }
// localStorage.setItem(
// 'auto_keyword_reply_' + room_id,
// JSON.stringify(replyArr)
// );
// } catch (e) {}
if (replyArr) {
$('#autoreply_arr').empty();
for (let i = 0; i < replyArr.length; i++) {
let reply = '';
for (let j = 0; j < replyArr[i].reply.length; j++) {
reply += replyArr[i].reply[j];
if (j != replyArr[i].reply.length - 1) {
reply += '\n';
}
}
$('#autoreply_arr').append(
`
<div>
<div style="display: inline-block;">
${[i + 1]}、关键词:
<input disabled style="display: inline-block; width: 200px; color: rgb(255, 104, 104); margin-bottom: 5px;"
type="text" index="${[i]}" value="${replyArr[i]
.keyword}" maxlength="20"/>
</div>
<div style="display: inline-block;">
自动回复:
<textarea disabled style="resize: none; vertical-align: middle; width: 500px; color: rgb(255, 104, 104); margin-bottom: 5px;"
index="${[i]}">${reply}</textarea>
<button class="replydel" index="${[i]}">删除</button>
</div>
</div>
`
);
}
$('textarea').autoHeightTextarea();
$('.replydel').click(CUTE_MODULE.keyword.reply.del);
}
},
add: msg => {
if (!CUTE_DATA.ROOM_INFO.room_id) {
alert('请先连接直播间再操作|・ω・`)');
return false;
}
let replyArr = CUTE_CONFIG.KEYWORD.replyArr;
let repeat = 0;
let keyword;
let reply;
if (msg) {
keyword = msg.text.split('=')[1].split('&')[0];
reply = msg.text.split('=')[1].split('&')[1];
if (!keyword || !reply) {
return CUTE_MODULE.danmaku.queue_add(
'关键词和自动回复不能为空|・ω・`)'
);
}
} else {
keyword = $('#keyword').val();
reply = $('#reply').val();
if (!keyword || !reply) {
return alert('关键词和自动回复不能为空|・ω・`)');
}
}
try {
// 查询关键词是否已经存在,不存在则新建对象
for (let i = 0; i < replyArr.length; i++) {
if (replyArr[i].keyword == keyword) {
replyArr[i].reply.push(reply);
repeat = 1;
if (msg) {
CUTE_MODULE.danmaku.queue_add(
`[${keyword}] 更新成功( ˘•ω•˘ )`
);
}
break;
}
}
if (!repeat) {
let obj = {};
obj.keyword = keyword;
obj.reply = [reply];
replyArr.push(obj);
if (msg) {
CUTE_MODULE.danmaku.queue_add(
`[${keyword}] 设置成功( ˘•ω•˘ )`
);
}
}
// localStorage.setItem(
// 'auto_keyword_reply_' + room_id,
// JSON.stringify(replyArr)
// );
CUTE_MODULE.config.update();
CUTE_MODULE.keyword.reply.get();
$('#keyword').val('');
$('#reply').val('');
} catch (err) {}
},
del: e => {
let index = e.target.attributes.index.value;
let replyArr = CUTE_CONFIG.KEYWORD.replyArr;
console.log(index);
replyArr.splice(index, 1);
CUTE_MODULE.config.update();
CUTE_MODULE.keyword.reply.get();
},
delByDanmaku: msg => {
let replyArr = CUTE_CONFIG.KEYWORD.replyArr;
if (replyArr) {
let keyword = msg.text.split('=')[1];
for (let i = 0; i < replyArr.length; i++) {
if (replyArr[i].keyword == keyword) {
replyArr.splice(i, 1);
CUTE_MODULE.config.update();
CUTE_MODULE.keyword.reply.get();
return CUTE_MODULE.danmaku.queue_add(
`[${keyword}] 删除成功( ˘•ω•˘ )`
);
}
}
return CUTE_MODULE.danmaku.queue_add(
`[${keyword}] 未找到|・ω・`)`
);
}
}
},
// 获取/添加/删除 关键词自动封禁
ban: {
// 未完成
get: () => {},
add: msg => {
if (!room_id) {
alert('未连接直播间');
return false;
}
let keyword = msg.text.split('=')[1];
if (keyword) {
let banArr = CUTE_CONFIG.KEYWORD.banArr;
for (let i = 0; i < banArr.length; i++) {
if (banArr[i] == keyword) {
CUTE_MODULE.toast.failed(`不可以添加重复的关键词!`);
// $.toast({
// heading: '添加失败',
// text: '错误原因:不可以添加重复的关键词!',
// hideAfter: 1500,
// stack: 10, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time
// icon: 'error',
// position: 'top-right', // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values
// textAlign: 'left', // Text alignment i.e. left, right or center
// loader: false // Whether to show loader or not. True by default
// });
return CUTE_MODULE.danmaku.queue_add(
`${keyword} 已存在,不可以重复添加`
);
}
}
banArr.push(keyword);
CUTE_MODULE.config.update();
return CUTE_MODULE.danmaku.queue_add(`${keyword} 设置成功`);
}
},
del: () => {},
delByDanmaku: msg => {
let keyword = msg.text.split('=')[1];
if (keyword) {
let banArr = CUTE_CONFIG.KEYWORD.banArr;
for (let i = 0; i < banArr.length; i++) {
if (banArr[i] == keyword) {
banArr.splice(i, 1);
CUTE_MODULE.config.update();
return CUTE_MODULE.danmaku.queue_add(
`${keyword} 删除成功`
);
}
}
return CUTE_MODULE.danmaku.queue_add(`${keyword} 未找到`);
}
}
}
},
// 封禁
block: {
// 可根据昵称查询用户uid
search: (search, hour, mode) => {
return CUTE_API.room.block_user
.search(search)
.then(response => {
if (response.code === 0) {
let block_uid = response.data.items[0].uid;
switch (mode) {
case 'execute':
CUTE_MODULE.block.add(
block_uid,
hour,
'execute'
);
break;
default:
break;
}
} else {
console.log(response.msg);
}
});
},
add: (block_uid, hour, mode) => {
return CUTE_API.room.block_user
.add(block_uid, hour)
.then(response => {
if (response.code === 0) {
console.log(
`用户 ${response.data.uname} 被封禁至 ${response.data
.block_end_time}`
);
switch (mode) {
case 'follow':
CUTE_MODULE.danmaku.queue_add(
`※ ${response.data.uname} 由于多次关注被制裁了`
);
break;
case 'keyword':
CUTE_MODULE.danmaku.queue_add(
`※ ${response.data.uname} 由于触发关键词被制裁了`
);
break;
case 'self':
CUTE_MODULE.danmaku.queue_add(
`※ ${response.data.uname} 由于想不开,进行了自裁`
);
break;
case 'execute':
CUTE_MODULE.danmaku.queue_add(
`※ ${response.data.uname} 被管理制裁了`
);
break;
case 'reflect':
CUTE_MODULE.danmaku.queue_add(
`※ ${response.data.uname} 由于作死,被反弹了制裁`
);
break;
default:
break;
}
return;
} else {
console.log(`触发了封禁,但是操作失败了:${response.message}`);
// CUTE_MODULE.danmaku.queue_add(
// `${response.message}|・ω・`)`
// );
}
});
},
del: (msg, page = 1) => {
return CUTE_API.room.block_user.check(page).then(response => {
if (response.code === 0) {
let block_user = msg.text.split('=')[1];
if (response.data.length > 0) {
for (let i = 0; i < response.data.length; i++) {
if (
block_user == response.data[i].uname ||
block_user == response.data[i].uid
) {
block_user = response.data[i].uname;
return CUTE_API.room.block_user
.del(response.data[i].id)
.then(response => {
if (response.code === 0) {
CUTE_MODULE.danmaku.queue_add(
`${block_user} 被捞出了小黑屋|・ω・`)`
);
}
});
}
}
if (page < 5 && response.data.length == 10) {
return CUTE_MODULE.room.block_user.del(page++);
} else {
return CUTE_MODULE.danmaku.queue_add(
`该用户不在小黑屋中哦|・ω・`)`
);
}
} else {
return CUTE_MODULE.danmaku.queue_add(
`该用户不在小黑屋中哦|・ω・`)`
);
}
} else {
console.log('发生了不可描述的错误: ' + response.msg);
return CUTE_MODULE.danmaku.queue_add(
`小黑屋查询请求失败了呢|・ω・`)`
);
}
});
}
},
// 感谢、赠送礼物
gift: {
// 感谢礼物列表
list: {},
// 添加新礼物进列表
add: msg => {
// console.log(`有新礼物加入感谢列表`);
let list = CUTE_MODULE.gift.list;
if (list[msg.uname]) {
if (list[msg.uname][msg.giftName]) {
if (list[msg.uname][msg.giftName].time == -1) {
// 同类礼物已存在,倒计时未启动
// console.log(`送礼闲置中,倒计时启动`);
list[msg.uname][msg.giftName].time = 5;
list[msg.uname][msg.giftName].giftNum = msg.num;
CUTE_MODULE.gift.thank(msg);
} else {
// 同类礼物已存在,倒计时中
// console.log(`送礼连击中,倒计时重置`);
list[msg.uname][msg.giftName].time = 5;
list[msg.uname][msg.giftName].giftNum += msg.num;
}
} else {
// 送礼用户已存在,但无同类礼物
// console.log(`送出新礼物,倒计时启动`);
list[msg.uname][msg.giftName] = {};
list[msg.uname][msg.giftName].time = 5;
list[msg.uname][msg.giftName].giftNum = msg.num;
CUTE_MODULE.gift.thank(msg);
}
} else {
// 送礼用户未记录
// console.log(`新送礼用户,倒计时启动`);
list[msg.uname] = {};
list[msg.uname][msg.giftName] = {};
list[msg.uname][msg.giftName].time = 5;
list[msg.uname][msg.giftName].giftNum = msg.num;
CUTE_MODULE.gift.thank(msg);
}
},
// 执行感谢操作
thank: msg => {
let list = CUTE_MODULE.gift.list;
setTimeout(() => {
if (list[msg.uname][msg.giftName].time > 0) {
list[msg.uname][msg.giftName].time--;
CUTE_MODULE.gift.thank(msg);
// console.log(list[msg.uname][msg.giftName].time);
} else {
list[msg.uname][msg.giftName].time = -1;
let unit = '个';
if (msg.giftName == '辣条') {
unit = '根';
}
switch (CUTE_DATA.ROOM_INFO.entry_id) {
case '631':
CUTE_MODULE.danmaku.queue_add(
`♡ ${msg.uname}献祭了${list[msg.uname][
msg.giftName
].giftNum +
unit +
msg.giftName}给恶魔`
);
break;
case '189':
CUTE_MODULE.danmaku.queue_add(
`♡ ${msg.uname}用${list[msg.uname][
msg.giftName
].giftNum +
unit +
msg.giftName}夸赞了狐妖`
);
break;
case '223':
CUTE_MODULE.danmaku.queue_add(
`♡ 收到${msg.uname}的${list[msg.uname][
msg.giftName
].giftNum +
unit +
msg.giftName},可可爽得飞起`
);
break;
case '64566':
CUTE_MODULE.danmaku.queue_add(
`♡ ${msg.uname}用${list[msg.uname][
msg.giftName
].giftNum +
unit +
msg.giftName}锤了猫幼的头`
);
break;
default:
return CUTE_MODULE.danmaku.queue_add(
`♡ 感谢${msg.uname}的${list[msg.uname][
msg.giftName
].giftNum +
unit +
msg.giftName}`
);
}
}
}, 1e3);
},
// 赠送礼物
send: msg => {},
// 赠送礼物(从包裹)
send_bag: msg => {
if (
!CUTE_DATA.send_gift_ts ||
new Date().getTime() > CUTE_DATA.send_gift_ts
) {
return CUTE_API.user.gift.bag_list().then(response => {
if (response.code === 0) {
let bag_list = response.data.list;
let bag_id;
for (let i = 0; i < bag_list.length; i++) {
if (bag_list[i].gift_name == '辣条') {
bag_id = bag_list[i].bag_id;
return CUTE_API.user.gift
.send_bag(1, 1, bag_id)
.then(response => {
console.log(response);
if (response.code === 0) {
CUTE_DATA.send_gift_ts =
new Date().getTime() + 6e5;
return CUTE_MODULE.danmaku.queue_add(
`${msg.name} 通过本机送出了1个辣条|・ω・`)`
);
} else {
return CUTE_MODULE.danmaku.queue_add(
`${msg.name} 投喂辣条失败了呢|・ω・`)`
);
}
});
}
}
return CUTE_MODULE.danmaku.queue_add(
`本机的包裹中没有辣条可以送了!(๑•́ ₃ •̀๑)`
);
}
});
} else {
let cd = Math.round(
(CUTE_DATA.send_gift_ts - new Date().getTime()) / 1000
);
return CUTE_MODULE.danmaku.queue_add(
`功能冷却中!请在${cd}秒后使用|・ω・`)`
);
}
}
},
// 转换时间戳
tsFormatter: (ts, mode = 'date') => {
var date = new Date(ts * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
var Y = date.getFullYear() + '-';
var M =
(date.getMonth() + 1 < 10
? '0' + (date.getMonth() + 1)
: date.getMonth() + 1) + '-';
var D =
(date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) +
' ';
var h =
(date.getHours() < 10
? '0' + date.getHours()
: date.getHours()) + ':';
var m =
(date.getMinutes() < 10
? '0' + date.getMinutes()
: date.getMinutes()) + ':';
var s =
date.getSeconds() < 10
? '0' + date.getSeconds()
: date.getSeconds();
if (mode == 'time') {
return h + m + s;
}
return Y + M + D + h + m + s;
},
// 获取日期
getDate: () => {
var date = new Date(); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
var Y = date.getFullYear() + '';
var M =
(date.getMonth() + 1 < 10
? '0' + (date.getMonth() + 1)
: date.getMonth() + 1) + '';
var D =
(date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) +
'';
return Y + M + D;
},
// 获取地址栏参数
getUrlParam: name => {
var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
var r = window.location.search.substr(1).match(reg);
if (r != null) return decodeURI(r[2]);
return null;
},
// roll点
roll: msg => {
let roll_range = 100;
let roll_num;
if (msg.text.split('=')[1]) {
if (msg.text.split('=')[1].length > 6) {
return CUTE_MODULE.danmaku.queue_add(
`对不起,你太长了,roll点失败|・ω・`)`
);
} else if (
parseInt(msg.text.split('=')[1]) == msg.text.split('=')[1]
) {
roll_range = parseInt(msg.text.split('=')[1]);
roll_num = Math.floor(Math.random() * roll_range + 1);
}
} else {
roll_num = Math.floor(Math.random() * roll_range + 1);
}
return CUTE_MODULE.danmaku
.queue_add(`${msg.name} roll出了${roll_num}点`)
.then(response => {
if (response.msg) {
CUTE_DATA.replyFailedText = msg.name + ' roll点失败,请重试';
CUTE_MODULE.danmaku.queue_add(
CUTE_DATA.replyFailedText
);
}
});
},
// 抽奖
raffle: msg => {
let total = CUTE_DATA.ROOM_INFO.guard_list.length;
let lucky_num = Math.floor(Math.random() * total);
let lucky_uid = CUTE_DATA.ROOM_INFO.guard_list[lucky_num];
return CUTE_API.user.search(lucky_uid).then(response => {
if (response.code === 0) {
let lucky_dog = response.data.name;
CUTE_MODULE.danmaku.queue_add(
`♡ ${lucky_dog} 被本机抽了一顿|・ω・`)`
);
}
});
},
// 操作提示封装
toast: {
success: msg => {
try {
$.toast({
heading: '操作成功',
text: msg || '',
icon: 'success',
hideAfter: 1500,
stack: 20, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time
position: 'top-right', // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values
textAlign: 'left', // Text alignment i.e. left, right or center
loader: false // Whether to show loader or not. True by default
});
let scrollHeight = $('.jq-toast-wrap:first').prop(
'scrollHeight'
);
$('.jq-toast-wrap:first').scrollTop(scrollHeight);
} catch (error) {
window.location.reload(true);
}
},
failed: msg => {
$.toast({
heading: '操作失败',
text: msg || '',
hideAfter: 1500,
stack: 20, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time
icon: 'error',
position: 'top-right', // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values
textAlign: 'left', // Text alignment i.e. left, right or center
loader: false // Whether to show loader or not. True by default
});
let scrollHeight = $('.jq-toast-wrap:first').prop(
'scrollHeight'
);
$('.jq-toast-wrap:first').scrollTop(scrollHeight);
}
},
// 礼物统计
giftRecorder: undefined
};
let CUTE_CONFIG = {
AD: {
replyArr: [], // 自动广告列表
replySerial: 0, // 自动广告的发送位置
replyTime: 300 // 自动广告时间间隔
},
KEYWORD: {
replyArr: [],
replySerialArr: [], // 自动回复的发送位置
banArr: []
},
FOLLOWER: {
record: {
ts: undefined, // 上次记录时间
num: undefined // 上次记录关注数
}
},
BLACKLIST: [],
MODULE_SWITCH: {
gift: 0,
follow: 0,
ad: 0,
reply: 0,
ban: 0,
coin_type: 'gold'
},
PERMISSION: {
author: 9999,
host: 5000,
admin: 1000,
guard: 200,
superfans: 100,
fans: 50,
normal: 10
}
};
// 弹幕管理器(全功能模式
let CUTE_DANMAKU_MGR = msg => {
switch (msg.cmd) {
// 特殊礼物刷屏
case 'SPECIAL_GIFT':
try {
if (msg.storm_action == 'start') {
CUTE_DATA.danmaku_filter.push(msg.storm_content);
CUTE_DATA.replyCD = 1;
CUTE_CONFIG.MODULE_SWITCH.ban = 0;
} else if (msg.storm_action == 'end') {
CUTE_DATA.replyCD = 0;
CUTE_CONFIG.MODULE_SWITCH.ban = 1;
}
} catch (e) {
console.log('然而这并不是storm!');
}
break;
// 开启天选抽奖
case 'ANCHOR_LOT_START':
try {
CUTE_DATA.danmaku_filter.push(msg.anchor_content);
if (CUTE_CONFIG.MODULE_SWITCH.follow == 1) {
CUTE_CONFIG.MODULE_SWITCH.follow = 0;
setTimeout(() => {
CUTE_CONFIG.MODULE_SWITCH.follow = 1;
}, msg.time * 1000);
}
} catch (e) {}
break;
// 上船
case 'GUARD_BUY':
try {
let username_limit =
msg.username.length < 10
? msg.username
: `${msg.username.substr(
0,
2
)}***${msg.username.substr(
msg.username.length - 3
)}`;
if (msg.price == 50000) {
return CUTE_MODULE.danmaku.queue_add(
`[一週間${msg.gift_name}] ${username_limit} 关于舰长的记忆只有一周(误`
);
} else if (
CUTE_DATA.ROOM_INFO.guard_list.indexOf(msg.uid) != -1
) {
return CUTE_MODULE.danmaku.queue_add(
`[续费${msg.gift_name}] ${username_limit} 一直续船一直爽!`
);
} else {
CUTE_DATA.ROOM_INFO.guard_list.push(msg.uid);
CUTE_MODULE.danmaku.queue_add(
`[新${msg.gift_name}] ${username_limit} 上船了,我地位-1!`
);
setTimeout(() => {
let whisperCtx = {
// 631: `欢迎来到631海豹大舰队!舰长群:870309615 \\n若已加入请无视~`,
189: `感谢大佬登上狐妖的小船船!舰长群:568744231,欢迎来玩♡\\n若已加入请无视~`,
223: `感谢大佬登上可可的小船船!舰长群:88479489,欢迎加入♡\\n若已加入请无视~`,
64566: `跪谢老板٩(๑^o^๑)۶对猫猫的船票支持,解锁欢乐的舰长群(823316645)快来一起玩耍吧٩(๑^o^๑)۶\\n若已加入请无视~`
};
if (whisperCtx[CUTE_DATA.ROOM_INFO.entry_id]) {
CUTE_MODULE.whisper(
msg.uid,
msg.username,
`{"content":"[${CUTE_MODULE.tsFormatter(
new Date() / 1000
)}] ${whisperCtx[
CUTE_DATA.ROOM_INFO.entry_id
]}"}`,
'guard'
);
} else {
console.log(`这个直播间没有设置舰长群,不能发送私信|・ω・`)`);
}
}, 5e3);
}
} catch (err) {}
break;
// 礼物
case 'SEND_GIFT':
try {
if (
CUTE_CONFIG.MODULE_SWITCH.gift == 2 ||
(CUTE_CONFIG.MODULE_SWITCH.gift == 1 &&
msg.coin_type ==
CUTE_CONFIG.MODULE_SWITCH.coin_type)
) {
return CUTE_MODULE.gift.add(msg);
}
} catch (err) {}
break;
// 开播
case 'LIVE':
try {
if (typeof msg.roomid == 'number') {
let startCtx = {
41682: `♡ 咕才是世界的常态……然而居然开播了|・ω・`)`,
70270: `♡ 啊,是我最喜欢的小狐妖开播了|・ω・`)`,
24589: `♡ 咕才是世界的常态……然而居然开播了|・ω・`)`,
64566: `♡ 第一次看直播,刚点进这个直播间就开播了|・ω・`)`,
176190: `♡ 小酸奶你来辣!那就让我一口吃掉好了|・ω・`)`,
2224562: `♡ 辣个北北粗线了,我开始黑听了|・ω・`)`
};
if (startCtx[msg.roomid]) {
CUTE_MODULE.danmaku.queue_add(startCtx[msg.roomid]);
}
CUTE_ROBOT.connect.common();
if (
window.Notification &&
Notification.permission !== 'denied'
) {
Notification.requestPermission(function(status) {
let notification = new Notification('真香警告', {
body:
CUTE_MODULE.tsFormatter(
new Date().getTime() / 1000
) +
' ' +
CUTE_DATA.ROOM_INFO.uname +
'出现了!我就是饿死也不会去看一眼!'
});
notification.onclick = function() {
window.open(
'https://live.bilibili.com/' +
CUTE_DATA.ROOM_INFO.short_id
);
};
});
}
// $('#connect').click();
}
} catch (err) {}
break;
// 下播
case 'PREPARING':
try {
CUTE_MODULE.danmaku.queue_add(
`${CUTE_MODULE.tsFormatter(
new Date() / 1000,
'time'
)} 直播结束,喜欢记得关注嗷~!`
);
CUTE_MODULE.ad.end();
setTimeout(() => {
CUTE_ROBOT.connect.sleep_mode();
}, 3e3);
} catch (err) {}
break;
// 封禁提示
case 'ROOM_BLOCK_MSG':
try {
$.toast({
heading: '封禁提示',
text: `${msg.block_uname}被制裁了`,
hideAfter: false,
stack: 20, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time
icon: 'error',
position: 'top-right', // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values
textAlign: 'left', // Text alignment i.e. left, right or center
loader: false // Whether to show loader or not. True by default
});
let scrollHeight = $('.jq-toast-wrap:first').prop(
'scrollHeight'
);
$('.jq-toast-wrap:first').scrollTop(scrollHeight);
var couple_arr = [
{
memberA: '133502',
memberB: '1738519'
}
];
let block_couple;
for (let i = 0; i < couple_arr.length; i++) {
if (
CUTE_DATA.blockIgnore == couple_arr[i].memberA ||
CUTE_DATA.blockIgnore == couple_arr[i].memberB
) {
CUTE_DATA.blockIgnore = '';
console.log('cp已被封禁');
return;
}
if (msg.block_uid == couple_arr[i].memberA) {
block_couple = couple_arr[i].memberB;
} else if (msg.block_uid == couple_arr[i].memberB) {
block_couple = couple_arr[i].memberA;
}
// console.log(msg.block_uid, couple_arr[i].memberA, couple_arr[i].memberB);
if (block_couple) {
console.log('couple: ' + block_couple);
CUTE_DATA.blockIgnore = block_couple;
CUTE_API.room.block_user
.add(block_couple, 1)
.then(response => {
if (response.code == 0) {
console.log('禁言成功');
CUTE_MODULE.danmaku.queue_add(
`封禁用户存在CP,同步封禁CP用户|・ω・`)`
);
} else {
CUTE_MODULE.danmaku.queue_add(
`封禁用户存在CP,CP用户已在小黑屋|・ω・`)`
);
}
CUTE_DATA.blockIgnore = '';
});
break;
}
}
} catch (err) {}
break;
// 弹幕
case 'DANMU_MSG':
case 'DANMU_MSG:4:0:2:2:2:0':
try {
CUTE_MODULE.danmaku.show(msg);
// 黑名单返回
let blacklist = CUTE_CONFIG.BLACKLIST;
if (
blacklist.length !== 0 &&
blacklist.indexOf(msg.uid) != -1 &&
msg.text.indexOf('求求萌萌兽把我从小黑屋里放出来吧') == -1
) {
return;
}
let permission = 0;
// 指令管理
if (msg.text.indexOf('*') == 0) {
if (msg.uid == 64131034 || msg.uid == 193351) {
permission += 9999;
}
if (msg.uid == CUTE_DATA.ROOM_INFO.ruid) {
permission += 5000;
}
if (msg.admin) {
permission += 1000;
}
if (msg.guard) {
permission += 1 / msg.guard * 600;
}
if (msg.medal_name == CUTE_DATA.ROOM_INFO.medal_name) {
permission += msg.medal_level * 10;
}
if (msg.user_level) {
permission += Math.round(msg.user_level * 0.1);
}
// console.log(`用户权限:${permission}`);
switch (msg.text.split(' ')[0].split('*')[1]) {
case 'admin':
if (
permission >= CUTE_CONFIG.PERMISSION.author
) {
CUTE_MODULE.danmaku.admin(msg);
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:${CUTE_CONFIG
.PERMISSION.author} |・ω・`)`
);
}
break;
case '配置':
if (
permission >= CUTE_CONFIG.PERMISSION.admin
) {
CUTE_MODULE.danmaku.command(msg);
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:${CUTE_CONFIG
.PERMISSION.admin} |・ω・`)`
);
}
break;
case '功能':
CUTE_MODULE.danmaku.cute(msg, permission);
break;
case '查询':
CUTE_MODULE.danmaku.query(msg, permission);
break;
default:
break;
}
} else {
// 关键词自动回复
if (
CUTE_CONFIG.MODULE_SWITCH.reply &&
msg.uid != CUTE_DATA.USER_INFO.uid
) {
let keyword = CUTE_CONFIG.KEYWORD;
for (let i = 0; i < keyword.replyArr.length; i++) {
if (
msg.text.indexOf(
keyword.replyArr[i].keyword
) != -1
) {
let r = Math.floor(
Math.random() *
keyword.replyArr[i].reply.length
);
if (
keyword.replySerialArr.toString() ===
[i].toString()
) {
console.log(`自动回复内容相同,回避本次回复`);
return;
}
if (!CUTE_DATA.replyCD) {
keyword.replySerialArr = [i];
CUTE_MODULE.danmaku.queue_add(
keyword.replyArr[i].reply[r]
);
clearTimeout(
CUTE_DATA.INTERVAL.replyItv
);
CUTE_DATA.INTERVAL.replyItv = setTimeout(
function() {
keyword.replySerialArr = [];
},
5e3
);
CUTE_DATA.replyCD = 1;
setTimeout(() => {
CUTE_DATA.replyCD = 0;
}, 3e3);
console.log(
`自动回复位置:${keyword.replySerialArr.toString()}`
);
} else {
console.log(`自动回复cd中`);
}
return;
}
}
}
if (
CUTE_CONFIG.MODULE_SWITCH.repeat == 2 &&
msg.uid != CUTE_DATA.USER_INFO.uid
) {
// 复读机
if (
msg.uid == CUTE_DATA.repeat_user ||
msg.name == CUTE_DATA.repeat_user
) {
CUTE_MODULE.danmaku.queue_add(msg.text);
return;
}
}
}
// }
} catch (err) {}
break;
default:
try {
} catch (err) {}
break;
}
};
// 弹幕管理器(休眠模式
let CUTE_SLEEP_MODE_MGR = msg => {
switch (msg.cmd) {
// 特殊礼物刷屏
case 'SPECIAL_GIFT':
try {
if (msg.storm) {
if (msg.storm_action == 'start') {
CUTE_DATA.danmaku_filter.push(msg.storm_content);
} else if (msg.storm_action == 'end') {
}
}
} catch (e) {
console.log('然而这并不是storm!');
}
break;
// 封禁提示
case 'ROOM_BLOCK_MSG':
try {
$.toast({
heading: '封禁提示',
text: `${msg.block_uname}被制裁了`,
hideAfter: false,
stack: 20, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time
icon: 'error',
position: 'top-right', // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values
textAlign: 'left', // Text alignment i.e. left, right or center
loader: false // Whether to show loader or not. True by default
});
let scrollHeight = $('.jq-toast-wrap:first').prop(
'scrollHeight'
);
$('.jq-toast-wrap:first').scrollTop(scrollHeight);
} catch (error) {}
break;
case 'DANMU_MSG':
case 'DANMU_MSG:4:0:2:2:2:0':
try {
CUTE_MODULE.danmaku.show(msg);
// 黑名单返回
let blacklist = CUTE_CONFIG.BLACKLIST;
if (
blacklist.length !== 0 &&
blacklist.indexOf(msg.uid) != -1 &&
msg.text.indexOf('求求萌萌兽把我从小黑屋里放出来吧') == -1
) {
return;
}
let permission = 0;
// 指令管理
if (msg.text.indexOf('*') == 0) {
if (msg.uid == 64131034 || msg.uid == 193351) {
permission += 9999;
}
if (msg.uid == CUTE_DATA.ROOM_INFO.ruid) {
permission += 5000;
}
if (msg.admin) {
permission += 1000;
}
if (msg.guard) {
permission += 1 / msg.guard * 600;
}
if (msg.medal_name == CUTE_DATA.ROOM_INFO.medal_name) {
permission += msg.medal_level * 10;
}
if (msg.user_level) {
permission += Math.round(msg.user_level * 0.1);
}
// console.log(`用户权限:${permission}`);
switch (msg.text.split(' ')[0].split('*')[1]) {
case 'admin':
if (
permission >= CUTE_CONFIG.PERMISSION.author
) {
CUTE_MODULE.danmaku.admin(msg);
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:${CUTE_CONFIG
.PERMISSION.author} |・ω・`)`
);
}
break;
case '配置':
if (
permission >= CUTE_CONFIG.PERMISSION.admin
) {
CUTE_MODULE.danmaku.command(msg);
} else {
return CUTE_MODULE.danmaku.queue_add(
`拒绝执行!你的权限:${permission},需要:${CUTE_CONFIG
.PERMISSION.admin} |・ω・`)`
);
}
break;
case '功能':
CUTE_MODULE.danmaku.cute(msg, permission);
break;
case '查询':
CUTE_MODULE.danmaku.query(msg, permission);
break;
default:
break;
}
}
} catch (err) {}
break;
// 开播
case 'LIVE':
try {
if (typeof msg.roomid == 'number') {
let startCtx = {
41682: `♡ 咕才是世界的常态……然而居然开播了|・ω・`)`,
70270: `♡ 啊,是我最喜欢的小狐妖开播了|・ω・`)`,
24589: `♡ 咕才是世界的常态……然而居然开播了|・ω・`)`,
64566: `♡ 第一次看直播,刚点进这个直播间就开播了|・ω・`)`
};
if (startCtx[msg.roomid]) {
CUTE_MODULE.danmaku.queue_add(startCtx[msg.roomid]);
}
CUTE_ROBOT.connect.common();
if (
window.Notification &&
Notification.permission !== 'denied'
) {
Notification.requestPermission(function(status) {
let notification = new Notification('真香警告', {
body:
CUTE_MODULE.tsFormatter(
new Date().getTime() / 1000
) +
' ' +
CUTE_DATA.ROOM_INFO.uname +
'出现了!我就是饿死也不会去看一眼!'
});
notification.onclick = function() {
window.open(
'https://live.bilibili.com/' +
CUTE_DATA.ROOM_INFO.short_id
);
};
});
}
// $('#connect').click();
}
} catch (err) {}
break;
// 上船
case 'GUARD_BUY':
try {
let username_limit =
msg.username.length < 10
? msg.username
: `${msg.username.substr(
0,
2
)}**${msg.username.substr(
msg.username.length - 3
)}`;
if (msg.price == 50000) {
return CUTE_MODULE.danmaku.queue_add(
`[一週間${msg.gift_name}] ${username_limit} 关于舰长的记忆只有一周(误`
);
} else if (
CUTE_DATA.ROOM_INFO.guard_list.indexOf(msg.uid) != -1
) {
return CUTE_MODULE.danmaku.queue_add(
`[续费${msg.gift_name}] ${username_limit} 一直续船一直爽!`
);
} else {
CUTE_DATA.ROOM_INFO.guard_list.push(msg.uid);
CUTE_MODULE.danmaku.queue_add(
`[新${msg.gift_name}] ${username_limit} 上船了,我地位-1!`
);
setTimeout(() => {
let whisperCtx = {
// 631: `欢迎来到631海豹大舰队!舰长群:870309615 \\n若已加入请无视~`,
189: `感谢大佬登上狐妖的小船船!舰长群:568744231,欢迎来玩♡\\n若已加入请无视~`,
223: `感谢大佬登上可可的小船船!舰长群:88479489,欢迎加入♡\\n若已加入请无视~`,
64566: `跪谢老板٩(๑^o^๑)۶对猫猫的船票支持,解锁欢乐的舰长群(823316645)快来一起玩耍吧٩(๑^o^๑)۶\\n若已加入请无视~`
};
if (whisperCtx[CUTE_DATA.ROOM_INFO.entry_id]) {
CUTE_MODULE.whisper(
msg.uid,
msg.username,
`{"content":"[${CUTE_MODULE.tsFormatter(
new Date() / 1000
)}] ${whisperCtx[
CUTE_DATA.ROOM_INFO.entry_id
]}"}`,
'guard'
);
} else {
console.log(`这个直播间没有设置舰长群,不能发送私信|・ω・`)`);
}
}, 5e3);
}
} catch (err) {}
break;
default:
break;
}
};
// 弹幕管理器(聊天模式
let CUTE_CHAT_MODE_MGR = msg => {
console.log(msg.cmd);
switch (msg.cmd) {
// 特殊礼物刷屏
case 'SPECIAL_GIFT':
try {
if (msg.storm) {
if (msg.storm_action == 'start') {
CUTE_DATA.danmaku_filter.push(msg.storm_content);
} else if (msg.storm_action == 'end') {
}
}
} catch (e) {
console.log('然而这并不是storm!');
}
break;
// 封禁提示
case 'ROOM_BLOCK_MSG':
try {
$.toast({
heading: '封禁提示',
text: `${msg.block_uname}被制裁了`,
hideAfter: false,
stack: 20, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time
icon: 'error',
position: 'top-right', // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values
textAlign: 'left', // Text alignment i.e. left, right or center
loader: false // Whether to show loader or not. True by default
});
let scrollHeight = $('.jq-toast-wrap:first').prop(
'scrollHeight'
);
$('.jq-toast-wrap:first').scrollTop(scrollHeight);
} catch (error) {}
break;
case 'DANMU_MSG':
case 'DANMU_MSG:4:0:2:2:2:0':
try {
CUTE_MODULE.danmaku.show(msg);
if (
CUTE_CONFIG.MODULE_SWITCH.repeat == 2 &&
msg.uid != CUTE_DATA.USER_INFO.uid
) {
// 复读机
if (
msg.uid == CUTE_DATA.repeat_user ||
msg.name == CUTE_DATA.repeat_user
) {
CUTE_MODULE.danmaku.queue_add(msg.text);
return;
}
}
} catch (error) {}
break;
default:
console.log(msg.cmd);
break;
}
};
CUTE_ROBOT.init();
window.onload = function() {
// 延迟加载toast所需的js文件
// setTimeout(() => {
// $('body').append(
// `<script src="https://cdn.bootcss.com/jquery-toast-plugin/1.3.2/jquery.toast.min.js"></script>`
// );
// }, 5e2);
// 连接弹幕服务器并启用全部功能
$('#connect').on('click', e => {
$('#connect').attr('disabled', true);
// e.target.disabled.value = true;
setTimeout(() => {
$('#connect').attr('disabled', false);
// e.target.disabled.value = false;
}, 10e3);
CUTE_ROBOT.connect.common();
});
// 休眠模式
$('#sleep_mode_connect').on('click', e => {
// console.log(e);
$('#sleep_mode_connect').attr('disabled', true);
// e.target.disabled.value = true;
setTimeout(() => {
$('#sleep_mode_connect').attr('disabled', false);
// e.target.disabled.value = false;
}, 10e3);
CUTE_ROBOT.connect.sleep_mode();
});
// 聊天模式
$('#chat_mode_connect').on('click', e => {
// console.log(e);
$('#chat_mode_connect').attr('disabled', true);
// e.target.disabled.value = true;
setTimeout(() => {
$('#chat_mode_connect').attr('disabled', false);
// e.target.disabled.value = false;
}, 10e3);
CUTE_ROBOT.connect.chat_mode();
});
// 断开弹幕服务器
$('#disconnect').on('click', () => {
CUTE_ROBOT.disconnect();
});
// 复读用户设定
$('#repeat_user').blur(() => {
CUTE_DATA.repeat_user = $('#repeat_user').val();
});
// 循环广告
$('#intervalTime').blur(() => {
CUTE_MODULE.ad.time();
});
$('#start').on('click', e => {
CUTE_MODULE.ad.time();
CUTE_MODULE.ad.run();
});
$('#clear').on('click', CUTE_MODULE.ad.end);
// 房间号输入
$('#room_entry').blur(() => {
CUTE_DATA.ROOM_INFO.entry_id = $('#room_entry').val();
});
$('#room_entry').val(CUTE_DATA.ROOM_INFO.entry_id);
// 打开直播间
$('#goToRoom').on('click', e => {
window.open(
'https://live.bilibili.com/' + CUTE_DATA.ROOM_INFO.short_id
);
});
// 更换弹幕颜色
$('.color').on('click', CUTE_MODULE.danmaku.color);
// 弹幕发送
$('#danmu_send').keypress(CUTE_MODULE.danmaku.send);
// 添加新的广告/关键词回复
$('#ad_new_submit').on('click', () => {
CUTE_MODULE.ad.add();
});
$('#autoreply_add').on('click', () => {
CUTE_MODULE.keyword.reply.add();
});
if (CUTE_MODULE.getUrlParam('reconnect')) {
CUTE_ROBOT.reconnect();
}
};
})();