"use strict";
|
cc._RF.push(module, '0203cfpv4xJJ4a1YIssdxDX', 'chat_model');
|
// Scripts/mod/chat/chat_model.js
|
|
"use strict";
|
|
var ChatConst = require("chat_const");
|
|
var ChatEvent = require("chat_event");
|
|
var RoleController = require("role_controller");
|
|
var ChatModel = cc.Class({
|
"extends": BaseClass,
|
properties: {
|
stack_list: {
|
"default": {}
|
},
|
stack_limit: {
|
"default": {}
|
},
|
outline_msgs: {
|
"default": {}
|
},
|
private_targets: null,
|
// 私聊对象
|
role_vo: null
|
},
|
ctor: function ctor() {
|
this.ctrl = arguments[0];
|
},
|
initConfig: function initConfig() {
|
this.unread_msgs = {}; // 未读消息
|
|
for (var channel_i in ChatConst.Channel) {
|
this.unread_msgs[ChatConst.Channel[channel_i]] = 0;
|
}
|
|
for (var channelIndex in ChatConst.Channel) {
|
this.stack_list[channelIndex] = [];
|
}
|
},
|
initChatMsg: function initChatMsg() {},
|
// 添加私聊对象
|
addPrivateTarget: function addPrivateTarget(target_data) {
|
if (!target_data) return;
|
if (!this.private_targets) this.initPrivatreTargets();
|
|
for (var target_i in this.private_targets) {
|
if (this.private_targets[target_i] && this.private_targets[target_i].srv_id === target_data.srv_id && this.private_targets[target_i].rid === target_data.rid) return;
|
}
|
|
this.private_targets.push(target_data);
|
var role_vo = RoleController.getInstance().getRoleVo();
|
cc.sys.localStorage.setItem("rec_private" + role_vo.srv_id + role_vo.rid, JSON.stringify(this.private_targets));
|
},
|
deltePrivateTarget: function deltePrivateTarget(friend_vo) {
|
var role_vo = RoleController.getInstance().getRoleVo();
|
cc.sys.localStorage.removeItem("rec_private" + role_vo.srv_id + role_vo.rid);
|
var private_index = friend_vo.srv_id + friend_vo.rid;
|
var stack_list = cc.sys.localStorage.removeItem(role_vo.srv_id + role_vo.rid + private_index);
|
|
for (var target_i in this.private_targets) {
|
var target_data = this.private_targets[target_i];
|
var target_index = target_data.srv_id + target_data.rid;
|
|
if (private_index == target_index) {
|
this.private_targets.splice(target_i, 1);
|
}
|
}
|
|
delete this.stack_list[private_index];
|
},
|
getPrivateTarget: function getPrivateTarget(rid) {
|
if (rid) {
|
for (var friend_i in this.private_targets) {
|
if (this.private_targets[friend_i].rid == rid) {
|
return this.private_targets[friend_i];
|
}
|
}
|
}
|
},
|
// 获取所有私聊对象
|
getPrivateTargets: function getPrivateTargets() {
|
if (!this.private_targets) this.initPrivatreTargets();
|
cc.log(this.private_targets);
|
return this.private_targets;
|
},
|
initPrivatreTargets: function initPrivatreTargets() {
|
if (!this.private_targets) {
|
var role_vo = RoleController.getInstance().getRoleVo();
|
var targets_info = cc.sys.localStorage.getItem("rec_private" + role_vo.srv_id + role_vo.rid);
|
|
if (targets_info) {
|
this.private_targets = JSON.parse(targets_info);
|
} else {
|
this.private_targets = [];
|
}
|
}
|
},
|
// 从本地初始化私聊消息
|
initPrivateMsg: function initPrivateMsg(private_index) {
|
if (!private_index) return;
|
var role_vo = RoleController.getInstance().getRoleVo();
|
var stack_list = JSON.parse(cc.sys.localStorage.getItem(role_vo.srv_id + role_vo.rid + private_index));
|
this.stack_list[private_index] = stack_list || [];
|
},
|
// 添加通用消息
|
addNormalChatMsg: function addNormalChatMsg(channel, msgData) {
|
if (!channel || !msgData) return;
|
|
if (channel == 48) {
|
//传闻左下和顶 暂时处理为普通传闻
|
channel = ChatConst.Channel.System;
|
msgData.channel = channel;
|
}
|
|
var channel_index = this.getChannelIndex(channel);
|
if (!channel_index) return;
|
var add_unread = true;
|
|
if (this.stack_list[channel_index].length > ChatConst.ChannelLimit[channel_index]) {
|
var msg_data = this.stack_list[channel_index].shift();
|
gcore.GlobalEvent.fire(ChatEvent.MassageDelete, msg_data);
|
if (this.unread_msgs[channel] >= ChatConst.ChannelLimit[channel_index]) add_unread = false;
|
}
|
|
msgData.id = this.ctrl.getUniqueId();
|
this.stack_list[channel_index].push(msgData);
|
if (msgData.flag !== 1 && add_unread) this.addUnreadNum(channel);
|
gcore.GlobalEvent.fire(ChatEvent.MassageUpdate, msgData);
|
},
|
// 添加离线私聊消息
|
addOutlinePrivateMsg: function addOutlinePrivateMsg(msg_data) {
|
var private_index = msg_data.srv_id + msg_data.rid;
|
if (!this.outline_msgs[private_index]) this.outline_msgs[private_index] = [];
|
this.outline_msgs[private_index].push(msg_data);
|
this.addUnreadNum(ChatConst.Channel.Friend);
|
},
|
// 添加私聊消息
|
addPrivateMsg: function addPrivateMsg(msg_data, had_read) {
|
if (!msg_data) return;
|
|
if (msg_data instanceof Array) {
|
for (var msg_i in msg_data) {
|
this.addPrivateMsg(msg_data[msg_i]);
|
}
|
} else {
|
// 判断是否有私聊对象
|
var have_target = false;
|
|
for (var target_i in this.private_targets) {
|
if (this.private_targets[target_i].rid == msg_data.rid) {
|
have_target = true;
|
break;
|
}
|
}
|
|
if (!have_target) {
|
var FriendController = require("friend_controller");
|
|
var target_data = FriendController.getInstance().getModel().getFriendInfo(msg_data.srv_id, msg_data.rid);
|
|
if (target_data) {
|
this.addPrivateTarget(target_data);
|
}
|
}
|
|
var private_index = msg_data.srv_id + msg_data.rid;
|
if (!this.stack_list[private_index]) this.initPrivateMsg(private_index);
|
|
if (this.stack_list[private_index].length > ChatConst.ChannelLimit.Friend) {
|
var msg_data = this.stack_list[private_index].shift();
|
var notice_info = {};
|
notice_info.msg_data = msg_data;
|
notice_info.channel = ChatConst.Channel.Friend;
|
gcore.GlobalEvent.fire(ChatEvent.PrivateMassageDelete, notice_info);
|
}
|
|
var notice_info = {};
|
msg_data.id = this.ctrl.getUniqueId();
|
notice_info.msg_data = msg_data;
|
notice_info.channel = ChatConst.Channel.Friend;
|
this.stack_list[private_index].push(msg_data);
|
var role_vo = RoleController.getInstance().getRoleVo();
|
cc.sys.localStorage.setItem(role_vo.srv_id + role_vo.rid + private_index, JSON.stringify(this.stack_list[private_index]));
|
if (msg_data.flag !== 1 && !had_read) this.addUnreadNum(ChatConst.Channel.Friend);
|
gcore.GlobalEvent.fire(ChatEvent.PrivateMassageUpdate, notice_info);
|
}
|
},
|
// 获取私聊消息
|
getPrivateMsgs: function getPrivateMsgs(srv_id, rid) {
|
var private_index = srv_id + rid;
|
if (!this.stack_list[private_index]) this.initPrivateMsg(private_index);
|
|
if (this.outline_msgs[private_index] && this.outline_msgs[private_index].length > 0) {
|
while (this.outline_msgs[private_index].length > 0) {
|
var mes_data = this.outline_msgs[private_index].shift();
|
this.addPrivateMsg(mes_data, true);
|
}
|
|
this.ctrl.sender12723(srv_id, rid);
|
}
|
|
var sort_fun = function sort_fun(msg1, msg2) {
|
return msg1.tick - msg2.tick;
|
};
|
|
cc.log(this.stack_list[private_index].sort(sort_fun));
|
return this.stack_list[private_index].sort(sort_fun);
|
},
|
getChannelIndex: function getChannelIndex(channel) {
|
var channel_tag;
|
|
for (var channel_index in ChatConst.Channel) {
|
if (ChatConst.Channel[channel_index] == channel) channel_tag = channel_index;
|
}
|
|
return channel_tag;
|
},
|
getChannelMsgs: function getChannelMsgs(channel) {
|
var channel_index = this.getChannelIndex(channel);
|
if (this.stack_list[channel_index]) return this.stack_list[channel_index];
|
return {};
|
},
|
cleanUnredNum: function cleanUnredNum(channel) {
|
if (this.unread_msgs[channel] > 0) {
|
this.unread_msgs[channel] = 0;
|
gcore.GlobalEvent.fire(EventId.CHAT_NEWMSG_FLAG);
|
}
|
},
|
addUnreadNum: function addUnreadNum(channel, num) {
|
num = num || 1;
|
this.unread_msgs[channel] += num;
|
gcore.GlobalEvent.fire(EventId.CHAT_NEWMSG_FLAG);
|
},
|
getUnreadNum: function getUnreadNum(channel) {
|
if (channel) {
|
return this.unread_msgs[channel];
|
} else {
|
var total_num = 0;
|
var role_vo = RoleController.getInstance().getRoleVo();
|
|
for (var channel_i in this.unread_msgs) {
|
if (channel_i == 1024 && role_vo && role_vo.lev < 50 || channel_i == 4 && role_vo && !role_vo.gid) {
|
continue;
|
}
|
|
total_num += this.unread_msgs[channel_i];
|
}
|
|
return total_num;
|
}
|
|
return 0;
|
},
|
saveTalkTime: function saveTalkTime(srv_id, rid) {// var time = gcore.SmartSocket.getTime();
|
// var vo = require("role_controller").getInstance().getRoleVo();
|
// var key_str = cc.js.formatStr("%s_%s_%d","friend_info",vo.srv_id,vo.rid);
|
},
|
// 存一下最新的艾特数据
|
setAtData: function setAtData(data) {
|
this.at_data = data;
|
},
|
getAtData: function getAtData() {
|
return this.at_data;
|
}
|
});
|
|
cc._RF.pop();
|