227 lines
7.7 KiB
Lua
227 lines
7.7 KiB
Lua
local MAJOR, MINOR = "LibElvUIPlugin-1.0", 13
|
||
local lib, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
|
||
if not lib then return end
|
||
|
||
--Cache global variables
|
||
--Lua functions
|
||
local pairs, tonumber = pairs, tonumber
|
||
local format, strsplit = format, strsplit
|
||
--WoW API / Variables
|
||
local CreateFrame = CreateFrame
|
||
local IsInInstance, IsInGroup, IsInRaid = IsInInstance, IsInGroup, IsInRaid
|
||
local GetAddOnMetadata = GetAddOnMetadata
|
||
local IsAddOnLoaded = IsAddOnLoaded
|
||
local RegisterAddonMessagePrefix = RegisterAddonMessagePrefix
|
||
local SendAddonMessage = SendAddonMessage
|
||
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"
|
||
|
||
-- MULTI Language Support (Default Language: English)
|
||
local MSG_OUTDATED = "Your version of %s is out of date (latest is version %s). You can download the latest version from http://www.tukui.org"
|
||
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
|
||
MSG_OUTDATED = "Deine Version von %s ist veraltet (akutelle Version ist %s). Du kannst die aktuelle Version von http://www.tukui.org herunterrladen."
|
||
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
|
||
MSG_OUTDATED = "Ваша версия %s устарела (последняя версия %s). Вы можете скачать последнюю версию на http://www.tukui.org"
|
||
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
|
||
RegisterAddonMessagePrefix(lib.prefix)
|
||
local f = CreateFrame('Frame')
|
||
f:RegisterEvent("GROUP_ROSTER_UPDATE")
|
||
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")
|
||
configFrame:SetScript("OnEvent", function(self,event,addon)
|
||
if addon == "ElvUI_Config" then
|
||
for _, plugin in pairs(lib.plugins) do
|
||
if(plugin.callback) then
|
||
plugin.callback()
|
||
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())
|
||
|
||
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]
|
||
if event == "CHAT_MSG_ADDON" then
|
||
if sender == E.myname or not sender or prefix ~= lib.prefix then return end
|
||
if not E["pluginRecievedOutOfDateMessage"] then
|
||
for _, p in pairs({strsplit(";",message)}) do
|
||
local name, version = p:match("([%w_]+)=([%d%p]+)")
|
||
if lib.plugins[name] then
|
||
local plugin = lib.plugins[name]
|
||
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)
|
||
local Pname = GetAddOnMetadata(plugin.name, "Title")
|
||
E:Print(format(MSG_OUTDATED,Pname,plugin.newversion))
|
||
E["pluginRecievedOutOfDateMessage"] = true
|
||
end
|
||
end
|
||
end
|
||
end
|
||
else
|
||
E.SendPluginVersionCheck = E.SendPluginVersionCheck or SendPluginVersionCheck
|
||
E["ElvUIPluginSendMSGTimer"] = E:ScheduleTimer("SendPluginVersionCheck", 2)
|
||
end
|
||
end
|
||
|
||
function lib:GeneratePluginList()
|
||
local list = ""
|
||
local E = ElvUI[1]
|
||
for _, plugin in pairs(lib.plugins) do
|
||
if plugin.name ~= MAJOR then
|
||
local author = GetAddOnMetadata(plugin.name, "Author")
|
||
local Pname = GetAddOnMetadata(plugin.name, "Title") or plugin.name
|
||
local color = plugin.old and E:RGBToHex(1,0,0) or E:RGBToHex(0,1,0)
|
||
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"
|
||
end
|
||
end
|
||
return list
|
||
end
|
||
|
||
function lib:SendPluginVersionCheck(message)
|
||
local plist = {strsplit(";",message)}
|
||
local m = ""
|
||
local delay = 1
|
||
local E = ElvUI[1]
|
||
for _, p in pairs(plist) do
|
||
if(#(m .. p .. ";") < 230) then
|
||
m = m .. p .. ";"
|
||
else
|
||
local _, instanceType = IsInInstance()
|
||
if IsInRaid() then
|
||
E:Delay(delay,SendAddonMessage(lib.prefix, m, (not IsInRaid(LE_PARTY_CATEGORY_HOME) and IsInRaid(LE_PARTY_CATEGORY_INSTANCE)) and "INSTANCE_CHAT" or "RAID"))
|
||
elseif IsInGroup() then
|
||
E:Delay(delay,SendAddonMessage(lib.prefix, m, (not IsInGroup(LE_PARTY_CATEGORY_HOME) and IsInGroup(LE_PARTY_CATEGORY_INSTANCE)) and "INSTANCE_CHAT" or "PARTY"))
|
||
end
|
||
m = p .. ";"
|
||
delay = delay + 1
|
||
end
|
||
end
|
||
-- Send the last message
|
||
local _, instanceType = IsInInstance()
|
||
if IsInRaid() then
|
||
E:Delay(delay+1,SendAddonMessage(lib.prefix, m, (not IsInRaid(LE_PARTY_CATEGORY_HOME) and IsInRaid(LE_PARTY_CATEGORY_INSTANCE)) and "INSTANCE_CHAT" or "RAID"))
|
||
elseif IsInGroup() then
|
||
E:Delay(delay+1,SendAddonMessage(lib.prefix, m, (not IsInGroup(LE_PARTY_CATEGORY_HOME) and IsInGroup(LE_PARTY_CATEGORY_INSTANCE)) and "INSTANCE_CHAT" or "PARTY"))
|
||
end
|
||
end
|
||
|
||
lib:RegisterPlugin(MAJOR, lib.GetPluginOptions) |