Quantcast
local A, L = ...

-- 表情选择器框架
local EmoteTableFrame = CreateFrame("Frame", "EmoteTableFrame", UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
EmoteTableFrame:SetMovable(true)
EmoteTableFrame:RegisterForDrag("LeftButton")
EmoteTableFrame:SetScript("OnDragStart", EmoteTableFrame.StartMoving)
EmoteTableFrame:SetScript("OnDragStop", EmoteTableFrame.StopMovingOrSizing)
EmoteTableFrame:EnableMouse(true)
EmoteTableFrame:SetWidth((L.C.emote.listsize + 6) * 12 + 10)
EmoteTableFrame:SetHeight((L.C.emote.listsize + 6) * 5 + 10)
EmoteTableFrame:SetPoint("BOTTOM", ChatFrame1EditBox, L.C.emote.offsetx, L.C.emote.offsety)
EmoteTableFrame:SetBackdrop({
  bgFile = "Interface\\Buttons\\WHITE8x8",
  edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
  tile = true,
  tileSize = 16,
  edgeSize = 16,
  insets = {left = 3, right = 3, top = 3, bottom = 3}
})
EmoteTableFrame:SetBackdropColor(0.05, 0.05, 0.05, 0.8)
EmoteTableFrame:SetBackdropBorderColor(0.3, 0.3, 0.3)
-- 表情选择框出现位置 默认30,30
EmoteTableFrame:Hide()
EmoteTableFrame:SetFrameStrata("DIALOG")

-- 表情解析规则
local fmtstring = format("\124T%%s:%d\124t", max(floor(select(2, SELECTED_CHAT_FRAME:GetFont())), L.C.emote.iconsize))

-- 自定义表情开始的序号
local customEmoteStartIndex = 9

local emotes = {
  --原版暴雪提供的8个图标
  {"{rt1}", [=[Interface\TargetingFrame\UI-RaidTargetingIcon_1]=]},
  {"{rt2}", [=[Interface\TargetingFrame\UI-RaidTargetingIcon_2]=]},
  {"{rt3}", [=[Interface\TargetingFrame\UI-RaidTargetingIcon_3]=]},
  {"{rt4}", [=[Interface\TargetingFrame\UI-RaidTargetingIcon_4]=]},
  {"{rt5}", [=[Interface\TargetingFrame\UI-RaidTargetingIcon_5]=]},
  {"{rt6}", [=[Interface\TargetingFrame\UI-RaidTargetingIcon_6]=]},
  {"{rt7}", [=[Interface\TargetingFrame\UI-RaidTargetingIcon_7]=]},
  {"{rt8}", [=[Interface\TargetingFrame\UI-RaidTargetingIcon_8]=]},
  --自定义表情
  {"{天使}", [=[Interface\Addons\rChat\emotions\Angel]=]},
  {"{生气}", [=[Interface\Addons\rChat\emotions\Angry]=]},
  {"{大笑}", [=[Interface\Addons\rChat\emotions\Biglaugh]=]},
  {"{鼓掌}", [=[Interface\Addons\rChat\emotions\Clap]=]},
  {"{酷}", [=[Interface\Addons\rChat\emotions\Cool]=]},
  {"{哭}", [=[Interface\Addons\rChat\emotions\Cry]=]},
  {"{可爱}", [=[Interface\Addons\rChat\emotions\Cutie]=]},
  {"{鄙视}", [=[Interface\Addons\rChat\emotions\Despise]=]},
  {"{美梦}", [=[Interface\Addons\rChat\emotions\Dreamsmile]=]},
  {"{尴尬}", [=[Interface\Addons\rChat\emotions\Embarrass]=]},
  {"{邪恶}", [=[Interface\Addons\rChat\emotions\Evil]=]},
  {"{兴奋}", [=[Interface\Addons\rChat\emotions\Excited]=]},
  {"{晕}", [=[Interface\Addons\rChat\emotions\Faint]=]},
  {"{打架}", [=[Interface\Addons\rChat\emotions\Fight]=]},
  {"{流感}", [=[Interface\Addons\rChat\emotions\Flu]=]},
  {"{呆}", [=[Interface\Addons\rChat\emotions\Freeze]=]},
  {"{皱眉}", [=[Interface\Addons\rChat\emotions\Frown]=]},
  {"{致敬}", [=[Interface\Addons\rChat\emotions\Greet]=]},
  {"{鬼脸}", [=[Interface\Addons\rChat\emotions\Grimace]=]},
  {"{龇牙}", [=[Interface\Addons\rChat\emotions\Growl]=]},
  {"{开心}", [=[Interface\Addons\rChat\emotions\Happy]=]},
  {"{心}", [=[Interface\Addons\rChat\emotions\Heart]=]},
  {"{恐惧}", [=[Interface\Addons\rChat\emotions\Horror]=]},
  {"{生病}", [=[Interface\Addons\rChat\emotions\Ill]=]},
  {"{无辜}", [=[Interface\Addons\rChat\emotions\Innocent]=]},
  {"{功夫}", [=[Interface\Addons\rChat\emotions\Kongfu]=]},
  {"{花痴}", [=[Interface\Addons\rChat\emotions\Love]=]},
  {"{邮件}", [=[Interface\Addons\rChat\emotions\Mail]=]},
  {"{化妆}", [=[Interface\Addons\rChat\emotions\Makeup]=]},
  -- {"{马里奥}", [=[Interface\Addons\rChat\emotions\Mario]=]},
  {"{沉思}", [=[Interface\Addons\rChat\emotions\Meditate]=]},
  {"{可怜}", [=[Interface\Addons\rChat\emotions\Miserable]=]},
  {"{好}", [=[Interface\Addons\rChat\emotions\Okay]=]},
  {"{漂亮}", [=[Interface\Addons\rChat\emotions\Pretty]=]},
  {"{吐}", [=[Interface\Addons\rChat\emotions\Puke]=]},
  {"{握手}", [=[Interface\Addons\rChat\emotions\Shake]=]},
  {"{喊}", [=[Interface\Addons\rChat\emotions\Shout]=]},
  {"{闭嘴}", [=[Interface\Addons\rChat\emotions\Shuuuu]=]},
  {"{害羞}", [=[Interface\Addons\rChat\emotions\Shy]=]},
  {"{睡觉}", [=[Interface\Addons\rChat\emotions\Sleep]=]},
  {"{微笑}", [=[Interface\Addons\rChat\emotions\Smile]=]},
  {"{吃惊}", [=[Interface\Addons\rChat\emotions\Suprise]=]},
  {"{失败}", [=[Interface\Addons\rChat\emotions\Surrender]=]},
  {"{流汗}", [=[Interface\Addons\rChat\emotions\Sweat]=]},
  {"{流泪}", [=[Interface\Addons\rChat\emotions\Tear]=]},
  {"{悲剧}", [=[Interface\Addons\rChat\emotions\Tears]=]},
  {"{想}", [=[Interface\Addons\rChat\emotions\Think]=]},
  {"{偷笑}", [=[Interface\Addons\rChat\emotions\Titter]=]},
  {"{猥琐}", [=[Interface\Addons\rChat\emotions\Ugly]=]},
  {"{胜利}", [=[Interface\Addons\rChat\emotions\Victory]=]},
  {"{雷锋}", [=[Interface\Addons\rChat\emotions\Volunteer]=]},
  {"{委屈}", [=[Interface\Addons\rChat\emotions\Wronged]=]}
}

local function ChatEmoteFilter(self, event, msg, ...)
  for i = customEmoteStartIndex, #emotes do
    if msg:find(emotes[i][1]) then
      msg = msg:gsub(emotes[i][1], format(fmtstring, emotes[i][2]), 1)
    end
  end
  return false, msg, ...
end

local function EmoteIconMouseUp(frame, button)
  if (button == "LeftButton") then
    local chatFrame = GetCVar("chatStyle") == "im" and SELECTED_CHAT_FRAME or DEFAULT_CHAT_FRAME
    local eb = chatFrame and chatFrame.editBox
    if (eb) then
      eb:Insert(frame.text)
      eb:Show();
      eb:SetFocus()
    end
  end
  rChat:ToggleEmoteTable()
end

function rChat:ToggleEmoteTable()
  if (EmoteTableFrame:IsShown()) then
    EmoteTableFrame:Hide()
  else
    EmoteTableFrame:Show()
  end
end

local icon, row, col
row = 1
col = 1
for i = 1, #emotes do
  text = emotes[i][1]
  texture = emotes[i][2]
  icon = CreateFrame("Frame", format("IconButton%d", i), EmoteTableFrame)
  icon:SetWidth(L.C.emote.listsize + 6)
  icon:SetHeight(L.C.emote.listsize + 6)
  icon.text = text
  icon.texture = icon:CreateTexture(nil, "ARTWORK")
  icon.texture:SetTexture(texture)
  icon.texture:SetAllPoints(icon)
  icon:Show()
  icon:SetPoint(
    "TOPLEFT",
    5 + (col - 1) * (L.C.emote.listsize + 6),
    -5 - (row - 1) * (L.C.emote.listsize + 6)
  )
  icon:SetScript("OnMouseUp", EmoteIconMouseUp)
  icon:EnableMouse(true)
  col = col + 1
  if (col > 12) then
    row = row + 1
    col = 1
  end
end

ChatFrame_AddMessageEventFilter("CHAT_MSG_CHANNEL", ChatEmoteFilter)-- 公共频道
ChatFrame_AddMessageEventFilter("CHAT_MSG_SAY", ChatEmoteFilter)-- 说
ChatFrame_AddMessageEventFilter("CHAT_MSG_YELL", ChatEmoteFilter)-- 大喊
ChatFrame_AddMessageEventFilter("CHAT_MSG_RAID", ChatEmoteFilter)-- 团队
ChatFrame_AddMessageEventFilter("CHAT_MSG_RAID_LEADER", ChatEmoteFilter)-- 团队领袖
ChatFrame_AddMessageEventFilter("CHAT_MSG_PARTY", ChatEmoteFilter)-- 队伍
ChatFrame_AddMessageEventFilter("CHAT_MSG_PARTY_LEADER", ChatEmoteFilter)-- 队伍领袖
ChatFrame_AddMessageEventFilter("CHAT_MSG_GUILD", ChatEmoteFilter)-- 公会

ChatFrame_AddMessageEventFilter("CHAT_MSG_AFK", ChatEmoteFilter)-- AFK玩家自动回复
ChatFrame_AddMessageEventFilter("CHAT_MSG_DND", ChatEmoteFilter)-- 切勿打扰自动回复

-- 副本和副本领袖
ChatFrame_AddMessageEventFilter("CHAT_MSG_INSTANCE_CHAT", ChatEmoteFilter)
ChatFrame_AddMessageEventFilter("CHAT_MSG_INSTANCE_CHAT_LEADER", ChatEmoteFilter)
-- 解析战网私聊
ChatFrame_AddMessageEventFilter("CHAT_MSG_WHISPER", ChatEmoteFilter)
ChatFrame_AddMessageEventFilter("CHAT_MSG_WHISPER_INFORM", ChatEmoteFilter)
ChatFrame_AddMessageEventFilter("CHAT_MSG_BN_WHISPER", ChatEmoteFilter)
ChatFrame_AddMessageEventFilter("CHAT_MSG_BN_WHISPER_INFORM", ChatEmoteFilter)
-- 解析社区聊天内容
ChatFrame_AddMessageEventFilter("CHAT_MSG_COMMUNITIES_CHANNEL", ChatEmoteFilter)