vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
----------------------------------------------------------------------------------
--
-- GuildAds.lua
--
-- Author: Alexandre Flament
-- URL : http://guildads.sourceforge.net
-- Licence: GPL version 2 (General Public License)
--
-- GuildAds allows multiple independant players to create a channel for chatting, 
-- exchange object and event organisation.
--

---------------------------------------------------------------------------------
--
-- Constants
-- 
---------------------------------------------------------------------------------
GUILDADS_VERSION          = 103.2;

GUILDADS_MAX_CHANNEL_JOIN_ATTEMPTS = 5;                         -- Wait 8 seconds more if no channel are joined

GUILDADS_DEBUG = false;

----------------------------------------------------------------------------------
--
-- Global variables / file scope variables
-- 
---------------------------------------------------------------------------------
local g_GuildAdsInitialized;                                            --- Is GuildAds initialized?

local g_playerName = "Noname";
local g_realmName = "None";
local g_ChatChannel = "GuildAdsGlobal";
local g_ChatPassword = nil;
local g_JoinChannelAttempts = 0;

-- CHAT_MSG_CHANNEL_JOIN, g_HasJoined[player] = true
-- GuildAds_OnOnline(player, true), si g_HasJoined[player] 
-- alors on affiche le message de connexion
local g_HasJoined = {};

local g_showPlayerVersion = false;

----------------------------------------------------------------------------------
--
-- Print a debug string to the chat frame
--      msg - message to print
-- 
---------------------------------------------------------------------------------
local function DEBUG_MSG(msg)
        if (GUILDADS_DEBUG) then
                ChatFrame1:AddMessage(msg, 1.0, 1.0, 0.5);
        end
end

function NoNil(param)
        if (param == nil) then
                return "<nil>";
        else
                return param
        end
end

----------------------------------------------------------------------------------
--
-- GetVersionAsString
-- 
---------------------------------------------------------------------------------
function GuildAds_GetVersionAsString()
        local addThis;
        local major = floor(GUILDADS_VERSION);
        local minor = floor((GUILDADS_VERSION - major)*10 + 0.5);
        if minor>0 then
                local minorToString = {
                        [1] = "Alpha",
                        [2] = "Beta",
                        [3] = "Beta 2",
                        [4] = "Beta 3",
                        [5] = "Beta 4",
                        [6] = "Beta 5",
                        [7] = "RC 1",
                        [8] = "RC 2",
                        [9] = "RC 3"
                }
                addThis = " "..minorToString[minor];
        else
                addThis = "";
        end
        return string.format("%0.2f", major/100)..addThis;
end

--------------------------------------------------------------------------------
--
-- Init
-- 
--------------------------------------------------------------------------------
function GuildAds_InitVariablesLoaded()
        DEBUG_MSG("[GuildAds_InitVariablesLoaded]");
        
        local backupAccountId;
        
        -- Init player and realm Name
        g_playerName = UnitName("player");
        g_realmName = GetCVar("realmName");
        
         -- Add GuildAds to myAddOns addons list
         if(myAddOnsFrame) then
                myAddOnsList.GuildAds = {
                        name = "GuildAds",
                        version = GuildAds_GetVersionAsString(),
                        category = MYADDONS_CATEGORY_GUILD,
                        author = "Zarkan",
                        email = "guildads@gmail.com",
                        website = "http://guildads.sf.net",
                        frame = "GuildAdsFrame",
                        optionsframe = "GuildAdsConfigFrame"
                };
        end
        
        -- On reset, backup accountId
        if GuildAds and GuildAds.Version=="reset" then
                backupAccountId = GuildAds.AccountId;
        end
        
        -- Reset channel data for old version
        if GuildAds and GuildAds.Version == "20050729" then
                -- for each GuildAds.Data[realmName].Global[channel]
                for realmName, data in pairs(GuildAds.Data) do
                        for channelName, ads in pairs(data.Global) do
                                data.Global[channelName] = nil;
                        end
                end
                -- to avoid reset
                GuildAds.Version = GUILDADS_VERSION_STORAGE;
        end
        
        -- If this is the first time that GuildAds is use with this version
        if ( (GuildAds == nil) or (GuildAds["Version"] ~=  GUILDADS_VERSION_STORAGE) ) then
                if (GuildAds) then
                        ChatFrame1:AddMessage("GuildAds: Reset", 1.0, 0.0, 0.0);
                end
                GuildAds = {};
                GuildAds.Version = GUILDADS_VERSION_STORAGE;
                GuildAds.Data = {};
                GuildAds.Config = {
                        MinimapRadiusOffset = 77;
                        MinimapArcOffset = 296;
                        PublishMyAds = true;
                        ShowMyAds = true;
                        ShowOfflinePlayer = true;
                        Filters = {
                                [GUILDADS_MSG_TYPE_ANNONCE] = { };
                                [GUILDADS_MSG_TYPE_REQUEST] = {
                                        everything = true;
                                };
                                [GUILDADS_MSG_TYPE_AVAILABLE] = {
                                        everything = true;
                                };
                                [GUILDADS_MSG_TYPE_SKILL] = {
                                        [4] = true, [5] = true, [6] = true,   
                                        [7] = true,  [8] = true, [9] = true,
                                        [13] = true
                                };
                                [GUILDADS_MSG_TYPE_EVENT] = {};
                        };
                        Mine = {};
                }
                
                for id, _ in GUILDADS_CLASSES do
                        GuildAds.Config.Filters[GUILDADS_MSG_TYPE_ANNONCE][id] =  true;
                end
                
                if (backupAccountId) then
                        GuildAds.AccountId = backupAccountId;
                end
                
                DEBUG_MSG("First time for this client");
        end
        
        -- Call GAC_InitVariablesLoaded
        GAC_InitVariablesLoaded();
        
        -- Call GuildAds_Init in 8 seconds or after Clcore init
        if clcore_AfterInit then
                clcore_AfterInit(GuildAds_ChatLocCallBack);
        else
                GuildAdsSystem.Reinit = false;
                GuildAdsSystem.InitTimer = 8;
        end
