158 lines
5.8 KiB
Lua
158 lines
5.8 KiB
Lua
|
-- ------------------------------------------------------------------------------ --
|
||
|
-- TradeSkillMaster --
|
||
|
-- https://tradeskillmaster.com --
|
||
|
-- All Rights Reserved - Detailed license information included with addon. --
|
||
|
-- ------------------------------------------------------------------------------ --
|
||
|
|
||
|
--- PlayerInfo Functions
|
||
|
-- @module PlayerInfo
|
||
|
|
||
|
local _, TSM = ...
|
||
|
local PlayerInfo = TSM.Init("Service.PlayerInfo")
|
||
|
local String = TSM.Include("Util.String")
|
||
|
local Settings = TSM.Include("Service.Settings")
|
||
|
local private = {
|
||
|
connectedAlts = {},
|
||
|
settings = nil,
|
||
|
isPlayerCache = {},
|
||
|
}
|
||
|
local PLAYER_NAME = UnitName("player")
|
||
|
local PLAYER_LOWER = strlower(PLAYER_NAME)
|
||
|
local FACTION_LOWER = strlower(UnitFactionGroup("player"))
|
||
|
local REALM_LOWER = strlower(GetRealmName())
|
||
|
local PLAYER_REALM_LOWER = PLAYER_LOWER.." - "..REALM_LOWER
|
||
|
|
||
|
|
||
|
|
||
|
-- ============================================================================
|
||
|
-- Module Loading
|
||
|
-- ============================================================================
|
||
|
|
||
|
PlayerInfo:OnSettingsLoad(function()
|
||
|
private.settings = Settings.NewView()
|
||
|
:AddKey("factionrealm", "internalData", "guildVaults")
|
||
|
:AddKey("factionrealm", "coreOptions", "ignoreGuilds")
|
||
|
:AddKey("factionrealm", "internalData", "characterGuilds")
|
||
|
end)
|
||
|
|
||
|
|
||
|
|
||
|
-- ============================================================================
|
||
|
-- Module Functions
|
||
|
-- ============================================================================
|
||
|
|
||
|
--- Return all connected realm alternative characters.
|
||
|
-- @return table The populated alternative characters.
|
||
|
function PlayerInfo.GetConnectedAlts()
|
||
|
wipe(private.connectedAlts)
|
||
|
for factionrealm in TSM.db:GetConnectedRealmIterator("factionrealm") do
|
||
|
for _, character in TSM.db:FactionrealmCharacterIterator(factionrealm) do
|
||
|
local realm = strmatch(factionrealm, ".+ %- (.+)")
|
||
|
character = Ambiguate(gsub(strmatch(character, "(.*) ?"..String.Escape("-").."?").."-"..gsub(realm, String.Escape("-"), ""), " ", ""), "none")
|
||
|
if character ~= UnitName("player") then
|
||
|
tinsert(private.connectedAlts, character)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
sort(private.connectedAlts)
|
||
|
return private.connectedAlts
|
||
|
end
|
||
|
|
||
|
--- Iterate over all characters on this factionrealm.
|
||
|
-- @tparam[opt=false] boolean currentAccountOnly If true, will only include the current account
|
||
|
-- @return An iterator with the following fields: `index, name`
|
||
|
function PlayerInfo.CharacterIterator(currentAccountOnly)
|
||
|
if currentAccountOnly then
|
||
|
return Settings.CharacterByAccountFactionrealmIterator()
|
||
|
else
|
||
|
return Settings.FactionrealmCharacterIterator()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
--- Iterate over all guilds on this factionrealm.
|
||
|
-- @tparam[opt=false] boolean includeIgnored If true, will include guilds which have been set to be ignored
|
||
|
-- @return An iterator with the following fields: `index, guildName`
|
||
|
function PlayerInfo.GuildIterator(includeIgnored)
|
||
|
if includeIgnored then
|
||
|
return private.GuildIteratorIgnoreIncluded, private.settings.guildVaults
|
||
|
else
|
||
|
return private.GuildIterator, private.settings.guildVaults
|
||
|
end
|
||
|
end
|
||
|
|
||
|
--- Get the player's guild.
|
||
|
-- @tparam string player The name of the player
|
||
|
-- @treturn ?string The name of the player's guilde or nil if it's not in one
|
||
|
function PlayerInfo.GetPlayerGuild(player)
|
||
|
return player and private.settings.characterGuilds[player] or nil
|
||
|
end
|
||
|
|
||
|
--- Check whether or not a player belongs to the user.
|
||
|
-- @tparam string target The name of the player
|
||
|
-- @tparam boolean includeAlts Whether or not to include alts
|
||
|
-- @tparam boolean includeOtherFaction Whether or not to include players on the other faction
|
||
|
-- @tparam boolean includeOtherAccounts Whether or not to include connected accounts
|
||
|
-- @treturn boolean Whether or not the player belongs to the user
|
||
|
function PlayerInfo.IsPlayer(target, includeAlts, includeOtherFaction, includeOtherAccounts)
|
||
|
local cacheKey = strjoin("%", target, includeAlts and "1" or "0", includeOtherFaction and "1" or "0", includeOtherAccounts and "1" or "0")
|
||
|
if private.isPlayerCache.lastUpdate ~= GetTime() then
|
||
|
wipe(private.isPlayerCache)
|
||
|
private.isPlayerCache.lastUpdate = GetTime()
|
||
|
end
|
||
|
if private.isPlayerCache[cacheKey] == nil then
|
||
|
private.isPlayerCache[cacheKey] = private.IsPlayerHelper(target, includeAlts, includeOtherFaction, includeOtherAccounts)
|
||
|
end
|
||
|
return private.isPlayerCache[cacheKey]
|
||
|
end
|
||
|
|
||
|
|
||
|
|
||
|
-- ============================================================================
|
||
|
-- Private Helper Functions
|
||
|
-- ============================================================================
|
||
|
|
||
|
function private.IsPlayerHelper(target, includeAlts, includeOtherFaction, includeOtherAccounts)
|
||
|
target = strlower(target)
|
||
|
if not strfind(target, " %- ") then
|
||
|
target = gsub(target, "%-", " - ", 1)
|
||
|
end
|
||
|
if target == PLAYER_LOWER then
|
||
|
return true
|
||
|
elseif strfind(target, " %- ") and target == PLAYER_REALM_LOWER then
|
||
|
return true
|
||
|
end
|
||
|
if not strfind(target, " %- ") then
|
||
|
target = target.." - "..REALM_LOWER
|
||
|
end
|
||
|
if includeAlts then
|
||
|
local result = false
|
||
|
for _, factionrealm, character in Settings.ConnectedFactionrealmAltCharacterIterator() do
|
||
|
local factionKey, realm = strmatch(factionrealm, "(.+) %- (.+)")
|
||
|
factionKey = strlower(factionKey)
|
||
|
if not result and target == strlower(character).." - "..strlower(realm) and (includeOtherFaction or factionKey == FACTION_LOWER) and (includeOtherAccounts or Settings.IsCurrentAccountOwner(character)) then
|
||
|
result = true
|
||
|
end
|
||
|
end
|
||
|
return result
|
||
|
end
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
function private.GuildIterator(tbl, prevName)
|
||
|
while true do
|
||
|
local name = next(tbl, prevName)
|
||
|
if not name then
|
||
|
return nil
|
||
|
end
|
||
|
if not private.settings.ignoreGuilds[name] then
|
||
|
return name
|
||
|
end
|
||
|
prevName = name
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function private.GuildIteratorIgnoreIncluded(tbl, prevName)
|
||
|
local name = next(tbl, prevName)
|
||
|
return name
|
||
|
end
|