squareDancing/js/handle.js

193 lines
6.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

let uidObj = {}
// 领舞人领舞时间 秒
let leaderTime = 10
// 事件列表-中文
let eventTextList = ['切歌', '跳跃', '向左', '向右', '左抖腿', '右抖腿', '抖动', '一起喊', '镜头']
// 根据事件文字 获取事件名
function getEvent(name) {
let map = {
'切歌' : '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() {
let list = ['scale-left', 'scale-right', 'scale-bottom-left', 'scale-bottom-right']
return list[Math.floor(Math.random() * list.length)];
}
// 字符串包含的事件 (仅取第一个)
function getFirstEventKeyword(name) {
let event = ''
$.each(eventTextList, function (index, item) {
if (name.indexOf(item) != -1) {
event = item
return false
}
})
return event
}
// 设置领舞 name=姓名 time=有效期 单位秒
function setLeader(name, time) {
localStorage.setItem('leader', name)
localStorage.setItem('leader_end_at', (new Date).getTime()/1000 + time)
}
// 获取领舞人信息
function getLeader() {
let res = []
res['name'] = localStorage.getItem('leader') ? localStorage.getItem('leader') : ''
res['time'] = localStorage.getItem('leader_end_at') ? localStorage.getItem('leader_end_at') : 0
return res
}
// 接受消息处理
function receiveMessage(event)
{
// console.log(event.data, 'event test')
// 我们能信任信息来源吗?
if (event.origin !== "https://live.bilibili.com") {
return false
}
let dataList = JSON.parse(event.data)
let data = dataList.dm
let adminList = dataList.admin
if (data.length <= 0) {
return false
}
// 当前直播间 自己的弹幕 无法获取到ct和type值 就暂时过滤
if (data.ct === '') {
return false
}
// 大航海列表
if (adminList.length > 0) {
// 获取当前领舞人
let leader = getLeader()
let now = (new Date).getTime()/1000
if (leader['name'] === '') {
setLeader(adminList[0], leaderTime)
} else {
//领舞人存在 检查过期时间
if (leader['time'] === 0 || leader['time'] < now) {
// 切换领舞
// 当前领舞人
let leaderIndex = adminList.indexOf(leader['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
if (!uidObj[data.uid]) {
isNew = 1
uidObj[data.uid] = data.uname
}
console.log(isNew, data.uname + ' 是否存在')
// custom.js中 每条弹幕的处理 放到了此处
// -------------------- 每条弹幕处理 begin -----------------------
let random2 = Math.floor(Math.random() + 0.5)
// 获取领舞信息
let leaderInfo = localStorage.getItem('leader')
let isLeader = data.uname == leaderInfo ? 1 : 0
// 给弹幕加上随机事件
let mathIndex = Math.floor(Math.random()*15)
console.log(mathIndex, '随机因子')
let randomEvent = eventTextList[mathIndex] ? eventTextList[mathIndex] : ''
// TODO 测试后 删除弹幕随机附加事件
let dm = {text: data.danmaku, uid: data.uid, uname: data.uname,
event: getEvent(getFirstEventKeyword(data.danmaku+randomEvent)),
is_new: isNew, is_admin: 0, is_exit: random2, is_leader: isLeader}
// TODO 测试后 删除领舞随机
let leaderRandomEvent = getEvent(getFirstEventKeyword(data.danmaku+randomEvent))
let leader = {
uid: 0, uname: leaderInfo, text: getEvent(getFirstEventKeyword(data.danmaku+randomEvent)), event: leaderRandomEvent
}
if (isLeader) {
leader.uid = dm.uid
leader.uname = dm.uname
leader.text = dm.text
leader.event = dm.event
}
console.log(dm, '弹幕')
console.log(leader, '当前领舞')
console.log(leaderRandomEvent, '领舞随机事件')
let actionIndex = Math.floor(Math.random()*actionArr.length);
let moveIndex = Math.floor(Math.random()*moveArr.length);
peopleObj(dm.uname,dm.text,actionArr[actionIndex],moveArr[moveIndex]);
num++;
$('.lingname').text(leader.uname);
if(leader.event=='scale-left' || leader.event=='scale-right' || leader.event=='scale-bottom-left' || leader.event=='scale-bottom-right'){
$('.ground-bg').addClass(leader.event);
} else {
setTimeout(()=>{
console.log(leader.event);
// 显示领舞说话
if (leader.text.length>0) {
$('.speak-pink').text(leader.text);
$('.speak-pink').fadeIn();
}
setTimeout(()=>{//关闭领舞说话
$('.speak-pink').fadeOut();
},3000)
allDancing(leader.event);
},3000)
}
// -------------------- 每条弹幕处理 end -----------------------
// event.source 就当前弹出页的来源页面
// event.data 是 "hello there!"
// 假设你已经验证了所受到信息的origin (任何时候你都应该这样做), 一个很方便的方式就是把event.source
// 作为回信的对象并且把event.origin作为targetOrigin
// event.source.postMessage("hi there yourself! the secret response " +
// "is: rheeeeet!",
// event.origin);
// 数据是否为空
// 弹幕类型判断 事件弹幕、内容弹幕
}
window.addEventListener("message", receiveMessage, false);