You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

379 lines
11 KiB

---------------------------------------------------------------------------------
--
-- Prat - A framework for World of Warcraft chat mods
--
-- Copyright (C) 2006-2020 Prat Development Team
--
-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License
-- as published by the Free Software Foundation; either version 2
-- of the License, or (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to:
--
-- Free Software Foundation, Inc.,
-- 51 Franklin Street, Fifth Floor,
-- Boston, MA 02110-1301, USA.
--
--
-------------------------------------------------------------------------------
Prat:AddModuleToLoad(function()
local function dbg(...) end
--[==[@debug@
function dbg(...) Prat:PrintLiteral(...) end
--@end-debug@]==]
local PRAT_MODULE = Prat:RequestModuleName("Mentions")
if PRAT_MODULE == nil then
return
end
local module = Prat:NewModule(PRAT_MODULE, "AceHook-3.0")
-- define localized strings
local PL = module.PL
Prat:SetModuleDefaults(module.name, {
profile = {
on = false,
}
})
--[==[@debug@
PL:AddLocale(PRAT_MODULE, "enUS", {
["module_name"] = "Mentions",
["module_desc"] = "Support mentioning other players in chat",
module_info = "THIS MODULE IS EXPERIMENTAL= It adds the ability to @mention people in chat to alert them>",
})
--@end-debug@]==]
-- These Localizations are auto-generated. To help with localization
-- please go to http://www.wowace.com/projects/prat-3-0/localization/
--@non-debug@
do
local L
L = {
["Mentions"] = {
["module_desc"] = "Support mentioning other players in chat",
["module_info"] = "THIS MODULE IS EXPERIMENTAL= It adds the ability to @mention people in chat to alert them>",
["module_name"] = "Mentions",
}
}
PL:AddLocale(PRAT_MODULE, "enUS", L)
L = {
["Mentions"] = {
--[[Translation missing --]]
["module_desc"] = "Support mentioning other players in chat",
--[[Translation missing --]]
["module_info"] = "THIS MODULE IS EXPERIMENTAL= It adds the ability to @mention people in chat to alert them>",
--[[Translation missing --]]
["module_name"] = "Mentions",
}
}
PL:AddLocale(PRAT_MODULE, "itIT", L)
L = {
["Mentions"] = {
--[[Translation missing --]]
["module_desc"] = "Support mentioning other players in chat",
--[[Translation missing --]]
["module_info"] = "THIS MODULE IS EXPERIMENTAL= It adds the ability to @mention people in chat to alert them>",
--[[Translation missing --]]
["module_name"] = "Mentions",
}
}
PL:AddLocale(PRAT_MODULE, "ptBR", L)
L = {
["Mentions"] = {
--[[Translation missing --]]
["module_desc"] = "Support mentioning other players in chat",
--[[Translation missing --]]
["module_info"] = "THIS MODULE IS EXPERIMENTAL= It adds the ability to @mention people in chat to alert them>",
--[[Translation missing --]]
["module_name"] = "Mentions",
}
}
PL:AddLocale(PRAT_MODULE, "frFR", L)
L = {
["Mentions"] = {
["module_desc"] = "Unterstützung beim Erwähnen anderer Spieler im Chat",
["module_info"] = "DIESES MODUL IST EXPERIMENTELL = Es fügt die Fähigkeit hinzu, Personen im Chat zu erwähnen, um dich zu alarmieren>",
["module_name"] = "Erwähnungen",
}
}
PL:AddLocale(PRAT_MODULE, "deDE", L)
L = {
["Mentions"] = {
["module_desc"] = "채팅에서 다른 플레이어를 언급하는 것을 지원",
["module_info"] = "이 모듈은 실험적입니다=채팅에서 사람들을 @언급하여 경보하는 기능을 추가합니다.",
["module_name"] = "언급 [Mentions]",
}
}
PL:AddLocale(PRAT_MODULE, "koKR", L)
L = {
["Mentions"] = {
--[[Translation missing --]]
["module_desc"] = "Support mentioning other players in chat",
--[[Translation missing --]]
["module_info"] = "THIS MODULE IS EXPERIMENTAL= It adds the ability to @mention people in chat to alert them>",
--[[Translation missing --]]
["module_name"] = "Mentions",
}
}
PL:AddLocale(PRAT_MODULE, "esMX", L)
L = {
["Mentions"] = {
["module_desc"] = "Поддержка упоминания других игроков в чате",
["module_info"] = "ЭТОТ МОДУЛЬ ЯВЛЯЕТСЯ ЭКСПЕРИМЕНТАЛЬНЫМ = Он добавляет возможность @ упоминать людей в чате, чтобы предупредить их >",
["module_name"] = "Упоминание",
}
}
PL:AddLocale(PRAT_MODULE, "ruRU", L)
L = {
["Mentions"] = {
--[[Translation missing --]]
["module_desc"] = "Support mentioning other players in chat",
--[[Translation missing --]]
["module_info"] = "THIS MODULE IS EXPERIMENTAL= It adds the ability to @mention people in chat to alert them>",
--[[Translation missing --]]
["module_name"] = "Mentions",
}
}
PL:AddLocale(PRAT_MODULE, "zhCN", L)
L = {
["Mentions"] = {
--[[Translation missing --]]
["module_desc"] = "Support mentioning other players in chat",
--[[Translation missing --]]
["module_info"] = "THIS MODULE IS EXPERIMENTAL= It adds the ability to @mention people in chat to alert them>",
--[[Translation missing --]]
["module_name"] = "Mentions",
}
}
PL:AddLocale(PRAT_MODULE, "esES", L)
L = {
["Mentions"] = {
--[[Translation missing --]]
["module_desc"] = "Support mentioning other players in chat",
--[[Translation missing --]]
["module_info"] = "THIS MODULE IS EXPERIMENTAL= It adds the ability to @mention people in chat to alert them>",
--[[Translation missing --]]
["module_name"] = "Mentions",
}
}
PL:AddLocale(PRAT_MODULE, "zhTW", L)
end
--@end-non-debug@
local toggleOption = {
name = function(info) return info.handler.PL[info[#info] .. "_name"] end,
desc = function(info) return info.handler.PL[info[#info] .. "_desc"] end,
type = "toggle",
}
Prat:SetModuleOptions(module.name, {
name = PL.module_name,
desc = PL.module_desc,
type = "group",
args = {
info = {
name = PL.module_info,
type = "description",
}
}
})
local CLR = Prat.CLR
local function GetChatCLR(name)
if name == nil then return CLR.COLOR_NONE end
local type = strsub(name, 10);
local info = ChatTypeInfo[type];
if not info then
return CLR.COLOR_NONE
end
return CLR:GetHexColor(info)
end
local function ChatType(text, type) return CLR:Colorize(GetChatCLR(type), text) end
local function channelLink(name, type, channel)
return "|Hchannel:" .. type .. ":" .. (channel or "0") .. "|h[" .. ChatType(name, "CHAT_MSG_" .. type) .. "]|h"
end
local function handleMention(match, m)
if m == nil then return end
-- dbg(match, m)
local name = match:sub(2)
local event = "CHAT_MSG_" .. m.CTYPE
local from = "(in " .. _G[event] .. ") "
-- dbg(from)
SendChatMessage(from .. m.MESSAGE, "WHISPER", GetDefaultLanguage("player"), name);
end
Prat:SetModulePatterns(module, {
{ pattern = "@%S+", matchfunc = handleMention, priority = 47, type = "OUTBOUND" }
})
function module:OnModuleEnable()
self:RegisterTabComplete()
Prat.RegisterChatEvent(self, "Prat_FrameMessage")
-- self:SecureHook("ChatEdit_OnChar")
end
function module:Prat_FrameMessage(arg, message, frame, event)
-- message.MESSAGE:gsub("%(in ([^)]+)%)", function(type) end)
end
function module:ChatEdit_OnChar(frame)
local start, index
index = frame:GetCursorPosition()
-- dbg("OnChar", frame:GetText())
local regex = "@(%S+)"
local text = frame:GetText()
while text:byte(index) ~= 32 do
if text:byte(index) == 64 then
start = index + 1
break;
end
index = index - 1
if index <= 0 then
break
end
end
local target
if start then
target = text:sub(start, frame:GetCursorPosition())
end
if (target) then --if they typed a command with a autocompletable target
AutoCompleteEditBox_SetAutoCompleteSource(frame, GetAutoCompleteResults,
AUTOCOMPLETE_LIST_TEMPLATES.ONLINE_NOT_BNET.include, AUTOCOMPLETE_LIST_TEMPLATES.ONLINE_NOT_BNET.exclude)
-- dbg(target)
local utf8Position = frame:GetUTF8CursorPosition();
local allowFullMatch = false;
local nameToShow = frame.autoCompleteSource(target, 1, utf8Position, allowFullMatch, unpack(frame.autoCompleteParams))[1];
-- dbg(nameToShow)
if (nameToShow and nameToShow.name) then
local name = Ambiguate(nameToShow.name, "all");
--We're going to be setting the text programatically which will clear the userInput flag on the editBox.
--So we want to manually update the dropdown before we change the text.
AutoComplete_Update(frame, target, utf8Position);
if strsub(name, 1, 1) ~= "|" then
target = escapePatternSymbols(target);
local newTarget = name;
-- dbg(newTarget, text, target, frame:GetCursorPosition())
local newText = text:sub(1, frame:GetCursorPosition() - target:len())..newTarget..text:sub(frame:GetCursorPosition()+1)
frame:SetText(newText);
-- frame:HighlightText(strlen(text), strlen(command) + strlen(whitespace) + strlen(newTarget));
end
end
end
end
function module:RegisterTabComplete()
local CLR = Prat.CLR
local AceTab = LibStub("AceTab-3.0")
local tabcompleteName = "mentions-tab-complete"
local servernames = Prat.Addon:GetModule("ServerNames", true)
local playernames = Prat.Addon:GetModule("PlayerNames", true)
if not AceTab:IsTabCompletionRegistered(tabcompleteName) then
local foundCache = {}
AceTab:RegisterTabCompletion(tabcompleteName, "@",
function(t, ...)
-- dbg(t, ...)
for name in pairs(playernames.Classes) do
table.insert(t, name)
end
end,
function(u, cands, ...)
local candcount = #cands
if candcount <= playernames.db.profile.tabcompletelimit then
local text
for key, cand in pairs(cands) do
if servernames then
local plr, svr = key:match("([^%-]+)%-?(.*)")
cand = CLR:Player(cand, plr, playernames:getClass(key))
if svr then
svr = servernames:FormatServer(nil, servernames:GetServerKey(svr))
cand = cand .. (svr and ("-" .. svr) or "")
end
else
cand = CLR:Player(cand, cand, playernames:getClass(cand))
end
text = text and (text .. ", " .. cand) or cand
end
return " " .. text
else
return " " .. ("Too many matches (%d possible)"):format(candcount)
end
end,
nil,
function(name)
return name:gsub(Prat.MULTIBYTE_FIRST_CHAR, string.upper, 1):match("^[^%-]+")
end)
end
end
end)