LibElvUIPlugin-1.0.lua 8.44 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 10
--WoW API / Variables
local CreateFrame = CreateFrame
11
local IsInGroup, IsInRaid = IsInGroup, IsInRaid
Elv's avatar
Elv committed
12 13
local GetAddOnMetadata = GetAddOnMetadata
local IsAddOnLoaded = IsAddOnLoaded
14
local C_ChatInfo_RegisterAddonMessagePrefix = C_ChatInfo.RegisterAddonMessagePrefix
Simpy's avatar
Simpy committed
15
local C_ChatInfo_SendAddonMessage = C_ChatInfo.SendAddonMessage
16
local GetNumGroupMembers = GetNumGroupMembers
Elv's avatar
Elv committed
17 18 19 20 21 22 23 24 25
local LE_PARTY_CATEGORY_HOME = LE_PARTY_CATEGORY_HOME
local LE_PARTY_CATEGORY_INSTANCE = LE_PARTY_CATEGORY_INSTANCE

--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
26
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
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
	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
--

function lib:RegisterPlugin(name,callback, isLib)
    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
80
		C_ChatInfo_RegisterAddonMessagePrefix(lib.prefix)
Elv's avatar
Elv committed
81 82
		local f = CreateFrame('Frame')
		f:RegisterEvent("GROUP_ROSTER_UPDATE")
83
		f:RegisterEvent("PLAYER_ENTERING_WORLD")
Elv's avatar
Elv committed
84 85 86 87 88 89 90 91 92
		f:RegisterEvent("CHAT_MSG_ADDON")
		f:SetScript('OnEvent', lib.VersionCheck)
		lib.vcframe = f
	end

	if not loaded then
		if not lib.ConfigFrame then
			local configFrame = CreateFrame("Frame")
			configFrame:RegisterEvent("ADDON_LOADED")
93
			configFrame:SetScript("OnEvent", function(self, event, addon)
Elv's avatar
Elv committed
94
				if addon == "ElvUI_Config" then
95 96 97
					for _, PlugIn in pairs(lib.plugins) do
						if PlugIn.callback then
							PlugIn.callback()
Elv's avatar
Elv committed
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
						end
					end
				end
			end)
			lib.ConfigFrame = configFrame
		end
	elseif loaded then
		-- Need to update plugins list
		if name ~= MAJOR then
			ElvUI[1].Options.args.plugins.args.plugins.name = lib:GeneratePluginList()
		end
		callback()
	end

	return plugin
end

function lib:GetPluginOptions()
	ElvUI[1].Options.args.plugins = {
        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

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(self)
	lib:SendPluginVersionCheck(lib:GenerateVersionCheckMessage())
Simpy's avatar
Simpy committed
148

Elv's avatar
Elv committed
149 150 151 152 153 154 155 156
	if self["ElvUIPluginSendMSGTimer"] then
		self:CancelTimer(self["ElvUIPluginSendMSGTimer"])
		self["ElvUIPluginSendMSGTimer"] = nil
	end
end

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

183 184
		local num = GetNumGroupMembers()
		if num ~= lib.groupSize then
Simpy's avatar
Simpy committed
185
			if num > 1 and num > lib.groupSize then
186 187 188
				E["ElvUIPluginSendMSGTimer"] = E:ScheduleTimer("SendPluginVersionCheck", 12)
			end
			lib.groupSize = num
189
		end
Simpy's avatar
Simpy committed
190
	end
Elv's avatar
Elv committed
191 192 193
end

function lib:GeneratePluginList()
194 195
	local list, E = "", ElvUI[1]
	local author, Pname, color
Elv's avatar
Elv committed
196 197
	for _, plugin in pairs(lib.plugins) do
		if plugin.name ~= MAJOR then
198 199 200
			author = GetAddOnMetadata(plugin.name, "Author")
			Pname = GetAddOnMetadata(plugin.name, "Title") or plugin.name
			color = plugin.old and E:RGBToHex(1,0,0) or E:RGBToHex(0,1,0)
Simpy's avatar
Simpy committed
201
			list = list .. Pname
Elv's avatar
Elv committed
202 203 204 205 206 207 208 209 210 211 212 213 214 215
			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)
216
	if (not message) or strmatch(message, "^%s-$") then return end
217
	local ChatType, Channel
218

219 220 221 222 223 224 225 226 227 228 229
	if IsInRaid() then
		ChatType = (not IsInRaid(LE_PARTY_CATEGORY_HOME) and IsInRaid(LE_PARTY_CATEGORY_INSTANCE)) and "INSTANCE_CHAT" or "RAID"
	elseif IsInGroup() then
		ChatType = (not IsInGroup(LE_PARTY_CATEGORY_HOME) and IsInGroup(LE_PARTY_CATEGORY_INSTANCE)) and "INSTANCE_CHAT" or "PARTY"
	else
		if GetChannelName('ElvUIGVC') then
			ChatType, Channel = "CHANNEL", GetChannelName('ElvUIGVC')
		elseif IsInGuild() then
			ChatType = "GUILD"
		end
	end
230

231
	local delay, maxChar, msgLength = 0, 250, strlen(message)
232 233
	if msgLength > maxChar then
		local splitMessage
234
		for _ = 1, ceil(msgLength/maxChar) do
235 236 237
			splitMessage = strmatch(strsub(message, 1, maxChar), '.+;')
			if splitMessage then -- incase the string is over 250 but doesnt contain `;`
				message = gsub(message, "^"..gsub(splitMessage, '([%(%)%.%%%+%-%*%?%[%^%$])','%%%1'), "")
238
				ElvUI[1]:Delay(delay, C_ChatInfo_SendAddonMessage, lib.prefix, splitMessage, ChatType, Channel)
239
				delay = delay + 1
Elv's avatar
Elv committed
240 241
			end
		end
242
	else
243
		C_ChatInfo_SendAddonMessage(lib.prefix, message, ChatType, Channel)
Elv's avatar
Elv committed
244 245 246
	end
end

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