LibElvUIPlugin-1.0.lua 8.74 KB
Newer Older
Simpy's avatar
Simpy committed
1
local MAJOR, MINOR = 'LibElvUIPlugin-1.0', 22
Elv's avatar
Elv committed
2 3 4 5 6
local lib, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not lib then return end

--Cache global variables
--Lua functions
7 8
local pairs, tonumber, strmatch, strsub = pairs, tonumber, strmatch, strsub
local format, strsplit, strlen, gsub, ceil = format, strsplit, strlen, gsub, ceil
Elv's avatar
Elv committed
9
--WoW API / Variables
Simpy's avatar
Simpy committed
10
local GetNumGroupMembers = GetNumGroupMembers
11
local GetLocale, IsInGuild = GetLocale, IsInGuild
12 13
local CreateFrame, IsAddOnLoaded = CreateFrame, IsAddOnLoaded
local GetAddOnMetadata, GetChannelName = GetAddOnMetadata, GetChannelName
Simpy's avatar
Simpy committed
14 15 16
local IsInRaid, IsInGroup = IsInRaid, IsInGroup
local LE_PARTY_CATEGORY_HOME = LE_PARTY_CATEGORY_HOME
local LE_PARTY_CATEGORY_INSTANCE = LE_PARTY_CATEGORY_INSTANCE
17
local C_ChatInfo_RegisterAddonMessagePrefix = C_ChatInfo.RegisterAddonMessagePrefix
Simpy's avatar
Simpy committed
18
local C_ChatInfo_SendAddonMessage = C_ChatInfo.SendAddonMessage
Elv's avatar
Elv committed
19 20 21 22 23 24

--Global variables that we don't cache, list them here for the mikk's Find Globals script
-- GLOBALS: ElvUI

lib.plugins = {}
lib.index = 0
25
lib.groupSize = 0
Simpy's avatar
Simpy committed
26
lib.prefix = 'ElvUIPluginVC'
Elv's avatar
Elv committed
27 28

-- MULTI Language Support (Default Language: English)
29
local MSG_OUTDATED = "Your version of %s %s is out of date (latest is version %s). You can download the latest version from http://www.tukui.org"
Elv's avatar
Elv committed
30 31 32 33 34 35 36 37
local HDR_CONFIG = "Plugins"
local HDR_INFORMATION = "LibElvUIPlugin-1.0.%d - Plugins Loaded  (Green means you have current version, Red means out of date)"
local INFO_BY = "by"
local INFO_VERSION = "Version:"
local INFO_NEW = "Newest:"
local LIBRARY = "Library"

if GetLocale() == "deDE" then -- German Translation
38
	MSG_OUTDATED = "Deine Version von %s %s ist veraltet (akutelle Version ist %s). Du kannst die aktuelle Version von http://www.tukui.org herunterrladen."
Elv's avatar
Elv committed
39 40 41 42 43 44 45 46 47
	HDR_CONFIG = "Plugins"
	HDR_INFORMATION = "LibElvUIPlugin-1.0.%d - Plugins geladen (Grün bedeutet du hast die aktuelle Version, Rot bedeutet es ist veraltet)"
	INFO_BY = "von"
	INFO_VERSION = "Version:"
	INFO_NEW = "Neuste:"
	LIBRARY = "Bibliothek"
end

if GetLocale() == "ruRU" then -- Russian Translations
48
	MSG_OUTDATED = "Ваша версия %s %s устарела (последняя версия %s). Вы можете скачать последнюю версию на http://www.tukui.org"
Elv's avatar
Elv committed
49 50 51 52 53 54 55 56
	HDR_CONFIG = "Плагины"
	HDR_INFORMATION = "LibElvUIPlugin-1.0.%d - загруженные плагины (зеленый означает, что у вас последняя версия, красный - устаревшая)"
	INFO_BY = "от"
	INFO_VERSION = "Версия:"
	INFO_NEW = "Последняя:"
	LIBRARY = "Библиотека"
end

57
function lib:GenerateVersionCheckMessage()
Simpy's avatar
Simpy committed
58
	local list = ''
59 60
	for _, plugin in pairs(lib.plugins) do
		if plugin.name ~= MAJOR then
Simpy's avatar
Simpy committed
61
			list = list..plugin.name..'='..plugin.version..';'
62 63 64 65 66 67 68 69 70
		end
	end
	return list
end

local function SendPluginVersionCheck()
	lib:SendPluginVersionCheck(lib:GenerateVersionCheckMessage())
end

71 72 73 74 75 76 77 78
local function DelayedSendVersionCheck()
	local E = ElvUI[1]

	if not E.SendPluginVersionCheck then
		ElvUI[1].SendPluginVersionCheck = SendPluginVersionCheck
	end

	if not lib.SendMessageTimer then
Simpy's avatar
Simpy committed
79
		lib.SendMessageTimer = E:ScheduleTimer('SendPluginVersionCheck', 10)
80 81 82
	end
end

