// ==UserScript== // @name DRRR.COM智能脚本 - 自动对话 - 自动点歌 // @description 让DRRR.COM聊天室支持点歌、智能聊天功能 // @namespace Violentmonkey Scripts // @match https://drrr.com/room/?id=* // @license MIT // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @grant GM_addElement // @runat document-end // @version 2.5.6 // @author QQ:121610059 // @update 2023-06-06 14:02:31 // @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== (function () { 'use strict' // 引入layer.js loadScript('https://cdn.bootcdn.net/ajax/libs/layer/3.5.1/layer.min.js', 'layer') // 设置默认欢迎文本 const welcome_text = '欢迎{username}进入聊天室' // 设置定时发送默认间隔时间 const interval_time = 60 // 设置定时发送的文本 const timer_str = '你好,现在时间是{time}' // 添加样式 GM_addStyle(` .message_box_effect_wraper{ height: 100%; } .room-input-wrap, .room-submit-wrap, #talks{ //display:none; } #drrr-auto-panel{ font-weight: bold; } #drrr-auto-content{ display: flex; align-content: center; justify-content: center; flex-wrap: wrap; align-items: flex-start; } #drrr-auto-content .items{ display: flex; align-items: center; padding: 8px; } #drrr-auto-content a{ color: #aaa; } #drrr-auto-content input[type=checkbox]{ margin: auto; margin-right: 3px; } #drrr-auto-content input[type=checkbox]{ outline: none; appearance: none; position: relative; width: 2.6rem; height: 1.52rem; border-radius: 50px; border: 1px solid #ccc; background-color: #ccc; } #drrr-auto-content input[type=checkbox]::after{ content: ''; display: inline-block; width: 1.4rem; height: 1.4rem; border-radius: 50%; background-color: #fff; box-shadow: 0 0 0 2px #999; transition: left 0.1s linear; position: absolute; top: 0; left: 0; } #drrr-auto-content input[type=checkbox]:checked{ background-color: #32ba58; } #drrr-auto-content input[type=checkbox]:checked:after{ position: absolute; top: 0; left: 50%; } .layui-layer-content{ display: flex; flex-direction: column; justify-content: center; align-items: center; } .layui-layer-content button{ color: #262629; margin: 5px auto; background-color: #fff; border-radius: 9px; padding: 5px; } .layui-layer-content .user-items div{ display: inline-block; width:50%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } `) // **添加drr-auto面板元素 const message_box_effect_wraper = document.querySelector('.message_box_effect_wraper') const drrr_auto_panel = GM_addElement(document.querySelector('.message_box_effect_wraper'), 'div', {id: 'drrr-auto-panel'}) drrr_auto_panel.innerHTML = `
点歌功能
点歌队列
自动点歌
智能聊天
欢迎加入
定时发送
配置更多信息
` // 点歌checkbox const song_checkbox = document.querySelector('#song_checkbox') // 点歌队列checkbox const song_list_checkbox = document.querySelector('#song_list_checkbox') // 自动点歌checkbox const auto_song_checkbox = document.querySelector('#auto_song_checkbox') // 聊天checkbox const chat_checkbox = document.querySelector('#chat_checkbox') // 欢迎加入checkbox const welcome_checkbox = document.querySelector('#welcome_checkbox') // 定时checkbox const timer_checkbox = document.querySelector('#timer_checkbox') // 设置checkbox选中状态 GM_getValue('song_checkbox', false) ? song_checkbox.checked = true : song_checkbox.checked = false GM_getValue('song_list_checkbox', false) ? song_list_checkbox.checked = true : song_list_checkbox.checked = false GM_getValue('auto_song_checkbox', false) ? auto_song_checkbox.checked = true : auto_song_checkbox.checked = false GM_getValue('chat_checkbox', false) ? chat_checkbox.checked = true : chat_checkbox.checked = false GM_getValue('welcome_checkbox', false) ? welcome_checkbox.checked = true : welcome_checkbox.checked = false GM_getValue('timer_checkbox', false) ? timer_checkbox.checked = true : timer_checkbox.checked = false // 自动点歌选中状态提示用户点击一下 let auto_song_click = false if (auto_song_checkbox.checked ){ swal({title:'开启自动点歌功能每次重新启动脚本必须点击一下确定'},function () { auto_song_click = true }) }else{ auto_song_click = true } // **点击事件绑定 document.addEventListener('click', function (e) { // checkbox点击事件绑定 if (e.target.tagName === 'INPUT' && e.target.type === 'checkbox') { let checked = e.target.checked let tip = e.target.nextElementSibling.innerText GM_setValue(e.target.id, e.target.checked) checked ? layer.msg(`${tip}已开启`) : layer.msg(`${tip}已关闭`) } // tip点击事件绑定 if (e.target.tagName === 'SPAN') { switch (e.target.innerText) { case '点歌功能': layer.tips('让聊天室支持点歌功能 格式: 点歌+歌曲名', e.target, {tips: 3}) break case '点歌队列': layer.tips('让点歌功能支持队列,而不是直接切换歌曲', e.target, {tips: 3}) break case '自动点歌': layer.tips('让聊天室没有音乐播放时自动播放随机音乐', e.target, {tips: 3}) break case '智能聊天': layer.tips('简单聊天功能 格式: @BOT+想说的话', e.target, {tips: 3}) break case '欢迎加入': layer.tips('有人进入房间时欢迎加入', e.target, {tips: 3}) break case '定时发送': layer.tips('设置定时发送信息', e.target, {tips: 3}) break } } // 全局配置事件 if (e.target.id === 'config') { layer.open({ type: 1, title: '更多配置', area: ['200px'], id: 'config_layer', content: ` ` }); } // 配置项点击事件绑定 if (e.target.parentNode.id === 'config_layer') { switch (e.target.innerText) { case '设置房间管理': let str = '' for (let i = 0; i < room.users.length; i++) { str += `
${room.users[i].name}
设为管理员
` } layer.open({ type: 1, title: '选择用户', //area: ['350px'], content: `
${str}
` }); break case '设置欢迎文本': layer.prompt({ title: e.target.innerText, value: GM_getValue('welcome_text', welcome_text), formType: 2, btn: ['保存', '退出'], }, function (text, index) { GM_setValue('welcome_text', text) layer.close(index) layer.msg('保存成功') }) break case '设置随机音乐': let random_music_lists = GM_getValue('random_music_lists', []) layer.prompt({ title: e.target.innerText, value: random_music_lists.join('\n'), formType: 2, area:['96vw', '96vh'], btn: ['保存', '退出'], }, function (text, index) { let random_music_lists_array = text.split('\n').filter(function (string) { return string && string.trim() }) GM_setValue('random_music_lists', random_music_lists_array) layer.close(index) layer.msg('保存成功') }) break case '设置定时间隔': layer.prompt({ title: `${e.target.innerText}(单位:秒)`, formType: 0, value: GM_getValue('interval_time', interval_time) }, function (time, index) { if (isNaN(+time)) { return layer.msg('只能输入数字(10-240)') } if (time < 10 || time > 240) { return layer.msg('间隔时间只能在10-240之间') } GM_setValue('interval_time', time) layer.close(index) layer.msg('保存成功') }) break case '设置定时文本': layer.prompt({ title: e.target.innerText, value: GM_getValue('timer_str', timer_str), formType: 2, btn: ['保存', '退出'], }, function (text, index) { GM_setValue('timer_str', text) layer.close(index) layer.msg('保存成功') }) break } } // 设置管理员 if (e.target.id === 'set_admin') { let id = e.target.parentElement.previousElementSibling.dataset.id let name = e.target.parentElement.previousElementSibling.textContent GM_setValue('admin_id', id) sendMessage(`已设置${name}为管理员`) layer.msg(`已设置${name}为管理员`) } }) // 拦截drrr消息 $.ajaxSetup({ complete: function (XMLHttpRequest, textStatus) { let url = this.url let {status: status, responseJSON: json} = XMLHttpRequest let talks = [] if (status === 200 && url.includes('update')) { talks = json.talks if (talks.length <= 0) return talks.forEach((element, index) => { if (element.is_me) return console.log(element) switch (element.type) { case 'join': console.log('收到用户加入信息') // 欢迎用户加入 if (welcome_checkbox.checked) { let new_str = replaceStr(GM_getValue('welcome_text', welcome_text), username) sendMessage(new_str) } break case 'leave': console.log('收到用户退出信息') break case 'user-profile': console.log('收到用户加入退出信息') break case 'music': console.log('收到音乐消息') break default : console.log('收到普通消息') // 接收新消息 let content = element.message || element.content let username = element.from.name let id = element.from.id console.log(`用户: ${username}`) console.log(`信息: ${content}`) console.log(`ID: ${id}`) // 点歌功能 if (song_checkbox.checked && content.includes('点歌') && content.length > 2) { let song_name = content.replace('点歌', '').trim() song(song_name) } // 聊天功能 if (chat_checkbox.checked && content.includes(`@${profile.name}`) && content.length > 1) { let ask_content = content.replace(`@${profile.name}`, '').trim() chat(username, ask_content) } // 查看歌单 if (content === '查看队列'){ console.log(play_list_array.length) if (play_list_array.length > 0) { sendMessage(`播放队列:\n${play_list_array.join('\n')}`) } } // 管理员功能 if(GM_getValue('admin_id') && GM_getValue('admin_id') === id){ switch (content) { case '切歌': Player.nowPlaying.howl.pause() Player.isPausing break } } break } }) } } }) function intervalSendFn() { let time = GM_getValue('interval_time', interval_time) console.log(`提示: 当前定时间隔为${time}秒`) let new_timer_str = replaceStr(GM_getValue('timer_str', timer_str)) timer_checkbox.checked && sendMessage(`${new_timer_str}`).then(() => { console.log(`发送: ${new_timer_str}`) }) clearInterval(intervalSendTimer) if (time !== interval_time) intervalSendTimer = setInterval(intervalSendFn, time * 1000) } // 替换文本中的自定义变量 function replaceStr(str, username) { let new_str = str.replace('{time}', new Date().toLocaleString()) if (username) new_str = new_str.replace('{username}', username) return new_str } // 点歌功能 let play_list_array = [] function song(keyword) { // 当前音乐在播放的话就加入队列 if(song_list_checkbox.checked && !Player.isPausing){ play_list_array.push(keyword) let str = `${keyword}已加入队列,排第${play_list_array.lastIndexOf(keyword)+1}位` console.log(`提示: ${str}`) sendMessage(str) return } let ajax = $.ajax({ 'url': `https://api.533526.top/drrrAuto/?action=getKeywodMusicUrl&keyword=${keyword}`, 'type': 'get', 'dataType': 'json', success: function (res) { if (res.code === 1) { let {songName = songName, singer = singer, songUrl = songUrl} = res.data sendMessage(`接下来让我们一起欣赏${singer}演唱的歌曲《${songName}》`) let data = {name: `${songName} - ${singer}`, url: songUrl} sendMessage(data).then(() => { layer.msg(`点播歌曲《${data.name}》`) console.log(`点歌: ${data.name}`) }) } else { console.log('提示: 获取歌曲信息失败') } } }) return ajax } // 聊天功能 function chat(form, content) { let ajax = $.ajax({ 'url': 'https://api.533526.top/drrrAuto/?action=getReply', 'type': 'post', 'data': { ask: content, form: `${profile.room_id}_${form}`, fromName: form }, 'dataType': 'json', success: function (res) { if (res.code === 1) { let {reply = reply, fromName = fromName} = res.data console.log(`回复: ${reply}`) sendMessage(`@${fromName} ${reply}`) } else { layer.msg(res.message) } } }) return ajax } // 加载script function loadScript(url, name) { let script = document.createElement("script") script.src = url script.id = name document.body.appendChild(script) return script } // 发送消息 function sendMessage(content) { if (content === undefined) return false let data = typeof content === 'string' ? {message: content, url: '', to: ''} : { music: 'music', url: content.url, name: content.name } let ajax = $.ajax({ method: "post", url: '/room/?ajax=1', async: false, data: data }) return ajax } // 定时检测播放状态 let geting = false setInterval(function () { if (auto_song_checkbox.checked && Player.isPausing && geting === false && auto_song_click) { geting = true if (song_list_checkbox.checked && play_list_array.length > 0){ song(play_list_array.shift()).then(() => { setTimeout(() => geting = false, 3000) }) console.log(play_list_array) return }else{ let random_music_lists = GM_getValue('random_music_lists',['稻香','花海','一路向北','蒲公英的约定']) let random_num = Math.floor(Math.random() * random_music_lists.length) song(random_music_lists[random_num]).then(() => { setTimeout(() => geting = false, 3000) }) } } }, 3000) // 定时发送消息 let intervalSendTimer = setInterval(intervalSendFn, GM_getValue('interval_time', interval_time) * 1000) })();