|
|
-
- SocialityFriendView = SocialityFriendView or BaseClass(BaseItem)
- function SocialityFriendView:__init()
- self.base_file = "sociality"
- self.layout_file = "SocialityFriendView"
- self.model = SocialityModel:getInstance()
- self.chatModel = ChatModel:getInstance()
- self.scrollView_original_y = 0 --滚动面板最初的y值
- self.curr_channel = ChatModel.CHANNEL_CECRET --当前频道
- self.chating_key_id = 0 --当前正在私聊的玩家id 0表示没有正在私聊的玩家
- self.all_chatItem_list = {} --总的聊天显示列表
- self.cache_chatItem_list = {} --缓存聊天显示列表
- self.cur_index = 0--TabBtn的index
- self.cur_sub_index = 0--TabSubBtn的index
- self.second_index = 0 --选中的一项,用于刷新的时候选回之前的一项
- self.curr_channel_height = 0 --当前频道界面的高度 用于布局
- self.chatItem_prefab = nil
- self.event_list = {}
-
- self.send_limit = 50
-
- self:SetSendFormat(Config.ConfigChat.friendChannel)
-
- self.open_index = 1--Config.ConfigSocial.RelativeType.friend --默认打开界面时展示的标签
- self.is_reset_open_index = false
-
- self.model.friend_tab_index = 2--打开界面时候,默认展示“联系人”界面
-
- self.recent_cur_index = 0
- self.recent_cur_sub_index = 0
-
- --更新社交列表 提前绑定事件
- local function onUpdate( need_sel_last )
- if self.is_loaded then
- self.is_need_update_sociality_view = false
- self.need_sel_last = need_sel_last
- self:UpdateView(false, need_sel_last)
- else
- self.is_need_update_sociality_view = true
- end
- end
- self.list_event_id = self.model:Bind(SocialityModel.UPDATE_SOCIALITY_VIEW, onUpdate) --更新社交列表
-
- --从外部调用事件私聊其他人时,不等协议全部返回才刷新界面
- if not self.model.only_show_recent_view then
- self.model:Fire(SocialityModel.REQUEST_SOCIAL_LIST)
- else
- self.model.only_rqeuest_data = true--只请求数据,不在协议返回后立即刷新界面
- self.model:Fire(SocialityModel.REQUEST_SOCIAL_LIST)
- end
-
- self:Load()
- end
-
- function SocialityFriendView:Load_callback()
- self.input_con,
- self.voiceBtn,
- self.faceBtn,
- self.sendBtn,
- self.chatCon,
- self.tipCon,
- self.chatBg,
- self.contactsBtn,--联系人按钮
- self.recentlyBtn,--最近联系列表
- self.sendBtnBlock,--发送按钮的挡板
- self.recentlyRed,
- self.firstLabel,
- self.oneKeyGetBtn,
- self.oneKeySendBtn,
- self.oneKeyGetRed,
- self.oneKeySendRed
- = GetChildGameObjects(self.transform,
- {
- "chatCon/bottom_con/TextInput",
- "chatCon/bottom_con/voiceBtn",
- "chatCon/bottom_con/faceBtn",
- "chatCon/bottom_con/sendBtn",
- "chatCon",
- "tipCon",
- "chatMsgBg",
- "topBarCon/contactsBtn",
- "topBarCon/recentlyBtn",
- "chatCon/bottom_con/sendBtnBlock",
- "topBarCon/recentlyBtn/recentlyRed",
- "first_label",
- "oneKeyGetBtn",
- "oneKeySendBtn",
- "oneKeyGetBtn/oneKeyGetRed",
- "oneKeySendBtn/oneKeySendRed",
- })
-
- self.bottom_con,
- self.scroll_content,
- self.tabCon,
- self.friendMsgCon,
- self.assistantChatCon--小助手聊天三分栏
- = GetChildTransforms(self.transform,
- {
- "chatCon/bottom_con",
- "chatCon/ScrollView/Viewport/Content",
- "tabCon",
- "friendMsgCon",
- "assistantChatCon",
- })
-
- self.sendBtn_text = self:GetChild("chatCon/bottom_con/sendBtn/Text"):GetComponent("TextMeshProUGUI")
- self.tipLabel = self:GetChild("tipCon/tipLabel"):GetComponent("TextMeshProUGUI")
- self.recentTabTxt = self:GetChild("topBarCon/recentlyBtn/Text"):GetComponent("TextMeshProUGUI")
- self.contactsStr = self:GetChild("topBarCon/contactsBtn/Text"):GetComponent("TextMeshProUGUI")
- self.sendText = self:GetChild("chatCon/bottom_con/sendBtn/Text"):GetComponent("TextMeshProUGUI")
-
-
- self.contactsImg,--联系人按钮背景图
- self.recentlyImg,--最近按钮背景图
- self.friendListBg,
- self.chatMsgBg,
- self.chatBottomBg
- = GetChildImages(self.transform,
- {
- "topBarCon/contactsBtn",
- "topBarCon/recentlyBtn",
- "friendListBg",
- "chatMsgBg",
- "chatMsgBg/chatBottomBg",
- })
- self.input_text = self:GetChild("chatCon/bottom_con/TextInput"):GetComponent("InputField")
- self.ScrollView = self:GetChild("chatCon/ScrollView"):GetComponent("RectTransform")
-
- self.girlIcon = self:GetChild("tipCon/girlIcon"):GetComponent("RawImage")
- self.empty_talk_bg = self:GetChild("tipCon/Image"):GetComponent("RawImage")
-
- self.scrollView_original_y = self.ScrollView.anchoredPosition.y
- self.input_text.characterLimit = self.send_limit
- self.chatCon:SetActive(false)
- self.chatBg:SetActive(false)
- self.tipCon:SetActive(false)
- self.firstLabel:SetActive(false)
- -- self.transform.localPosition = Vector3.zero
-
- lua_resM:setOutsideImageSprite(self, self.friendListBg, GameResPath.GetSocialityImage("sociality_friend_list_bg"))
- lua_resM:setOutsideImageSprite(self, self.chatMsgBg, GameResPath.GetSocialityImage("sociality_chat_bg"))
- lua_resM:setOutsideImageSprite(self, self.chatBottomBg, GameResPath.GetSocialityImage("sociality_chat_bottom"))
- lua_resM:setOutsideRawImage(self, self.girlIcon, GameResPath.GetRoleBg("team_empty_bg_267_589"), false)
- lua_resM:setOutsideRawImage(self, self.empty_talk_bg, GameResPath.GetViewBigBg("com_empty_bg1"))
-
- self.sendBtnBlock:SetActive(false)
-
- self:InitEvent()
-
- if self.friend_msg_view == nil then
- self.friend_msg_view = SocialityFriendMsg.New(self.friendMsgCon)
- end
- self.friend_msg_view:SetVisible(false)
-
- if self.assistan_chat_bar == nil then
- self.assistan_chat_bar = SocialityAssistanChatBar.New(self.assistantChatCon)
- end
- self.assistan_chat_bar:SetVisible(false)
-
- self:LoadChatItemPrefab()
-
- if self.is_need_update_sociality_view then
- self:UpdateView(false, self.need_sel_last)
- end
- end
-
- function SocialityFriendView:LoadChatItemPrefab()
- local function call_back(objs)
- if self._use_delete_method then
- return
- end
- self.chatItem_prefab = objs[0]
- -- self:UpdateView(true)
- -- self:UpdateView(false, self.need_sel_last)
-
-
- --正常打开好友界面时等协议返回再updateview,从外部私聊时,先updateview
- if self.model.only_show_recent_view then
- self:UpdateView()
- else
- self:UpdateView(false,false,true)
- end
- self.model.only_show_recent_view = false
- end
- lua_resM:loadPrefabs(self, "chat", {"chatItem"}, call_back)
- end
-
- function SocialityFriendView:InitEvent( )
- local function onClickBtnHandler(target)
- if target == self.faceBtn then
- GlobalEventSystem:Fire(EventName.OPEN_INDIVIDUATION_VIEW,self.chatModel.curr_individuation_bar_index,-192,-270, true, self.chating_key_id,true)
- elseif target == self.sendBtn then
- GlobalEventSystem:Fire(EventName.CLOSE_INDIVIDUATION_VIEW)
- self:SendMsg()
- elseif target == self.posBtn then
- -- 仇人不能聊天
- local is_enemy = self.model:IsRelaviveType(self.chating_key_id, Config.ConfigSocial.RelativeType.enemy)
- if is_enemy then
- Message.show("仇人不能聊天")
- self.input_text.text = ""
- return
- end
-
- local use_index = self.model.friend_tab_index == 1 and self.recent_cur_index or self.cur_index
- local use_sub_index = self.model.friend_tab_index == 1 and self.recent_cur_sub_index or self.cur_sub_index
- local vo = self.model:GetInfoByIndex(use_index, use_sub_index)
- -- if vo and vo.online_flag~=1 then
- -- Message.show("对方不在线")
- -- return
- -- end
- --跳跃中不能发坐标,障碍点也不能发
- if Scene.Instance.main_role:IsInState(PoseState.JUMP) or Scene.Instance.main_role:IsInState(PoseState.FLY) then return end
- --发送坐标 用超链接的方法
- local role = Scene.Instance:GetMainRole()
- if not role then return end
- local scene_id = SceneManager:getInstance():GetSceneId()
- local line = MapModel:getInstance():GetServerLine()
- local x = role.logic_pos.x
- local y = role.logic_pos.y
- if not SceneManager:getInstance():IsBlockXY(x , y) then
- local scene_name = SceneManager:getInstance():GetSceneInfo(scene_id).name
- local content = string.format("<a@pos@%s@%s@%s@%s><color=%s><u>%s,%d,%d</u></color></a>", scene_id, line, role.real_pos.x, role.real_pos.y, "#2cf89a", scene_name, x, y)
- local tmpArgs = ChatModel:getInstance():GetAllArgsText(content)
- content = ChatModel:getInstance():GetHyperlinkText(content)
- ChatModel:getInstance():Fire(ChatModel.SEND_MSG,self.curr_channel,content,self.chating_key_id,tmpArgs,ChatModel.CHAT_COMMON_TYPE.COMMON)
- end
- elseif target == self.contactsBtn then--联系人按钮
- --切换到联系人页签时,会加载到上次在联系人界面时候的历史位置(打开socialityview时默认加载第一个位置)
- if self.model.friend_tab_index ==2 then return end--已经是当前页签时候就不再刷新界面了
- self.model.friend_tab_index = 2
- self.model.special_flag_change_tab = true--特殊标记:切换页签时防止好友列表遍历setselected时选中其他好友
- self:UpdateView()
- self.model:Fire(SocialityModel.REFRESH_SUB_BTN_RED)
- elseif target == self.recentlyBtn then--最近联系按钮
- if self.model.friend_tab_index ==1 then return end--已经是当前页签时候就不再刷新界面了
- self.model.friend_tab_index = 1
- self.model.special_flag_change_tab = true--特殊标记:切换页签时防止好友列表遍历setselected时选中其他好友
- self.model.only_request_recent_flag = true--标识:只请求最近联系人列表
- self.model:Fire(SocialityModel.REQUEST_CCMD_EVENT, 14000, 5)--请求最近联系人
- elseif target == self.oneKeyGetBtn then--一键领取票券
- local id_list = self.model:GetCanGetTicketFriendIdList()
- if #id_list == 0 then
- Message.show("暂无交易券可领")
- else
- self.model:Fire(SocialityModel.REQUEST_CCMD_EVENT, 14023)
- end
- elseif target == self.oneKeySendBtn then--一键赠送票券
- local id_list,special_flag = self.model:GetCanSendTicketFriendIdList()
- if special_flag then
- Message.show("已达到赠送次数限制")
- else
- if #id_list == 0 then
- Message.show("暂无好友可赠送")
- else
- self.model:Fire(SocialityModel.REQUEST_CCMD_EVENT, 14022, id_list)
- end
- end
- end
- end
- AddClickEvent(self.faceBtn,onClickBtnHandler,2)
- AddClickEvent(self.sendBtn,onClickBtnHandler,2)
- AddClickEvent(self.applyBtn,onClickBtnHandler,2)
- AddClickEvent(self.addBtn,onClickBtnHandler,2)
- AddClickEvent(self.flowerBtn,onClickBtnHandler,LuaSoundManager.SOUND_UI.NONE)
- AddClickEvent(self.contactsBtn,onClickBtnHandler,2)
- AddClickEvent(self.recentlyBtn,onClickBtnHandler,2)
- AddClickEvent(self.oneKeyGetBtn,onClickBtnHandler,2)
- AddClickEvent(self.oneKeySendBtn,onClickBtnHandler,2)
-
- local function onUpdateRecentView()
- self:UpdateView()
- self.model:Fire(SocialityModel.REFRESH_SUB_BTN_RED)
- end
- self:BindEvent(self.model,SocialityModel.UPDATE_SOCIALITY_RECENT_VIEW,onUpdateRecentView)
-
- local function onSelectFaceItemHandler(item)
- if item then
- local face_str = "<#f_"..(item.index - 1)..">"
- if #self.input_text.text + #face_str <= self.input_text.characterLimit and self.input_text.characterLimit ~= 0 then
- self.input_text.text = self.input_text.text .. face_str
- end
- end
- end
- self.select_faceItem_id = self.chatModel:Bind(ChatModel.SELECT_FACE_ITEM,onSelectFaceItemHandler)
-
- local function onSelectTextFaceItemHandler(item)
- if item then
- if self.chatModel.clicked_role_item == nil then
- self.input_text.text = string.gsub(item.vo.one,"#N",RoleManager.Instance:GetMainRoleVo().name)
- else
- self.input_text.text = string.gsub(item.vo.two,"#n",self.chatModel.clicked_role_item.info.name)
- self.input_text.text = string.gsub(self.input_text.text,"#N",RoleManager.Instance:GetMainRoleVo().name)
- end
- end
- end
- self.select_textFaceItem_id = self.chatModel:Bind(ChatModel.SELECT_TEXT_FACE_ITEM,onSelectTextFaceItemHandler)
-
- local function onSelectHistoryTextItemHandler(str)
- self.input_text.text = str
- end
- table.insert(self.event_list, self.chatModel:Bind(ChatModel.SELECT_HISTORY_TEXT_ITEM, onSelectHistoryTextItemHandler))
-
- local function onClickPosBtnHandler(content, show_str)
- self.click_pos_content = content
- self.click_pos_show_str = show_str
- self.input_text.text = show_str
- end
- table.insert(self.event_list, self.chatModel:Bind(ChatModel.CLICK_POS_BTN, onClickPosBtnHandler))
-
- local function onSelectGoodItemHandler(goodVo)
- -- if goodVo then
- -- local content = nil
- -- if goodVo.type == GoodsModel.TYPE.EQUIP then
- -- content = string.format("<a@goods4@%s@%s@%s></a>", goodVo.type_id, goodVo.goods_id, RoleManager.Instance:GetMainRoleId())
- -- else
- -- content = string.format("<a@goods4@%s></a>", goodVo.type_id)
- -- end
-
- -- local args = string.format("{goods,%s,%s}", goodVo.type_id, goodVo.goods_id)
- -- local str = "<" .. Trim(goodVo.goods_name) .. ">"
- -- if goodVo.type == 11 and (goodVo.subtype == 10 or goodVo.subtype == 11) then
- -- local type_id, _name, icon = EquipModel:getInstance():GetIdentifyGoodsNameAndIcon(goodVo.type_id, RoleManager.Instance.mainRoleInfo.career, goodVo.color, true)
- -- str = "<" .. _name .. ">"
- -- end
- -- self:ReplaceInputTextMark(str)
- -- self.chatModel:AddArgs(str, {args, content})
- -- -- self.model.curr_chat_args = "{goods,"..goodVo.type_id..","..goodVo.goods_id.."}"
- -- end
-
- if goodVo then
- local content = nil
- local em_power_lv = 0
- if goodVo.type == GoodsModel.TYPE.EQUIP then
- content = string.format("<a@goods2@%s@%s@%s></a>", RoleManager.Instance:GetMainRoleId(),goodVo.goods_id, goodVo.type_id)
- if goodVo then
- for i,v in pairs(goodVo.other_data) do
- if v.type == GoodsModel.GoodsInfoType.EquipEmpower then
- em_power_lv = tonumber(v.info)
- break
- end
- end
- if em_power_lv == 0 and EquipModel:getInstance():IsWearEquip(goodVo.goods_id) then--如果是已穿戴
- local equip_cfg = EquipModel:getInstance():GetEquipmentCfg(goodVo.type_id)
- if equip_cfg and equip_cfg.series ~= 99 then
- local server_info = EquipModel:getInstance():GetRedEquipInfo(equip_cfg.series,equip_cfg.equip_type)
- em_power_lv = server_info and server_info.lv or 0
- end
- end
- if em_power_lv > 0 then
- content = string.format("<a@goods2@%s@%s@%s@%s></a>", RoleManager.Instance:GetMainRoleId(),goodVo.goods_id, goodVo.type_id,em_power_lv)
- end
- end
- else
- content = string.format("<a@goods4@%s></a>", goodVo.type_id)
- end
-
- local args = string.format("{goods,%s,%s}", goodVo.type_id, goodVo.goods_id)
- local str = "<" .. Trim(goodVo.goods_name) .. ">"
- if goodVo.type == 11 and (goodVo.subtype == 10 or goodVo.subtype == 11) then
- local type_id, _name, icon = EquipModel:getInstance():GetIdentifyGoodsNameAndIcon(goodVo.type_id, RoleManager.Instance.mainRoleInfo.career, goodVo.color, true)
- str = "<" .. _name .. ">"
- end
- self:ReplaceInputTextMark(str)
- self.chatModel:AddArgs(str, {args, content})
- -- self.model.curr_chat_args = "{goods,"..goodVo.type_id..","..goodVo.goods_id.."}"
- end
- end
- self.select_goodItem_id = self.chatModel:Bind(ChatModel.SELECT_GOOD_ITEM, onSelectGoodItemHandler)
-
- local function onSendMsg( str )
- self.input_text.text = str
- self:SendMsg()
- end
- self.send_event_id = self.chatModel:Bind(ChatModel.SEND_MSG_IN_VIEW, onSendMsg)
-
- local function onAddMsgHandler(info)
- if info and info.channel and info.channel == self.curr_channel then
- self:AddMsgItem(info,true)
- self.firstLabel:SetActive(false)
- -- --保存聊天记录
- -- CookieWrapper.Instance:WriteChatHistroy()
-
- end
- end
- self.add_msg_id = self.chatModel:Bind(ChatModel.ADD_NEW_MSG,onAddMsgHandler)
-
- GlobalEventSystem:Fire(EventName.ADD_RECORD_BTN,self.voiceBtn,{channel = ChatModel.CHANNEL_CECRET, rect = {x = 401,y = 33, w = 397, h = 58}, dis = 60})
-
- local function onBoardCast( scmd )
- local offset = 0
- local curr_channel_list = self.all_chatItem_list[self.chatModel.curr_channel]
- if not curr_channel_list then return end
- for k,v in pairs(curr_channel_list) do
- if offset ~= 0 then
- v:ReLayout(offset)
- else
- if v.info.voice_id == scmd.auto_id then
- offset = -v:SetRegText(scmd)
- end
- end
- end
- self.curr_channel_height = self.curr_channel_height + offset
- end
- self.bind_update_reg_text = self.chatModel:Bind(ChatModel.BROADCAST_VOICE_TEXT, onBoardCast)
-
- -- local function onUpdate( need_sel_last )
- -- if self.is_loaded then
- -- self.is_need_update_sociality_view = false
- -- self.need_sel_last = need_sel_last
- -- self:UpdateView(false, need_sel_last)
- -- else
- -- self.is_need_update_sociality_view = true
- -- end
- -- end
- -- self.list_event_id = self.model:Bind(SocialityModel.UPDATE_SOCIALITY_VIEW, onUpdate) --更新社交列表
-
- local onRed = function ( )
- -- self:RefreshRed()--主界面的申请、送花红点
- self:RefreshRed()
- end
- self.social_event_id = GlobalEventSystem:Bind(EventName.REFRESH_SOCIAL_RED_DOT, onRed)
-
- -- local onSelect = function ( )
- -- --需要打开私聊对象
- -- if ChatModel:getInstance().need_chat_key then
- -- local index, sub_index = self.model:GetIndexByChatKey(ChatModel:getInstance().need_chat_key)
- -- if index and sub_index then
- -- self.verTabBar:SetSelectTab(index, sub_index, true)
- -- end
- -- ChatModel:getInstance().need_chat_key = nil
- -- end
- -- end
- -- self.sel_event_id = GlobalEventSystem:Bind(EventName.SOCIAL_CHAT_SEL, onSelect)
-
- --打开聊天界面上方的好友信息栏
- local function UpdateFriendMsgView( data )
- if not data then return end
- if self.friend_msg_view then
- local is_black = self.model:IsRelaviveType(data.role_id, Config.ConfigSocial.RelativeType.black)
- if is_black then
- self.friend_msg_view:SetVisible(false)
- else
- self.friend_msg_view:SetVisible(true)
- end
- self.friend_msg_view:SetData(data)
- end
- end
- self.friend_msg_event_id = self.model:Bind(SocialityModel.OPEN_FRIEND_MSG_VIEW, UpdateFriendMsgView)
-
-
- local function onUpdateSendTime()
- self:UpdateSendTime()
- end
- self:BindEvent(ChatModel:getInstance(),ChatModel.UPDATE_SEND_TIME,onUpdateSendTime)
-
- local function onUpdateScrollViewSize(is_one_way)
- if is_one_way then
- self.ScrollView.anchoredPosition = Vector3(self.ScrollView.anchoredPosition.x,305,self.ScrollView.anchoredPosition.z)
- self.ScrollView.sizeDelta = Vector2(650,450)
- else
- self.ScrollView.anchoredPosition = Vector3(self.ScrollView.anchoredPosition.x,self.scrollView_original_y,self.ScrollView.anchoredPosition.z)
- self.ScrollView.sizeDelta = Vector2(650,500)
- end
- end
- self:BindEvent(self.model,SocialityModel.UPDATE_ONE_WAY_SCROLL_VIEW_SIZE,onUpdateScrollViewSize)
- end
-
-
-
- function SocialityFriendView:SetVisible( bool )
- BaseItem.SetVisible(self, bool)
- if bool and self.is_loaded then
- GlobalEventSystem:Fire(EventName.ADD_RECORD_BTN,self.voiceBtn,{channel = ChatModel.CHANNEL_CECRET, rect = {x = 401,y = 33, w = 397, h = 58}, dis = 60})
- end
- end
-
- function SocialityFriendView:RefreshRed( )
- self:RefreshTopBarRed()
- self:RefreshOneKeyTicketRed()
- end
-
- --根据“最近”、“联系人”页签来获取tabdata
- function SocialityFriendView:GetFriendListDataByTabIndex()
- local contactsAb = self.model.friend_tab_index == 1 and "uiComponent_asset" or "sociality_asset"
- local contactsStr = self.model.friend_tab_index == 1 and "com_empty" or "sociality_tab_on"
- local recentlyAb = self.model.friend_tab_index == 1 and "sociality_asset" or "uiComponent_asset"
- local recentlyStr = self.model.friend_tab_index == 1 and "sociality_tab_on" or "com_empty"
- lua_resM:setImageSprite(self, self.contactsImg, contactsAb, contactsStr)
- lua_resM:setImageSprite(self, self.recentlyImg, recentlyAb, recentlyStr)
- self.contactsStr.text = self.model.friend_tab_index == 2 and "<color=#ffffff>联系人</color>" or "<color=#9eb3cf>联系人</color>"
- self.recentTabTxt.text = self.model.friend_tab_index == 2 and "<color=#9eb3cf>最近</color>" or "<color=#ffffff>最近</color>"
-
- local contactsMat = self.model.friend_tab_index == 2 and ShaderTools.TMPSharedMaterialType.HKYTW7OutlineBlueTab or ShaderTools.TMPSharedMaterialType.HKYTW7FFDefault
- local recentTabMat = self.model.friend_tab_index == 2 and ShaderTools.TMPSharedMaterialType.HKYTW7FFDefault or ShaderTools.TMPSharedMaterialType.HKYTW7OutlineBlueTab
- SetTMPSharedMaterial(self.contactsStr, contactsMat)
- SetTMPSharedMaterial(self.recentTabTxt, recentTabMat)
-
- if self.model.friend_tab_index == 1 then
- self.tab_data = self.model:GetRecentFriendTabData()
- else
- self.tab_data = self.model:GetFriendTabData()
- end
- end
-
- function SocialityFriendView:UpdateView( show, need_sel_last,do_not_reset_chat_key)
- self.need_cecret_chat = ChatModel:getInstance().need_chat_key
- --先判断一次是不是有人私聊,如果有,界面打开时需要切换到最近页签
- if self.need_cecret_chat then
- self.model.friend_tab_index = 1
- end
-
- --判断页签,并使用相应的下标
- local use_index = self.model.friend_tab_index == 1 and self.recent_cur_index or self.cur_index
- local use_sub_index = self.model.friend_tab_index == 1 and self.recent_cur_sub_index or self.cur_sub_index
-
- if self.model.friend_tab_index == 1 then
- need_sel_last = false
- end
-
- self:GetFriendListDataByTabIndex()--根据页签获取到相应的好友列表数据
- self:ReLayoutScroll()
-
- --创建好友列表TabBar
- if not self.verTabBar then
- self.verTabBar = SocialityTabBar.New(self.tabCon)
- end
- local call_back = function (index, sub_index)
- self:SwitchView(index, sub_index)
- end
- local call_back2 = function (index)
- self.second_index = index
- end
- self.verTabBar:SetTabBars(self.tab_data, call_back, false, call_back2)
-
- self.model.special_flag_change_tab = false
- self.model.special_flag_online_changed = false
-
- if show then return end --只是展示列表 不要往下执行, 等协议返回再执行
-
- if self.need_cecret_chat then--需要打开私聊对象
- local index, sub_index
- if self.model.friend_tab_index == 1 then
- index, sub_index = self.model:GetRecentListIndex(self.need_cecret_chat)
- else
- index, sub_index = self.model:GetIndexByChatKey(self.need_cecret_chat)
- end
- if index and sub_index then
- self.verTabBar:SetSelectTab(index, sub_index, true)
- end
-
- --预加载的updateview不要重置私聊id
- if not do_not_reset_chat_key then
- ChatModel:getInstance().need_chat_key = nil
- self.need_cecret_chat = nil
- end
-
- if self.model.has_private_chat then
- self.model.has_private_chat = false
- -- if MsgManager:getInstance():IsMsgTypeShow(Config.ConfigMainIcon.TipType.private_chat) then
- -- MsgManager:getInstance():Remove(Config.ConfigMainIcon.TipType.private_chat)
- -- end --WQ:暂时不需要主界面的私聊图标
- end
- return
- elseif need_sel_last and use_index~=0 then
- -- self.verTabBar:SetNewData(use_index)
- local index, sub_index = self.model:GetIndexByChatKey(self.chating_key_id)
- if index and sub_index then
- self.verTabBar:SetSelectTab(index, sub_index, true)
- end
- return
- else
- if use_index == 0 and use_sub_index == 0 then --历史记录为(0,0)时直接打开(1,1)位置
- self.verTabBar:SetSelectTab(1, 1, true)
- use_index = 1--强行打开指定位置后,临时下标变量use_index等也要手动变化,因为当前函数后面还将用到
- use_sub_index = 1
- elseif use_index ~= 0 and use_sub_index ~= 0 then --当历史记录存在时,直接打开历史位置
- self.verTabBar:SetSelectTab(use_index, use_sub_index, true)
- elseif self.second_index~=0 then
- self.verTabBar:SetSelectTab(self.second_index, 1, true)
- elseif self.open_index then
- self.verTabBar:SetSelectTab(self.open_index,1,true)
- self.open_index = nil
- self.is_reset_open_index = true
- else
- self.firstLabel:SetActive(false)
- self.chatCon:SetActive(false)
- self.chatBg:SetActive(false)
- self.friend_msg_view:SetVisible(false)
- self.tipCon:SetActive(true)
- end
- end
- if self.is_reset_open_index then return end
- -- if use_index == 0 then
- -- self.verTabBar:SetNewData(self.second_index)
- -- else
- -- self.verTabBar:SetNewData(use_index)
- -- end
- self.is_reset_open_index = false
- end
-
- function SocialityFriendView:__delete( )
- GlobalEventSystem:Fire(EventName.CLOSE_INDIVIDUATION_VIEW)
- GlobalEventSystem:Fire(EventName.REMOVE_RECORD_BTN,self.voiceBtn)
- if self.select_faceItem_id then
- self.chatModel:UnBind(self.select_faceItem_id)
- self.select_faceItem_id = nil
- end
- if self.select_textFaceItem_id then
- self.chatModel:UnBind(self.select_textFaceItem_id)
- self.select_textFaceItem_id = nil
- end
- if self.send_event_id then
- self.chatModel:UnBind(self.send_event_id)
- self.send_event_id = nil
- end
- if self.list_event_id then
- self.model:UnBind(self.list_event_id)
- self.list_event_id = nil
- end
- if self.add_msg_id then
- self.chatModel:UnBind(self.add_msg_id)
- self.add_msg_id = nil
- end
- if self.social_event_id then
- GlobalEventSystem:UnBind(self.social_event_id)
- self.social_event_id = nil
- end
-
- for channel,list in pairs(self.all_chatItem_list) do
- for i,item in pairs(list) do
- item:DeleteMe()
- item = nil
- end
- list = nil
- end
-
- if self.verTabBar then
- self.verTabBar:DestroyBtnList()
- self.verTabBar:DeleteMe()
- self.verTabBar = nil
- end
-
- for i,item in pairs(self.cache_chatItem_list) do
- item:DeleteMe()
- item = nil
- end
-
- for i, v in ipairs(self.event_list) do
- self.chatModel:UnBind(v)
- v = nil
- end
- self.event_list = nil
-
- if self.friend_msg_event_id then
- self.model:UnBind(self.friend_msg_event_id)
- self.friend_msg_event_id = nil
- end
-
- if self.friend_msg_view then
- self.friend_msg_view:DeleteMe()
- self.friend_msg_view = nil
- end
-
- if self.assistan_chat_bar then
- self.assistan_chat_bar:DeleteMe()
- self.assistan_chat_bar = nil
- end
-
- if self.send_timer_id then
- GlobalTimerQuest:CancelQuest(self.send_timer_id)
- self.send_timer_id = nil
- end
-
- self.cache_chatItem_list = {}
- self.all_chatItem_list = {}
- self.chating_key_id = 0
- self.chatModel.chating_key_id = 0
- self.chatItem_prefab = nil
-
- if self.delay_show_assist_msg then
- TimerQuest.CancelQuest(GlobalTimerQuest, self.delay_show_assist_msg)
- self.delay_show_assist_msg = nil
- end
-
- --保存聊天记录
- CookieWrapper.Instance:WriteChatHistroy()
- end
-
- function SocialityFriendView:SendMsg()
- local use_index = self.model.friend_tab_index == 1 and self.recent_cur_index or self.cur_index
- local use_sub_index = self.model.friend_tab_index == 1 and self.recent_cur_sub_index or self.cur_sub_index
-
- -- 黑名单不能聊天
- local is_black = self.model:IsRelaviveType(self.chating_key_id, Config.ConfigSocial.RelativeType.black)
- if is_black then
- Message.show("不能向黑名单发送消息")
- self.input_text.text = ""
- return
- end
-
- --对方是否在线(WQ暂时先不要离线禁止私聊的逻辑)
- -- local vo = self.model:GetInfoByIndex(use_index, use_sub_index)
- -- if vo and vo.online_flag~=1 then
- -- Message.show("对方不在线")
- -- self.input_text.text = ""
- -- return
- -- end
-
- if self.chatModel:CheckCurrentTimeCanSend(channel,self.send_interval) then
- local content = self.input_text.text
- local _, title_filter = LanguageFilter.FilterMsg(content)
- if title_filter == false then
- Message.show("内容有敏感词")
- return
- end
- if not CheatModel:getInstance():CheckCommand(content) then
- return
- end
- if self.input_text.text == "@##@" then
- GlobalEventSystem:Fire(EventName.OPEN_CHEAT_INPUT_VIEW) --秘籍
- return
- elseif self.input_text.text == "@testclient" then
- GlobalEventSystem:Fire(EventName.OPEN_CHEAT_CLIENT_VIEW) --客户端秘籍
- return
- end
- if content and content ~= "" then
- if self.click_pos_content then
- if Trim(self.click_pos_show_str) == Trim(content) then
- content = self.click_pos_content
- self.click_pos_content = false
- end
- end
- local tmpArgs = self.chatModel:GetAllArgsText(content)
- content = self.chatModel:GetHyperlinkText(content)
- self.chatModel:Fire(ChatModel.SEND_MSG,self.curr_channel,content,self.chating_key_id,tmpArgs,ChatModel.CHAT_COMMON_TYPE.COMMON)
- self.input_text.text = ""
- self.chatModel.chat_args_dic = {}
-
- --判断私聊是否可以完成羁绊日常任务
- local mate_daily_need_chat_role_list = MateModel:GetInstance():GetMateDailyTaskNeedChatData()
- if mate_daily_need_chat_role_list and mate_daily_need_chat_role_list[self.chating_key_id] then
- MateModel:GetInstance():Fire(MateConst.PROTO_CCMD_EVENT,14956,1,self.chating_key_id)
- mate_daily_need_chat_role_list[self.chating_key_id] = nil
- end
-
- end
- else
- if self.input_text.text ~= "" then
- Message.show("发送频率过快,请销后再试...")
- end
- end
- end
-
- --设置发送的格式
- function SocialityFriendView:SetSendFormat(info)
- self.send_interval = info.send_interval
- self.send_limit = info.send_limit
- end
-
- function SocialityFriendView:ReplaceInputTextMark(str)
- --替换规则是"(<.->)"
- local text = self.input_text.text
- local old_args = self.chatModel:IsHasArgs(text)
- if (string.find(text,"(<.->)") and old_args) then
- old_args = LanguageFilter.ConvPartten(old_args)
- self.input_text.text = string.gsub(text,old_args,str)
- else
- self.input_text.text = text .. str
- end
- return str
- end
-
- --重新布局滚动条大小 以及位置
- function SocialityFriendView:ReLayoutScroll()
- local is_one_way = self.model:IsRelaviveType(self.chating_key_id,Config.ConfigSocial.RelativeType.oneWay)
- if is_one_way then
- self.ScrollView.anchoredPosition = Vector3(self.ScrollView.anchoredPosition.x,305,self.ScrollView.anchoredPosition.z)
- self.ScrollView.sizeDelta = Vector2(650,450)
- else
- self.ScrollView.anchoredPosition = Vector3(self.ScrollView.anchoredPosition.x,self.scrollView_original_y,self.ScrollView.anchoredPosition.z)
- self.ScrollView.sizeDelta = Vector2(650,500)
- end
-
- self.scroll_content.sizeDelta = Vector2(702,self.curr_channel_height+10)
- local off_h = self.scroll_content.sizeDelta.y - self.ScrollView.sizeDelta.y
- off_h = off_h < 0 and 0 or off_h
- self.scroll_content.localPosition = Vector3(0,off_h,0)
- end
-
- --添加一个聊天信息 autoLayout是否自动布局
- function SocialityFriendView:AddMsgItem(info,autoLayout)
- -- self.firstLabel:SetActive(false)
-
- if self.curr_channel ~= info.channel or info.key_id~=self.chating_key_id then return end
- if self.pre_renderer_chatItem and not self.pre_renderer_chatItem:IsLineItem() then
- local time_off = info.time - self.pre_renderer_chatItem.info.time
- if time_off >= ChatModel.SHOW_LINE_TIME then --说话间隔大于该时间 就要添加横线时间
- self.pre_renderer_chatItem = nil
- local lineInfo = self.chatModel:PackChatInfo(self.curr_channel,info.time,info.key_id)
- self:AddMsgItem(lineInfo,true)
- end
- end
-
- local curr_channel_list = nil
- curr_channel_list = self.all_chatItem_list[self.curr_channel] -- 取出当前频道的消息列表
- if curr_channel_list == nil then --如果没有就创建一个空表出来
- curr_channel_list = {}
- self.all_chatItem_list[self.curr_channel] = curr_channel_list
- end
- --超过长度放入缓存列表
- if #curr_channel_list >= ChatModel.MAX_LEN_LIST[self.curr_channel] then
- local item = table.remove(curr_channel_list,1)
- item:SetVisible(false)
- table.insert(self.cache_chatItem_list,item)
- local item_height = item:GetHeight()
- for i = 1, #curr_channel_list do
- item = curr_channel_list[i]
- item:ReLayout(item_height)
- end
- self.curr_channel_height = self.curr_channel_height - item_height
- end
- --检查缓存
- local new_item
- if #self.cache_chatItem_list > 0 then
- new_item = table.remove(self.cache_chatItem_list,1)
- else
- new_item = ChatItem.New(self.scroll_content, self.chatItem_prefab, nil, nil, true)
- end
-
- self.curr_channel_height = self.curr_channel_height + new_item:SetData(info,self.curr_channel_height) or 0
-
- table.insert(curr_channel_list,new_item)
- if new_item:IsLineItem() then
- new_item:SetLineTimeColor(ColorType.WHITE)
- new_item:SetLineSize(560, 192)
- end
- if autoLayout then
- self:ReLayoutScroll()
- end
-
- self.pre_renderer_chatItem = new_item
- new_item.transform.sizeDelta = Vector2(575, new_item.height)
-
- end
-
-
- function SocialityFriendView:UpdateSendTime()
- local time = self:SetSendTimeText()
- if time > 0 then
- if self.send_timer_id then
- GlobalTimerQuest:CancelQuest(self.send_timer_id)
- self.send_timer_id = nil
- end
- local function onSendTimerPlaying()
- self:SetSendTimeText()
- end
- self.send_timer_id = GlobalTimerQuest:AddPeriodQuest(onSendTimerPlaying,1,-1)
- end
- end
-
- function SocialityFriendView:SetSendTimeText()
- if self._use_delete_method then return end
- -- local time = self.chatModel:GetPassTimeFromSend(ChatModel.CHANNEL_CECRET,Config.ConfigChat.channel_level[4].send_interval)
- local time = self.chatModel:GetPassTimeFromSend(ChatModel.CHANNEL_CECRET,3)
- if time > 0 then
- local str = math.ceil(time) .. "s"
- self.sendText.text = str
- self.sendBtnBlock:SetActive(true)
- else
- self:CancelSendTimer()
- self.sendText.text = "发送"
- self.sendBtnBlock:SetActive(false)
- end
- return time
- end
-
- function SocialityFriendView:CancelSendTimer( )
- if self.send_timer_id then
- GlobalTimerQuest:CancelQuest(self.send_timer_id)
- self.send_timer_id = nil
- end
- end
-
-
- function SocialityFriendView:SwitchView(index, sub_index)
-
- -------- 先处理和小助手聊天的情况
- local is_assistant = (self.model.friend_tab_index == 1 and index == 1 and sub_index == 1) or (self.model.friend_tab_index == 2 and index == 1 and sub_index == 1)
- if is_assistant then
- self.friend_msg_view:HideBtnCon(false)
- self.assistan_chat_bar:SetVisible(true)
- self.bottom_con.gameObject:SetActive(false)
- self.chatBottomBg.gameObject:SetActive(false)
- else
- self.friend_msg_view:HideBtnCon(true)
- self.assistan_chat_bar:SetVisible(false)
- self.bottom_con.gameObject:SetActive(true)
- self.chatBottomBg.gameObject:SetActive(true)
- end
- --------
-
- local vo = self.model:GetInfoByIndex(index, sub_index) -- 拿到好友信息
- if vo then
- self.chating_key_id = vo.role_id
- self.chatModel.chating_key_id = vo.role_id
-
- if self.model.friend_tab_index == 2 then
- self.cur_index = index
- self.cur_sub_index = sub_index
- else
- self.recent_cur_index = index
- self.recent_cur_sub_index = sub_index
- end
-
- local use_index = self.model.friend_tab_index == 1 and self.recent_cur_index or self.cur_index
- local use_sub_index = self.model.friend_tab_index == 1 and self.recent_cur_sub_index or self.cur_sub_index
-
- if index==3 then
- self.chatCon:SetActive(false)
- self.chatBg:SetActive(false)
- self.friend_msg_view:SetVisible(false)
- self.tipCon:SetActive(true)
- self.tipLabel.text = "无法向黑名单玩家发消息哦!"
- else
- self.chatCon:SetActive(true)
- self.chatBg:SetActive(true)
- self.tipCon:SetActive(false)
- self.tipLabel.text = "点击左侧列表好友即可聊天!"
- end
-
-
- self.curr_channel_height = 0
-
- --先显示界面再加载 非黑名单的情况下
- if index~=3 then
- self.chatCon:SetActive(true)
- self.chatBg:SetActive(true)
- self.tipCon:SetActive(false)
- end
-
- --好友首次聊天显示防骗信息(除去小助手)
- if (index == 1 or index == 2)
- and vo.last_chat_time==0
- and not is_assistant
- and self.model:IsRelaviveType(vo.role_id,Config.ConfigSocial.RelativeType.friend) then
- self.firstLabel:SetActive(true)
- else
- self.firstLabel:SetActive(false)
- end
-
-
-
- local pre_channel_list = self.all_chatItem_list[self.curr_channel]
- if pre_channel_list then
- for i,item in pairs(pre_channel_list) do
- item:SetVisible(false)
- if not TableContains(self.cache_chatItem_list,item) then
- table.insert(self.cache_chatItem_list,item)
- end
- end
- end
-
- --测试用,用于删除和指定玩家的聊天缓存
- -- CookieWrapper.Instance:DeleteChatHistroyFile(1)
-
- local list = CookieWrapper.Instance:GetChatHistroy(self.chating_key_id,true)--根据id获取聊天缓存
- if list and list[tostring(self.chating_key_id)] then
- for k,v in pairs(list[tostring(self.chating_key_id)]) do
- --获取新头像信息
- if v.key_id then
- if v.player_id==RoleManager.Instance.mainRoleInfo.role_id then
- v.turn = RoleManager.Instance.mainRoleInfo.turn
- v.sex = RoleManager.Instance.mainRoleInfo.sex
- v.career = RoleManager.Instance.mainRoleInfo.career
- v.picture_ver = RoleManager.Instance.mainRoleInfo.picture_ver
- v.picture = RoleManager.Instance.mainRoleInfo.picture
- v.profile_photo_id = RoleManager.Instance.mainRoleInfo.profile_photo_id
- else
- local vo = SocialityModel:getInstance():GetVoByOnlyId(v.key_id)
- if vo then
- v.picture_ver = vo.picture_ver
- v.picture = vo.picture
- v.profile_photo_id = vo.profile_photo_id
- v.board = vo.board
- v.turn = vo.turn
- v.sex = vo.sex
- v.career = vo.career
- end
- end
- end
- end
- end
- self.chatModel.all_chat_list[ChatModel.CHANNEL_CECRET] = list
- local curr_channel_list = list[tostring(self.chating_key_id)]
-
- --设置好友信息栏的展示
- self.model:Fire(SocialityModel.OPEN_FRIEND_MSG_VIEW,vo)
-
- --判断有没有小助手的私聊信息,如果有的话,打开界面后要延时展示消息
- local has_assist_info = false
- local chat_priate_info = ChatModel:getInstance():GetPriateChatInfo() or {}
- for k,v in pairs(chat_priate_info) do
- if v == 1 then
- has_assist_info = true
- end
- end
-
- --设置聊天记录
- self.pre_renderer_chatItem = nil
- local need_hide_first_label = false
- if curr_channel_list then
- self.all_chatItem_list[self.curr_channel] = {}
- if #curr_channel_list > 0 then
- need_hide_first_label = true
- end
- if is_assistant and has_assist_info then
- for i = 1,#curr_channel_list-1 do
- self:AddMsgItem(curr_channel_list[i],false)
- end
- else
- for i = 1,#curr_channel_list do
- self:AddMsgItem(curr_channel_list[i],false)
- end
- end
- end
- if need_hide_first_label then
- self.firstLabel:SetActive(false)
- end
- self:ReLayoutScroll()--滚动到聊天栏最后的位置
-
- if self.model.temp_chat_msg_content then
- self.input_text.text = self.model.temp_chat_msg_content
- self.model.temp_chat_msg_content = nil
- end
-
-
- if self.delay_show_assist_msg then
- TimerQuest.CancelQuest(GlobalTimerQuest, self.delay_show_assist_msg)
- self.delay_show_assist_msg = nil
- end
- if is_assistant and has_assist_info then
- local function delay_method( )
- self:AddMsgItem(curr_channel_list[#curr_channel_list],false)
- self:ReLayoutScroll()--滚动到聊天栏最后的位置
- end
- self.delay_show_assist_msg = setTimeout(delay_method, 0.5)
- end
- else
- self.chating_key_id = 0
- self.chatModel.chating_key_id = 0
- self.cur_index = 0
- self.cur_sub_index = 0
- self.curr_channel_height = 0
- self.firstLabel:SetActive(false)
-
- self.chatCon:SetActive(false)
- self.chatBg:SetActive(false)
- self.friend_msg_view:SetVisible(false)
- self.tipCon:SetActive(true)
- self.tipLabel.text = "点击左侧列表好友即可聊天!"
- end
-
- --清除红点
- self.chatModel:ClearChannelMessageNum(self.curr_channel, self.chating_key_id)
- self.chatModel:Fire(ChatModel.SHOW_TAB_RED_POINT,self.chatModel.all_chat_list_count)
- end
-
- --刷新“最近”页签的红点,当有其他玩家(非当前聊天时)消息过来时,刷新红点
- function SocialityFriendView:RefreshTopBarRed( ... )
- self.info,self.vo = MainUIModel:getInstance():IsShowChatFriendRed()
- if self.vo then
- self.recentlyRed:SetActive(self.info)
- end
- local chat_priate_info = ChatModel:getInstance():GetPriateChatInfo() or {}
- local recent_red = {}
- self.recentlyRed:SetActive(TableSize(chat_priate_info) > 0)
- end
-
- function SocialityFriendView:RefreshOneKeyTicketRed( )
- local can_send_list = self.model:GetCanSendTicketFriendIdList()
- local can_get_list = self.model:GetCanGetTicketFriendIdList()
- local sendRed = #can_send_list ~= 0
- local getRed = #can_get_list ~= 0
- self.oneKeySendRed:SetActive(sendRed)
- self.oneKeyGetRed:SetActive(getRed)
- end
|