Simpy's avatar
Simpy committed
83 84 85 86 87 88 89 90 91 92 93 94 95
--
-- Plugin table format:
--   { name (string) - The name of the plugin,
--     version (string) - The version of the plugin,
--     optionCallback (string) - The callback to call when ElvUI_Config is loaded
--   }
--

--
-- RegisterPlugin(name,callback)
--   Registers a module with the given name and option callback, pulls version info from metadata
--

96 97
function lib:RegisterPlugin(name, callback, isLib)
	if not ElvUI then return end -- lol?
98
	local E = ElvUI[1]
99

Elv's avatar
Elv committed
100 101
    local plugin = {}
	plugin.name = name
Simpy's avatar
Simpy committed
102
	plugin.version = name == MAJOR and MINOR or GetAddOnMetadata(name, 'Version')
Elv's avatar
Elv committed
103 104 105
	if isLib then plugin.isLib = true; plugin.version = 1 end
	plugin.callback = callback
	lib.plugins[name] = plugin
Simpy's avatar
Simpy committed
106
	local loaded = IsAddOnLoaded('ElvUI_Config')
Elv's avatar
Elv committed
107 108

	if not lib.vcframe then
109
		C_ChatInfo_RegisterAddonMessagePrefix(lib.prefix)
Elv's avatar
Elv committed
110
		local f = CreateFrame('Frame')
Simpy's avatar
Simpy committed
111 112
		f:RegisterEvent('CHAT_MSG_ADDON')
		f:RegisterEvent('GROUP_ROSTER_UPDATE')
Elv's avatar
Elv committed
113 114 115 116 117 118
		f:SetScript('OnEvent', lib.VersionCheck)
		lib.vcframe = f
	end

	if not loaded then
		if not lib.ConfigFrame then
Simpy's avatar
Simpy committed
119 120 121 122
			local configFrame = CreateFrame('Frame')
			configFrame:RegisterEvent('ADDON_LOADED')
			configFrame:SetScript('OnEvent', function(_, _, addon)
				if addon == 'ElvUI_Config' then
123 124 125
					for _, PlugIn in pairs(lib.plugins) do
						if PlugIn.callback then
							PlugIn.callback()
Elv's avatar
Elv committed
126 127 128 129 130 131 132 133 134
						end
					end
				end
			end)
			lib.ConfigFrame = configFrame
		end
	elseif loaded then
		-- Need to update plugins list
		if name ~= MAJOR then
135
			ElvUI[1].Options.args.plugins.args.plugins.name = lib:GeneratePluginList()
Elv's avatar
Elv committed
136
		end
Simpy's avatar
Simpy committed
137

Elv's avatar
Elv committed
138 139 140
		callback()
	end

141 142
	DelayedSendVersionCheck() -- initial broadcast

Elv's avatar
Elv committed
143 144 145 146
	return plugin
end

function lib:GetPluginOptions()
147
	ElvUI[1].Options.args.plugins = {
Elv's avatar
Elv committed
148
        order = -10,
Simpy's avatar
Simpy committed
149
        type = 'group',
Elv's avatar
Elv committed
150 151 152 153 154
        name = HDR_CONFIG,
        guiInline = false,
        args = {
            pluginheader = {
                order = 1,
Simpy's avatar
Simpy committed
155
                type = 'header',
Elv's avatar
Elv committed
156 157 158 159
                name = format(HDR_INFORMATION, MINOR),
            },
            plugins = {
                order = 2,
Simpy's avatar
Simpy committed
160
                type = 'description',
Elv's avatar
Elv committed
161 162 163 164 165 166
                name = lib:GeneratePluginList(),
            },
        }
    }
end

167
function lib:VersionCheck(event, prefix, message, _, sender)
168
	local E = ElvUI[1]
Simpy's avatar
Simpy committed
169
	if (event == 'CHAT_MSG_ADDON' and prefix == lib.prefix) and (sender and message and not strmatch(message, '^%s-$')) then
170
		if not lib.myName then lib.myName = E.myname..'-'..gsub(E.myrealm,'[%s%-]','') end
171 172
		if sender == lib.myName then return end

173
		if not E.pluginRecievedOutOfDateMessage then
174
			local name, version, plugin, Pname
Simpy's avatar
Simpy committed
175 176 177
			for _, p in pairs({strsplit(';',message)}) do
				if not strmatch(p, '^%s-$') then
					name, version = strmatch(p, '([%w_]+)=([%d%p]+)')
Simpy's avatar
Simpy committed
178
					if lib.plugins[name] then
179
						plugin = lib.plugins[name]
180 181
						if (version ~= nil and plugin.version ~= nil and plugin.version ~= 'BETA') and (tonumber(version) ~= nil and tonumber(plugin.version) ~= nil) and (tonumber(version) > tonumber(plugin.version)) then
							plugin.old, plugin.newversion = true, tonumber(version)
Simpy's avatar
Simpy committed
182
							Pname = GetAddOnMetadata(plugin.name, 'Title')
183
							E:Print(format(MSG_OUTDATED,Pname,plugin.version,plugin.newversion))
