LibElvUIPlugin-1.0.lua 7.84 KB
Newer Older
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
10
local GetLocale, IsInGuild = GetLocale, IsInGuild
11 12
local CreateFrame, IsAddOnLoaded = CreateFrame, IsAddOnLoaded
local GetAddOnMetadata, GetChannelName = GetAddOnMetadata, GetChannelName
13
local C_ChatInfo_RegisterAddonMessagePrefix = C_ChatInfo.RegisterAddonMessagePrefix
Simpy's avatar
Simpy committed
14
local C_ChatInfo_SendAddonMessage = C_ChatInfo.SendAddonMessage
Elv's avatar
Elv committed
15 16 17 18 19 20 21

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

lib.plugins = {}
lib.index = 0
lib.prefix = "ElvUIPluginVC"
Simpy's avatar
Simpy committed
22
lib.groupSize = -1 --this is negative one so that the first check will send (if group size is greater than one; specifically for /reload)
Elv's avatar
Elv committed
23 24

-- MULTI Language Support (Default Language: English)
25
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
26 27 28 29 30 31 32 33
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
34
	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
35 36 37 38 39 40 41 42 43
	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
44
	MSG_OUTDATED = "Ваша версия %s %s устарела (последняя версия %s). Вы можете скачать последнюю версию на http://www.tukui.org"
Elv's avatar
Elv committed
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
	HDR_CONFIG = "Плагины"
	HDR_INFORMATION = "LibElvUIPlugin-1.0.%d - загруженные плагины (зеленый означает, что у вас последняя версия, красный - устаревшая)"
	INFO_BY = "от"
	INFO_VERSION = "Версия:"
	INFO_NEW = "Последняя:"
	LIBRARY = "Библиотека"
end

--
-- 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
--

66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
function lib:GenerateVersionCheckMessage()
	local list = ""
	for _, plugin in pairs(lib.plugins) do
		if plugin.name ~= MAJOR then
			list = list..plugin.name.."="..plugin.version..";"
		end
	end
	return list
end

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

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

Elv's avatar
Elv committed
84 85 86 87 88 89 90 91 92
    local plugin = {}
	plugin.name = name
	plugin.version = name == MAJOR and MINOR or GetAddOnMetadata(name, "Version")
	if isLib then plugin.isLib = true; plugin.version = 1 end
	plugin.callback = callback
	lib.plugins[name] = plugin
	local loaded = IsAddOnLoaded("ElvUI_Config")

	if not lib.vcframe then
93
		C_ChatInfo_RegisterAddonMessagePrefix(lib.prefix)
Elv's avatar
Elv committed
94 95 96 97 98 99
		local f = CreateFrame('Frame')
		f:RegisterEvent("CHAT_MSG_ADDON")
		f:SetScript('OnEvent', lib.VersionCheck)
		lib.vcframe = f
	end

100 101 102 103 104
	if not lib.delayedCheck then
		lib.E:Delay(10, SendPluginVersionCheck)
		lib.delayedCheck = true
	end

Elv's avatar
Elv committed
105 106 107 108
	if not loaded then
		if not lib.ConfigFrame then
			local configFrame = CreateFrame("Frame")
			configFrame:RegisterEvent("ADDON_LOADED")
109
			configFrame:SetScript("OnEvent", function(_, _, addon)
Elv's avatar
Elv committed
110
				if addon == "ElvUI_Config" then
111 112 113
					for _, PlugIn in pairs(lib.plugins) do
						if PlugIn.callback then
							PlugIn.callback()
Elv's avatar
Elv committed
114 115 116 117 118 119 120 121 122
						end
					end
				end
			end)
			lib.ConfigFrame = configFrame
		end
	elseif loaded then
		-- Need to update plugins list
		if name ~= MAJOR then
123
			lib.E.Options.args.plugins.args.plugins.name = lib:GeneratePluginList()
Elv's avatar
Elv committed
124 125 126 127 128 129 130 131
		end
		callback()
	end

	return plugin
end