end

function GuildAds_ChatLocCallBack(flag)
        if flag=="INIT" then
                GuildAds_Init();
        end
end

function GuildAds_Init()
        DEBUG_MSG("[GuildAds_Init] begin");
        
        -- already init ? 
        if g_GuildAdsInitialized then
                return;
        end
        
        -- does general channels exists ? if not delayed init
        local firstChannelNumber = GetChannelList();
        if (firstChannelNumber == nil) then
                DEBUG_MSG("[GuildAds_Init] delay - channels");
                g_JoinChannelAttempts = g_JoinChannelAttempts +1;
                if (g_JoinChannelAttempts <= GUILDADS_MAX_CHANNEL_JOIN_ATTEMPTS) then
                        GuildAdsSystem.InitTimer = 2;
                        return;
                end
        end
        
        -- Init du channel
        g_ChatChannel = GuildAdsConfig_GetChannelName();
        g_ChatPassword =  GuildAdsConfig_GetChannelPassword();
        
        -- GuildAdsStorage : init
        GAS_Init(g_playerName, g_ChatChannel);

        -- Register plugins
        GuildAdsPlugin_RegisterPlugins();
        
        -- GuildAdsComm : init
        GAC_Init(g_playerName, g_ChatChannel, g_ChatPassword);
        
        -- Init Plugin
        DEBUG_MSG("[GuildAdsPlugin_OnInit] begin");
        GuildAdsPlugin_OnInit();
        DEBUG_MSG("[GuildAdsPlugin_OnInit] end");
        
        -- Init first step done
        g_GuildAdsInitialized = true;
        
        -- Init GuildAdsFrame
        DEBUG_MSG("[GuildAdsFrame_Init] begin");
        GuildAdsFrame_Init();
        DEBUG_MSG("[GuildAdsFrame_Init] end");
        
        DEBUG_MSG("[GuildAds_Init] end");
end

function GuildAds_Reinit()
        DEBUG_MSG("[GuildAds_Reinit]");
        GAC_SendRemoveAll(nil);
        
        GuildAdsSystem.Reinit = true;
        GuildAdsSystem.InitTimer = 2;
end

function GuildAds_ReinitSecond()
        DEBUG_MSG("[GuildAds_ReinitSecond]");
        g_GuildAdsInitialized = false;
        
        -- Reinit du channel
        g_ChatChannel = GuildAdsConfig_GetChannelName();
        g_ChatPassword =  GuildAdsConfig_GetChannelPassword();
        
        -- Reinit GuildAdsStorage
        GAS_Init(g_playerName, g_ChatChannel);
        
        -- Reinit UI
        GuildAdsFrame_OnChannelChange();
        
        -- Reinit GuildAdsComm
        GAC_Reinit(g_ChatChannel, g_ChatPassword);
        
        g_GuildAdsInitialized = true;
end

