You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

189 lines
6.8 KiB

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local TSM = select(2, ...) ---@type TSM
local AppHelper = TSM:NewPackage("AppHelper")
local Environment = TSM.Include("Environment")
local ClassicRealms = TSM.Include("Data.ClassicRealms")
local Wow = TSM.Include("Util.Wow")
local Log = TSM.Include("Util.Log")
local AuctionHouseWrapper = TSM.Include("Service.AuctionHouseWrapper")
local LibRealmInfo = LibStub("LibRealmInfo")
local private = {
-- The addon has historically had the game version as a suffix, whereas the app data has it as a prefix, so we store both
addonRegion = nil,
appDataRegion = nil,
appInfo = nil,
auctionDBData = {},
shoppingData = nil,
}
local APP_INFO_REQUIRED_KEYS = { "version", "lastSync", "message", "news" }
local AUCTIONDB_REALM_TAGS = {
AUCTIONDB_REALM_DATA = true,
AUCTIONDB_REALM_SCAN_STAT = true,
AUCTIONDB_REALM_HISTORICAL = true,
}
local AUCTIONDB_REGION_TAGS = {
AUCTIONDB_REGION_COMMODITY = true,
AUCTIONDB_REGION_HISTORICAL = true,
AUCTIONDB_REGION_SALE = true,
AUCTIONDB_REGION_STAT = true,
}
-- ============================================================================
-- Global Function
-- ============================================================================
function TSM_APPHELPER_LOAD_DATA(tag, realmOrRegion, data)
if type(tag) ~= "string" or type(realmOrRegion) ~= "string" or type(data) ~= "string" then
Log.Err("Unknown AppHelper data: %s, %s, %s", strsub(tostring(tag), 1, 20), strsub(tostring(realmOrRegion), 1, 20), strsub(tostring(data), 1, 20))
return
end
if tag == "APP_INFO" and realmOrRegion == "Global" then
if realmOrRegion ~= "Global" then
Log.Info("Ignoring app info for '%s'", realmOrRegion)
return
elseif private.appInfo then
Log.Err("Duplicate app info")
return
end
Log.Info("Got app info")
-- Load the app info
private.appInfo = assert(loadstring(data))()
for _, key in ipairs(APP_INFO_REQUIRED_KEYS) do
assert(private.appInfo[key])
end
-- Clean up the news content strings
for _, info in ipairs(private.appInfo.news) do
-- For some reason the data is missing a few newlines before bold headings, so add one
info.content = gsub(info.content, "(<strong>)", "\n\n%1")
info.content = gsub(info.content, "<br%s+/>", "\n")
info.content = gsub(info.content, "<strong>(.-)</strong>", "%1")
info.content = gsub(info.content, "<a href='.-'>(.-)</a>", "%1")
info.content = gsub(info.content, "&#8211;", "-")
info.content = gsub(info.content, "&#8216;", "'")
end
elseif AUCTIONDB_REALM_TAGS[tag] or AUCTIONDB_REGION_TAGS[tag] then
if (AUCTIONDB_REALM_TAGS[tag] and private.IsCurrentRealm(realmOrRegion)) or (AUCTIONDB_REGION_TAGS[tag] and realmOrRegion == private.appDataRegion) then
if private.auctionDBData[tag] then
Log.Err("Duplicate AuctionDB data (%s)", tag)
return
end
private.auctionDBData[tag] = data
Log.Info("Got AuctionDB data (%s)", tag)
else
Log.Info("Ignoring AuctionDB data (%s) for '%s'", tag, realmOrRegion)
end
elseif tag == "SHOPPING_SEARCHES" then
if not private.IsCurrentRealm(realmOrRegion) then
Log.Info("Ignoring Shopping data for '%s'", realmOrRegion)
return
elseif private.shoppingData then
Log.Err("Duplicate Shopping data")
return
end
private.shoppingData = data
Log.Info("Got Shopping data")
else
Log.Err("Unknown AppHelper data: %s, %s", strsub(tag, 1, 25), strsub(realmOrRegion, 1, 25))
end
end
-- ============================================================================
-- Module Functions
-- ============================================================================
function AppHelper.OnInitialize()
local cVar = GetCVar("Portal")
local region = nil
if Environment.IsRetail() then
region = LibRealmInfo:GetCurrentRegion() or (cVar ~= "public-test" and cVar) or "PTR"
else
local currentRealmName = private.SanitizedRealmName(Wow.GetRealmName())
region = ClassicRealms.GetRegion(currentRealmName) or (cVar ~= "public-test" and cVar) or "PTR"
end
if Environment.IsRetail() then
private.addonRegion = region
private.appDataRegion = region
elseif Environment.IsClassicHardcore() then
private.addonRegion = region.."-HC"
private.appDataRegion = "HC-"..region
elseif Environment.IsClassicDiscovery() then
private.addonRegion = region.."-SoD"
private.appDataRegion = "SoD-"..region
elseif Environment.IsVanillaClassic() then
private.addonRegion = region.."-Classic"
private.appDataRegion = "Classic-"..region
elseif Environment.IsWrathClassic() or Environment.IsCataClassic() then
private.addonRegion = region.."-BCC"
private.appDataRegion = "BCC-"..region
else
error("Invalid game version")
end
AuctionHouseWrapper.SetAnalyticsRegionRealm(private.addonRegion.."-"..private.SanitizedRealmName(Wow.GetRealmName()))
end
function AppHelper.OnEnable()
TSM_APPHELPER_LOAD_DATA = nil
end
function AppHelper.GetLastSync()
return private.appInfo and private.appInfo.lastSync or nil
end
function AppHelper.GetMessage()
if not private.appInfo then
return
end
return private.appInfo.message.msg, private.appInfo.message.id
end
function AppHelper.GetNews()
return private.appInfo and private.appInfo.news or nil
end
function AppHelper.GetRegion()
return private.addonRegion
end
function AppHelper.GetAuctionDBData()
local realmData = private.auctionDBData["AUCTIONDB_REALM_DATA"]
local realmScanStat = private.auctionDBData["AUCTIONDB_REALM_SCAN_STAT"]
local realmHistorical = private.auctionDBData["AUCTIONDB_REALM_HISTORICAL"]
local regionCommodity = private.auctionDBData["AUCTIONDB_REGION_COMMODITY"]
local regionStat = private.auctionDBData["AUCTIONDB_REGION_STAT"]
local regionHistorical = private.auctionDBData["AUCTIONDB_REGION_HISTORICAL"]
local regionSale = private.auctionDBData["AUCTIONDB_REGION_SALE"]
return realmData, realmScanStat, realmHistorical, regionCommodity, regionStat, regionHistorical, regionSale
end
function AppHelper.GetShoppingData()
return private.shoppingData
end
-- ============================================================================
-- Module Functions
-- ============================================================================
function private.SanitizedRealmName(realm)
return gsub(realm, "\226", "'")
end
function private.IsCurrentRealm(realm)
local currentRealmName = private.SanitizedRealmName(Wow.GetRealmName())
if not Environment.HasFeature(Environment.FEATURES.CONNECTED_FACTION_AH) then
currentRealmName = currentRealmName.."-"..Wow.GetFactionName()
end
return strlower(private.SanitizedRealmName(realm)) == strlower(currentRealmName)
end