function lib:GetPluginOptions()
132
	lib.E.Options.args.plugins = {
Elv's avatar
Elv committed
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
        order = -10,
        type = "group",
        name = HDR_CONFIG,
        guiInline = false,
        args = {
            pluginheader = {
                order = 1,
                type = "header",
                name = format(HDR_INFORMATION, MINOR),
            },
            plugins = {
                order = 2,
                type = "description",
                name = lib:GeneratePluginList(),
            },
        }
    }
end

152 153 154 155 156 157 158 159
function lib:VersionCheck(event, prefix, message, _, sender)
	if (event == "CHAT_MSG_ADDON") and (prefix == lib.prefix) and (sender and message and not strmatch(message, "^%s-$")) then
		if not lib.myName then lib.myName = lib.E.myname..'-'..gsub(lib.E.myrealm,'[%s%-]','') end
		if sender == lib.myName then
			if lib.delayedCheck then
				lib.delayedCheck = nil
			end
			return
Elv's avatar
Elv committed
160
		end
161
		if not lib.E["pluginRecievedOutOfDateMessage"] then
162
			local name, version, plugin, Pname
Elv's avatar
Elv committed
163
			for _, p in pairs({strsplit(";",message)}) do
164 165
				if not strmatch(p, "^%s-$") then
					name, version = strmatch(p, "([%w_]+)=([%d%p]+)")
Simpy's avatar
Simpy committed
166
					if lib.plugins[name] then
167
						plugin = lib.plugins[name]
168 169
						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)
170
							Pname = GetAddOnMetadata(plugin.name, "Title")
171 172
							lib.E:Print(format(MSG_OUTDATED,Pname,plugin.version,plugin.newversion))
							lib.E["pluginRecievedOutOfDateMessage"] = true
Simpy's avatar
Simpy committed
173
						end
Elv's avatar
Elv committed
174 175 176 177 178
					end
				end
			end
		end
	else
179 180
		if not lib.E.SendPluginVersionCheck then
			lib.E.SendPluginVersionCheck = SendPluginVersionCheck
181
		end
182

183
		lib.E:ScheduleTimer("SendPluginVersionCheck", 10)
Simpy's avatar
Simpy committed
184
	end
Elv's avatar
Elv committed
185 186 187
end

function lib:GeneratePluginList()
188
	local list = ""
189
	local author, Pname, color
Elv's avatar
Elv committed
190 191
	for _, plugin in pairs(lib.plugins) do
		if plugin.name ~= MAJOR then
192 193
			author = GetAddOnMetadata(plugin.name, "Author")
			Pname = GetAddOnMetadata(plugin.name, "Title") or plugin.name
194
			color = plugin.old and lib.E:RGBToHex(1,0,0) or lib.E:RGBToHex(0,1,0)
Simpy's avatar
Simpy committed
195
			list = list .. Pname
Elv's avatar
Elv committed
196 197 198 199 200 201 202 203 204 205 206 207 208 209
			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"
		end
	end
	return list
end

function lib:SendPluginVersionCheck(message)
210
	if (not message) or strmatch(message, "^%s-$") then return end
211
	local ChatType, Channel
212

213 214 215 216 217
	local ElvUIGVC = GetChannelName('ElvUIGVC')
	if ElvUIGVC and ElvUIGVC > 0 then
		ChatType, Channel = "CHANNEL", ElvUIGVC
	elseif IsInGuild() then
		ChatType = "GUILD"
218
	end
219

220
	local delay, maxChar, msgLength = 0, 250, strlen(message)
221 222
	if msgLength > maxChar then
		local splitMessage
223
		for _ = 1, ceil(msgLength/maxChar) do
224 225 226
			splitMessage = strmatch(strsub(message, 1, maxChar), '.+;')
			if splitMessage then -- incase the string is over 250 but doesnt contain `;`
				message = gsub(message, "^"..gsub(splitMessage, '([%(%)%.%%%+%-%*%?%[%^%$])','%%%1'), "")
227
				lib.E:Delay(delay, C_ChatInfo_SendAddonMessage, lib.prefix, splitMessage, ChatType, Channel)
228
				delay = delay + 1
Elv's avatar
Elv committed
229 230
			end
		end
231
	else
232
		C_ChatInfo_SendAddonMessage(lib.prefix, message, ChatType, Channel)
Elv's avatar
Elv committed
233 234 235
	end
end

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