// ==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) // 插入控制面板样式 // 创建一个