184
							ElvUI[1].pluginRecievedOutOfDateMessage = true
Simpy's avatar
Simpy committed
185
						end
Elv's avatar
Elv committed
186 187 188 189
					end
				end
			end
		end
Simpy's avatar
Simpy committed
190
	elseif event == 'GROUP_ROSTER_UPDATE' then
Simpy's avatar
Simpy committed
191 192 193
		local num = GetNumGroupMembers()
		if num ~= lib.groupSize then
			if num > 1 and num > lib.groupSize then
194
				DelayedSendVersionCheck()
Simpy's avatar
Simpy committed
195 196 197
			end
			lib.groupSize = num
		end
Simpy's avatar
Simpy committed
198
	end
Elv's avatar
Elv committed
199 200 201
end

function lib:GeneratePluginList()
Simpy's avatar
Simpy committed
202
	local E, list = ElvUI[1], ''
203
	local author, Pname, color
Elv's avatar
Elv committed
204 205
	for _, plugin in pairs(lib.plugins) do
		if plugin.name ~= MAJOR then
Simpy's avatar
Simpy committed
206 207
			author = GetAddOnMetadata(plugin.name, 'Author')
			Pname = GetAddOnMetadata(plugin.name, 'Title') or plugin.name
208
			color = plugin.old and E:RGBToHex(1,0,0) or E:RGBToHex(0,1,0)
Simpy's avatar
Simpy committed
209 210 211 212 213
			list = list..Pname
			if author then list = list..' '..INFO_BY..' '..author end
			list = list..color..(plugin.isLib and ' '..LIBRARY or ' - '..INFO_VERSION..' '..plugin.version)
			if plugin.old then list = list..INFO_NEW..plugin.newversion..')' end
			list = list..'|r\n'
Elv's avatar
Elv committed
214 215 216 217 218
		end
	end
	return list
end

Simpy's avatar
Simpy committed
219
function lib:ClearSendMessageTimer()
220 221 222
	lib.SendMessageTimer = nil
end

Elv's avatar
Elv committed
223
function lib:SendPluginVersionCheck(message)
Simpy's avatar
Simpy committed
224
	if (not message) or strmatch(message, '^%s-$') then
225 226 227 228
		lib.ClearSendMessageTimer()
		return
	end

229
	local ChatType, Channel
Simpy's avatar
Simpy committed
230
	if IsInRaid() then
Simpy's avatar
Simpy committed
231
		ChatType = (not IsInRaid(LE_PARTY_CATEGORY_HOME) and IsInRaid(LE_PARTY_CATEGORY_INSTANCE)) and 'INSTANCE_CHAT' or 'RAID'
Simpy's avatar
Simpy committed
232
	elseif IsInGroup() then
Simpy's avatar
Simpy committed
233
		ChatType = (not IsInGroup(LE_PARTY_CATEGORY_HOME) and IsInGroup(LE_PARTY_CATEGORY_INSTANCE)) and 'INSTANCE_CHAT' or 'PARTY'
Simpy's avatar
Simpy committed
234 235 236
	else
		local ElvUIGVC = GetChannelName('ElvUIGVC')
		if ElvUIGVC and ElvUIGVC > 0 then
Simpy's avatar
Simpy committed
237
			ChatType, Channel = 'CHANNEL', ElvUIGVC
Simpy's avatar
Simpy committed
238
		elseif IsInGuild() then
Simpy's avatar
Simpy committed
239
			ChatType = 'GUILD'
Simpy's avatar
Simpy committed
240
		end
241
	end
242

243
	if not ChatType then
Simpy's avatar
Simpy committed
244
		lib.ClearSendMessageTimer()
245 246
		return
	end
247

248
	local delay, maxChar, msgLength = 0, 250, strlen(message)
249
	if msgLength > maxChar then
250
		local E, splitMessage = ElvUI[1]
251
		for _ = 1, ceil(msgLength/maxChar) do
252 253
			splitMessage = strmatch(strsub(message, 1, maxChar), '.+;')
			if splitMessage then -- incase the string is over 250 but doesnt contain `;`
Simpy's avatar
Simpy committed
254
				message = gsub(message, '^'..gsub(splitMessage, '([%(%)%.%%%+%-%*%?%[%^%$])','%%%1'), '')
255
				E:Delay(delay, C_ChatInfo_SendAddonMessage, lib.prefix, splitMessage, ChatType, Channel)
256
				delay = delay + 1
257
				E:Delay(delay, lib.ClearSendMessageTimer) -- keep this after `delay = delay + 1`
Elv's avatar
Elv committed
258 259
			end
		end
260
	else
261
		C_ChatInfo_SendAddonMessage(lib.prefix, message, ChatType, Channel)
Simpy's avatar
Simpy committed
262
		lib.ClearSendMessageTimer()
Elv's avatar
Elv committed
263 264 265
	end
end

Simpy's avatar
Simpy committed
266
lib:RegisterPlugin(MAJOR, lib.GetPluginOptions)