Files
Prat/modules/PlayerNames.lua
buhfur-ubuntu 120bb38b37 Initial commit
2026-05-31 14:10:07 -04:00

575 lines
25 KiB
Lua
Executable File

--[[
Name: Prat_PlayerNames
Revision: $Revision: 16689 $
Author(s): Curney (asml8ed@gmail.com)
Krtek (krtek4@gmail.com)
Inspired by: idChat2_PlayerNames by Industrial
Website: http://www.wowace.com/files/index.php?path=Prat/
Documentation: http://www.wowace.com/wiki/Prat/Integrated_Modules#PlayerNames
SVN: http://svn.wowace.com/wowace/trunk/Prat/
Description: Module for Prat that adds player name options.
Dependencies: Prat
]]
local L = AceLibrary("AceLocale-2.2"):new("PratPlayerNames")
L:RegisterTranslations("enUS", function() return {
["PlayerNames"] = true,
["Player name formating options."] = true,
["Brackets"] = true,
["Square"] = true,
["Angled"] = true,
["None"] = true,
["Class"] = true,
["Random"] = true,
["Sets style of brackets to use around player names."] = true,
["Use common color"] = true,
["Toggle useing common color for unknown player names."] = true,
["Set common color"] = true,
["Change the common color of PlayerNames"] = true,
["Use TabComplete"] = true,
["Toggle tab completion of player names."] = true,
["Show Level"] = true,
["Toggle level showing."] = true,
["Show Group"] = true,
["Toggle raid group showing."] = true,
["Keep Info"] = true,
["Keep player information between session."] = true,
["Color Mode"] = true,
["How to color Players name."] = true,
["Toggle"] = true,
["Toggle the module on and off."] = true,
["Use Census+"] = true,
["Use Census+ database"] = true,
["Mark self"] = true,
["Toggle color marking of your nikname in chat."] = true,
["Set mark color"] = true,
["Change the mark color of your nikname"] = true,
["Group acronim"] = true,
["Simbol of raid group added to group number"] = true ,
["Enable group number at %s"] = true,
} end)
L:RegisterTranslations("ruRU", function() return {
["PlayerNames"] = "PlayerNames",
["Player name formating options."] = "Настройки форматирования имени собеседника.",
["Brackets"] = "Скобки",
["Square"] = "Квадратные",
["Angled"] = "Треугольные",
["None"] = "Нет",
["Class"] = "Класс",
["Random"] = "Случайно",
["Sets style of brackets to use around player names."] = "Установить стиль скобок вокруг имени собеседника.",
["Use common color"] = "Использовать общий цвет",
["Toggle useing common color for unknown player names."] = "Вкл/Выкл использование общего цвета для неизвестных имен игроков.",
["Set common color"] = "Установить общий цвет",
["Change the common color of PlayerNames"] = "Изменить общий цвет имен игроков",
["Use TabComplete"] = "Использовать TabComplete",
["Toggle tab completion of player names."] = "Вкл/Выкл TabComplete в именах игроков.",
["Show Level"] = "Показывать уровень",
["Toggle level showing."] = "Вкл/выкл отображения уровня собеседника.",
["Show Group"] = "Показывать группу",
["Toggle raid group showing."] = "Вкл/выкл отображения рейдовой группы.",
["Keep Info"] = "Хранить информацию",
["Keep player information between session."] = "Хранить информацию о игроках между сессиями.",
["Color Mode"] = "Режим цвета",
["How to color Players name."] = "Как окрасить имя игрока.",
["Toggle"] = "Вкл/Выкл",
["Toggle the module on and off."] = "Вкл/Выкл модуль",
["Use Census+"] = "Использовать Census+",
["Use Census+ database"] = "Использовать базу данных Census+",
} end)
L:RegisterTranslations("zhCN", function() return {
["PlayerNames"] = "玩家姓名",
["Player name formating options."] = "玩家姓名格式选项。",
["Brackets"] = "圆弧",
["Square"] = "方形",
["Angled"] = "折角",
["None"] = "无",
["Class"] = "职业",
["Random"] = "随机",
["Sets style of brackets to use around player names."] = "设置玩家名字的括号。",
["Use TabComplete"] = "标签",
["Toggle tab completion of player names."] = "为玩家姓名作标签。",
["Show Level"] = "显示等级",
["Toggle level showing."] = "人物等级显示。",
["Show Group"] = "显示小组",
["Toggle raid group showing."] = "团队小组显示。",
["Keep Info"] = "持续",
["Keep player information between session."] = "在进程间保持信息。",
["Color Mode"] = "颜色模块",
["How to color Players name."] = "玩家名字颜色。",
["Toggle"] = "切换",
["Toggle the module on and off."] = "切换此模块的打开与关闭。",
} end)
L:RegisterTranslations("koKR", function() return {
["PlayerNames"] = "플레이어명",
["Player name formating options."] = "플레이어명 형식을 설정합니다.",
["Brackets"] = "괄호",
["Square"] = "사각형",
["Angled"] = "각진형",
["None"] = "없음",
["Class"] = "직업",
["Random"] = "무작위",
["Sets style of brackets to use around player names."] = "플레이어명 주위 괄호의 스타일 설정",
["Use common color"] = "공통 색상 사용",
["Toggle useing common color for unknown player names."] = "알려지지 않은 플레이어명에 대한 공통 색상 사용을 전환합니다.",
["Set common color"] = "공통 색상 설정",
["Change the common color of PlayerNames"] = "플레이어명의 공통 색상을 설정합니다.",
["Use TabComplete"] = "탭완성 사용",
["Toggle tab completion of player names."] = "플레이어명의 탭 완성기능을 전환합니다.",
["Show Level"] = "레벨 표시",
["Toggle level showing."] = "레벨 표시를 전환합니다.",
["Show Group"] = "파티 표시",
["Toggle raid group showing."] = "공격대 파티 표시를 전환합니다.",
["Keep Info"] = "정보 유지",
["Keep player information between session."] = "연결 간 플레이어 정보를 유지합니다.",
["Color Mode"] = "색상 모드",
["How to color Players name."] = "플레이어명 색상을 변경합니다.",
["Toggle"] = "전환",
["Toggle the module on and off."] = "모듈 켜고 끄기를 전환합니다.",
} end)
local BC = AceLibrary("Babble-Class-2.2")
local sfind, sformat, slower, sgsub = string.find, string.format , string.lower, string.gsub
Prat_PlayerNames = Prat:NewModule("playernames")
Prat_PlayerNames.Classes = {}
Prat_PlayerNames.Levels = {}
Prat_PlayerNames.Subgroups = {}
local chatList = {[1] = {t = "SAY", n = "Say"},
[4] = {t = "GUILD", n = "Guild"},
[2] = {t = "PARTY", n = "Party"},
[3] = {t = "RAID", n = "Raid"},
[7] = {t = "WHISPER", n = "Whisper"},
[6] = {t = "YELL", n = "Yell"},
[5] = {t = "OFFICER", n = "Officer"},
[93] = {t = "BATTLEGROUND", n = "Battlegground"}
}
Prat_chatList = chatList
function Prat_PlayerNames:OnInitialize()
Prat_PlayerNames.db = Prat:AcquireDBNamespace("PlayerNames")
local defaults = {
on = true,
brackets = "Angled",
tabcomplete = true,
level = true,
classes = {},
levels = {},
subgroup = true,
groupchan = {},
groupAcronim = "[%s]",
keep = true,
census = false,
colormode = "CLASS",
usecommoncolor = true,
color = {
r = 1,
g = 0,
b = 1,
},
markself = true,
selfcolor = {
r = 1,
g = 0,
b = 1,
},
}
for id,chat in pairs( chatList) do defaults.groupchan[chat.t] = true end
Prat:RegisterDefaults("PlayerNames", "profile", defaults)
Prat.Options.args.playernames = {
name = L["PlayerNames"],
desc = L["Player name formating options."],
type = "group",
args = {
brackets = {
name = L["Brackets"],
desc = L["Sets style of brackets to use around player names."],
type = "text",
order = 140,
get = function() return Prat_PlayerNames.db.profile.brackets end,
set = function(v) Prat_PlayerNames.db.profile.brackets = v end,
validate = {["Square"] = L["Square"], ["Angled"] = L["Angled"], ["None"] = L["None"]}
},
colormode = {
name = L["Color Mode"],
desc = L["How to color Players name."],
type = "text",
order = 150,
get = function() return Prat_PlayerNames.db.profile.colormode end,
set = function(v) Prat_PlayerNames.db.profile.colormode = v end,
validate = {["RANDOM"] = L["Random"], ["CLASS"] = L["Class"], ["NONE"] = L["None"]}
},
level = {
name = L["Show Level"],
desc = L["Toggle level showing."],
type = "toggle",
order = 160,
get = function() return Prat_PlayerNames.db.profile.level end,
set = function(v) Prat_PlayerNames.db.profile.level = v end
},
subgroup = {
name = L["Show Group"],
desc = L["Toggle raid group showing."],
type = "group",
order = 170,
args = {
set = {
name = L["Group acronim"],
desc = L["Simbol of raid group added to group number"],
type = "text",
usage = "<string>",
order = 90,
get = function() return Prat_PlayerNames.db.profile.groupAcronim end,
set = function(v) Prat_PlayerNames.db.profile.groupAcronim = v end
},
},
},
keep = {
name = L["Keep Info"],
desc = L["Keep player information between session."],
type = "toggle",
order = 180,
get = function() return Prat_PlayerNames.db.profile.keep end,
set = function(v) Prat_PlayerNames.db.profile.keep = v end
},
census = {
name = L["Use Census+"],
desc = L["Use Census+ database"],
type = "toggle",
order = 185,
get = function() return Prat_PlayerNames.db.profile.census end,
set = function(v) Prat_PlayerNames.db.profile.census = v end
},
tabcomplete = {
name = L["Use TabComplete"],
desc = L["Toggle tab completion of player names."],
type = "toggle",
order = 190,
get = function() return Prat_PlayerNames.db.profile.tabcomplete end,
set = function(v) Prat_PlayerNames.db.profile.tabcomplete = v; self:TabComplete(v) end
},
usecommoncolor = {
name = L["Use common color"],
desc = L["Toggle useing common color for unknown player names."],
type = "toggle",
order = 200,
get = function() return Prat_PlayerNames.db.profile.usecommoncolor end,
set = function(v) Prat_PlayerNames.db.profile.usecommoncolor = v end
},
setcolor = {
name = L["Set common color"],
desc = L["Change the common color of PlayerNames"],
type = "color",
order = 210,
get = function() return Prat_PlayerNames.db.profile.color.r, Prat_PlayerNames.db.profile.color.g, Prat_PlayerNames.db.profile.color.b end,
set = function(r, g, b, a) Prat_PlayerNames.db.profile.color.r, Prat_PlayerNames.db.profile.color.g, Prat_PlayerNames.db.profile.color.b = r, g, b end,
disabled = function() if not Prat_PlayerNames.db.profile.usecommoncolor then return true else return false end end,
},
markself = {
name = L["Mark self"],
desc = L["Toggle color marking of your nikname in chat."],
type = "toggle",
order = 220,
get = function() return Prat_PlayerNames.db.profile.markself end,
set = function(v) Prat_PlayerNames.db.profile.markself = v end
},
setselfcolor = {
name = L["Set mark color"],
desc = L["Change the mark color of your nikname"],
type = "color",
order = 230,
get = function() return Prat_PlayerNames.db.profile.selfcolor.r, Prat_PlayerNames.db.profile.selfcolor.g, Prat_PlayerNames.db.profile.selfcolor.b end,
set = function(r, g, b, a) Prat_PlayerNames.db.profile.selfcolor.r, Prat_PlayerNames.db.profile.selfcolor.g, Prat_PlayerNames.db.profile.selfcolor.b = r, g, b end,
disabled = function() if not Prat_PlayerNames.db.profile.markself then return true else return false end end,
},
toggle = {
name = L["Toggle"],
desc = L["Toggle the module on and off."],
type = "toggle",
order = 500,
get = function() return Prat_PlayerNames.db.profile.on end,
set = function() Prat_PlayerNames.db.profile.on = Prat:ToggleModuleActive("playernames") end
}
}
}
local ord = 100
local menu = Prat.Options.args.playernames.args.subgroup.args
for id,chat in pairs( chatList) do
menu[chat.t] = {}
menu[chat.t].name = chat.n
menu[chat.t].desc = sformat(L["Enable group number at %s"],chat.n)
menu[chat.t].type = "toggle"
menu[chat.t].order = ord
--menu[chat].get = function() return Prat_PlayerNames.db.profile.groupchan[chat] end
--menu[chat].set = function(v) Prat_PlayerNames.db.profile.groupchan[chat] = not Prat_PlayerNames.db.profile.groupchan[chat] end
ord = ord +10
end
menu["SAY"].get = function() return Prat_PlayerNames.db.profile.groupchan["SAY"] end
menu["SAY"].set = function(v) Prat_PlayerNames.db.profile.groupchan["SAY"] = v end
menu["GUILD"].get = function() return Prat_PlayerNames.db.profile.groupchan["GUILD"] end
menu["GUILD"].set = function(v) Prat_PlayerNames.db.profile.groupchan["GUILD"] = v end
menu["PARTY"].get = function() return Prat_PlayerNames.db.profile.groupchan["PARTY"] end
menu["PARTY"].set = function(v) Prat_PlayerNames.db.profile.groupchan["PARTY"] = v end
menu["RAID"].get = function() return Prat_PlayerNames.db.profile.groupchan["RAID"] end
menu["RAID"].set = function(v) Prat_PlayerNames.db.profile.groupchan["RAID"] = v end
menu["WHISPER"].get = function() return Prat_PlayerNames.db.profile.groupchan["WHISPER"] end
menu["WHISPER"].set = function(v) Prat_PlayerNames.db.profile.groupchan["WHISPER"] = v end
menu["YELL"].get = function() return Prat_PlayerNames.db.profile.groupchan["YELL"] end
menu["YELL"].set = function(v) Prat_PlayerNames.db.profile.groupchan["YELL"] = v end
menu["OFFICER"].get = function() return Prat_PlayerNames.db.profile.groupchan["OFFICER"] end
menu["OFFICER"].set = function(v) Prat_PlayerNames.db.profile.groupchan["OFFICER"] = v end
menu["BATTLEGROUND"].get = function() return Prat_PlayerNames.db.profile.groupchan["BATTLEGROUND"] end
menu["BATTLEGROUND"].set = function(v) Prat_PlayerNames.db.profile.groupchan["BATTLEGROUND"] = v end
end
function Prat_PlayerNames:OnEnable()
for i = 1, NUM_CHAT_WINDOWS do
self:Hook(getglobal("ChatFrame"..i), "AddMessage")
end
self:RegisterEvent("FRIENDLIST_UPDATE", "updateFriends")
self:RegisterEvent("GUILD_ROSTER_UPDATE", "updateGuild")
self:RegisterEvent("RAID_ROSTER_UPDATE", "updateRaid")
self:RegisterEvent("PARTY_MEMBERS_CHANGED", "updateParty")
self:RegisterEvent("PLAYER_TARGET_CHANGED", "updateTarget")
self:RegisterEvent("WHO_LIST_UPDATE", "updateWho")
self:RegisterEvent("CHAT_MSG_SYSTEM", "updateWho") -- for short /who command
for name, color in pairs(Prat_PlayerNames.db.profile.classes) do Prat_PlayerNames.Classes[name] = color end
for name, level in pairs(Prat_PlayerNames.db.profile.levels) do Prat_PlayerNames.Levels[name] = level end
local PlayerClass
_, PlayerClass = UnitClass("player")
self.playerName = UnitName("player");
self:addName(self.playerName, Playerclass, UnitLevel("player"))
self:updateParty()
self:updateRaid()
self:updateFriends()
self:updateGuild()
self:TabComplete(Prat_PlayerNames.db.profile.tabcomplete)
end
function Prat_PlayerNames:OnDisable()
self:TabComplete(false)
end
function Prat_PlayerNames:updateFriends()
local Name, Class, Level
for i = 1, GetNumFriends() do
Name, Level, Class = GetFriendInfo(i)
self:addName(Name, Class, Level)
end
end
function Prat_PlayerNames:updateGuild()
local Name, Class, Level
for i = 1, GetNumGuildMembers() do
Name, _, _, Level, Class = GetGuildRosterInfo(i)
self:addName(Name, Class, Level)
end
end
function Prat_PlayerNames:updateRaid()
local Name, Class, SubGroup, Level
Prat_PlayerNames.Subgroups = {}
for i = 1, GetNumRaidMembers() do
Name, _, SubGroup, Level, Class = GetRaidRosterInfo(i)
self:addName(Name, Class, Level, SubGroup)
end
end
function Prat_PlayerNames:updateParty()
local Class, Unit
for i = 1, GetNumPartyMembers() do
Unit = "party" .. i
_, Class = UnitClass(Unit)
self:addName(UnitName(Unit), Class, UnitLevel(Unit))
end
end
function Prat_PlayerNames:updateTarget()
local Class
if not UnitIsPlayer("target") or not UnitIsFriend("player", "target") then
return
end
_, Class = UnitClass("target")
self:addName(UnitName("target"), Class, UnitLevel("target"))
end
function Prat_PlayerNames:updateWho()
local Name, Class, Level
for i = 1, GetNumWhoResults() do
Name, _, Level, _, Class = GetWhoInfo(i)
self:addName(Name, Class, Level)
end
end
function Prat_PlayerNames:addName(Name, Class, Level, SubGroup)
if Name then
if Level and Level ~= 0 and ( not ( Prat_PlayerNames.Levels[Name] and Prat_PlayerNames.Levels[Name] > Level ) ) then
Prat_PlayerNames.Levels[Name] = Level
if ( Prat_PlayerNames.db.profile.keep) then Prat_PlayerNames.db.profile.levels[Name] = Level end
end
if Class then
Prat_PlayerNames.Classes[Name] = Class
if ( Prat_PlayerNames.db.profile.keep ) then Prat_PlayerNames.db.profile.classes[Name] = Class end
end
if SubGroup then
Prat_PlayerNames.Subgroups[Name] = SubGroup
end
end
end
function Prat_PlayerNames:randomColor(Name)
local hash = 17
for i=1,string.len(Name) do
hash = hash * 37 * string.byte(Name, i);
end
local r = math.floor(math.mod(hash / 97, 255));
local g = math.floor(math.mod(hash / 17, 255));
local b = math.floor(math.mod(hash / 227, 255));
if ((r * 299 + g * 587 + b * 114) / 1000) < 105 then
r = math.abs(r - 255);
g = math.abs(g - 255);
b = math.abs(b - 255);
end
return sformat("%02x%02x%02x", r, g, b)
end
function Prat_PlayerNames:addInfo(Name, id)
if Name then
local returnName = Name
if Prat_PlayerNames.Levels[Name] and Prat_PlayerNames.db.profile.level then
returnName = sformat("%s:%s", Prat_PlayerNames.Levels[Name], returnName)
elseif Prat_PlayerNames.db.profile.census and CensusPlus_ForAllCharacters then
local realmName = g_CensusPlusLocale .. GetCVar("realmName");
CensusPlus_ForAllCharacters( realmName, UnitFactionGroup("player"), nil, nil, nil, nil, Prat_InternalWhoResult)
end
if Prat_PlayerNames.Subgroups[Name] and (id == nil or (chatList[id] and Prat_PlayerNames.db.profile.groupchan[chatList[id].t])) then
local grp = sformat(Prat_PlayerNames.db.profile.groupAcronim,Prat_PlayerNames.Subgroups[Name] or "")
returnName = sformat("%s%s", returnName, grp )
end
if Prat_PlayerNames.Classes[Name] then
if Prat_PlayerNames.db.profile.colormode == "CLASS" then
returnName = sformat("|cff%s%s|r", BC:GetHexColor(Prat_PlayerNames.Classes[Name]), returnName)
elseif Prat_PlayerNames.db.profile.colormode == "RANDOM" then
returnName = sformat("|cff%s%s|r", self:randomColor(Name), returnName)
end
else
if Prat_PlayerNames.db.profile.usecommoncolor then
local color = sformat("%02x%02x%02x", Prat_PlayerNames.db.profile.color.r*255, Prat_PlayerNames.db.profile.color.g*255, Prat_PlayerNames.db.profile.color.b*255)
returnName = sformat("|cff%s%s|r", color, returnName)
end
end
return returnName
else
return ""
end
end
function Prat_InternalWhoResult(Name, Level, guild, race, Class, lastSeen )
if Name then
if Level and Level ~= 0 and ( not ( Prat_PlayerNames.Levels[Name] and Prat_PlayerNames.Levels[Name] > Level ) ) then
Prat_PlayerNames.Levels[Name] = Level
if ( Prat_PlayerNames.db.profile.keep) then Prat_PlayerNames.db.profile.levels[Name] = Level end
end
if Class then
Prat_PlayerNames.Classes[Name] = Class
if ( Prat_PlayerNames.db.profile.keep ) then Prat_PlayerNames.db.profile.classes[Name] = Class end
end
end
end
function gisub(s, pat, repl, n)
pat = sgsub(pat, '(%a)',
function (v) return '['..strupper(v)..strlower(v)..']' end)
if n then
return sgsub(s, pat, repl, n)
else
return sgsub(s, pat, repl)
end
end
function Prat_PlayerNames:AddMessage(frame, text, r, g, b, id)
if text and id then
-- local Name = sgsub(text, ".*|Hplayer:(.-)|h.*", "%1")
-- Sender's name is always the first linked player name in the message
local _, _, Name = sfind(text, "|Hplayer:(.-)|h%[.-]|h")
-- If self.playerName is a clickable link, don't color it
local _, _, linkedName = sfind(text, sformat("Hplayer:(%s)", self.playerName))
if not linkedName then
_, _, linkedName = sfind(text, sformat("|h[(%s)]|h", self.playerName))
end
if not linkedName and Name ~= self.playerName and Prat_PlayerNames.db.profile.markself then
local textL = slower(text)
local playerL = slower(self.playerName)
if sfind(textL, playerL) then
local color = sformat("%02x%02x%02x", Prat_PlayerNames.db.profile.selfcolor.r*255, Prat_PlayerNames.db.profile.selfcolor.g*255, Prat_PlayerNames.db.profile.selfcolor.b*255)
local returnName = sformat("|cff%s%s|r", color, self.playerName)
text = gisub(text, self.playerName, returnName)
PlaySound("FriendJoinGame");
end
end
local Brackets
Name = self:addInfo(Name, id)
if Prat_PlayerNames.db.profile.brackets == "Angled" then
Brackets = "<|Hplayer:%1|h" .. Name .. "|h>"
elseif Prat_PlayerNames.db.profile.brackets == "None" then
Brackets = "|Hplayer:%1|h" .. Name .. "|h"
else
Brackets = "[|Hplayer:%1|h" .. Name .. "|h]"
end
-- Only replace the first instance, and leave any linked names untouched
text = sgsub(text, "|Hplayer:(.-)|h%[.-%]|h(.-:-)", Brackets .. "%2", 1)
end
Prat_PlayerNames.hooks[frame].AddMessage(frame, text, r, g, b, id)
end
function Prat_PlayerNames:TabComplete(enabled)
if enabled then
if not AceLibrary("AceTab-2.0"):IsTabCompletionRegistered("Prat_PlayerNames") then
AceLibrary("AceTab-2.0"):RegisterTabCompletion("Prat_PlayerNames", "",
function(t, text, pos)
for name in pairs(Prat_PlayerNames.Classes) do
table.insert(t, pos == 0 and name..":" or name)
end
end,
function(u, cands)
local text = ""
for _, cand in ipairs(cands) do
cand = sgsub(cand, ":", "")
cand = self:addInfo(cand, nil)
text = text .. " " .. cand
end
Prat:Print("Tab completion : " .. text)
end
)
end
else
if AceLibrary("AceTab-2.0"):IsTabCompletionRegistered("Prat_PlayerNames") then
AceLibrary("AceTab-2.0"):UnregisterTabCompletion("Prat_PlayerNames")
end
end
end