import Vue from 'vue'
import store from '../store'
if(!Function.prototype.bind){
Function.prototype.bind = function(){
var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift();
return function(){
return fn.apply(object, args.concat(Array.prototype.slice.call(arguments)));
}
}
}
let Utils = Object.create(null)
Utils.encode = function (_map, _content) {
_content = '' + _content
if (!_map || !_content) {
return _content||''
}
return _content.replace(_map.r, function ($1) {
var _result = _map[!_map.i ? $1.toLowerCase() : $1]
return _result != null ? _result : $1
});
};
Utils.escape = (function () {
let _reg = /
$/
let _map = {
r:/\<|\>|\&|\r|\n|\s|\'|\"/g,
'<':'<',
'>':'>',
'&':'&',
' ':' ',
'"':'"',
"'":''',
'\n':'
',
'\r':''
}
return function(_content){
_content = Utils.encode(_map, _content)
return _content.replace(_reg, '
');
};
})();
Utils.object2query = function (obj) {
let keys = Object.keys(obj)
let queryArray = keys.map(item => {
return `${item}=${encodeURIComponent(obj[item])}`
})
return queryArray.join('&')
}
// https://cn.vuejs.org/v2/guide/reactivity.html
// Vue 不能检测到对象属性的添加或删除。然而它可以使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上
Utils.mergeObject = function (dest, src) {
if (typeof dest !== 'object' || dest === null) {
dest = Object.create(null)
}
dest = Object.assign(Object.create(null), dest, src)
return dest
}
Utils.mergeVueObject = function (dest, src) {
let keys = Object.keys(src)
keys.forEach(item => {
if (typeof src[item] !== 'undefined') {
Vue.set(dest, item, src[item])
}
})
return dest
}
// 消息类型列表
Utils.mapMsgType = function (msg) {
let map = {
text: '文本消息',
image: '图片消息',
file: '文件消息',
audio: '语音消息',
video: '视频消息',
geo: '地理位置消息',
tip: '提醒消息',
custom: '自定义消息',
notification: '系统通知',
robot: '机器人消息'
}
let type = msg.type
return map[type] || '未知消息类型'
}
Utils.stringifyDate = function (datetime, simple = false) {
// let weekMap = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
let weekMap = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
datetime = new Date(datetime)
let year = datetime.getFullYear()
let simpleYear = datetime.getYear() - 100
let month = datetime.getMonth() + 1
month = month > 9 ? month : '0' + month
let day = datetime.getDate()
day = day > 9 ? day : '0' + day
let hour = datetime.getHours()
hour = hour > 9 ? hour : '0' + hour
let min = datetime.getMinutes()
min = min > 9 ? min : '0' + min
let week = datetime.getDay()
week = weekMap[week]
let thatDay = (new Date(year, month - 1, day, 0, 0, 0)).getTime()
if (simple) {
return {
withYear: `${day}/${month}/${simpleYear}`,
withMonth: `${month}-${day}`,
withDay: `${week}`,
withLastDay: `昨天`,
withHour: `${hour}:${min}`,
thatDay
}
} else {
return {
withYear: `${year}-${month}-${day} ${hour}:${min}`,
withMonth: `${month}-${day} ${hour}:${min}`,
withDay: `${week} ${hour}:${min}`,
withLastDay: `昨天 ${hour}:${min}`,
withHour: `${hour}:${min}`,
thatDay
}
}
}
/* 格式化日期 */
Utils.formatDate = function (datetime, simple = false) {
let tempDate = (new Date()).getTime()
let result = this.stringifyDate(datetime, simple)
let thatDay = result.thatDay
let deltaTime = (tempDate - thatDay) / 1000
if (deltaTime < 3600 * 24) {
return result.withHour
} else if (deltaTime < 3600 * 24 * 2) {
return result.withLastDay
} else if (deltaTime < 3600 * 24 * 7) {
return result.withDay
} else if (deltaTime < 3600 * 24 * 30) {
return result.withMonth
} else {
return result.withYear
}
}
Utils.parseSession = function (sessionId) {
if (/^p2p-/.test(sessionId)) {
return {
scene: 'p2p',
to: sessionId.replace(/^p2p-/, '')
}
} else if (/^team-/.test(sessionId)) {
return {
scene: 'team',
to: sessionId.replace(/^team-/, '')
}
}
}
Utils.parseCustomMsg = function (msg) {
if (msg.type === 'custom') {
try {
let cnt = JSON.parse(msg.content)
switch (cnt.type) {
case 1:
return '[猜拳消息]'
case 2:
return '[阅后即焚]'
case 3:
return '[贴图表情]'
case 4:
return '[白板消息]'
}
} catch (e) {}
return '[自定义消息]'
}
return ''
}
/* 获得有效的备注名 */
Utils.getFriendAlias = function (userInfo) {
userInfo.alias = userInfo.alias ? userInfo.alias.trim() : ''
return userInfo.alias || userInfo.nick || userInfo.account
}
Utils.generateChatroomSysMsg = function (data) {
let text
switch (data.attach.type) {
case 'memberEnter':
text = `欢迎${data.attach.fromNick}进入直播间`
break
case 'memberExit':
text = `${data.attach.fromNick}离开了直播间`
break
case 'blackMember':
text = `${(data.attach.toNick[0] || data.attach.to[0])}被管理员拉入黑名单`
break
case 'unblackMember':
text = `${(data.attach.toNick[0]||data.attach.to[0])}被管理员解除拉黑`
break
case 'gagMember':
text = `${(data.attach.toNick[0]||data.attach.to[0])}被管理员禁言`
break
case 'ungagMember':
text = `${(data.attach.toNick[0]||data.attach.to[0])}被管理员解除禁言`
break
case 'addManager':
text = `${(data.attach.toNick[0]||data.attach.to[0])}被任命管理员身份`
break
case 'removeManager':
text = `${(data.attach.toNick[0]||data.attach.to[0])}被解除管理员身份`
break;
case 'addTempMute':
text = `${(data.attach.toNick[0]||data.attach.to[0])}被管理员临时禁言`
break;
case 'removeTempMute':
text = `${(data.attach.toNick[0]||data.attach.to[0])}被管理员解除临时禁言`
break;
case 'addCommon':
text = `管理员添加普通成员`
break
case 'removeCommon':
text = `管理员删除普通成员`
break
case 'kickMember':
text = `${data.attach.toNick[0]}被管理员踢出房间`
break;
// case 'xxx':
// 直播公告已更新
// break;
default:
text = '通知消息'
break
}
return text
}
Utils.generateTeamSysmMsg = function (data) {
var text, nicks = this.getNickNames(data.attach.users)
switch (data.attach.type) {
case 'updateTeam':
text = this.getTeamUpdateInfo(data)
break;
case 'addTeamMembers': {
let op = nicks.pop()
text = `${op}邀请${nicks.join()}加入群`
break;
}
case 'removeTeamMembers': {
let op = nicks.pop()
text = `${nicks.join()}被${op}移出群`
break;
}
case 'acceptTeamInvite': {
let op = nicks.pop()
text = `${nicks.join()}接受了${op}入群邀请`
break;
}
case 'passTeamApply': {
let op = nicks.shift()
if (nicks.length===1 && op===nicks[0]) {
// 此情况为高级群设置不需要验证,用户申请入群后,收到的群消息提示
text = `${op}加入群`
} else {
text = `${op}通过了${nicks}入群邀请`
}
break;
}
case 'addTeamManagers': {
// todo test
let op = nicks.pop()
text = `${op}新增了${nicks}为管理员`
break;
}
case 'removeTeamManagers': {
// todo test
let op = nicks.pop()
text = `${op}移除了${nicks}的管理员权限`
break;
}
case 'leaveTeam': {
text = `${nicks.join()}退出了群`
break;
}
case 'dismissTeam': {
text = `${nicks.join()}解散了群`
break;
}
case 'transferTeam': {
// todo test
let nicks = this.getNickNames(data.attach.users)
let op = nicks.shift()
text = `${op}转让群主给${nicks}`
break;
}
case 'updateTeamMute':{
let nicks = this.getNickNames(data.attach.users)
let op = nicks.shift()
text = `${nicks}被管理员${data.attach.mute ? '禁言' : '解除禁言'}`
break;
}
default:
break;
}
return text
}
// todo 写成私有成员方法
Utils.getNickNames = function(users) {
return users.map(user => {
return user.account === store.state.userUID? '你' : user.nick
})
}
// todo 写成私有成员方法
Utils.getTeamUpdateInfo = function(msg) {
let text, team = msg.attach.team, op = this.getNickNames(msg.attach.users).pop()
if (team['name']) {
text = `${op}修改群名为${team['name']}`
} else if (team['intro']) {
text = `${op}修改群介绍为${team['intro']}`
}
// 由于群公告的交互与 Android iOS 不一致,现版本不适配群公告
// else if (team['announcement']) {
// text = `${op}修改群公告为${team['announcement']}`
// }
else if (team['joinMode']) {
text = `群身份验证模式更新为${team.joinMode === 'noVerify' ? '不需要验证' : team.joinMode === 'needVerify' ? '需要验证' : '禁止任何人加入'}`
} else if (team['inviteMode']) {
text = `邀请他人权限为${team['inviteMode'] === 'all' ? '所有人' : '管理员'}`
} else if (team['updateTeamMode']) {
text = `群资料修改权限为${team['updateTeamMode'] === 'all' ? '所有人' : '管理员'}`
} else if (team['beInviteMode']) {
text = `被邀请人身份${team['beInviteMode'] === 'noVerify' ? '不需要验证' : '需要验证'}`
} else {
text = '更新群信息'
}
return text
}
Utils.teamConfigMap = {
joinMode: {
'noVerify': '不需要验证',
'needVerify': '需要验证',
'rejectAll': '禁止任何人加入'
},
beInviteMode: {
'needVerify': '需要验证',
'noVerify': '不需要验证'
},
inviteMode: {
'manager': '管理员邀请',
'all': '所有人邀请'
},
updateTeamMode: {
'manager': '管理员修改',
'all': '所有人修改'
},
memberType: {
'manager': '管理员',
'normal': '普通成员'
}
}
export default Utils