TradeSkillMaster/LibTSM/Service/PlayerInfo.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