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
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)
|