Files

680 lines
22 KiB
JavaScript
Raw Permalink Normal View History

2026-05-24 10:21:26 +08:00
"use strict";
cc._RF.push(module, '559695kgCRCAqBf7CfSGjQa', 'cmp.chat.wnd');
// Scripts/mod/chat/cmp/cmp.chat.wnd.js
"use strict";
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
// 好友主界面
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var ChatConst = require("chat_const");
var ChatEvent = require("chat_event");
var RoleEvent = require("role_event");
var ChatItemController = require("chat_item_controller");
var ChatController = require("chat_controller");
var RoleController = require("role_controller");
var FxSVC = require("nx.fx.sv.expand");
var FxTogs = require("nx.fx.togs");
var BridgeWindow = require("bridge.window");
cc.Class({
"extends": BridgeWindow,
properties: {
chat_taps: {
//暂时不改颜色
"default": [],
type: [cc.Node]
},
chat_list: {
"default": null,
type: FxSVC
},
notice_list: {
"default": null,
type: FxSVC
},
msg_rt: {
"default": null,
type: cc.RichText
},
empty_tips_nd: {
"default": null,
type: cc.Node
},
// 私聊区域
private_add_nd: {
"default": null,
type: cc.Node
},
private_nd: {
"default": null,
type: cc.Node
},
private_view: {
"default": null,
type: cc.Node
},
private_contend: {
"default": null,
type: cc.Node
},
private_list: {
"default": null,
type: FxSVC
},
slide_tar: {
"default": null,
type: cc.Node
},
slide_btn: {
"default": null,
type: cc.Node
},
//按钮红点
channel_red: {
"default": [],
type: [cc.Node]
},
togs: {
"default": null,
type: FxTogs
},
//notice
notice_node: {
"default": null,
type: cc.Node
},
at_notice_node: {
"default": null,
type: cc.Node
},
chat_input_panel: {
"default": null,
type: cc.Node
},
chat_pre: {
"default": null,
type: cc.Prefab
}
},
// LIFE-CYCLE CALLBACKS:
onLoad: function onLoad() {
var _this = this;
this.ctrl = ChatController.getInstance();
this.model = this.ctrl.getModel();
this.channel = ChatConst.Channel.World;
this.role_vo = RoleController.getInstance().getRoleVo();
this.cut_tap = null; // 当前选中的标签
this.chat_items = {};
this.chat_items_cache = [];
this.is_update = false; // 消息列表更新中
this.update_index = 0; // 消息更新序号
this.chat_msgs = {};
this.content_info = {};
this.channel_tg = {};
this.private_targets = null;
this.chat_friends = {};
this.cur_friend = null; // 当前私聊对象
this.cur_friend_tap = null; // 当前私聊对象标签页面
this.chat_items_index = ""; // 当前聊天索引
this.scroll_dis = 0;
if (!this.timer) {
this.timer = gcore.Timer.set(function () {
this.mainLoop();
}.bind(this), 100, -1);
}
this.chat_item_ctrl = ChatItemController.getInstance();
//事件绑定
this.role_update_event = this.role_vo.bind(RoleEvent.ROLE_EVENT_ATTR_UPDATE, function (key, val) {
if (key == "lev" || key == "gid") _this.updateWidget();
});
//为频道增加一条新消息
this.bindGEvent(ChatEvent.MassageUpdate, this.addMsgs.bind(this));
//为频道删除一条消息
this.bindGEvent(ChatEvent.MassageDelete, this.deleteMsgs.bind(this));
//为频道增加一条私聊最新消息
this.bindGEvent(ChatEvent.PrivateMassageUpdate, this.addMsgs.bind(this));
//删除一条私聊消息
this.bindGEvent(ChatEvent.PrivateMassageDelete, this.deleteMsgs.bind(this));
//更新红点
this.bindGEvent(EventId.CHAT_NEWMSG_FLAG, this.setAllRedStatus.bind(this));
this.togs.posTog = this.onTogMenu.bind(this);
// this.scrollview_mgs_sc.node.on("scrolling", this.contentScrolling.bind(this))
//键盘输入监听
this.chat_input_cmp = this.chat_input_panel.getComponent("cmp.chat.wnd.input");
this.chat_input_cmp.setSendCallback(this.didiClickSendMsg.bind(this));
this.chatPool = new cc.NodePool();
},
//当前根节点销毁前进行的预处理操作
onPreClosed: function onPreClosed() {
this.is_update = false;
this.private_targets = null;
this.chat_list.rebuild([]);
this.notice_list.rebuild([]);
this.private_list.rebuild([]);
this.rebuildMsgItem(null);
},
start: function start() {},
createChatList: function createChatList(data_list, key) {},
onOpenConfigs: function onOpenConfigs(params) {
var channel = ChatConst.Channel.Cross; //从世界聊天默认到跨服聊天
if (params && params.channel) channel = params.channel;
var channel_tag = this.getChannelTag(channel);
if (channel == ChatConst.Channel.Friend) {
this.cur_friend = params.friend_data;
this.togs.togTo(2);
if (!this.private_view.active) {
this.onClickSlide();
}
} else {
this.togs.togTo(0);
}
this.changeChannel(channel_tag);
this.updateWidget();
this.setAllRedStatus();
},
onFocusFriendList: function onFocusFriendList(_item) {
// 空
if (nx.dt.objEmpty(_item) || nx.dt.objEmpty(_item.mdata)) {
return;
}
// 聚焦
this.private_list.cleanFocus();
this.private_list.addFocus(_item.index);
var real_index = _item.friend_vo.srv_id + _item.friend_vo.rid;
this.selectPrivate(real_index, _item.friend_vo);
},
onEnable: function onEnable() {},
onDisable: function onDisable() {
if (nx.bridge.prompt) {
nx.bridge.prompt.delPrompt(8);
}
},
//------------------------1
changeChannel: function changeChannel(channel_tag) {
if (channel_tag == 1) {
nx.mTip.openTip("chat.world", false);
} else if (channel_tag == 2) {
nx.mTip.openTip("chat.union", false);
} else if (channel_tag == 3) {
nx.mTip.openTip("chat.players", false);
} else if (channel_tag == 4) {
nx.mTip.openTip("chat.system", false);
}
this.chat_list.rebuild([]);
this.notice_list.rebuild([]);
nx.gui.setActive(this.chat_list.node, "", channel_tag != 4);
nx.gui.setActive(this.notice_list.node, "", channel_tag == 4);
this.setRedStatus(channel_tag);
var channel_index = ChatConst.ChannelTag[channel_tag];
this.last_chat_index = this.chat_items_index;
this.channel = ChatConst.Channel[channel_index];
this.chat_input_panel.active = true;
this.slide_btn.active = false;
if (this.private_view.active && this.channel != ChatConst.Channel.Friend) {
this.private_view.active = false;
this.slide_tar.scaleX = -this.slide_tar.scaleX;
}
if (this.channel == ChatConst.Channel.Gang && this.role_vo.gid == 0 || this.channel == ChatConst.Channel.System) {
this.chat_input_panel.active = false;
this.notice_node.active = true;
} else if (this.channel == ChatConst.Channel.Province) {
var province_config = game.configs.misc_data.data_const["province_level"];
if (!province_config || this.role_vo.lev < province_config.val) {
this.chat_input_panel.active = false;
this.notice_node.active = false;
} else {
this.chat_input_panel.active = true;
this.notice_node.active = false;
}
} else {
this.notice_node.active = false;
}
if (channel_tag === 0) {
if (this.role_vo && this.role_vo.lev < 35) {
this.empty_tips_nd.active = true;
this.chat_input_panel.active = false;
} else {
this.empty_tips_nd.active = false;
this.chat_input_panel.active = true;
}
}
this.cut_tap = channel_tag;
// 更新记录切换时的高度和位置
// this.updageChannelSizeInfo();
this.private_list.rebuild([]);
this.chat_items_index = this.channel;
if (this.channel == ChatConst.Channel.Friend) {
this.slide_btn.active = true;
this.private_targets = null;
if (!this.private_targets) {
this.private_targets = [];
var h_private_targets = this.model.getPrivateTargets();
if (h_private_targets.length > 0) {
if (!this.cur_friend) {
this.cur_friend = h_private_targets[0];
}
var list = [];
var index = 0;
for (var friend_i = 0; friend_i < h_private_targets.length; friend_i++) {
var select = this.addPrivateTap(h_private_targets[friend_i]);
var obj = {};
obj.vo = h_private_targets[friend_i];
// obj.select_cb = this.selectPrivate.bind(this);
obj.delete_cb = this.deletePrivate.bind(this);
obj.is_select = select;
if (select) {
index = friend_i;
this.cur_friend = h_private_targets[friend_i];
}
list.push(obj);
}
this.private_list.rebuild(list);
this.private_list.addFocus(index);
}
}
if (this.cur_friend) {
this.chat_items_index = this.cur_friend.srv_id + this.cur_friend.rid;
this.private_add_nd.active = false;
} else {
this.private_add_nd.active = true;
}
} else {
if (this.private_add_nd.active) this.private_add_nd.active = false;
}
// 清楚频道未读消息
this.model.cleanUnredNum(this.channel);
// 更新显示区域
this.updateMsgsContent();
var tempStr = "";
// 同省、跨服、世界、公会可以@人
if (channel_tag == 1 || channel_tag == 2 || channel_tag == 3 || channel_tag == 4) {
var data = this.model.getAtData();
if (!nx.dt.objEmpty(data)) {
// this.showAtNotice(true, data);
}
tempStr = "";
}
this.chat_input_cmp.setPlacholderLabel(tempStr);
this.chat_input_cmp.setChannel(this.channel);
},
//标签页红点处理
setRedStatus: function setRedStatus(channel) {
if (channel == null) return;
this.model.updateRedStatus(channel);
// if ((channel == 2 && this.role_vo && this.role_vo.lev < 50) || (channel == 4 && this.role_vo && !this.role_vo.gid)) {
// return;
// }
// let btn = this.channel_red[channel-1];
// let num = this.model.getUnreadNum(ChatConst.Channel[ChatConst.ChannelTag[channel]]);
// if (num > 0) {
// btn.active = true;
// } else {
// btn.active = false;
// }
},
// 更新消息容器的高度和位置
updageChannelSizeInfo: function updageChannelSizeInfo(is_clean) {
// if (!this.chat_items_index) return;
// if (!this.content_info[this.chat_items_index]) this.content_info[this.chat_items_index] = {};
// var c_pos = this.msgs_content.y;
// var c_height = this.msgs_content.height;
// if (is_clean) {
// c_pos = 0;
// c_height = 0;
// }
// this.content_info[this.chat_items_index].c_pos = c_pos;
// this.content_info[this.chat_items_index].c_height = c_height;
},
addPrivateTap: function addPrivateTap(friend_vo) {
for (var friend_i = 0; friend_i < this.private_targets.length; friend_i++) {
if (this.private_targets[friend_i].srv_id === friend_vo.srv_id && this.private_targets[friend_i].rid === friend_vo.rid) {
return;
}
}
// var ChatFriend = require("chat_friend");
var is_select = false;
if (this.cur_friend && this.cur_friend.srv_id === friend_vo.srv_id && this.cur_friend.rid == friend_vo.rid) is_select = true;
this.private_targets.push(friend_vo);
return is_select;
},
selectPrivate: function selectPrivate(private_index, friend_vo) {
if (private_index && friend_vo && private_index !== this.chat_items_index) {
// 更新记录切换时的高度和位置
this.updageChannelSizeInfo();
this.cur_friend_tap = this.chat_friends[friend_vo.srv_id + friend_vo.rid];
this.cur_friend = friend_vo;
this.last_chat_index = this.chat_items_index;
this.chat_items_index = private_index;
this.updateMsgsContent();
}
},
deletePrivate: function deletePrivate(private_index, friend_vo) {
if (private_index && friend_vo) {
for (var friend_i in this.private_targets) {
if (this.private_targets[friend_i].rid === friend_vo.rid) {
this.private_targets.splice(friend_i, 1);
}
}
if (this.private_targets.length > 0) {
var new_friend_vo = this.private_targets[0];
var private_index = new_friend_vo.srv_id + new_friend_vo.rid;
this.selectPrivate(private_index, new_friend_vo);
this.private_add_nd.active = false;
} else {
this.last_chat_index = friend_vo.srv_id + friend_vo.rid;
this.chat_msgs[this.chat_items_index] = [];
this.updateMsgsContent();
this.chat_items_index = null;
this.cur_friend = null;
this.last_chat_index = null;
this.private_add_nd.active = true;
}
// delete this.chat_friends[friend_vo.srv_id + friend_vo.rid];
this.model.deltePrivateTarget(friend_vo);
var list = [];
for (var i = 0; i < this.private_targets.length; i++) {
var obj = {};
obj.vo = this.private_targets[i];
obj.select_cb = this.selectPrivate.bind(this);
obj.delete_cb = this.deletePrivate.bind(this);
if (i == 0) {
obj.is_select = true;
} else {
obj.is_select = false;
}
list.push(obj);
}
this.private_list.rebuild(list);
}
},
rebuildMsgItem: function rebuildMsgItem(e) {
// 清空
// if( e == null ) {
// nx.pools.putChildren( this.msgs_content );
// return;
// }
// 重建
// let pool = nx.pools.getPool( this.chat_pre.name, this.chat_pre );
// let node = cc.instantiate(this.chat_pre);
// if(node){
// return node.getComponent("cmp.item.chat.player");
// }
// return null;
},
addMsgItem: function addMsgItem(msg_data, channel2) {
var channel = channel2 ? channel2 : msg_data.channel;
var items_index = channel;
if (channel === ChatConst.Channel.Friend) {
items_index = msg_data.srv_id + msg_data.rid;
}
// 解析聊天字符串,增加表情和图片高度
// analyzeMessage
var test_msg = this.chat_item_ctrl.analyzeMessage(msg_data.msg);
this.msg_rt.string = test_msg;
this.chat_msgs[items_index].push(msg_data);
return items_index; // msg_item
},
// 删除、初始化消息来创建chat_item, 更新区域
updateMsgsContent: function updateMsgsContent() {
// 初始化当前频道信息
if (this.chat_items_index && !this.chat_msgs[this.chat_items_index]) {
// this.updageChannelSizeInfo(true);
this.initItems(this.channel, this.chat_items_index);
} else {
var msg_list = this.chat_msgs[this.chat_items_index] || [];
if (this.channel == ChatConst.Channel.System) {
this.notice_list.svcKey = this.channel;
this.notice_list.rebuild(msg_list);
} else {
this.chat_list.svcKey = this.channel;
this.chat_list.rebuild(msg_list);
}
// this.createChatList(this.chat_msgs[this.chat_items_index],this.chat_items_index);
}
},
// 初始化某个channel的消息条目
initItems: function initItems(channel, item_index) {
if (!channel) return;
var items_index = item_index ? item_index : channel;
var msgs = [];
this.chat_msgs[items_index] = [];
this.chat_items[items_index] = [];
if (channel == ChatConst.Channel.Friend && item_index) {
if (this.cur_friend) {
msgs = this.model.getPrivateMsgs(this.cur_friend.srv_id, this.cur_friend.rid);
this.ctrl.sender12723(this.cur_friend.srv_id, this.cur_friend.rid);
}
} else {
msgs = this.model.getChannelMsgs(channel);
}
var chat_item_index = channel;
if (msgs.length > 0) {
for (var msg_i = 0; msg_i < msgs.length; msg_i++) {
chat_item_index = this.addMsgItem(msgs[msg_i], channel);
}
} else {
if (channel == ChatConst.Channel.Friend) {
chat_item_index = item_index;
}
}
var msg_list = this.chat_msgs[chat_item_index] || [];
if (channel == ChatConst.Channel.System) {
this.notice_list.svcKey = channel;
this.notice_list.rebuild(msg_list);
} else {
this.chat_list.svcKey = channel;
this.chat_list.rebuild(msg_list);
}
},
cleanConten: function cleanConten() {
// if (!this.last_chat_index) return
// this.update_index = 0;
// for (var chat_i in this.chat_items[this.last_chat_index]) {
// this.chat_items[this.last_chat_index][chat_i].updateContent(true);
// }
},
// 更新条目状态
updageItems: function updageItems() {
// if (this.chat_items_index) {
// if (this.chat_items[this.chat_items_index]) {
// for (var item_index in this.chat_items[this.chat_items_index]) {
// this.chat_items[this.chat_items_index][item_index].updateContent();
// }
// // 更新到最新位置
// if (this.chat_items[this.chat_items_index].length > 0) {
// this.empty_tips_nd.active = false;
// } else {
// if (this.cut_tap !== 1 || (this.role_vo && this.role_vo.lev > 35)) {
// this.empty_tips_nd.active = true;
// }
// }
// }
// }
},
//------------------------1------------------end
//------------------------2
updateWidget: function updateWidget() {
// 设置个频道状态
for (var channel_i in ChatConst.ChannelTag) {
var channel_status = this.checkBtnIsOpen(channel_i);
}
},
checkBtnIsOpen: function checkBtnIsOpen(channel) {
if (channel == 2) {
if (this.role_vo.lev < 50) return false;
} else if (channel == 4) {
if (!this.role_vo.gid) return false;
}
return true;
},
//所有标签页红点处理
setAllRedStatus: function setAllRedStatus() {
for (var i = 1; i <= 6; i++) {
this.setRedStatus(i);
}
},
//------------------------2------------------end
onTogMenu: function onTogMenu(_type) {
this.checkToggle(_type + 1);
this.didClickTap(_type + 1);
},
checkToggle: function checkToggle(event) {
var toggle_tag_1 = event;
if (toggle_tag_1 == this.cur_select) return;
this.changeChannel(toggle_tag_1);
},
// 点击标签
didClickTap: function didClickTap(event) {
if (event == 2 && !this.role_vo.gid) {
nx.tbox("ChatNoParty");
}
this.setRedStatus(event);
},
mainLoop: function mainLoop() {
// if (!this.is_update) return
// if (this.chat_items[this.chat_items_index] && this.update_index < this.chat_items[this.chat_items_index].length) {
// this.chat_items[this.chat_items_index][this.update_index].updateContent();
// this.update_index ++;
// } else {
// this.update_index = 0;
// this.is_update = false;
// }
},
addMsgs: function addMsgs(msgData) {
if (!msgData) return;
var channel = msgData.channel;
var data = msgData;
var chat_items_index = channel;
if (channel === ChatConst.Channel.Friend) {
chat_items_index = msgData.msg_data.srv_id + msgData.msg_data.rid;
data = msgData.msg_data;
}
if (!this.chat_msgs[chat_items_index]) {
if (chat_items_index == this.chat_items_index) {
this.initItems(channel, chat_items_index);
}
} else {
chat_items_index = this.addMsgItem(data, channel);
if (chat_items_index == this.chat_items_index) {
var msg_list = this.chat_msgs[chat_items_index] || [];
if (channel == ChatConst.Channel.System) {
this.notice_list.svcKey = channel;
this.notice_list.rebuild(msg_list);
} else {
this.chat_list.svcKey = channel;
this.chat_list.rebuild(msg_list);
}
// this.createChatList(this.chat_msgs[chat_items_index],chat_items_index);
}
}
var tag = null;
for (var i in ChatConst.Channel) {
if (ChatConst.Channel[i] == channel) {
for (var j in ChatConst.ChannelTag) {
if (ChatConst.ChannelTag[j] == i) {
tag = j;
}
}
}
}
this.setRedStatus(tag);
if (channel === this.channel) this.model.cleanUnredNum(channel);
},
deleteMsgs: function deleteMsgs(msgData) {
if (!msgData) return;
var channel = msgData.channel;
var chat_items_index = msgData.channel;
if (channel === ChatConst.Channel.Friend) chat_items_index = msgData.srv_id + msgData.rid;
if (this.chat_msgs && this.chat_msgs[chat_items_index]) {
this.chat_msgs[chat_items_index].shift();
this.chat_list.svcKey = "";
this.chat_list.rebuild([]);
this.notice_list.svcKey = "";
this.notice_list.rebuild([]);
}
this.setRedStatus(channel);
},
getChannelTag: function getChannelTag(channel) {
var channel_tag = null,
channel_index = null;
for (var channel_i in ChatConst.Channel) {
if (ChatConst.Channel[channel_i] === channel) channel_index = channel_i;
}
if (channel_index) {
for (var tag_i in ChatConst.ChannelTag) {
if (ChatConst.ChannelTag[tag_i] == channel_index) channel_tag = tag_i;
}
}
return channel_tag;
},
didiClickSendMsg: function didiClickSendMsg(msg) {
if (msg.length > 0) {
if (this.channel === ChatConst.Channel.Friend) {
if (this.cur_friend) this.ctrl.sendMessage(this.channel, msg, 2, this.cur_friend.srv_id, this.cur_friend.rid, this.cur_friend.name);
} else {
this.ctrl.sendMessage(this.channel, msg, 2);
}
} else {
nx.tbox("chat_str6");
}
},
getChatItemNd: function getChatItemNd() {
if (this.chat_items_cache.length > 0) {
return this.chat_items_cache.shift();
}
},
cacheChatItemNd: function cacheChatItemNd(item_nd) {
this.chat_items_cache.push(item_nd);
},
// getContentPos: function() {
// return this.msgs_content.y
// },
onClickAddPriBtn: function onClickAddPriBtn() {
this.ctrl.closeChatPanel();
nx.bridge.createPanel("WndFriend", {
type: 1
});
},
onClickSlide: function onClickSlide() {
this.private_view.active = !this.private_view.active;
this.slide_tar.scaleX = -this.slide_tar.scaleX;
},
atSelfNotice: function atSelfNotice(item) {
if (item) {
// var precent = (this.msgs_content.height - item.pos_y-item.height) / this.msgs_content.height;
// if(precent>1){
// precent = 1;
// }
// this.scrollview_mgs_sc.scrollToPercentVertical(precent, 0.1,true);
this.atSelfClose();
}
},
atSelfClose: function atSelfClose(atData) {
this.at_notice_node.active = false;
this.model.setAtData({});
if (!nx.dt.objEmpty(atData)) {
this.ctrl.sender12768(atData.rid, atData.srv_id, atData.channel, atData.msg);
}
}
});
cc._RF.pop();