MosswartMassacre/flagtracker/quests.lua
2025-06-09 02:03:11 +02:00

110 lines
No EOL
3.1 KiB
Lua

local libQuest = {
List = {},
Dictionary = {}
}
---@class Quest: Object
---@field id number
---@field solves number
---@field timestamp number
---@field description string
---@field maxsolves number
---@field delta number
---@field expiretime number
local function OnChatText(evt)
local taskname, solves, timestamp, description, maxsolves, delta = string.match(evt.Message, "([%w%s%(%)-]+) %- (%d+) solves %((%d+)%)\"([^\"]+)\" (%-?%d+) (%d+)")
if taskname and solves and timestamp and description and maxsolves and delta then
table.insert(libQuest.List, {id=taskname,solves=solves,timestamp=timestamp,description=description,maxsolves=maxsolves,delta=delta,expiretime=timestamp+delta})
libQuest.Dictionary[taskname] = {id=taskname,solves=solves,timestamp=timestamp,description=description,maxsolves=maxsolves,delta=delta,expiretime=timestamp+delta}
end
end
function libQuest:Clear()
self.List = {}
self.Dictionary = {}
end
function libQuest:Refresh()
self:Clear()
game.OnTick.Once(function (evt)
game.World.OnChatText.Add(OnChatText)
sleep(100)
game.Actions.InvokeChat("/myquests")
sleep(3000)
game.World.OnChatText.Remove(OnChatText)
end)
end
function libQuest:IsQuestAvailable(queststamp)
local quest = self.Dictionary[queststamp]
if quest == nil then return true end
return quest.expiretime < os.time()
end
function libQuest:IsQuestMaxSolved(queststamp)
local quest = self.Dictionary[queststamp]
if quest == nil then return false end
if tonumber(quest.maxsolves) == tonumber(quest.solves) then return true end
return false
end
function libQuest:HasQuestFlag(queststamp)
local quest = self.Dictionary[queststamp]
return quest ~= nil
end
function libQuest:GetFieldByID(quest, id)
local fields = {
quest.id,
quest.solves,
quest.timestamp,
quest.maxsolves,
quest.delta,
quest.expiretime
}
return fields[id] or quest.id
end
function libQuest:FormatTimeStamp(time)
return tostring(os.date("%m/%d/%Y %H:%M:%S", time))
end
function libQuest:FormatSeconds(seconds)
if seconds <= 0 then
return "0s"
end
local days = math.floor(seconds / 86400)
seconds = seconds % 86400
local hours = math.floor(seconds / 3600)
seconds = seconds % 3600
local minutes = math.floor(seconds / 60)
seconds = math.floor(seconds % 60)
local result = ""
if days > 0 then
result = result .. days .. "d "
end
if hours > 0 then
result = result .. hours .. "h "
end
if minutes > 0 then
result = result .. minutes .. "m "
end
if seconds > 0 or result == "" then
result = result .. seconds .. "s"
end
return result:match("^%s*(.-)%s*$") -- Trim any trailing space
end
function libQuest:GetTimeUntilExpire(quest)
if quest == nil then return "Unknown" end
local expireTime = self:FormatSeconds(quest.expiretime - os.time())
if expireTime == "0s" then
return "Ready"
end
return expireTime
end
return libQuest