squareDancing/js/handle.js

543 lines
16 KiB
JavaScript

// 对象uid=>最近弹幕时间
let uidObj = {}
// 歌曲库地址
let musicUrl = 'https://bili.scdxtc.cn'
// 自动删除不说话用户
let autoDel = false
// 是否开始虚拟人物
let virtualPeople = true
// 虚拟人物数量
let virtualNum = 50
// 虚拟人物名字列表
let virtualList = ['一只小绵飏','未来狗头耀武扬威什么','大牛逼玩意','长呆毛的呆猫','区实验川大聪明',
'卡拉提斯','洛天依ぅ','时光向晚','宵行Lis','给个香香的三连',
'不能翻身的咸鱼鹅','gxuangg','海绵eat宝宝','滚动的天空-轩','天知道我取了什么名字',
'秋去春来流水落花','溪溪子和酱酱子','秦昭烈帝曹操','樱子君','兜兜里有糖的洛洛',
'女王说部落都是废物','张卡2511小号','花大屎','小德佬冲鸭','l仙儿',
'钻石五的维克多','推进式地狱双头龙','骧华阳','暗月丶无心','织子双立人',
'下木先生','Naakoo','粉红色的小铲铲','drair1','为什么会变成大冬',
'红林叶影','整肠生南国','叶老狗-','瓜皮小博','一个过路的好人',
'不会玩的泰菲','三剑客2020','Kola呀考拉','住在张总的酒窝里','哆_哆啦A梦',
'一只小菜包呐','夫人老婆','爱霏妹的老邢','耄耋just','This-is-斯巴达'
]
let virtualWordList = ['哈哈哈', '我又来了!', '大爷闪亮登场', '真会玩 哈哈']
// 礼物所需电池
let giftObj = {
// '小心心': 99,
'粉丝团灯牌': 1,
'牛哇牛哇': 1,
'白银宝盒': 10,
'紫金宝盒': 100,
'金币':10,
'泡泡糖':10,
'打榜':10,
'疯狂应援':10,
'战车出击':100,
'冰阔落':100,
'粉玫瑰':100,
'聚光灯':100,
'战鼓声声':100,
'狂欢派对':100,
'超级战舰':100,
'D言D语': 330,
'星愿水晶球': 1000,
'为你加冕': 4500,
'探索者启航': 23330,
'小花花': 1,
'这个好诶': 10,
'盛典门票': 20,
'庆典礼花': 880,
'告白花束': 220,
'疯狂心动': 520,
'守护之翼': 2000,
'次元之城': 12450,
'i了i了': 1,
'打call': 5,
'情书': 52,
'干杯': 66,
'B坷垃': 99,
'撒花': 660,
'节奏风暴': 1000,
'心动卡': 1,
'泡泡机': 50,
'爱之魔力': 280,
'摩天轮': 1000,
'转运锦鲤': 6660,
'领航者飞船': 12450,
'友谊的小船': 52,
'冲浪': 1000,
'奈斯': 20,
'变身话筒': 20,
'喵娘': 52
}
// 用户消费电池 姓名: 电池量
let userCell = {}
// 多少秒不说话删除
let speakExpireTime = 10*60
// 歌曲列表
var musicList = []
// 镜头出现时间
let cameraTimer = null;
let cameraTime = 60000*3//默认3分钟
// 领舞人领舞时间 秒
let leaderTime = 15*60
// 何时添加镜头
var addJingTime = 2000;//2秒
// 事件列表-中文
let eventTextList = ['切歌', '跳', '向左', '向右', '左抖腿', '右抖腿', '抖动', '一起喊', '镜头','击剑','起飞']
// 个人---荧光棒列表-中文
let fluoTextList = ['击剑','起飞'];
// 领舞---荧光棒列表-中文
let leaderFluoList = ['一起击剑','一起起飞'];
// 领舞者喊的集体舞
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 getLeaderFluoEvent(name) {
let leadMap = {
'一起击剑':'stickcome',
'一起起飞':'stick-go'
}
return leadMap[name] ? leadMap[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
// }
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 getFluoEvent(name) {
let fluoMap = {
'击剑':'stickcome',
'起飞':'stick-go'
}
return fluoMap[name] ? fluoMap[name] : ''
}
// 个人喊荧光棒
function peopleFluo(val){
return fluoTextList.includes(val);
}
// 领舞喊舞
function dancer(val){
return allEventList.includes(val);
}
// 间隔多久加镜头
function cameraEv(){
cameraTimer = setInterval(()=>{
console.log('随机镜头');
list.forEach(item=>{
var haveDan = $(`.ground-bg`).is(`.${item}`);
// 如果之前有镜头,删除镜头
if(haveDan) {
$('.ground-bg').removeClass(item);
}
})
setTimeout(()=>{
$('.ground-bg').addClass(list[Math.floor(Math.random()*list.length)]);
},1000)
},cameraTime-1000)
}
cameraEv();
// 删除久未说话的人
function delExpireDiv() {
if (!autoDel) {
return false
}
let timestamp = parseInt(new Date().getTime()/1000)
let delTime = timestamp - speakExpireTime
let delList = $(".dance-people").filter(function() {
return $(this).attr("data-time") < delTime
})
// console.log(delList.length, speakExpireTime+'秒未说话人数')
delList.remove();
}
// 接受消息处理
function receiveMessage(event)
{
// 来源检测
if (event.origin !== "https://live.bilibili.com") {
return false
}
// 解析消息
let dataList = JSON.parse(event.data)
// 弹幕消息
let data = dataList.dm
// 舰长
let adminList = dataList.admin
// 高能榜top3
let highList = dataList.high
// 送礼物列表
let giftList = dataList.gift
// console.log(giftList, '获取的礼物列表')
if (giftList.length > 0) {
updateUserCell(giftList)
console.log(userCell, '用户电池记录')
}
if (data.length <= 0) {
return false
}
// 当前直播间 自己的弹幕 无法获取到ct和type值 就暂时过滤
if (data.ct === '') {
return false
}
// 领舞信息 目前为领舞名称
let leaderInfo = ''
// 高能榜第一位设为领舞
if (highList!=undefined && highList.length > 0) {
leaderInfo = highList[0]
}
// leaderInfo = '内有猛犬小心'
// leaderInfo = '饺子吃肉肉'
// uid是否存在 不存在则存入uidObj
let isNew = 0
// 最近发弹幕时间
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 eventName = getEvent(data.danmaku)
let isLeader = data.uname == leaderInfo ? 1 : 0
let isAdmin = adminList.indexOf(data.uname) == -1 ? 0 : 1
// isAdmin = Math.floor(Math.random() * 30) //随机大宝剑
let dm = {text: data.danmaku, uid: data.uid, uname: data.uname,
event: eventName,
is_new: isNew, is_admin: isAdmin, 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
}
let decoration = []
let userCellNum = userCell[dm.uname]
userCell['流域_墨绿绿'] = 99999
userCell['yin5th'] = 15
// userCell['未来狗头耀武扬威什么'] = 1
if (userCellNum != undefined) {
// 1个电池送圣诞帽
if (userCellNum >= 1) {
decoration.push('people-hat')
}
// 10个电池送圣诞树光棒子
if (userCellNum >= 10) {
decoration.push('stick-christmas')
}
// 99个电池送大翅膀一对
if (userCellNum >= 99) {
decoration.push('people-block')
}
console.log('付费用户['+dm.uname+']说:'+dm.text, '付费用户发言记录')
}
// 新用户
if(dm.is_new==1){
// if(dm.uname!=leader.uname){//如果弹幕的人的名字不等于领舞者的名字,就创建一个人物
peopleObj(dm.uname,dm.uid,dm.text,dm.event,dm.active_time,dm.is_admin, decoration);
// }
} else {
// 老用户
$(`#${dm.uid} .speak`).html(dm.text);
//更新最近时间
$(`#${dm.uid}`).attr('data-time', dm.active_time);
$(`#${dm.uid} .speak`).removeClass("dn");
if (dm.is_admin == 1) {
// 舰长添加大宝剑
$(`#${dm.uid} .stick`).addClass("stick-swing-big-tow");
}
if (decoration.length > 0) {
// 添加帽子
if (decoration.indexOf('people-hat') != -1) {
$(`#${dm.uid} .people-img`).removeClass("people-hat").addClass('people-hat');
}
// 添加棒子
if (decoration.indexOf('stick-christmas') != -1) {
$(`#${dm.uid} .stick`).removeClass("stick-christmas").removeClass('stick-swing-big-tow').addClass('stick-christmas');
}
// 添加翅膀
if (decoration.indexOf('people-block') != -1) {
$(`#${dm.uid} .people-wing`).removeClass("people-block").addClass('people-block');
}
}
setTimeout(()=>{
//关闭当前说话
$(`#${dm.uid} .speak`).addClass("dn");
},3000)
// 舞者喊舞---动作舞
if(peopleHan(dm.text)){
peopleAction(`${dm.uid}`,dm.event);
}
// 舞者喊舞---荧光棒
if(peopleFluo(dm.text)){
fluoEv(`${dm.uid}`,getFluoEvent(dm.text));
}
}
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'){
let again = null;
clearInterval(cameraTimer);
clearTimeout(again);
// 领舞喊镜头
list.forEach(item=>{
var haveDan = $(`.ground-bg`).is(`.${item}`);
// 如果之前有镜头,删除镜头
if(haveDan) {
$('.ground-bg').removeClass(item);
}
})
// 各几秒重新添加镜头
setTimeout(()=>{
$('.ground-bg').addClass(leader.event);
},addJingTime)
// 重新开启间隔随机镜头事件
again = setTimeout(()=>{
cameraEv();
},10000)
} else {
if(firTimes==0){
firTimes++;
// 显示领舞说话
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==="烟花"){
$('.lighting-bg').addClass('fireworks');
setTimeout(()=>{
$('.lighting-bg').removeClass('fireworks');
},5000)
}
//领舞起飞
if(leader.text==="一起起飞"){
$('.stick').removeClass('stick-swing');
$('.stick').addClass('stick-go');
setTimeout(()=>{
$('.stick').removeClass('stick-go');
$('.stick').addClass('stick-swing');
},6000)
}
if(leader.text==="一起击剑"){//一起击剑
$('.stick').addClass('stickcome');
setTimeout(()=>{
$('.stick').removeClass('stickcome');
},6000)
}
if(peopleFluo(leader.text)){
$('.leading .stick').removeClass('stick-swing');
$('.leading .stick').addClass(getFluoEvent(dm.text));
setTimeout(()=>{
$('.leading .stick').removeClass(getFluoEvent(dm.text));
$('.leading .stick').addClass('stick-swing');
},6000)
}
setTimeout(()=>{
firTimes = 0;
},2000)
// 领舞喊一起喊
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);
}
// 领舞喊荧光棒事件
// if(getLeaderFluoEvent(leader.text)!=''){
// if(firTimes==0){//防多次说话
// firTimes++;
// console.log(getLeaderFluoEvent(leader.text));
// setTimeout(()=>{
// firTimes = 0;
// },5000)
// }
// }
}
}
// -------------------- 每条弹幕处理 end -----------------------
}
// 创建随机人物
function createVirtual() {
for (let i = 0; i < virtualNum; i++) {
let eventName = eventTextList[Math.floor(Math.random()*(eventTextList.length-1))]
let word = virtualWordList[Math.floor(Math.random()*(virtualWordList.length-1))]
if (virtualList[i] != undefined) {
peopleObj(virtualList[i], 'virtual'+i, word, getEvent(eventName), 0, 0);
} else {
peopleObj('我是卧底95'+i, 'virtual'+i, word, getEvent(eventName), 1638930062, 0);
}
}
}
function updateUserCell(list) {
$.each(list, function (index, item) {
let cell = 0
// console.log(item.uname + ' -- '+item.gift+ ' num:'+item.num, '礼物信息')
// console.log(giftObj, '礼物对象')
let giftCellNum = giftObj[item.gift]
// console.log(giftCellNum)
if (giftCellNum != undefined) {
cell = giftCellNum * item.num
}
// console.log(item.uname + ' -- '+item.gift+ ' num:'+item.num + ' cell='+cell, '礼物信息')
if (cell > 0) {
if (userCell[item.uname] == undefined) {
userCell[item.uname] = cell
} else {
userCell[item.uname] = userCell[item.uname] + cell
}
}
})
}
// music();
// 清理缓存
sessionStorage.clear()
$(function(){
// 创建虚拟人物
if (virtualPeople) {
createVirtual()
}
})
window.addEventListener("message", receiveMessage, false);