squareDancing/js/handle.js

332 lines
9.3 KiB
JavaScript

// 对象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',
'剑来':'stickgo',
'切歌' : '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',
'剑来':'stickgo',
'切歌' : '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==="剑来"){
if(firTimes==0){
firTimes++;
$('.stick').removeClass('stick-swing');
$('.stick').addClass('stick-go');
setTimeout(()=>{
$('.stick').removeClass('stick-go');
$('.stick').addClass('stick-swing');
firTimes = 0;
},6000)
}
}
// 领舞喊一起喊
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);