/* * @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.0.9.js' //用户 function User(id, nickname, avatar) { this.id = id; this.nickname = nickname; this.avatar = avatar; } //消息 function Message(senderUserId, senderNickname, content, type) { this.senderNickname = senderNickname; this.senderUserId = senderUserId; this.content = content; this.type = type } //聊天室 function Room(id, name, currentUser) { this.id = id; this.name = name; this.currentUser = currentUser; this.onlineUsers = { count: 0, users: [] }; this.messages = []; this.MessageType = { CHAT: 0,//文字聊天 PROP: 1//道具 }; this.Prop = { HEART: 0,//桃心 ROCKET: 1//火箭 }; } function ChatRoomService(room, user) { this.room = new Room(room.id, room.name, user); this.whenNewMessage = function () { }; this.whenOnlineUserChange = function () { }; } //获取实例 ChatRoomService.prototype.connectGoEasyIM = function () { this.im = GoEasyIM.getInstance({ appkey: 'BC-453aa755c4ea48148abefc55a86df283', host: 'hangzhou.goeasy.io' }); //监听网络连接成功 this.im.on(GoEasyIM.EVENT.CONNECTED, () => { console.log('GoEasyIM网络连接成功'); //连接成功后,更新在线用户数和用户头像 this.initialOnlineUsers(this.room.id); }); //监听网络连接断开 this.im.on(GoEasyIM.EVENT.DISCONNECTED, () => { console.log('GoEasyIM网络断开') }); //监听上下线提醒 this.listenerGroupPresence(); //监听新消息 this.listenerNewMessage(); var currentUser = this.room.currentUser; //连接GoEasyIM this.im.connect({ id: currentUser.id, data: { avatar: currentUser.avatar, nickname: currentUser.nickname } }).then(() => { console.log('连接成功'); this.initialChatHistory(this.room.id); //订阅用户上下线事件 this.subscribePresence(this.room.id); //订阅聊天室消息 this.subscribeRoomMessage(this.room.id); }).catch(e => { console.log(e); console.log('连接失败'); }); }; ChatRoomService.prototype.initialWhenNewMessage = function (whenNewMessage) { this.whenNewMessage = whenNewMessage; }; ChatRoomService.prototype.initialWhenOnlineUserChange = function (whenOnlineUserChange) { this.whenOnlineUserChange = whenOnlineUserChange; }; //监听新消息 ChatRoomService.prototype.listenerNewMessage = function () { this.im.on(GoEasyIM.EVENT.GROUP_MESSAGE_RECEIVED, (message) => { var content = JSON.parse(message.payload.text); this.addNewMessage(message); this.whenNewMessage(content); }) } ChatRoomService.prototype.addNewMessage = function (message) { var content = JSON.parse(message.payload.text); let messageContent = ""; //聊天消息 if (content.type == this.room.MessageType.CHAT) { messageContent = content.content; } //道具消息 if (content.type == this.room.MessageType.PROP) { if (content.content == this.room.Prop.ROCKET) { messageContent = "送出了一枚大火箭"; } if (content.content == this.room.Prop.HEART) { messageContent = "送出了一个大大的比心"; } } //添加消息 let newMessage = new Message(message.senderId, content.senderNickname, messageContent); this.room.messages.push(newMessage); }; //监听用户上下线 ChatRoomService.prototype.listenerGroupPresence = function () { this.im.on(GoEasyIM.EVENT.GROUP_PRESENCE, (event) => { //更新在线用户数 this.room.onlineUsers.count = event.groupOnlineCount; if (event.action == 'join' || event.action == 'online') { let userData = JSON.parse(event.userData); //添加新用户 let user = new User(event.userId, userData.nickname, userData.avatar); //添加在线用户,避免用户重复 if (!this.room.onlineUsers.users.find(item => item.id == event.userId)) { this.room.onlineUsers.users.push(user); } //添加进入房间的消息 let message = new Message(event.userId, userData.nickname, " 进入房间", this.room.MessageType.CHAT); this.room.messages.push(message); } else { let offlineUserIndex = this.room.onlineUsers.users.findIndex(item => item.id == event.userId); if (offlineUserIndex > -1) { //将离开的用户从onlineUsers中删掉 let offlineUser = Object.assign(this.room.onlineUsers.users[offlineUserIndex]); this.room.onlineUsers.users.splice(offlineUserIndex, 1); //添加离开消息 let message = new Message(offlineUser.id, offlineUser.nickname, " 离开房间", this.room.MessageType.CHAT) this.room.messages.push(message); } } this.whenOnlineUserChange(this.room.onlineUsers); }) }; //查询和初始化在线用户列表和在线用户数 ChatRoomService.prototype.initialOnlineUsers = function (roomId) { let self = this; //查询最新上线的用户列表 this.im.groupHereNow(roomId) .then(result => { if (result.code == 200) { let users = []; result.content && result.content.map(function (onlineUser) { let userData = JSON.parse(onlineUser.userData); let user = new User(onlineUser.userId, userData.nickname, userData.avatar); users.push(user); }); self.room.onlineUsers = { users: users }; } }).catch(e => { if (e.code == 401) { console.log("您还没有开通用户在线状态提醒,登录goeasy->我的应用->查看详情->高级功能,自助开通."); } else { console.log(e); } }); //获取聊天室在线用户数 this.im.groupOnlineCount(roomId) .then(result => { this.room.onlineUsers.count = result.content.onlineCount; }).catch(e => { console.log(e) }) }; //订阅聊天室成员上下线 ChatRoomService.prototype.subscribePresence = function (roomId) { this.im.subscribeGroupPresence([roomId]) .then(() => { console.log('成员上下线订阅成功') }).catch(e => { console.log(e) }) } //订阅聊天室消息 ChatRoomService.prototype.subscribeRoomMessage = function (roomId) { this.im.subscribeGroup([roomId]) .then(result => { console.log('消息订阅成功') }).catch(e => { console.log(e) }) } //历史消息 ChatRoomService.prototype.initialChatHistory = function (roomId) { var self = this; this.im.history({ groupId: roomId }).then(res => { res.content.forEach(function (message) { self.addNewMessage(message); }) }).catch(function (error) { if (error.code == 401) { console.log("您还没有开通历史消息的权限,登录goeasy->我的应用->查看详情->高级功能,自助开通."); } else { console.log(error); } }) }; //发送消息 ChatRoomService.prototype.sendMessages = function (roomId, content) { var contentMessage = { text: JSON.stringify(content) }; let message = this.im.createTextMessage(contentMessage); this.im.sendGroupMessage(roomId, message) .then(() => { console.log('消息发送成功') }).catch(e => { console.log(e); }) }; //退出聊天室 ChatRoomService.prototype.quitRoom = function (roomId) { this.im.disconnect() }; module.exports = ChatRoomService;