vanilla-wow-addons – Rev 1
?pathlinks?
--[[
Guild Event Manager by Kiki of European Cho'gall (Alliance)
Subscribers module (Sorting/Adding/Managing)
]]
--------------- Local variables ---------------
GEM_SUB_Plugins = {};
--------------- Internal functions ---------------
local function _GEM_SUB_IsTitular(ev_id,pl_name)
for i,tab in GEM_Events.realms[GEM_Realm].events[ev_id].titulars do
if(tab.name == pl_name)
then
return true;
end
end
return false;
end
local function _GEM_SUB_IsSubstitute(ev_id,pl_name)
for i,tab in GEM_Events.realms[GEM_Realm].events[ev_id].substitutes do
if(tab.name == pl_name)
then
return true;
end
end
return false;
end
local function _GEM_SUB_IsReplacement(ev_id,pl_name)
for i,tab in GEM_Events.realms[GEM_Realm].events[ev_id].replacements do
if(tab.name == pl_name)
then
return true;
end
end
return false;
end
--------------- Exported functions ---------------
function GEM_SUB_AddToReplacementList(ev_id,pl_name,pl_guild,pl_class,pl_level)
local event = GEM_Events.realms[GEM_Realm].events[ev_id];
if(event == nil)
then
return;
end
table.insert(event.replacements,{name=pl_name,guild=pl_guild,class=pl_class,level=pl_level});
event.classes[pl_class].repl_count = event.classes[pl_class].repl_count + 1;
GEM_COM_ReplacementPlayer(ev_id,pl_name);
GEM_ChatDebug(GEM_DEBUG_SUBSCRIBERS,"GEM_SUB_AddToReplacementList : Added "..pl_name.." to Replacement list");
end
function GEM_SUB_RemoveFromReplacementList(ev_id,pl_name,pl_class)
local event = GEM_Events.realms[GEM_Realm].events[ev_id];
if(event == nil)
then
return;
end
for i,tab in event.replacements do
if(tab.name == pl_name)
then
table.remove(event.replacements,i);
event.classes[pl_class].repl_count = event.classes[pl_class].repl_count - 1;
GEM_ChatDebug(GEM_DEBUG_SUBSCRIBERS,"GEM_SUB_RemoveFromReplacementList : Removed "..pl_name.." from replacement list");
return;
end
end
end
function GEM_SUB_CreateSubscriber(ev_id,pl_stamp,pl_name,pl_class,pl_guild,pl_level,pl_comment,forcesub,forcetit)
local event = GEM_Events.realms[GEM_Realm].events[ev_id];
if(event == nil)
then
return;
end
if(event.players[pl_name] ~= nil)
then
event.players[pl_name].update_time = pl_stamp;
event.players[pl_name].level = pl_level;
event.players[pl_name].comment = pl_comment;
GEM_ChatDebug(GEM_DEBUG_SUBSCRIBERS,"GEM_SUB_CreateSubscriber : Player "..pl_name.." already in my list. Updating stamp, level and comment");
if(GEM_SUB_SortPlayers(ev_id))
then
GEM_COM_NotifyEventUpdate(ev_id); -- Schedule an event update
end
return;
end
event.players[pl_name] = {};
event.players[pl_name].class = pl_class;
event.players[pl_name].level = pl_level;
event.players[pl_name].update_time = pl_stamp; -- Leader side only
event.players[pl_name].guild = pl_guild; -- Leader side only
event.players[pl_name].comment = pl_comment; -- Leader side only
event.players[pl_name].forcesub = forcesub; -- Leader side only
event.players[pl_name].forcetit = forcetit; -- Leader side only
if(event.players[pl_name].forcetit == nil)
then
event.players[pl_name].forcetit = 0;
end
if(forcesub == 1)
then
GEM_SUB_AddToReplacementList(ev_id,pl_name,pl_guild,pl_class,pl_level);
else
GEM_SUB_SortPlayers(ev_id); -- Sort players
end
GEM_COM_NotifyEventUpdate(ev_id); -- Schedule an event update
end
function GEM_SUB_RemoveSubscriber(ev_id,pl_name,comment)
local event = GEM_Events.realms[GEM_Realm].events[ev_id];
if(event == nil)
then
return;
end
if(event.players[pl_name] == nil) -- Unknown player
then
GEM_ChatDebug(GEM_DEBUG_SUBSCRIBERS,"GEM_SUB_RemoveSubscriber : Unknown player "..pl_name);
return;
end
GEM_ChatDebug(GEM_DEBUG_SUBSCRIBERS,"GEM_SUB_RemoveSubscriber : Removing player "..pl_name);
local pl_class = event.players[pl_name].class;
event.players[pl_name] = nil; -- Remove player
if(_GEM_SUB_IsReplacement(ev_id,pl_name)) -- Player was a replacement ?
then
GEM_SUB_RemoveFromReplacementList(ev_id,pl_name,pl_class);
else
GEM_SUB_SortPlayers(ev_id); -- Sort players
end
event.assistants[pl_name] = nil; -- Remove assistant status
GEM_COM_NotifyEventUpdate(ev_id); -- Schedule an event update
end
function GEM_SUB_SetTitular(ev_id,pl_stamp,pl_name)
if(GEM_Events.realms[GEM_Realm].events[ev_id] ~= nil)
then
if(GEM_Events.realms[GEM_Realm].subscribed[ev_id] ~= nil)
then
GEM_Events.realms[GEM_Realm].subscribed[ev_id].state = "1";
GEM_ChatDebug(GEM_DEBUG_SUBSCRIBERS,"GEM_SUB_SetTitular : I'm now a TITULAR from EventID "..ev_id);
GEM_NotifyGUI(GEM_NOTIFY_MY_SUBSCRIPTION,ev_id);
end
end
end
function GEM_SUB_SetSubstitute(ev_id,pl_stamp,pl_name)
if(GEM_Events.realms[GEM_Realm].events[ev_id] ~= nil)
then
if(GEM_Events.realms[GEM_Realm].subscribed[ev_id] ~= nil)
then
GEM_Events.realms[GEM_Realm].subscribed[ev_id].state = "2";
GEM_ChatDebug(GEM_DEBUG_SUBSCRIBERS,"GEM_SUB_SetSubstitute : I'm now a SUBSTITUTE from EventID "..ev_id);
GEM_NotifyGUI(GEM_NOTIFY_MY_SUBSCRIPTION,ev_id);
end
end
end
function GEM_SUB_SetReplacement(ev_id,pl_stamp,pl_name)
if(GEM_Events.realms[GEM_Realm].events[ev_id] ~= nil)
then
if(GEM_Events.realms[GEM_Realm].subscribed[ev_id] ~= nil)
then
GEM_Events.realms[GEM_Realm].subscribed[ev_id].state = "3";
GEM_ChatDebug(GEM_DEBUG_SUBSCRIBERS,"GEM_SUB_SetReplacement : I'm now a REPLACEMENT from EventID "..ev_id);
GEM_NotifyGUI(GEM_NOTIFY_MY_SUBSCRIPTION,ev_id);
end
end
end
function GEM_SUB_CheckPlayersLevel(ev_id)
local event = GEM_Events.realms[GEM_Realm].events[ev_id];
if(event == nil)
then
GEM_ChatWarning("GEM_SUB_CheckPlayersLevel : Trying to sort a nil event ("..ev_id..")");
return;
end
for name,tab in event.players do
if(tab.level < event.min_lvl or tab.level > event.max_lvl) -- Not in level range anymore
then
GEM_COM_KickPlayer(ev_id,name,GEM_TEXT_ERR_LEVEL_FAILED);
end
end
end
function GEM_SUB_RegisterPlugin(plugin)
if(type(plugin) ~= "table")
then
GEM_ChatPrint("GEM_SUB_RegisterPlugin : Failed to register plugin : Passed plugin is not a table");
return;
end
if(plugin.Name == nil)
then
GEM_ChatPrint("GEM_SUB_RegisterPlugin : Failed to register plugin : Passed plugin has no 'Name' parameter");
return;
end
if(type(plugin.Name) ~= "string")
then
GEM_ChatPrint("GEM_SUB_RegisterPlugin : Failed to register plugin : Passed plugin's 'Name' value is not a string");
return;
end
local name = plugin.Name;
if(plugin.SortType == nil)
then
GEM_ChatPrint("GEM_SUB_RegisterPlugin : Failed to register plugin '"..name.."' : Passed plugin has no 'SortType' parameter");
return;
end
if(type(plugin.SortType) ~= "string")
then
GEM_ChatPrint("GEM_SUB_RegisterPlugin : Failed to register plugin '"..name.."' : Passed plugin's 'SortType' value is not a string");
return;
end
if(plugin.Sort == nil)
then
GEM_ChatPrint("GEM_SUB_RegisterPlugin : Failed to register plugin '"..name.."' : Passed plugin has no 'Sort' function");
return;
end
if(type(plugin.Sort) ~= "function")
then
GEM_ChatPrint("GEM_SUB_RegisterPlugin : Failed to register plugin '"..name.."' : Passed plugin's 'Sort' value is not a function");
return;
end
if(plugin.Configure and type(plugin.Configure) ~= "function")
then
GEM_ChatPrint("GEM_SUB_RegisterPlugin : Failed to register plugin '"..name.."' : Passed plugin's 'Configure' value is not a function");
return;
end
if(plugin.Help and type(plugin.Help) ~= "string")
then
GEM_ChatPrint("GEM_SUB_RegisterPlugin : Failed to register plugin '"..name.."' : Passed plugin's 'Help' value is not a string");
return;
end
GEM_SUB_Plugins[name] = plugin;
GEM_ChatDebug(GEM_DEBUG_GLOBAL,"GEM_SUB_RegisterPlugin : Successfully loaded plugin '"..name.."'");
end
function GEM_SUB_GetPlugin(sorttype)
for name,plugin in GEM_SUB_Plugins do
if(plugin.SortType == sorttype)
then
return plugin;
end
end
return nil;
end
function GEM_SUB_GetSortType(sortname)
if(sortname == nil)
then
return nil;
end
local plugin = GEM_SUB_Plugins[sortname];
if(plugin ~= nil)
then
return plugin.SortType;
end
return nil;
end
--[[
Main sorting function.
Returns True if order changed, false otherwise
]]
function GEM_SUB_SortPlayers(ev_id)
local event = GEM_Events.realms[GEM_Realm].events[ev_id];
if(event == nil)
then
GEM_ChatWarning("GEM_SUB_SortPlayers : Trying to sort a nil event ("..ev_id..")");
return false;
end
local plugin = GEM_SUB_GetPlugin(event.sorttype);
if(plugin == nil)
then
GEM_ChatWarning("GEM_SUB_SortPlayers : Cannot find selected sorting plugin ("..event.sorttype..") !");
return false;
end
local players = {};
for name,tab in event.players do
if(tab.forcesub == 0) -- Only add non-forcesub players
then
players[name] = tab;
end
end
-- Build classes limits
local classes = {};
for name,tab in event.classes do
local max = tab.max;
local min = tab.min;
if(max == nil or max == -1)
then
max = 666;
end
if(min == nil or min == -1)
then
min = 0;
end
classes[name] = { min=min,max=max,count=0 };
end
local res_tit,res_sub = plugin.Sort(players,classes,event.max_count);
-- Check if order has changed
local update = false;
if(event.titular_count ~= table.getn(res_tit) or table.getn(event.substitutes) ~= table.getn(res_sub))
then
update = true;
end
for name,tab in event.classes do
event.classes[name].tit_count = 0;
event.classes[name].sub_count = 0;
end
-- Rebuild the lists
local new_tit = {};
for i,name in res_tit do
if(event.titulars[i] == nil or event.titulars[i].name ~= name) -- Not the same order, tag for update
then
update = true;
if(not _GEM_SUB_IsTitular(ev_id,name)) -- Was not a titular previously
then
GEM_COM_TitularPlayer(ev_id,name);
GEM_ChatDebug(GEM_DEBUG_SUBSCRIBERS,"GEM_SUB_SortPlayers : Added "..name.." to Titular list");
end
end
local player = event.players[name];
if(player == nil)
then
GEM_ChatWarning("GEM_SUB_SortPlayers : Failed to find titular player '"..name.."' in my players list !");
else
table.insert(new_tit,{name=name,stamp=player.update_time,guild=player.guild,class=player.class,level=player.level});
event.classes[player.class].tit_count = event.classes[player.class].tit_count + 1;
end
end
event.titulars = new_tit;
event.titular_count = table.getn(new_tit);
local new_sub = {};
for i,name in res_sub do
if(event.substitutes[i] == nil or event.substitutes[i].name ~= name) -- Not the same order, tag for update
then
update = true;
if(not _GEM_SUB_IsSubstitute(ev_id,name)) -- Was not a substitute previously
then
GEM_COM_SubstitutePlayer(ev_id,name);
GEM_ChatDebug(GEM_DEBUG_SUBSCRIBERS,"GEM_SUB_SortPlayers : Added "..name.." to Substitute list");
end
end
local player = event.players[name];
if(player == nil)
then
GEM_ChatWarning("GEM_SUB_SortPlayers : Failed to find substitute player '"..name.."' in my players list !");
else
table.insert(new_sub,{name=name,stamp=player.update_time,guild=player.guild,class=player.class,level=player.level});
event.classes[player.class].sub_count = event.classes[player.class].sub_count + 1;
end
end
event.substitutes = new_sub;
return update;
end
function GEM_SUB_RecoverSubscribers(ev_id)
local event = GEM_Events.realms[GEM_Realm].events[ev_id];
if(event == nil)
then
GEM_ChatWarning("GEM_SUB_RecoverSubscribers : Trying to recover a nil event ("..ev_id..")");
return false;
end
local plugin = GEM_SUB_GetPlugin(event.sorttype);
if(plugin == nil)
then
GEM_ChatWarning("GEM_SUB_RecoverSubscribers : Cannot find selected sorting plugin ("..event.sorttype..") !");
return false;
end
if(plugin.Recover == nil)
then
GEM_ChatWarning("GEM_SUB_RecoverSubscribers : Cannot find 'Recover' function for selected sorting plugin ("..event.sorttype..") !");
return false;
end
-- Rebuild 'players' tab
for i,tab in event.titulars
do
if(event.players[tab.name] == nil)
then
event.players[tab.name] = {};
event.players[tab.name].update_time = i+1;
event.players[tab.name].class = tab.class;
event.players[tab.name].guild = GEM_NA_FORMAT;
event.players[tab.name].level = tab.level;
event.players[tab.name].comment = "";
event.players[tab.name].forcesub = 0;
end
end
for i,tab in event.substitutes
do
if(event.players[tab.name] == nil)
then
event.players[tab.name] = {};
event.players[tab.name].update_time = event.titular_count + i + 1;
event.players[tab.name].class = tab.class;
event.players[tab.name].guild = GEM_NA_FORMAT;
event.players[tab.name].level = tab.level;
event.players[tab.name].comment = "";
event.players[tab.name].forcesub = 0;
end
end
for i,tab in event.replacements
do
if(event.players[tab.name] == nil)
then
event.players[tab.name] = {};
event.players[tab.name].update_time = 1;
event.players[tab.name].class = tab.class;
event.players[tab.name].guild = GEM_NA_FORMAT;
event.players[tab.name].level = tab.level;
event.players[tab.name].comment = "";
event.players[tab.name].forcesub = 1;
end
end
-- Build classes limits
local classes = {};
for name,tab in event.classes do
local max = tab.max;
local min = tab.min;
if(max == nil or max == -1)
then
max = 666;
end
if(min == nil or min == -1)
then
min = 0;
end
classes[name] = { min=min,max=max,count=0 };
end
plugin.Recover(event.players,classes,event.max_count);
GEM_SUB_SortPlayers(ev_id);
return true;
end