// 对象uid=>最近弹幕时间 let uidObj = {} // 歌曲库地址 let musicUrl = 'https://bili.scdxtc.cn' // 自动删除不说话用户 let autoDel = false // 多少秒不说话删除 let speakExpireTime = 10*60 // 歌曲列表 var musicList = [] // 领舞人领舞时间 秒 let leaderTime = 15*60 // 何时添加镜头 var addJingTime = 2000;//2秒 // 事件列表-中文 let eventTextList = ['切歌', '跳', '向左', '向右', '左抖腿', '右抖腿', '抖动', '一起喊', '镜头'] // 领舞者喊的集体舞 let allEventList = ['切歌', '一起跳', '一起向左', '一起向右', '一起左抖腿', '一起右抖腿', '一起抖动', '一起喊', '镜头'] // 镜头列表 let list = ['scale-left', 'scale-right', 'scale-bottom-left', 'scale-bottom-right'] // 烟花次数 let firTimes = 0; // 根据事件文字 获取事件名 function getEvent(name) { let map = { '烟花':'fireworks', '切歌' : 'change_song', '跳' : 'dancing-down', '向左' : 'dancing-left', '向右' : 'dancing-right', '左抖腿' : 'dancing-wobble', '右抖腿' : 'dancing-wobble-right', '抖动' : 'dancing-up', '一起喊' : 'all_shout', '镜头' : scale() } return map[name] ? map[name] : '' } // 根据事件文字 获取领舞者事件名 function getLeaderEvent(name) { let map = { '烟花':'fireworks', '切歌' : 'change_song', '一起跳' : 'dancing-down', '一起向左' : 'dancing-left', '一起向右' : 'dancing-right', '一起左抖腿' : 'dancing-wobble', '一起右抖腿' : 'dancing-wobble-right', '一起抖动' : 'dancing-up', '一起喊' : 'all_shout', '镜头' : scale() } return map[name] ? map[name] : '' } // 随机选择镜头 function scale() { return list[Math.floor(Math.random() * 3)]; } // 字符串包含的事件 (仅取第一个) function getFirstEventKeyword(name) { let event = '' $.each(eventTextList, function (index, item) { if (name.toString().indexOf(item) != -1) { event = item return false } }) return event } // 设置领舞 name=姓名 time=有效期 单位秒 function setLeader(name, time) { sessionStorage.setItem('leader', name) sessionStorage.setItem('leader_end_at', (new Date).getTime()/1000 + time) } // 获取领舞人信息 function getLeader() { let res = [] res['name'] = sessionStorage.getItem('leader') ? sessionStorage.getItem('leader') : '' res['time'] = sessionStorage.getItem('leader_end_at') ? sessionStorage.getItem('leader_end_at') : 0 return res } function music() { $.get(musicUrl, function (res) { musicList = res if (musicList.length > 0) { $('#music source').attr('src', musicUrl+'/music/'+musicList[0]) } }) } // 切歌 function changeMusic() { $.get(musicUrl, function (res) { musicList = res if (musicList.length > 0) { let index = Math.floor(Math.random()*(musicList.length-1)) $('#music').data('song', musicList[index]) $('#music source').attr('src', musicUrl+'/music/'+musicList[index]) $('#music')[0].load() } }) } // 个人喊舞 function peopleHan(val){ return eventTextList.includes(val); } // 领舞喊舞 function dancer(val){ return allEventList.includes(val); } // 删除久未说话的人 function delExpireDiv() { if (!autoDel) { return false } let timestamp = parseInt(new Date().getTime()/1000) let delList = $(".dance-people").filter(function() { return $(this).attr("data-time") < timestamp - speakExpireTime; }) // console.log(delList.length, speakExpireTime+'秒未说话人数') delList.remove(); } // 接受消息处理 function receiveMessage(event) { // console.log(event.data, '接受弹幕') // 我们能信任信息来源吗? if (event.origin !== "https://live.bilibili.com") { return false } let dataList = JSON.parse(event.data) let data = dataList.dm // 目前硬编码大航海列表 // let adminList = dataList.admin adminList = ['流域_墨绿绿']; // adminList = ['内有猛犬小心']; if (data.length <= 0) { return false } // 当前直播间 自己的弹幕 无法获取到ct和type值 就暂时过滤 if (data.ct === '') { return false } // 大航海列表 if (adminList.length > 0) { // 获取当前领舞人 let currentLeader = getLeader() let now = (new Date).getTime()/1000 if (currentLeader['name'] === '') { setLeader(adminList[0], leaderTime) } else { //领舞人存在 检查过期时间 if (currentLeader['time'] === 0 || currentLeader['time'] < now) { // 切换领舞 // 当前领舞人 let leaderIndex = adminList.indexOf(currentLeader['name']) let newLeader if (leaderIndex == -1) { newLeader = adminList[0] } else { let newIndex = leaderIndex + 1 if (newIndex >= adminList.length) { newIndex = 0 } newLeader = adminList[newIndex] } setLeader(newLeader, leaderTime) } } } // uid是否存在 不存在则存入uidObj let isNew = 0 // console.log(uidObj[data.uid],'uidObj[data.uid]'); let speakTime = uidObj[data.uid]; if (!speakTime) { isNew = 1 } else if (autoDel && speakTime < parseInt(new Date().getTime()/1000) - speakExpireTime){ //存在 但是最近弹幕时间已在过期时间外。 isNew = 1; } // 记录uid最近弹幕时间 uidObj[data.uid] = data.ts // custom.js中 每条弹幕的处理 放到了此处 // -------------------- 每条弹幕处理 begin ----------------------- // 获取领舞信息 let leaderInfo = sessionStorage.getItem('leader') let eventName = getEvent(data.danmaku) let isLeader = data.uname == leaderInfo ? 1 : 0 let dm = {text: data.danmaku, uid: data.uid, uname: data.uname, event: eventName, is_new: isNew, is_admin: 0, is_leader: isLeader,active_time: data.ts} let leader = { uid: 0, uname: leaderInfo, text: '', event: '' } if (isLeader) { let leaderEvent = getLeaderEvent(dm.text) leader.uid = dm.uid leader.uname = dm.uname leader.text = dm.text leader.event = eventName ? eventName : leaderEvent } // 新用户 if(dm.is_new==1){ // if(dm.uname!=leader.uname){//如果弹幕的人的名字不等于领舞者的名字,就创建一个人物 peopleObj(dm.uname,dm.uid,dm.text,dm.event,dm.active_time); // } } else { // 老用户 $(`#${dm.uid} .speak`).html(dm.text); //更新最近时间 $(`#${dm.uid}`).attr('data-time', dm.active_time); $(`#${dm.uid} .speak`).removeClass("dn"); setTimeout(()=>{ $(`#${dm.uid} .speak`).addClass("dn"); },3000) // 舞者喊舞 if(peopleHan(dm.text)){ peopleAction(`${dm.uid}`,dm.event); } } num++; // console.log(Object.keys(uidObj).length, 'uid 长度') // console.log(uidObj, 'uid') // console.log(num, '人物渲染个数') // 显示领舞的昵称 $('.lingname').text(leader.uname); if (!isLeader) { return false } if(leader.event=='scale-left' || leader.event=='scale-right' || leader.event=='scale-bottom-left' || leader.event=='scale-bottom-right'){ // 领舞喊镜头 list.forEach(item=>{ var haveDan = $(`.ground-bg`).is(`.${item}`); // 如果之前有镜头,删除镜头 if(haveDan) { $('.ground-bg').removeClass(item); } }) // 各几秒重新添加镜头 setTimeout(()=>{ $('.ground-bg').addClass(leader.event); },addJingTime) } else { // 显示领舞说话 if (leader.text.length>0) { $('.speak-pink').text(leader.text); $('.speak-pink').fadeIn(); //关闭领舞说话 setTimeout(()=>{ $('.speak-pink').fadeOut(); },3000) } // 领舞说切歌 if(leader.text=="切歌"){ changeMusic(); } if(leader.text==="烟花"){ if(firTimes==0){ firTimes++; $('.lighting-bg').addClass('fireworks'); setTimeout(()=>{ $('.lighting-bg').removeClass('fireworks'); firTimes = 0; },5000) } } // 领舞喊一起喊 if (leader.text.length >= 4) { if(leader.text.slice(0,4)=="一起喊:" || leader.text.slice(0,4)=="一起喊:"){ allSay(leader.text.slice(4)); } } // 领舞自己喊跳舞 if(peopleHan(dm.text)){ clearInterval(dancerTimer); dancerOwn(leader.event); } // 领舞喊集体跳舞 if(dancer(leader.text)){ allDancing(leader.event); } } // -------------------- 每条弹幕处理 end ----------------------- } music(); window.addEventListener("message", receiveMessage, false);