function GuildAds_OnEvent(event)
        if (event == "PLAYER_LEVEL_UP") then
                GuildAdsSystem.SendAnnonceTimer = 10;
                
        elseif (event == "CHAT_MSG_SKILL") then
                -- Toutes les compétences sont envoyées.
                -- Lors de l'apprentissage d'une armes contre un mob la compétence monte vite.
                -- --> MAJ au maxi toutes les minutes, pour éviter le flood.
                GuildAdsSystem.SendSkillsTimer = 60;
                
        elseif (event == "CHARACTER_POINTS_CHANGED") then
                GuildAdsSystem.SendSkillsTimer = 60;
                
        elseif (event == "PLAYER_GUILD_UPDATE") then
                -- Changement de guilde ?
                if g_GuildAdsInitialized and GuildAdsConfig_GetChannelName() ~= g_ChatChannel then
                        GuildAds_ReinitSecond();
                end
                
        elseif (event == "CHAT_MSG_CHANNEL_JOIN") and (arg9 == g_ChatChannel) then
                -- Un joueur vient d'arrive sur le channel
                g_HasJoined[arg2] = GAS_currentTime();
                
        elseif (event == "CHAT_MSG_CHANNEL_LEAVE") and (arg9 == g_ChatChannel) then
                -- Un joueur vient de quitter le channel 
                -- Mise à jour du statut online
                GAS_SetOnlineStatus(arg2, false);
                
        elseif (event == "VARIABLES_LOADED") then
                GuildAds_InitVariablesLoaded();
                
        end
end

---------------------------------------------------------------------------------
--
-- Called by WOW for each frame
-- 
---------------------------------------------------------------------------------
function GuildAds_OnUpdate(elapsed)
        
        if (this.InitTimer) then
                this.InitTimer = this.InitTimer - elapsed;
                if (this.InitTimer <= 0) then
                        this.InitTimer = nil;
                        if (this.Reinit) then
                                GuildAds_ReinitSecond();
                        else
                                GuildAds_Init();
                        end
                end
        else
                if (this.SendAnnonceTimer) then
                        this.SendAnnonceTimer = this.SendAnnonceTimer - elapsed;
                        if (this.SendAnnonceTimer <=0) then
                                this.SendAnnonceTimer = nil;
                                GAC_SendAnnonce(nil);
                        end
                end
                
                if (this.SendSkillsTimer) then
                        this.SendSkillsTimer = this.SendSkillsTimer - elapsed;
                        if (this.SendSkillsTimer <= 0) then
                                this.SendSkillsTimer = nil;
                                GAC_SendSkills(nil);
                        end
                end     
                
                if (this.SynchronizeOfflinesTimer) then
                        this.SynchronizeOfflinesTimer = this.SynchronizeOfflinesTimer - elapsed;
                        if (this.SynchronizeOfflinesTimer <= 0) then
                                this.SynchronizeOfflinesTimer = nil;
                                if (this.SynchronizeOfflinesTimerEnd) then
                                        GAC_SynchronizeOfflinesEnd();
                                else
                                        GAC_SynchronizeOfflines(this.SynchronizeOfflinesCount);
                                end
                        end
                end
        end
end

---------------------------------------------------------------------------------
--
-- Called by WoW when this add-on is loaded.  Register for events we are interested in.
-- 
---------------------------------------------------------------------------------
function GuildAds_OnLoad()
        DEBUG_MSG("[GuildAds_OnLoad]");
        
        --
        this:RegisterEvent("VARIABLES_LOADED");
        
        this:RegisterEvent("PLAYER_LEVEL_UP");
        
        this:RegisterEvent("CHAT_MSG_SKILL");
        this:RegisterEvent("CHARACTER_POINTS_CHANGED");
        
        this:RegisterEvent("CHAT_MSG_CHANNEL_JOIN");
        this:RegisterEvent("CHAT_MSG_CHANNEL_LEAVE");
        
        this:RegisterEvent("PLAYER_GUILD_UPDATE");

        -- Start uninitialized
        g_GuildAdsInitialized = false;
        
        -- Slash commands
        SLASH_GUILDADS1 = "/guildads";
        SlashCmdList["GUILDADS"] = GuildAds_SlashHandler;
end

----------------------------------------------------------------------------------
--
-- Return non-nil if playerName has joined the GuildAds channel after the current one
-- 
---------------------------------------------------------------------------------
function GuildAds_HasJoined(playerName)
        return g_HasJoined[playerName];
end

function GuildAds_ResetHasJoined(playerName)
        g_HasJoined[playerName] = nil;
end

