mirror of
https://codeberg.org/Duvelcorp/MetaHunt.git
synced 2026-09-28 10:36:04 +00:00
v1.0.4
This commit is contained in:
@@ -0,0 +1,179 @@
|
||||
MTH = MTH or {}
|
||||
MTH.VersionCheck = MTH.VersionCheck or {}
|
||||
|
||||
local VC = MTH.VersionCheck
|
||||
VC.abbrev = "MTH"
|
||||
VC.channelName = "LFT"
|
||||
VC.nextPublishAt = nil
|
||||
VC.joinAt = nil
|
||||
VC.notified = false
|
||||
VC._invalidVersionWarned = false
|
||||
|
||||
local function VC_GetTimeNow()
|
||||
if type(time) == "function" then
|
||||
return time()
|
||||
end
|
||||
if type(GetTime) == "function" then
|
||||
return math.floor(GetTime())
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
function VC:GetLocalVersionString()
|
||||
if MTH and MTH.version and tostring(MTH.version) ~= "" then
|
||||
return tostring(MTH.version)
|
||||
end
|
||||
local getMeta = _G and _G["GetAddOnMetadata"] or nil
|
||||
if type(getMeta) == "function" then
|
||||
local v = getMeta("MetaHunt", "Version")
|
||||
if v and v ~= "" then
|
||||
return tostring(v)
|
||||
end
|
||||
end
|
||||
return "0.0.0"
|
||||
end
|
||||
|
||||
function VC:GetLocalVersionNumber()
|
||||
local versionText = self:GetLocalVersionString()
|
||||
local _, _, major, minor, patch = string.find(tostring(versionText or ""), "^(%d+)%.(%d+)%.?(%d*)$")
|
||||
if not major then
|
||||
return nil
|
||||
end
|
||||
major = tonumber(major) or 0
|
||||
minor = tonumber(minor) or 0
|
||||
patch = tonumber(patch) or 0
|
||||
return (major * 1000000) + (minor * 1000) + patch
|
||||
end
|
||||
|
||||
local function VC_GetChannelIdByName(channelName)
|
||||
if type(GetChannelName) ~= "function" then
|
||||
return nil
|
||||
end
|
||||
local id = nil
|
||||
local name = nil
|
||||
id, name = GetChannelName(channelName)
|
||||
id = tonumber(id)
|
||||
if id and id > 0 then
|
||||
return id
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
local function VC_IsOurChannel(name)
|
||||
return type(name) == "string" and string.lower(name) == string.lower(VC.channelName)
|
||||
end
|
||||
|
||||
function VC:ResetPublishDelay()
|
||||
self.nextPublishAt = VC_GetTimeNow() + math.random(10, 20)
|
||||
end
|
||||
|
||||
function VC:ShouldPublish()
|
||||
return self.nextPublishAt and VC_GetTimeNow() >= self.nextPublishAt
|
||||
end
|
||||
|
||||
function VC:TryPublish()
|
||||
if type(SendChatMessage) ~= "function" then
|
||||
return false
|
||||
end
|
||||
local channelId = VC_GetChannelIdByName(self.channelName)
|
||||
if not channelId then
|
||||
if type(JoinChannelByName) == "function" then
|
||||
JoinChannelByName(self.channelName, "", 0, false)
|
||||
end
|
||||
return false
|
||||
end
|
||||
local localVersionNumber = self:GetLocalVersionNumber()
|
||||
if not localVersionNumber or localVersionNumber <= 0 then
|
||||
if not self._invalidVersionWarned and MTH and type(MTH.Print) == "function" then
|
||||
self._invalidVersionWarned = true
|
||||
MTH:Print("Version check disabled: invalid local version format.")
|
||||
end
|
||||
return false
|
||||
end
|
||||
local payload = self.abbrev .. ":" .. tostring(localVersionNumber) .. ":v"
|
||||
SendChatMessage(payload, "CHANNEL", nil, tostring(channelId))
|
||||
return true
|
||||
end
|
||||
|
||||
function VC:HandleRemoteMessage(message, author, channelLabel)
|
||||
if self.notified then
|
||||
return
|
||||
end
|
||||
if not message or message == "" then
|
||||
return
|
||||
end
|
||||
if author and UnitName and author == UnitName("player") then
|
||||
return
|
||||
end
|
||||
local channelName = string.gsub(tostring(channelLabel or ""), "^%d+%.%s*", "")
|
||||
if not VC_IsOurChannel(channelName) then
|
||||
return
|
||||
end
|
||||
if string.find(message, self.abbrev .. ":", 1, true) ~= 1 then
|
||||
return
|
||||
end
|
||||
|
||||
local _, _, addonTag, remoteVersion = string.find(message, "^([^:]+):([^:]+):")
|
||||
if addonTag ~= self.abbrev then
|
||||
return
|
||||
end
|
||||
local remoteNumber = tonumber(remoteVersion)
|
||||
if not remoteNumber or remoteNumber <= 0 then
|
||||
return
|
||||
end
|
||||
local localVersionNumber = self:GetLocalVersionNumber()
|
||||
if not localVersionNumber or localVersionNumber <= 0 then
|
||||
return
|
||||
end
|
||||
if remoteNumber <= localVersionNumber then
|
||||
return
|
||||
end
|
||||
|
||||
self.notified = true
|
||||
self.nextPublishAt = nil
|
||||
if MTH and type(MTH.Print) == "function" then
|
||||
MTH:Print("A new version is available !")
|
||||
end
|
||||
|
||||
if VC.frame then
|
||||
VC.frame:UnregisterEvent("CHAT_MSG_CHANNEL")
|
||||
VC.frame:SetScript("OnUpdate", nil)
|
||||
end
|
||||
end
|
||||
|
||||
if not VC.frame then
|
||||
local frame = CreateFrame("Frame", "MTHVersionCheckFrame", UIParent)
|
||||
if frame then
|
||||
VC.frame = frame
|
||||
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||
frame:RegisterEvent("CHAT_MSG_CHANNEL")
|
||||
frame:SetScript("OnEvent", function()
|
||||
if event == "PLAYER_ENTERING_WORLD" then
|
||||
VC.joinAt = GetTime() + 6
|
||||
VC:ResetPublishDelay()
|
||||
elseif event == "CHAT_MSG_CHANNEL" then
|
||||
VC:HandleRemoteMessage(arg1, arg2, arg4)
|
||||
end
|
||||
end)
|
||||
frame:SetScript("OnUpdate", function()
|
||||
if (this._mthTick or 1) > GetTime() then
|
||||
return
|
||||
end
|
||||
this._mthTick = GetTime() + 1
|
||||
|
||||
if VC.joinAt and GetTime() >= VC.joinAt then
|
||||
if not VC_GetChannelIdByName(VC.channelName) and type(JoinChannelByName) == "function" then
|
||||
JoinChannelByName(VC.channelName, "", 0, false)
|
||||
end
|
||||
VC.joinAt = nil
|
||||
end
|
||||
|
||||
if VC:ShouldPublish() then
|
||||
if VC:TryPublish() then
|
||||
VC.nextPublishAt = nil
|
||||
this:SetScript("OnUpdate", nil)
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user