// ==UserScript==
// @name DRRR点歌助手(drrr-music-helper)
// @description 让DRRR.COM聊天室支持点歌功能
// @namespace Violentmonkey Scripts
// @match https://drrr.com/*
// @license MIT
// @require https://cdn.staticfile.org/layer/3.5.1/layer.min.js
// @resource layerCss https://cdn.staticfile.org/layer/3.5.1/theme/default/layer.min.css
// @unwrap
// @version 3.1.6
// @author QQ:121610059
// @update 2023-12-24 18:05:01
// @supportURL https://greasyfork.org/zh-CN/scripts/414535-drrr-com%E6%99%BA%E8%83%BD%E8%84%9A%E6%9C%AC-%E8%87%AA%E5%8A%A8%E5%AF%B9%E8%AF%9D-%E8%87%AA%E5%8A%A8%E7%82%B9%E6%AD%8C
// @downloadURL none
// ==/UserScript==
// 定义全局变量
let lastRequestedSong = null // 外部创建一个变量来存储上一首点的歌曲信息
const userSongTimestamps = {} // 外部创建一个对象来跟踪每个用户的点歌时间戳// 外部创建一个对象来跟踪每个用户的点歌时间戳
let userInteracted = false; // 添加一个变量来跟踪用户是否已经与网页交互
// 添加事件监听器来检测用户的互动行为
document.addEventListener('click', function() {
userInteracted = true;
});
// 检测本地存储是否已经存在songList
if (!localStorage.getItem('songList')) {
// 如果不存在,将数组中的数据设置为本地存储的songList
localStorage.setItem('songList', JSON.stringify([
'极乐净土',
'aLIEZ',
'only my railgun',
'恋爱循环',
'打上花火',
'我的战争',
'菲克瑟先生',
'Lost in Paradise',
'Under the tree',
'Last stardust',
'青鸟',
'直到世界尽头'
]));
}
// 从本地存储中获取songList
let songList = JSON.parse(localStorage.getItem('songList'));
// 创建一个消息类型到处理函数的映射
const typeToHandler = {
'join': handleJoin,
'leave': handleLeave,
'message': handleMessage,
'music': handleMusic
}
// 添加全局事件监听器
$(document).ready(function () {
// 初始化逻辑
initialize()
// 监听音乐播放状态
musicPlaybackStatus()
// 监控talks子元素数量不超过50,并以倒序方式移除超过指定数量的子元素。
monitorTalksElement()
// 添加 AJAX 请求监听器
setupAjaxListeners()
})
// 初始化函数
function initialize() {
// 创建并添加样式表
createAndAppendStylesheet()
// 当自动放歌功能打开时页面加载成功提示确认放歌
showConfirmationDialog()
// 创建设置按钮
createAndAppendSettingsButton()
// 设置按钮点击事件
settingsButtonClick()
// 添加自动发送面板
createAndAppendAutoSendToPanel()
// 添加欢迎加入面板
createAndAppendWelcomePanel()
}
// 添加欢迎加入面板
function createAndAppendWelcomePanel() {
$(".nav-tabs").append(`
加入欢迎
`)
$(".tab-content").append(`
`)
const checkboxId = 'welcome_to_the_switch'
const checkbox = document.getElementById(checkboxId)
// 尝试从 localStorage 中获取保存的状态
checkbox.checked = localStorage.getItem(`${checkboxId}_state`) === 'true';
checkbox.addEventListener('change', function() {
// 存储 checkbox 的 checked 状态为字符串
localStorage.setItem(`${checkboxId}_state`, this.checked.toString())
})
}
// 添加自动发送面板
function createAndAppendAutoSendToPanel() {
$(".nav-tabs").append(`
定时发送
`)
$(".tab-content").append(`
`)
// 定时发送代码
let intervalSendTimer = setInterval(intervalSendFn, Number(scheduled_send_intervals.value) * 1000)
//获取当前日期函数
function getFormattedDateTime() {
const now = new Date();
const formatNumber = (num) => String(num).padStart(2, '0');
const year = now.getFullYear();
const month = formatNumber(now.getMonth() + 1);
const day = formatNumber(now.getDate());
const hours = formatNumber(now.getHours());
const minutes = formatNumber(now.getMinutes());
const seconds = formatNumber(now.getSeconds());
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
function intervalSendFn() {
clearInterval(intervalSendTimer)
if(timed_send_switch.checked){
logMessage(`提示: 当前定时间隔为${Number(scheduled_send_intervals.value) }秒`,'success')
sendMessage(scheduled_send_content.value.replace('{time}', getFormattedDateTime()))
}
intervalSendTimer = setInterval(intervalSendFn, Number(scheduled_send_intervals.value) * 1000)
}
const checkboxId = 'timed_send_switch'
const checkbox = document.getElementById(checkboxId)
// 尝试从 localStorage 中获取保存的状态
checkbox.checked = localStorage.getItem(`${checkboxId}_state`) === 'true';
checkbox.addEventListener('change', function() {
// 存储 checkbox 的 checked 状态为字符串
localStorage.setItem(`${checkboxId}_state`, this.checked.toString())
})
}
// 创建并添加样式表
function createAndAppendStylesheet() {
// 创建一个link元素
const link = document.createElement('link')
link.rel = 'stylesheet'
link.type = 'text/css'
link.href = 'https://jsdelivr.b-cdn.net/npm/layer-src@3.5.1/dist/theme/default/layer.min.css'
// 将link元素附加到文档的head中
document.head.appendChild(link)
// 插入控制面板样式
// 创建一个