Files
fangche/static/lib/imservice.js
2021-04-07 15:18:17 +08:00

205 lines
6.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* @Author: jack.lu
* @Date: 2020-4-21 10:10:20
* @Last Modified by: jack.lu
* @Last Modified time: 2020-4-21 15:01:41
*/
import GoEasyIM from './goeasy-im-1.5.1';
import restApi from './restapi';
function Friend(uuid, name, avatar) {
this.uuid = uuid;
this.name = name;
this.avatar = avatar;
}
function Group(uuid, name, avatar) {
this.uuid = uuid;
this.name = name;
this.avatar = avatar;
}
function CurrentUser(uuid, name, avatar) {
this.uuid = uuid;
this.name = name;
this.avatar = avatar;
}
function IMService(im) {
this.im = im;
//当前“我”
this.currentUser = null;
//私聊消息记录map格式每个好友对应一个数组
this.privateMessages = {};
//群聊消息记录map格式每个群对应一个数组
this.groupMessages = {};
/*
* 监听器们
*
* 可以在页面里,根据需求,重写以下监听器,
* 便于当各种事件触发时,页面能够执行对应的响应
*
*/
//收到一条私聊消息
this.onNewPrivateMessageReceive = function (friendId, message) {};
//收到一条群聊消息
this.onNewGroupMessageReceive = function (groupId, message) {};
}
//获取群成员
IMService.prototype.getGroupMembers = function (groupId) {
let members = restApi.findGroupMembers(groupId);
let membersMap = {};
members.map(item => {
membersMap[item.uuid] = item
});
return membersMap;
};
IMService.prototype.findGroupById = function (groupId) {
let group = restApi.findGroupById(groupId);
return new Group(group.uuid, group.name, group.avatar);
};
IMService.prototype.getGroupMessages = function (groupId) {
if (!this.groupMessages[groupId]) {
this.groupMessages[groupId] = [];
}
return this.groupMessages[groupId]
};
IMService.prototype.findFriendById = function (userId) {
let user = restApi.findUserById(userId);
return new Friend(user.uuid, user.name, user.avatar);
};
IMService.prototype.getPrivateMessages = function (friendId) {
if (!this.privateMessages[friendId]) {
this.privateMessages[friendId] = [];
}
return this.privateMessages[friendId]
};
//连接GoEasy
IMService.prototype.connectIM = function (currentUser) {
this.currentUser = currentUser;
//初始化IM相关的监听器
this.initialIMListeners();
this.im.connect({
id: this.currentUser.uuid,
data: {
avatar: this.currentUser.avatar,
name: this.currentUser.name
}
}).then(() => {
console.log('connect成功')
}).catch(error => {
console.log('connect失败,请确保网络正常appkey和host正确code:' + error.code + " content:" + error.content);
});
this.subscribeGroupMessage();
};
IMService.prototype.subscribeGroupMessage = function () {
let groups = restApi.findGroups(this.currentUser);
let groupIds = groups.map(item => item.uuid);
this.im.subscribeGroup(groupIds)
.then(() => {
console.log('订阅群消息成功')
})
.catch(error => {
console.log('订阅群消息失败')
console.log(error)
})
}
//IM监听
IMService.prototype.initialIMListeners = function () {
this.im.on(GoEasyIM.EVENT.CONNECTED, () => {
console.log('连接成功.')
});
this.im.on(GoEasyIM.EVENT.DISCONNECTED, () => {
console.log('连接断开.')
});
this.im.on(GoEasyIM.EVENT.CONNECTING, (times) => {
console.log('连接中', times);
});
//监听私聊消息
this.im.on(GoEasyIM.EVENT.PRIVATE_MESSAGE_RECEIVED, (message) => {
//更新私聊消息记录
let friendId;
if (this.currentUser.uuid == message.senderId) {
friendId = message.receiverId;
} else {
friendId = message.senderId;
}
let friendMessages = this.getPrivateMessages(friendId);
friendMessages.push(message);
//如果页面传入了相应的listener执行listener
this.onNewPrivateMessageReceive(friendId, message);
});
//监听群聊消息
this.im.on(GoEasyIM.EVENT.GROUP_MESSAGE_RECEIVED, (message) => {
let groupId = message.groupId;
//更新群聊消息记录
let groupMessages = this.getGroupMessages(groupId);
groupMessages.push(message);
//如果页面传入了相应的listener执行listener
this.onNewGroupMessageReceive(groupId, message);
})
};
//加载单聊历史消息
IMService.prototype.loadPrivateHistoryMessage = function (friendId, timeStamp) {
return new Promise((resolve, reject) => {
this.im.history({
friendId: friendId,
lastTimestamp: timeStamp
}).then(result => {
let history = result.content;
let friendMessages = this.getPrivateMessages(friendId);
for (let i = history.length - 1; i >=0; i--) {
friendMessages.unshift(history[i])
}
resolve(friendMessages)
}).catch(error => {
if (error.code == 401) {
console.log("您尚未开通历史消息请登录GoEasy查看应用详情里自助启用.");
}
reject(error)
});
})
};
//群聊历史消息
IMService.prototype.loadGroupHistoryMessage = function (groupId, timeStamp) {
return new Promise((resolve, reject) => {
this.im.history({
groupId: groupId,
lastTimestamp: timeStamp
}).then(result => {
let history = result.content;
let chatMessage = this.getGroupMessages(groupId);
for (let i = history.length - 1; i >= 0; i--) {
chatMessage.unshift(history[i]);
}
resolve(chatMessage)
}).catch(error => {
if (error.code == 401) {
console.log("您尚未开通历史消息请登录GoEasy查看应用详情里自助启用.");
}
reject(error)
});
})
};
export default IMService;