-- Path of Building
--
-- Class: ArchivesListControl
-- Archives list control.
--
local t_insert = table.insert
local dkjson = require "dkjson"
local archivesUrl = 'https://pobarchives.com'
local PoBArchivesProviderClass = newClass("PoBArchivesProvider", "ExtBuildListProvider",
function(self, mode)
if mode == "builds" then
self.ExtBuildListProvider({"Trending", "Latest"})
else
self.ExtBuildListProvider({"Similar Builds"})
end
self.buildList = {}
self.mode = mode
end
)
function PoBArchivesProviderClass:GetApiUrl()
if self.importCode then
return archivesUrl .. '/api/' .. 'recommendations'
else
return archivesUrl .. '/api/builds?q=' .. string.lower(self.activeList)
end
end
function PoBArchivesProviderClass:GetPageUrl()
local buildsPath = '/builds'
if self.activeList == "Latest" then
return archivesUrl .. buildsPath .. '/yenTGNDb'
end
if self.activeList == "Trending" then
return archivesUrl .. buildsPath .. '/7U8QXU8m?sort=popularity'
end
-- TODO extract id and page
if self.mode == "similar" then
-- return archivesUrl .. buildsPath .. '/?similar=' .. self.importCode
return nil
end
return nil
end
function PoBArchivesProviderClass:GetRecommendations(buildCode, postURL)
local id = LaunchSubScript([[
local code, connectionProtocol, proxyURL = ...
local curl = require("lcurl.safe")
local page = ""
local easy = curl.easy()
easy:setopt_url(']]..postURL..[[')
easy:setopt(curl.OPT_POST, true)
easy:setopt(curl.OPT_USERAGENT, "Path of Building/]]..launch.versionNumber..[[")
easy:setopt(curl.OPT_POSTFIELDS, ']].."importCode="..[['..code)
easy:setopt(curl.OPT_ACCEPT_ENCODING, "")
if connectionProtocol then
easy:setopt(curl.OPT_IPRESOLVE, connectionProtocol)
end
if proxyURL then
easy:setopt(curl.OPT_PROXY, proxyURL)
end
easy:setopt_writefunction(function(data)
page = page..data
return true
end)
easy:perform()
local res = easy:getinfo_response_code()
easy:close()
return page, res
]], "", "", buildCode, launch.connectionProtocol, launch.proxyURL)
if id then
launch:RegisterSubScript(id, function(response, errMsg)
if errMsg == 200 then
self.statusMsg = nil
self:ParseBuilds(response)
return
else
self.statusMsg = "Error while fetching similar builds: " .. errMsg
return
end
end)
end
end
function PoBArchivesProviderClass:ParseBuilds(message)
local obj = dkjson.decode(message)
if not obj or not obj.builds or next(obj.builds) == nil then
self.statusMsg = "No builds found."
return
end
for _, value in pairs(obj.builds) do
local build = {}
build.buildName = value.build_info.title
build.author = value.build_info.author
build.mainSkill = value.build_info.mainSkill
if value.build_info.ascendancy ~= "None" then
build.ascendancy = value.build_info.ascendancy
end
if value.build_info.class ~= "None" then
build.class = value.build_info.class
end
build.previewLink = archivesUrl .. "/build/" .. value.build_info.short_uuid
build.buildLink = value.build_info.build_link
build.ehp = value.stats.TotalEHP
build.life = value.stats.LifeUnreserved
build.es = value.stats.EnergyShield
build.dps = value.fullDPS
build.version = value.tree and value.tree.version
if value.similarity_score then
build.metadata = {
{key="Match Score", value=value.similarity_score},
}
end
-- build.score = value.similarity_score
t_insert(self.buildList, build)
end
end
function PoBArchivesProviderClass:GetBuilds()
self.statusMsg = "Loading.."
wipeTable(self.buildList)
self.contentHeight = nil
if self.mode == 'similar' then
self:GetRecommendations(self.importCode,self:GetApiUrl())
return
else
launch:DownloadPage(self:GetApiUrl(), function(response, errMsg)
if errMsg then
self.statusMsg = errMsg
return
end
self:ParseBuilds(response.body)
self.statusMsg = nil
end, {})
end
end