KLFriendChatItem.lua 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. ---@class KLFriendChatItem:UIKmlLuaPanelBase
  2. ---@field view KLFriendChatItemView
  3. ---@field item_is_show boolean @背包显示标记
  4. ---@field chatView KLUIChatView
  5. local KLFriendChatItem = class(UIKmlLuaPanelBase)
  6. local this =KLFriendChatItem
  7. ---创建时调用一次
  8. function this:Init()
  9. self.item_is_show = false
  10. self.emoji_is_show = false
  11. self.item_select_type = 1
  12. self:ItemBtnShow()
  13. self.ChatItem = {}
  14. self:UpdateMessage("")
  15. local bag_info = string.split(SL:GetConfig("cfg_global", 6).value, '#')
  16. self.maxHor = tonumber(bag_info[1])
  17. self.maxVet = tonumber(bag_info[2])
  18. --表情
  19. self.all_emoji_info = {}
  20. for i = 61, 87 do
  21. table.insert(self.all_emoji_info,i.."000")
  22. end
  23. GUI:Text_sethorwrap(self.view.text_input,"1")
  24. GUI:Text_setmline(self.view.text_input,"0")
  25. GUI:DataListInitData(self.view.emoji_data_list,function()
  26. return self:EmojiDataListItemCountFunc()
  27. end,function(realIndex)
  28. return self:EmojiDataListItemGetFunc(realIndex)
  29. end,function(realIndex, kmlcontrol)
  30. return self:EmojiDataListItemInitFunc(realIndex, kmlcontrol)
  31. end, function(realIndex, kmlcontrol)
  32. return self:EmojiDataListItemUpdateFunc(realIndex, kmlcontrol)
  33. end)
  34. self.btn_emoji_item = {}
  35. GUI:UIPanel_Open("dev/ui/FriendSys/Item/KLFriendChatView/KLFriendChatViewItem",
  36. self.view.panel_root,self,nil,false,function(chatView)
  37. self.chatView = chatView
  38. self:UpdateChatContent()
  39. end)
  40. self.friendId = nil
  41. GUI:UIPanel_Open("dev/ui/Chat/Item/KLUIChatItem/KLUIChatItem",self.view.root,self,{},true,function (item)
  42. self.calculationUI = item
  43. GUI:setPositionX(self.calculationUI.view.root,2000)
  44. GUI:setPositionY(self.calculationUI.view.root,2000)
  45. end)
  46. end
  47. ---创建或者刷新界面数据时调用
  48. function this:Refresh()
  49. end
  50. function this:SetFriend(rid)
  51. self.friendId = rid
  52. self:UpdateChatContent()
  53. end
  54. ---更新当前输入的消息文本
  55. function this:UpdateMessage(str)
  56. self.message = str
  57. GUI:Text_setString(self.view.text_input,self.message)
  58. end
  59. ---********************************背包************************************
  60. function this:ShowItem()
  61. GUI:UIPanel_Close("dev/ui/Chat/Item/KLUIChatBagScrollView/KLUIChatBagScrollViewItem")
  62. local itemList_ = {}
  63. local show_id = EBagTileScrollViewId.Bag
  64. if self.item_select_type == 1 then
  65. itemList_ = SL:GetMetaValue("BAG_DATA")[1]
  66. else
  67. local baseWearBar = SL:GeCareerBaseWearBar(SL:MeData_GetCareer())
  68. local itemList_1 = SL:GetWearBarsData(baseWearBar)
  69. for _, item in pairs(itemList_1) do
  70. table.insert(itemList_, item)
  71. end
  72. --itemList_ = BagCellUtil.SortItemList(itemList_)
  73. itemList_ = SL.Bag:SortItemList(itemList_)
  74. show_id = EBagTileScrollViewId.Recover
  75. end
  76. GUI:UIPanel_Open("dev/ui/Chat/Item/KLUIChatBagScrollView/KLUIChatBagScrollViewItem", self.view.item_panel, self,
  77. {
  78. itemList = itemList_,
  79. id = show_id,
  80. forbidCount = SL:GetMetaValue("BAG_FORBID_COUNT"),
  81. hor = self.maxHor,
  82. vet = self.maxVet,
  83. canDrag = false,
  84. forbidClickCallback = self.forbidClick,
  85. itemClick = self.ClickItemCallBack,
  86. callBackUI = self
  87. })
  88. end
  89. function this:HideItem()
  90. self.item_is_show = false
  91. GUI:setVisible(self.view.item_panel,self.item_is_show)
  92. end
  93. function this:ClickItemCallBack(itemControl, itemData)
  94. local cfgId = itemData.cfgId
  95. local id = itemData.id
  96. -- @item@0:0@
  97. local index = #self.ChatItem + 1
  98. table.insert(self.ChatItem,{lid=id,type=self.item_select_type})
  99. local emojiStr = string.format("item@%s:%s@",index,self.item_select_type)
  100. self:UpdateMessage(self.message .. emojiStr)
  101. self:HideItem()
  102. end
  103. function this:forbidClick()
  104. end
  105. function this:btn_bag_onclick()
  106. self.item_select_type = 1
  107. self:ItemBtnShow()
  108. self:ShowItem()
  109. end
  110. function this:btn_equip_onclick()
  111. self.item_select_type = 2
  112. self:ItemBtnShow()
  113. self:ShowItem()
  114. end
  115. function this:ItemBtnShow()
  116. if self.item_select_type == 1 then
  117. GUI:setVisible(self.view.btn_bag_select,true)
  118. GUI:setVisible(self.view.btn_equip_select,false)
  119. else
  120. GUI:setVisible(self.view.btn_bag_select,false)
  121. GUI:setVisible(self.view.btn_equip_select,true)
  122. end
  123. end
  124. ---***********************************************************
  125. ---***********************表情***************************
  126. function this:EmojiDataListItemInitFunc(realIndex, kmlcontrol)
  127. end
  128. function this:EmojiDataListItemUpdateFunc(realIndex, kmlcontrol)
  129. local data = self.all_emoji_info[realIndex + 1]
  130. self.btn_emoji_item[kmlcontrol]:RefreshItem(data,self)
  131. end
  132. function this:EmojiDataListItemCountFunc()
  133. return #self.all_emoji_info
  134. end
  135. function this:EmojiDataListItemGetFunc(realIndex)
  136. local item = GUI:UIPanel_Open("dev/ui/Chat/Item/KLUIChatEmojiItem/KLUIChatEmojiItem", self.view.emoji_data_list, self, {}, true)
  137. self.btn_emoji_item[item.view.root] = item
  138. return item.view.root
  139. end
  140. --添加表情
  141. function this:AddEmoji(emoji_id)
  142. self:HideEmoji()
  143. -- emoji@61000:1@
  144. local emojiStr = string.format("emoji@%s:1@",emoji_id)
  145. self:UpdateMessage(self.message .. emojiStr)
  146. end
  147. function this:HideEmoji()
  148. self.emoji_is_show = false
  149. GUI:setVisible(self.view.emoji_panel,self.emoji_is_show)
  150. end
  151. ---****************************************************
  152. ---注册UI事件和服务器消息
  153. function this:RegistEvents()
  154. GUI:AddOnClickEvent(self.view.bag_btn, self, self.BagOnClick)
  155. GUI:AddOnClickEvent(self.view.pos_btn, self, self.PosOnClick)
  156. GUI:AddOnClickEvent(self.view.biaoqing_btn, self, self.EmojiOnClick)
  157. GUI:AddOnClickEvent(self.view.fasong, self, self.SendMessageOnClick)
  158. GUI:Input_SetOnEndEdit(self.view.text_input, self, self.TextChange)
  159. GUI:AddOnClickEvent(self.view.btn_bag, self, self.btn_bag_onclick)
  160. GUI:AddOnClickEvent(self.view.btn_equip, self, self.btn_equip_onclick)
  161. GUI:AddOnClickEvent(self.view.item_mask, self, self.BagOnClick)
  162. GUI:AddOnClickEvent(self.view.emoji_mask, self, self.EmojiOnClick)
  163. --SL:RegisterLUAEvent(Event.FriendChatReceiveEvent, self.FriendChatReceiveEvent, self)
  164. SL:RegisterLUAEvent(LUA_EVENT_CHAT_RECEIVE, self.LUA_EVENT_CHAT_RECEIVE, self)
  165. end
  166. function this:BagOnClick()
  167. self.item_is_show = not self.item_is_show
  168. GUI:setVisible(self.view.item_panel,self.item_is_show)
  169. if self.item_is_show then
  170. self:ShowItem()
  171. else
  172. GUI:UIPanel_Close("dev/ui/Chat/Item/KLUIChatBagScrollView/KLUIChatBagScrollViewItem")
  173. end
  174. end
  175. function this:PosOnClick()
  176. local x = SL:MeData_GetCoord().x
  177. local y = SL:MeData_GetCoord().z
  178. local mapId = SL:GetMetaValue(EMetaVarGetKey.MAP_ID)
  179. local line = SL:GetMetaValue(EMetaVarGetKey.MAP_LINE)
  180. local posStr = string.format("pos@%s,%s,%s,%s@",x,y,mapId,line)
  181. self:UpdateMessage(self.message .. posStr)
  182. end
  183. function this:EmojiOnClick()
  184. self.emoji_is_show = not self.emoji_is_show
  185. GUI:setVisible(self.view.emoji_panel,self.emoji_is_show)
  186. if self.emoji_is_show then
  187. GUI:DataListUpdateData(self.view.emoji_data_list)
  188. end
  189. end
  190. function this:SendMessageOnClick()
  191. --SL:SendChat(EChatChannelType.FRIEND,self.message,self.friendId,self.ChatItem)
  192. SL:SendChat(EChatChannelType.PERSONAL,self.message,self.friendId,self.ChatItem)
  193. self.ChatItem = {}
  194. self:UpdateMessage("")
  195. end
  196. function this:TextChange(a, b,eventData)
  197. local messageStr = eventData[1]
  198. if string.isNullOrEmpty(messageStr) then
  199. self.message = messageStr
  200. self.ChatItem = {}
  201. else
  202. local str = self:CheckInputRichText(messageStr)
  203. if str ~= messageStr then
  204. messageStr = str
  205. GUI:Text_setString(self.view.text_input,messageStr)
  206. end
  207. local mess = {message={channel = EChatChannelType.SYSTEM,message = messageStr}}
  208. self.calculationUI:RefreshItem(mess)
  209. local xx,yy = GUI:getSizeDelta(self.calculationUI.view.richT)
  210. if yy <= 320 then
  211. self.message = messageStr
  212. else
  213. GUI:Text_setString(self.view.text_input,self.message)
  214. end
  215. end
  216. end
  217. --去掉玩家输入的富文本
  218. function this:CheckInputRichText(message)
  219. --<size=500>超大字体</size>
  220. --<color=red>红色</color>
  221. local str = string.gsub(message, "<[^>]+>", "")
  222. return str
  223. end
  224. ---聊天信息变化
  225. function this:FriendChatReceiveEvent(_, senderId)
  226. if self.friendId == senderId or senderId == SL:GetMetaValue(EMetaVarGetKey.UID) then
  227. self:UpdateChatContent()
  228. end
  229. end
  230. --刷新聊天记录content
  231. -- function this:UpdateChatContent()
  232. -- local chatIdList = SL:FriendInfo_GetChatHistory(self.friendId)
  233. -- local chatList = {}
  234. -- for _,v in pairs(chatIdList) do
  235. -- local msg = SL:FriendInfo_GetMsg(v)
  236. -- if msg then
  237. -- table.insert(chatList, msg)
  238. -- end
  239. -- end
  240. -- if self.chatView then
  241. -- self.chatView:RefreshData(chatList)
  242. -- end
  243. -- end
  244. function this:LUA_EVENT_CHAT_RECEIVE(_,message)
  245. if message.channel == EChatChannelType.PERSONAL then
  246. self:UpdateChatContent()
  247. end
  248. end
  249. function this:UpdateChatContent()
  250. if not self.friendId then
  251. return
  252. end
  253. local chatIdList = SL:ChatInfo_GetChaTargetInfo(self.friendId)
  254. local chatList = {}
  255. for i, v in ipairs(chatIdList) do
  256. table.insert(chatList,v)
  257. end
  258. if self.chatView then
  259. self.chatView:RefreshData(chatList)
  260. end
  261. SL:ChatInfo_FriendShow(self.friendId)
  262. local is_show = SL:ChatInfo_FriendLookTipShow()
  263. if is_show then
  264. local popoverPanel = GUI:GetUI("dev/ui/Preview/Panel/KLPopover/KLPopoverPanel")
  265. popoverPanel:SetPopoverData(19)
  266. popoverPanel:RefreshUI()
  267. else
  268. local popoverPanel = GUI:GetUI("dev/ui/Preview/Panel/KLPopover/KLPopoverPanel")
  269. popoverPanel:ClosePopover(19)
  270. popoverPanel:RefreshUI()
  271. end
  272. end
  273. function this:Close()
  274. end
  275. return this