-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPartyState.lua
More file actions
158 lines (132 loc) · 4.2 KB
/
PartyState.lua
File metadata and controls
158 lines (132 loc) · 4.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
--[[
QuestTogether Group Roster State
This file now owns only lightweight group identity data:
1) Normalized player/member names.
2) Current party/raid roster membership.
3) Class metadata for grouped players.
]]
local QuestTogether = _G.QuestTogether
QuestTogether.partyMembers = QuestTogether.partyMembers or {}
QuestTogether.partyMemberOrder = QuestTogether.partyMemberOrder or {}
QuestTogether.partyRosterFingerprint = QuestTogether.partyRosterFingerprint or ""
local function SafeText(value, fallback)
return QuestTogether:SafeToString(value, fallback or "")
end
local function SafeMatch(text, pattern)
local safeText = SafeText(text, "")
if safeText == "" then
return nil
end
local ok, first, second = pcall(string.match, safeText, pattern)
if not ok then
return nil
end
return first, second
end
local function NormalizeRealmName(addon, realmName)
if not realmName or realmName == "" then
realmName = addon.API.GetRealmName() or ""
end
if addon and addon.SafeStripWhitespace then
return addon:SafeStripWhitespace(realmName, "")
end
-- Realm values can come from protected APIs; keep fallback normalization non-fatal.
local okText, textValue = pcall(tostring, realmName)
if not okText then
return ""
end
local okStrip, stripped = pcall(string.gsub, textValue, "%s+", "")
if not okStrip then
return ""
end
return stripped
end
local function SortNames(nameList)
table.sort(nameList, function(left, right)
return SafeText(left, "") < SafeText(right, "")
end)
end
function QuestTogether:NormalizeMemberName(name)
if not name or name == "" then
return nil
end
local baseName, realmName = SafeMatch(name, "^([^%-]+)%-(.+)$")
if not baseName then
baseName = name
realmName = NormalizeRealmName(self, nil)
else
realmName = NormalizeRealmName(self, realmName)
end
local normalized = SafeText(baseName, "") .. "-" .. SafeText(realmName, "")
return normalized
end
function QuestTogether:GetPlayerFullName()
local name, realm = self.API.UnitFullName("player")
if not name then
return nil
end
return SafeText(name, "") .. "-" .. SafeText(NormalizeRealmName(self, realm), "")
end
function QuestTogether:InitializePartyState()
self.partyMembers = self.partyMembers or {}
self.partyMemberOrder = self.partyMemberOrder or {}
self.partyRosterFingerprint = self.partyRosterFingerprint or ""
end
local function AddUnitToRoster(addon, unitToken, membersByName, orderedNames)
if not addon.API.UnitExists(unitToken) then
return
end
local fullName
local unitName, unitRealm = addon.API.UnitFullName(unitToken)
if unitName then
fullName = SafeText(unitName, "") .. "-" .. SafeText(NormalizeRealmName(addon, unitRealm), "")
else
fullName = addon:NormalizeMemberName(addon.API.UnitName(unitToken))
end
if not fullName or membersByName[fullName] then
return
end
local _, classFile = addon.API.UnitClass(unitToken)
membersByName[fullName] = {
fullName = fullName,
displayName = addon:GetShortDisplayName(fullName),
classFile = classFile,
}
orderedNames[#orderedNames + 1] = fullName
end
function QuestTogether:RefreshPartyRoster()
local membersByName = {}
local orderedNames = {}
AddUnitToRoster(self, "player", membersByName, orderedNames)
if self.API.IsInRaid() then
for raidIndex = 1, 40 do
AddUnitToRoster(self, "raid" .. SafeText(raidIndex, ""), membersByName, orderedNames)
end
else
for partyIndex = 1, 4 do
AddUnitToRoster(self, "party" .. SafeText(partyIndex, ""), membersByName, orderedNames)
end
end
SortNames(orderedNames)
self.partyMembers = membersByName
self.partyMemberOrder = orderedNames
self.partyRosterFingerprint = table.concat(orderedNames, "|")
end
function QuestTogether:GetPartyRosterFingerprint()
return self.partyRosterFingerprint or ""
end
function QuestTogether:IsGroupedSender(senderName)
local normalizedName = self:NormalizeMemberName(senderName)
if not normalizedName then
return false
end
return self.partyMembers and self.partyMembers[normalizedName] ~= nil
end
function QuestTogether:GetGroupedSenderClassFile(senderName)
local normalizedName = self:NormalizeMemberName(senderName)
if not normalizedName then
return nil
end
local member = self.partyMembers and self.partyMembers[normalizedName]
return member and member.classFile or nil
end