Files
fc/dev/project/assets/Scripts/mod/chat/chat_model.js
T
2026-05-23 22:10:14 +08:00

313 lines
11 KiB
JavaScript

const BridgeClass = require( "bridge.class" );
var ChatConst = require("chat_const");
var ChatEvent = require("chat_event");
const ChatController = require("chat_controller");
var RoleController = require("role_controller")
var ChatModel = cc.Class({
extends: BridgeClass,
properties: {
stack_list: {
default: {}
},
stack_limit: {
default: {}
},
outline_msgs: {
default: {}
},
private_targets: null, // 私聊对象
role_vo: null,
},
ctor: function () {
this.ctrl = ChatController.getInstance();
},
initConfig: function () {
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() {
},
// 添加私聊对象
addPrivateTarget: function(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(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(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() {
if (!this.private_targets)
this.initPrivatreTargets();
cc.log(this.private_targets);
return this.private_targets
},
initPrivatreTargets: function() {
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(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 || [];
},
updateRedStatus(channel_index){
if (ChatConst.Channel[channel_index]){
let order = ChatConst.Channel[channel_index];
nx.mTip.openTip(ChatConst.ChatTip[order]);
}
},
// 添加通用消息
addNormalChatMsg: function(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;
}
if(this.stack_list[channel_index]){
let msg_arr = this.stack_list[channel_index];
for(let i=0;i<msg_arr.length;i++){
let val = msg_arr[i];
if(val){
if(val.msg === msgData.msg && val.tick == msgData.tick){
return;
}
}
}
}
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);
gcore.GlobalEvent.fire(ChatEvent.MessageUpdateOnWnd, msgData);
if(channel == ChatConst.Channel.World){
nx.mTip.openTip("chat.world",true);
}else if(channel == ChatConst.Channel.Gang){
nx.mTip.openTip("chat.union",true);
}else if(channel == ChatConst.Channel.System || channel == ChatConst.Channel.System1){
nx.mTip.openTip("chat.system",true);
}
},
// 添加离线私聊消息
addOutlinePrivateMsg: function(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(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(msg_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);
gcore.GlobalEvent.fire(ChatEvent.MessageUpdateOnWnd, notice_info)
}
},
// 获取私聊消息
getPrivateMsgs: function(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(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(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(channel) {
var channel_index = this.getChannelIndex(channel);
if (this.stack_list[channel_index]) return this.stack_list[channel_index];
return {}
},
cleanUnredNum: function(channel) {
if (this.unread_msgs[channel] > 0) {
this.unread_msgs[channel] = 0;
gcore.GlobalEvent.fire(EventId.CHAT_NEWMSG_FLAG);
}
},
addUnreadNum: function(channel, num) {
num = num || 1;
this.unread_msgs[channel] += num;
gcore.GlobalEvent.fire(EventId.CHAT_NEWMSG_FLAG);
},
getUnreadNum: function(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(srv_id,rid){
// var time = client.socket.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( data ){
this.at_data = data;
},
getAtData:function( ){
return this.at_data;
},
})