----------------------------------------------------------------------------------
--
-- Called by /guildads
-- 
---------------------------------------------------------------------------------
function GuildAds_ShowPlayerVersion()
        return g_showPlayerVersion;
end

function GuildAds_SlashHandler(msg)
        iStart, iEnd, command = string.find(msg, "(%w+)( ?)");
        if (iEnd) then
                param = string.sub(msg, iEnd+1)
        else
                param = "";
        end
        
        if (msg == "") then
                if (g_GuildAdsInitialized) then
                        GuildAds_Toggle();
                else
                        ChatFrame1:AddMessage("GuildAds is not initialized.");
                end
        elseif (command == "debuginfo") then
                GuildAds_Debuginfo();
        elseif (command == "reset") then
                g_GuildAdsInitialized = false;
                GuildAds.Version = "reset";
                ReloadUI();
        elseif (command == "hardreset") then
                g_GuildAdsInitialized = false;
                GuildAds = nil;
                ReloadUI();
        elseif (command == "debug") then
                GUILDADS_DEBUG = true;
                GUILDADSSTORAGE_DEBUG = true;
                GUILDADSCOMM_DEBUG = true;
        elseif (command == "nodebug") then
                GUILDADS_DEBUG = false;
                GUILDADSSTORAGE_DEBUG = false;
                GUILDADSCOMM_DEBUG = false;
        elseif (command == "config") then
                if (g_GuildAdsInitialized) then
                        GuildAdsConfigFrame:Show();
                else
                        ChatFrame1:AddMessage("GuildAds is not initialized.");
                end
        elseif (command == "angle") then
                if (param=="") then
                        ChatFrame1:AddMessage(GuildAds.Config.MinimapArcOffset);
                else
                        GuildAds.Config.MinimapArcOffset = tonumber(param)+0;
                        GuildAdsMinimapButton_Update();
                end
        elseif (command == "showVersions") then
                if g_showPlayerVersion then
                        ChatFrame1:AddMessage("show versions: no");
                        g_showPlayerVersion = false;
                else
                        ChatFrame1:AddMessage("show versions: yes");
                        g_showPlayerVersion = true;
                end
        elseif (command == "ignore") then
                if param=="" then
                        ChatFrame1:AddMessage(IGNORE_LIST);
                        for playerName, when in GAS_ProfileIgnoreList() do
                                ChatFrame1:AddMessage(string.format("|Hplayer %s|h[%s]|h "..GUILDADS_SINCE, playerName, playerName, GAS_timeToString(when)));
                        end
                else
                        if GAS_ProfileIsIgnored(param) then
                                ChatFrame1:AddMessage(string.format(ERR_IGNORE_REMOVED_S, param));
                                GAS_ProfileIgnore(param, false);
                        else
                                ChatFrame1:AddMessage(string.format(ERR_IGNORE_ADDED_S, param));
                                GAS_ProfileIgnore(param, true);
                        end
                end
        end
end

function GuildAds_Debuginfo()
        ChatFrame1:AddMessage("Version: "..GUILDADS_VERSION.."("..NoNil(GuildAds.Version)..")");
        if (g_GuildAdsInitialized) then
                ChatFrame1:AddMessage("GuildAdsInitialized: true");
        else
                ChatFrame1:AddMessage("GuildAdsInitialized: false");
        end
        ChatFrame1:AddMessage("PlayerName: "..NoNil(g_playerName));
        ChatFrame1:AddMessage("Realm: "..NoNil(g_realmName));
        ChatFrame1:AddMessage("AccountId: "..NoNil(GAS_GetAccountId()));
        ChatFrame1:AddMessage("Channel: "..NoNil(g_ChatChannel));
        ChatFrame1:AddMessage("JoinChannelAttemps: "..g_JoinChannelAttempts);
end

----------------------------------------------------------------------------------
--
-- Toggle hidden status of want ads
-- 
---------------------------------------------------------------------------------
function GuildAds_Toggle() 
        if (g_GuildAdsInitialized) then
                if ( GuildAdsFrame:IsVisible() ) then
                        GuildAdsFrame:Hide();
                else
                        GuildAdsFrame:Show();
                end
        end
end

----------------------------------------------------------------------------------
--
-- Toggle advertise on and off
-- 
---------------------------------------------------------------------------------
function GuildAds_SetPublishMyAds(state)
        if (state) then
                -- Broadcast all my ads
                GAC_SendAllAdsType(nil, nil);
        else
                -- Broadcast a message to remove all my ads
                GAC_SendRemoveAll(nil);
        end
        GuildAds.Config.PublishMyAds = state;
end