Files
fc/dev/project/library/imports/02/0203c7e9-bf8c-4927-86b5-608b2c7710d7.js
2026-05-24 10:21:26 +08:00

264 lines
10 KiB
JavaScript

"use strict";
cc._RF.push(module, '0203cfpv4xJJ4a1YIssdxDX', 'chat_model');
// Scripts/mod/chat/chat_model.js
"use strict";
var BridgeClass = require("bridge.class");
var ChatConst = require("chat_const");
var ChatEvent = require("chat_event");
var 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 ctor() {
this.ctrl = ChatController.getInstance();
},
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 || [];
},
updateRedStatus: function updateRedStatus(channel_index) {
if (ChatConst.Channel[channel_index]) {
var order = ChatConst.Channel[channel_index];
nx.mTip.openTip(ChatConst.ChatTip[order]);
}
},
// 添加通用消息
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;
}
if (this.stack_list[channel_index]) {
var msg_arr = this.stack_list[channel_index];
for (var i = 0; i < msg_arr.length; i++) {
var 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 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(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 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 = 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 setAtData(data) {
this.at_data = data;
},
getAtData: function getAtData() {
return this.at_data;
}
});
cc._RF.pop();