initial commit
This commit is contained in:
157
LibTSM/Service/PlayerInfo.lua
Normal file
157
LibTSM/Service/PlayerInfo.lua
Normal file
@@ -0,0 +1,157 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- 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
|
||||
Reference in New Issue
Block a user