-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathversioncontroll.lua
More file actions
163 lines (138 loc) · 4.26 KB
/
versioncontroll.lua
File metadata and controls
163 lines (138 loc) · 4.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
Achiever = Achiever or {}
AchieverSettings = AchieverSettings or {}
-- Version comparison function
function IsNewerVersion(a, b)
local function split(v)
local major, minor, patch = string.match(v, "(%d+)%.(%d+)%.(%d+)")
return tonumber(major), tonumber(minor), tonumber(patch)
end
local a1, a2, a3 = split(a)
local b1, b2, b3 = split(b)
if a1 ~= b1 then
return a1 > b1
end
if a2 ~= b2 then
return a2 > b2
end
return a3 > b3
end
function GetAvailableChannels()
local available = {}
if IsInGuild() then
table.insert(available, "GUILD")
end
if UnitInParty("player") then
table.insert(available, "PARTY")
end
if UnitInRaid("player") then
table.insert(available, "RAID")
end
if UnitInBattleground("player") then
table.insert(available, "BATTLEGROUND")
end
-- You could also check joined custom channels
--[[ for i = 1, GetNumDisplayChannels() do
local name, _, _, _, _, _, channelID = GetChannelDisplayInfo(i)
if name then
table.insert(available, channelID)
-- You’d pass the numeric ID when using SendAddonMessage for CHANNEL
end
end ]]
return available
end
function Achiever:Broadcast(txt, channel)
if not txt or txt == "" then
return
end
local channel = channel or nil
local channels = GetAvailableChannels()
--print(txt)
--print(channel)
if #txt > 255 then
DEFAULT_CHAT_FRAME:AddMessage("Achiever.Broadcast: Message too long! Max 255 Chars!")
return
end
if channel then
for _, ch in ipairs(channels) do
if channel == ch then
SendAddonMessage("Achiever", txt, channel)
-- DEFAULT_CHAT_FRAME:AddMessage("Achiever send message into " .. channel .. ".")
return
end
end
DEFAULT_CHAT_FRAME:AddMessage("Achiever.Broadcast: Invalid Channel! " .. channel)
return
end
for _, ch in ipairs(channels) do
SendAddonMessage("Achiever", txt, ch)
return
end
DEFAULT_CHAT_FRAME:AddMessage("Achiever.Broadcast: No Channels Found!")
end
-- Event frame
local versionFrame = CreateFrame("Frame")
versionFrame:RegisterEvent("PLAYER_LOGIN")
versionFrame:RegisterEvent("GROUP_ROSTER_UPDATE")
versionFrame:SetScript("OnEvent", function(_, event)
if event == "PLAYER_LOGIN" or event == "GROUP_ROSTER_UPDATE" then
Achiever:Broadcast("VERSION:" .. Achiever.version)
end
end)
-- Register Addon Message listener
local f = CreateFrame("Frame")
f:RegisterEvent("CHAT_MSG_ADDON")
-- Broadcasting a check request
function Achiever:SendVersionCheck()
local checkID = math.random(99999)
self.pendingChecks[checkID] = {}
DEFAULT_CHAT_FRAME:AddMessage("|cffaaff00Achiever:|r Sending check (ID: " .. checkID .. ")...")
self:Broadcast(("CHECK:" .. tostring(checkID)))
end
-- Handle Incoming messages
f:SetScript("OnEvent", function(_, _, prefix, msg, channel, sender)
if prefix ~= "Achiever" or sender == Achiever.playerName then
return
end
-- Debug
-- print(prefix, msg, channel, sender)
-- Check Request
local checkID = msg:match("^CHECK:(%d+)$")
if checkID then
Achiever:Broadcast("RESPONSE:" .. checkID .. ":" .. Achiever.version, channel)
return
end
local respCheckID, theirVersion = msg:match("^RESPONSE:(%d+):(.+)$")
if respCheckID and theirVersion then
respCheckID = tonumber(respCheckID)
if Achiever.pendingChecks[respCheckID] then
Achiever.pendingChecks[respCheckID][sender] = theirVersion
DEFAULT_CHAT_FRAME:AddMessage(
"|cffaaff00Achiever:|r " .. sender .. " responded with version " .. theirVersion
)
--[[ else
DEFAULT_CHAT_FRAME:AddMessage("No pending check found for CheckID:", respCheckID) ]]
end
return
end
local theirVersionPassive = msg:match("^VERSION:(.+)")
if theirVersionPassive then
-- print("|cffaaff00Achiever:|r Received version " .. theirVersionPassive .. " from " .. sender) -- Debug
if
IsNewerVersion(theirVersionPassive, Achiever.version)
and AchieverSettings.lastNotifiedVersion ~= theirVersionPassive
then
DEFAULT_CHAT_FRAME:AddMessage(
"|cffffaa00Achiever:|r New version available (v" .. theirVersionPassive .. ") from " .. sender
)
DEFAULT_CHAT_FRAME:AddMessage(
"|cffffaa00"
.. "Achiever:"
.. "|r"
.. "You can download it from "
.. "https://github.com/Zaphirez/Achiever/releases/latest"
)
AchieverSettings.lastNotifiedVersion = theirVersionPassive
end
return
end
end)