vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        InviteOMatic is a BG Group inviter
        
        @author Gof
        @version 29-03-06
]]--

----------------------------------------------------------------------
-- Saved variable
----------------------------------------------------------------------

InviteOMaticOptions = {};

----------------------------------------------------------------------
-- Strings used in this mod
----------------------------------------------------------------------

local IOM_VERSION = "v1.16";
local IOM_IOM = "[InviteOMatic]";
local IOM_LOADED = IOM_IOM.." "..IOM_VERSION.." Loaded!";

local IOM_FIRST_INVITE_SPAM_DEFAULT = IOM_IOM.." Please leave your groups, i have the raid group, (Or at least Promote me so i can help invite =)";

local IOM_ERROR_AIG_DEFAULT = IOM_IOM.." Since you appear to already be grouped you could not be auto-invited to the raid. If you want to join the raid, please leave your group and send me a whisper with the word: invite";

local IOM_INVITE_REG_EXP = "[iI][nN][vV][iI][tT][eE]"; -- Regular expression for magic word.

----------------------------------------------------------------------
-- Local variables used to capture state
----------------------------------------------------------------------
local IOM_WHOIS = false; -- Are we doing a /who lookup?
local IOM_NAME_BY_WHO = "----"; -- The name we are currently looking up over /Who
local IOM_NAME_BY_WHO_INVITER = "----"; -- The name of the person starting the lookup over /who
local IOM_BG_ACTIVE = false; -- Are we active in a BG, or just handling group outside BG
local IOM_BG_ACTIVE_INDEX = -1; -- The index of the active BG
local IOM_INVITE_WAIT = 1; -- Time to back off before sending invites again, (in seconds)
-- local IOM_FIRST_SCHED_TIME = 2; -- Time to wait from joining BG, to sending the first invite
local IOM_LAST_INVITE = 0; -- Time since last invite cycle, to prevent spamming of invites
local IOM_INVITE_FIRST = true; -- Is this the first invite cycle in this BG?
local IOM_READY = false;

local IOM_AIG = {};
local IOM_AIG_ERROR = {};
local IOM_DECLINE = {};
local IOM_IGNORE = {};

local IOM_GROUPBUG = {};

local IOM_PURGE_TIMER = 0;
local IOM_INVITE_TIMER = 0;
local IOM_UPDATE_PURGE_TIMER = false;
local IOM_UPDATE_INVITE_TIMER = false;

----------------------------------------------------------------------
-- This function is called when the mod is first loaded.
----------------------------------------------------------------------

function InviteOMatic_OnLoad()
        this:RegisterEvent("VARIABLES_LOADED"); -- Saved variables loaded
        this:RegisterEvent("UPDATE_BATTLEFIELD_STATUS"); -- Register event that fires when BG status changes
        this:RegisterEvent("CHAT_MSG_WHISPER"); -- Register event that fires when player receives a whisper
end

----------------------------------------------------------------------
-- Called when an event occurs (That we have registered to hear)
--
-- @param event The event that occured
----------------------------------------------------------------------
function InviteOMatic_OnEvent()

        if( event == "VARIABLES_LOADED" ) then
                InviteOMatic_VariablesLoaded();         
                
        elseif( event == "CHAT_MSG_WHISPER" ) then
                InviteOMatic_WhisperEvent(arg1, arg2);
        
        elseif( event == "UPDATE_BATTLEFIELD_STATUS" ) then
                InviteOMatic_BGEvent();
        
        elseif( event == "WHO_LIST_UPDATE" ) then
                InviteOMatic_WhoEvent();
        
        elseif( event == "CHAT_MSG_SYSTEM" ) then
                InviteOMatic_ChannelSystem(arg1);

        end
end

function InviteOMatic_VariablesLoaded()
        if( InviteOMaticOptions == nil ) then
                InviteOMaticOptions = {};
        end

        if( type(InviteOMaticOptions) ~= "table" ) then
                InviteOMaticOptions = {};
        end

        if( InviteOMaticOptions["autoInvite"] == nil ) then
                InviteOMaticOptions["autoInvite"] = true;
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteAutoInvite", "checked", InviteOMaticOptions["autoInvite"]);
        end

        if( InviteOMaticOptions["whisperInvite"] == nil ) then
                InviteOMaticOptions["whisperInvite"] = true;
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteWhisperInvite", "checked", InviteOMaticOptions["whisperInvite"]);
        end

        if( InviteOMaticOptions["autoPurge"] == nil ) then
                InviteOMaticOptions["autoPurge"] = true;
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteAutoPurge", "checked", InviteOMaticOptions["autoPurge"]);
        end

        if( InviteOMaticOptions["debug"] == nil ) then
                InviteOMaticOptions["debug"] = false;
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteDebug", "checked", InviteOMaticOptions["debug"]);
        end

        if( InviteOMaticOptions["ignoreList"] == nil ) then
                InviteOMaticOptions["ignoreList"] = {};
        end

        if( InviteOMaticOptions["aigttl"] == nil ) then
                InviteOMaticOptions["aigttl"] = 10;
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteAIGRetry", "slider", InviteOMaticOptions["aigttl"]);
        end

        if( InviteOMaticOptions["declinettl"] == nil ) then
                InviteOMaticOptions["declinettl"] = 1;
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteDeclineRetry", "slider", InviteOMaticOptions["declinettl"]);
        end

        if( InviteOMaticOptions["ignorettl"] == nil ) then
                InviteOMaticOptions["ignorettl"] = 1;
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteIgnoreRetry", "slider", InviteOMaticOptions["ignorettl"]);
        end

        if( InviteOMaticOptions["sendInviteSpam"] == nil ) then
                InviteOMaticOptions["sendInviteSpam"] = true;
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteSendSpam", "checked", InviteOMaticOptions["sendInviteSpam"]);
        end

        if( InviteOMaticOptions["sendAIGSpam"] == nil ) then
                InviteOMaticOptions["sendAIGSpam"] = true;
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteSendAIGSpam", "checked", InviteOMaticOptions["sendAIGSpam"]);
        end

        if( InviteOMaticOptions["inviteDelay"] == nil ) then
                InviteOMaticOptions["inviteDelay"] = 10;
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteDelay", "slider", InviteOMaticOptions["inviteDelay"]);
        end

        if( InviteOMaticOptions["purgeDelay"] == nil ) then
                InviteOMaticOptions["purgeDelay"] = 10;
                InviteOMatic_KhaosSetKey("InviteOMatic", "PurgeDelay", "slider", InviteOMaticOptions["purgeDelay"]);
        end

        if( InviteOMaticOptions["inviteMsg"] == nil ) then
                InviteOMaticOptions["inviteMsg"] = IOM_FIRST_INVITE_SPAM_DEFAULT;
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteSpamMsg", "value", InviteOMaticOptions["inviteMsg"]);
        end

        if( InviteOMaticOptions["aigMsg"] == nil ) then
                InviteOMaticOptions["aigMsg"] = IOM_ERROR_AIG_DEFAULT;
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteAIGSpamMsg", "value", InviteOMaticOptions["aigMsg"]);
        end

        if( InviteOMaticOptions["magicWord"] == nil ) then
                InviteOMaticOptions["magicWord"] = IOM_INVITE_REG_EXP;
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteMagicWord", "value", InviteOMaticOptions["magicWord"]);
        end

        InviteOMatic.log(IOM_LOADED);
        SlashCmdList["IOM"] = InviteOMatic_SlashHandler;
        SLASH_IOM1 = "/iom";

        IOM_READY = true;

        InviteOMatic_RegisterKhaos();

end

----------------------------------------------------------------------
-- Slash command handler
----------------------------------------------------------------------
function InviteOMatic_SlashHandler(msg)
        if( not IOM_READY ) then
                return;
        end
        
        if( InviteOMatic_IsDisabled() ) then
                return;
        end
        
        local oldmsg = msg;
        msg = string.lower(msg);
        
        InviteOMatic.debug("Slashcommand: ("..msg..")");
        
        _, _, option, value = string.find(msg, "(%w*)%s*(%w*)");
        
        InviteOMatic.debug("Option: ("..option.."), Value: ("..value..")");
        
        if( option == "autoinvite" ) then
                if( value == "on" ) then
                        InviteOMaticOptions["autoInvite"] = true;
                elseif( value == "off" ) then
                        InviteOMaticOptions["autoInvite"] = false;
                else
                        InviteOMaticOptions["autoInvite"] = not InviteOMaticOptions["autoInvite"];
                end
                InviteOMatic.log("Auto invite set to: "..tostring(InviteOMaticOptions["autoInvite"]));
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteAutoInvite", "checked", InviteOMaticOptions["autoInvite"]);
                if( IOM_BG_ACTIVE ) then
                        IOM_UPDATE_INVITE_TIMER = InviteOMaticOptions["autoInvite"];
                end
                
        elseif( option == "whisperinvite" ) then
                if( value == "on" ) then
                        InviteOMaticOptions["whisperInvite"] = true;
                elseif( value == "off" ) then
                        InviteOMaticOptions["whisperInvite"] = false;
                else
                        InviteOMaticOptions["whisperInvite"] = not InviteOMaticOptions["whisperInvite"];
                end
                InviteOMatic.log("Whisper invite set to: "..tostring(InviteOMaticOptions["whisperInvite"]));
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteWhisperInvite", "checked", InviteOMaticOptions["whisperInvite"]);

        elseif( option == "autopurge" ) then
                if( value == "on" ) then
                        InviteOMaticOptions["autoPurge"] = true;
                elseif( value == "off" ) then
                        InviteOMaticOptions["autoPurge"] = false;
                else
                        InviteOMaticOptions["autoPurge"] = not InviteOMaticOptions["autoPurge"];
                end
                InviteOMatic.log("Auto purge set to: "..tostring(InviteOMaticOptions["autoPurge"]));
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteAutoPurge", "checked", InviteOMaticOptions["autoPurge"]);
                if( IOM_BG_ACTIVE ) then
                        IOM_UPDATE_PURGE_TIMER = InviteOMaticOptions["autoPurge"];
                end
                
        elseif( option == "spam" ) then
                if( value == "on" ) then
                        InviteOMaticOptions["sendInviteSpam"] = true;
                elseif( value == "off") then
                        InviteOMaticOptions["sendInviteSpam"] = false;
                else
                        InviteOMaticOptions["sendInviteSpam"] = not InviteOMaticOptions["sendInviteSpam"];
                end
                InviteOMatic.log("Invite spam set to: "..tostring(InviteOMaticOptions["sendInviteSpam"]));
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteSendSpam", "checked", InviteOMaticOptions["sendInviteSpam"]);
        
        elseif( option == "debug" ) then
                if( value == "on" ) then
                        InviteOMaticOptions["debug"] = true;
                elseif( value == "off") then
                        InviteOMaticOptions["debug"] = false;
                else
                        InviteOMaticOptions["debug"] = not InviteOMaticOptions["debug"];
                end
                InviteOMatic.log("Debug messages set to: "..tostring(InviteOMaticOptions["debug"]));
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteDebug", "checked", InviteOMaticOptions["debug"]);

        elseif( option == "ignore" ) then
                if( value ~= nil ) then
                        local lowerName = string.lower(value);
                        InviteOMaticOptions["ignoreList"][lowerName] = lowerName;
                else
                        InviteOMatic.log("You need to specify a playername you wish to add to the ignore-list, /iom ignore playername");
                end
                InviteOMatic.log(value.." added to ignore list");

        elseif( option == "removeignore" ) then
                if( value ~= nil ) then
                        local lowerName = string.lower(value);
                        InviteOMaticOptions["ignoreList"][lowerName] = nil;
                else
                        InviteOMatic.log("You need to specify a playername you wish to remove from the ignore-list, /iom ignore playername");
                end
                InviteOMatic.log(value.." removed from ignore list");

        elseif( option == "spammsg" ) then
                if( value == "default" ) then
                        InviteOMaticOptions["inviteMsg"] = IOM_FIRST_INVITE_SPAM_DEFAULT;
                        InviteOMatic.log("First spam msg set to default: "..InviteOMaticOptions["inviteMsg"]);
                        InviteOMatic_KhaosSetKey("InviteOMatic", "InviteSpamMsg", "value", InviteOMaticOptions["inviteMsg"]);
                        return;
                end
                
                sS, sE = string.find(msg, "\".*\"");
                
                if( not sS ) then
                        InviteOMatic.log("You need to specify a new message ex. /iom spammsg \"newmsg\"");
                        return;
                end
                
                newmsg = string.sub(oldmsg, sS+1, sE-1);
                InviteOMatic.debug("New message is: ("..newmsg..")");
                InviteOMaticOptions["inviteMsg"] = newmsg;
                InviteOMatic.log("First spam msg set to: "..InviteOMaticOptions["inviteMsg"]);
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteSpamMsg", "value", InviteOMaticOptions["inviteMsg"]);

        elseif( option == "aigmsg" ) then
                if( value == "default" ) then
                        InviteOMaticOptions["aigMsg"] = IOM_ERROR_AIG_DEFAULT;
                        InviteOMatic.log("AIG spam msg set to default: "..InviteOMaticOptions["aigMsg"]);
                        InviteOMatic_KhaosSetKey("InviteOMatic", "InviteAIGSpamMsg", "value", InviteOMaticOptions["aigMsg"]);
                        return;
                end

                sS, sE = string.find(msg, "\".*\"");

                if( not sS ) then
                        InviteOMatic.log("You need to specify a new message ex. /iom aigmsg \"newmsg\"");
                        return;
                end

                newmsg = string.sub(oldmsg, sS+1, sE-1);
                InviteOMatic.debug("New message is: ("..newmsg..")");
                InviteOMaticOptions["aigMsg"] = newmsg;
                InviteOMatic.log("AIG spam msg set to: "..InviteOMaticOptions["aigMsg"]);
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteAIGSpamMsg", "value", InviteOMaticOptions["aigMsg"]);

        elseif( option == "magicword" ) then
                if( value == "default" ) then
                        InviteOMaticOptions["magicWord"] = IOM_INVITE_REG_EXP;
                        InviteOMatic.log("Magic word set to default: "..InviteOMaticOptions["magicWord"]);
                        InviteOMatic_KhaosSetKey("InviteOMatic", "InviteMagicWord", "value", InviteOMaticOptions["magicWord"]);
                        return;
                end

                sS, sE = string.find(msg, "\".*\"");

                if( not sS ) then
                        InviteOMatic.log("You need to specify a new magic word ex. /iom aigmsg \"[iI][nN][vV]\"");
                        return;
                end

                newmsg = string.sub(oldmsg, sS+1, sE-1);
                InviteOMatic.debug("New magic word is: ("..newmsg..")");
                InviteOMaticOptions["magicWord"] = newmsg;
                InviteOMatic.log("Magic word set to: "..InviteOMaticOptions["magicWord"]);
                InviteOMatic_KhaosSetKey("InviteOMatic", "InviteMagicWord", "value", InviteOMaticOptions["magicWord"]);

        elseif( option == "resetaiglist" ) then
                InviteOMatic_ResetAIG();
                InviteOMatic.log("Already in group list reset");

        elseif( option == "promote" ) then
                InviteOMatic_PromoteAll();
        
        elseif( option == "demote" ) then
                InviteOMatic_DemoteAll();

        elseif( option == "aigttl" ) then
                if( value ) then
                        local num = tonumber(value);
                        if( num ) then
                                if( num >= 0 and num <= 20 ) then
                                        InviteOMaticOptions["aigttl"] = num;
                                        InviteOMatic.log("Already in group retries set to: "..InviteOMaticOptions["aigttl"]);
                                        InviteOMatic_KhaosSetKey("InviteOMatic", "InviteAIGRetry", "slider", InviteOMaticOptions["aigttl"]);
                                else
                                        InviteOMatic.log("Number must be between 0 and 20");
                                end
                        end
                end
        elseif( option == "ignorettl" ) then
                if( value ) then
                        local num = tonumber(value);
                        if( num ) then
                                if( num >= 0 and num <= 10 ) then
                                        InviteOMaticOptions["ignorettl"] = num;
                                        InviteOMatic.log("Ignore retries set to: "..InviteOMaticOptions["ignorettl"]);
                                        InviteOMatic_KhaosSetKey("InviteOMatic", "InviteIgnoreRetry", "slider", InviteOMaticOptions["ignorettl"]);
                                else
                                        InviteOMatic.log("Number must be between 0 and 10");
                                end
                        end
                end

        elseif( option == "declinettl" ) then
                if( value ) then
                        local num = tonumber(value);
                        if( num ) then
                                if( num >= 0 and num <= 10 ) then
                                        InviteOMaticOptions["declinettl"] = num;
                                        InviteOMatic.log("Decline retries set to: "..InviteOMaticOptions["declinettl"]);
                                        InviteOMatic_KhaosSetKey("InviteOMatic", "InviteDeclineRetry", "slider", InviteOMaticOptions["declinettl"]);
                                else
                                        InviteOMatic.log("Number must be between 0 and 10");
                                end
                        end
                end

        else
                InviteOMatic.log("Unknown option: "..option);
                InviteOMatic.log("Usage: /iom option value");
                InviteOMatic.log("Options:");
                InviteOMatic.log(" autoinvite on|off -- Turns autoinvite on/off");
                InviteOMatic.log(" autopurge on|off -- Turns autopurge on/off");
                InviteOMatic.log(" whisperinvite on|off -- Turns whisperinvite on/off");
                InviteOMatic.log(" debug on|off -- Turns debug messages on/off");
                InviteOMatic.log(" spam on|off -- Turns the invite spam on/off");
                InviteOMatic.log(" spammsg default|\"newmsg\" -- Sets invite msg to newmsg");
                InviteOMatic.log(" aigmsg default|\"newmsg\" -- Sets AIG msg to newmsg");
                InviteOMatic.log(" magicword default|\"word\" -- Sets the magic invite word (REGEXP)");
                InviteOMatic.log(" resetaiglist -- Resets the already in group list");
                InviteOMatic.log(" ignore playername -- Puts the player on the ignorelist (Will not be invited)");
                InviteOMatic.log(" removeignore playername -- Puts the player on the ignorelist (Will not be invited)");
                InviteOMatic.log(" promote -- Promotes all members of the raidgroup");
                InviteOMatic.log(" demote -- Demotes all members of the raidgroup");
                InviteOMatic.log(" aigttl num -- Set number of already in group retries to num");
                InviteOMatic.log(" ignorettl num -- Set number of ignore retries to num");
                InviteOMatic.log(" declinettl num -- Set number of decline retries to num");
        end
        
end

function InviteOMatic_KhaosSetKey(set, key, type, value)
        if(Khaos) then
                if(Khaos.getSetKey(set,key)) then
                        Khaos.setSetKeyParameter(set, key, type, value);
                end
        end
end

----------------------------------------------------------------------
-- Should this person be invited? (Do checks)
----------------------------------------------------------------------
function InviteOMatic_ShouldInvite(name)
        if( not IOM_READY ) then
                return;
        end
        if( InviteOMatic_IsDisabled() ) then
                return;
        end

        if( name ~= nil ) then
          local lowerName = string.lower(name);
        
                if( InviteOMaticOptions["ignoreList"][lowerName] ~= nil ) then
                        -- This player is ignored, so dont invite
                        InviteOMatic.debug("Player "..charname.." is on ignore list, so will not get invited");
                        return false;
                end

                -- Do checks on this specefic name (Will only reject, not accept)
                
                if( IOM_AIG[name] and IOM_AIG[name] >= InviteOMaticOptions["aigttl"] ) then
                        
                        if( not IOM_AIG_ERROR[name] ) then
                                IOM_AIG_ERROR[name] = true;
                                if( InviteOMaticOptions["sendAIGSpam"] ) then
                                        SendChatMessage(InviteOMaticOptions["aigMsg"], "WHISPER",this.language,name);
                                end
                        end
                        
                        return false;

                end
                if( IOM_DECLINE[name] and IOM_DECLINE[name] >= InviteOMaticOptions["declinettl"] ) then
                        return false;
                end
                
                if( IOM_IGNORE[name] and IOM_IGNORE[name] >= InviteOMaticOptions["ignorettl"] ) then
                        return false;
                end
        end     
        
        --Do general checks( Accept and reject )
        
        -- If raid officer or leader then ok
        if( IsRaidLeader() or IsRaidOfficer() or IsPartyLeader() ) then
                return true;
        elseif( IOM_BG_ACTIVE and ((GetNumPartyMembers() > 0) or (GetNumRaidMembers() > 0)) ) then
                --We are in a BG, but not able to invite
                return false;
        end

        return true;
end

----------------------------------------------------------------------
-- Invite the player with the given name, if its ok
----------------------------------------------------------------------
function InviteOMatic_InvitePlayer(name)
        if( InviteOMatic_IsDisabled() ) then
                return;
        end

        if( name == nil ) then
                return;
        end

  local lowerName = string.lower(name);

        if( InviteOMaticOptions["ignoreList"][lowerName] ~= nil ) then
                -- This player is ignored, so dont invite
                InviteOMatic.debug("Player "..lowerName.." is on ignore list, so will not get invited");
                return;
        end
        
        InviteOMatic.debug("Checking invite: ("..name..")");
        
        local ok = InviteOMatic_ShouldInvite(name);
        
        if( ok ) then
                InviteOMatic.debug("("..name..") checked ok, inviting");
        
                if( IOM_GROUPBUG[name] ~= nil ) then
                        InviteOMatic.debug("Group bug2 maybee found. Uninviting first...");
                        
                        UninviteByName(name);
                end
        
                InviteByName(name);
                
                IOM_GROUPBUG[name] = true;
                
        else    
                InviteOMatic.debug("("..name..") failed check!");
        end
end

----------------------------------------------------------------------
-- Convert to Raid
----------------------------------------------------------------------
function InviteOMatic_MakeRaid()
        if( InviteOMatic_IsDisabled() ) then
                return;
        end

        local raidMembers = GetNumRaidMembers();
        local isLeader = IsPartyLeader();
        
        if( (raidMembers == 0) and isLeader ) then
                
                InviteOMatic.debug("Converting to raid...");
                
                ConvertToRaid();
        end
end

----------------------------------------------------------------------
-- Function to handle enter world event
----------------------------------------------------------------------
function InviteOMatic_BGEvent()
        InviteOMatic.debug("Battlefield status changed...");
        
        NUMBER_OF_BATTLEFIELDS = 3;
        
        if( not IOM_BG_ACTIVE ) then
                for i=1,NUMBER_OF_BATTLEFIELDS do
                status, mapName, instanceID = GetBattlefieldStatus(i);
                        
                        InviteOMatic.debug("Status: "..status..", MapName: "..mapName..", InstanceID: "..instanceID);
                        
                        if( status == "active" ) then
                                
                                InviteOMatic_EnteredBG(i);
                                
                        end
                end
        else
                status, mapName, instanceID = GetBattlefieldStatus(IOM_BG_ACTIVE_INDEX);
                if( status ~= "active" ) then
                        -- You have left BG
                                InviteOMatic_LeftBG(IOM_BG_ACTIVE_INDEX);
                end
        end
end

----------------------------------------------------------------------
-- Function to handle whisper events
----------------------------------------------------------------------
function InviteOMatic_WhisperEvent(text, name)
        if( InviteOMatic_IsDisabled() ) then
                return;
        end

        InviteOMatic.debug("Tell recieved...");
        
        --If whisper invites isnt enabled, just return
        if( not InviteOMaticOptions["whisperInvite"] ) then
                return;
        end
        
        --Check if tell contains the magic word invite
        
        sStart, sEnd = string.find(text, InviteOMaticOptions["magicWord"], 1);
        if( sStart ~= nil ) then
                
                --Check if the word just after invite is a player
                sStart2, sEnd2 = string.find(text, "%s[^%s%?%.!]+", sEnd);
                
                if( sStart2 ~= nil ) then
                        local foundName = string.lower( string.sub(text, sStart2+1, sEnd2) );
                
                        if( foundName == "me" or foundName == "please" or foundName == "plz" or foundName == "plez" or foundName == "pleaz") then
                                IOM_AIG[name] = nil;
                                IOM_AIG_ERROR[name] = nil;
                                IOM_IGNORE[name] = nil;
                                IOM_DECLINE[name] = nil;
                                InviteOMatic.invite(name);
                        else
                                InviteOMatic.debug(name.." wants you to invite ("..foundName..")");
                                
                                IOM_WHOIS = true;
                                
                                this:RegisterEvent("WHO_LIST_UPDATE");
                                FriendsFrame:UnregisterEvent("WHO_LIST_UPDATE");
                                SetWhoToUI(1);
                                
                                -- Do lookup via Who command.
                                IOM_NAME_BY_WHO = string.lower(foundName);
                                IOM_NAME_BY_WHO_INVITER = name;
                                
                                SendWho("n-\""..foundName.."\"");
                        end
                else
                        IOM_AIG[name] = nil;
                        IOM_AIG_ERROR[name] = nil;
                        IOM_IGNORE[name] = nil;
                        IOM_DECLINE[name] = nil;
                        InviteOMatic.invite(name);
                end
        end
end

----------------------------------------------------------------------
-- Function to handle who events
----------------------------------------------------------------------
function InviteOMatic_WhoEvent()

        if( IOM_WHOIS ) then 
                InviteOMatic.debug("WHO_LIST_UPDATED - ("..IOM_NAME_BY_WHO..")");

                local invited = false;

                -- We saw our who, so reset everything back

                SetWhoToUI(0);
                FriendsFrame:RegisterEvent("WHO_LIST_UPDATE");                  
                this:UnregisterEvent("WHO_LIST_UPDATE");
                IOM_WHOIS = false;
                
                -- Now process the who list
                local length = GetNumWhoResults();
                
                for i=1,length do
                        charname, guildname, level, race, class, zone, unknown = GetWhoInfo(i);
                        
                        InviteOMatic.debug("Found: "..charname);
                        
                        charname = string.lower(charname);
                        
                        if( charname == IOM_NAME_BY_WHO ) then
                                if( InviteOMaticOptions["ignoreList"][charname] ~= nil ) then
                                        -- This player is ignored, so dont invite
                                        InviteOMatic.log("Player "..charname.." is on ignore list, so will not get invited");
                                        return;
                                end

                                IOM_AIG[IOM_NAME_BY_WHO] = nil;
                                IOM_AIG_ERROR[IOM_NAME_BY_WHO] = nil;
                                IOM_IGNORE[IOM_NAME_BY_WHO] = nil;
                                IOM_DECLINE[IOM_NAME_BY_WHO] = nil;
                                InviteOMatic.invite(IOM_NAME_BY_WHO);
                                invited = true;
                        end
                end
                
                if( not invited ) then
                        if( InviteOMaticOptions["ignoreList"][IOM_NAME_BY_WHO_INVITER] ~= nil ) then
                                -- This player is ignored, so dont invite
                                InviteOMatic.log("Player "..charname.." is on ignore list, so will not get invited");
                                return;
                        end

                        IOM_AIG[IOM_NAME_BY_WHO_INVITER] = nil;
                        IOM_AIG_ERROR[IOM_NAME_BY_WHO_INVITER] = nil;
                        IOM_IGNORE[IOM_NAME_BY_WHO_INVITER] = nil;
                        IOM_DECLINE[IOM_NAME_BY_WHO_INVITER] = nil;

                        InviteByName(IOM_NAME_BY_WHO_INVITER);
                end
                
                -- Done processing, reset IOM_NAME_BY_WHO, IOM_NAME_BY_WHO_INVITER
                IOM_NAME_BY_WHO = "----";
                IOM_NAME_BY_WHO_INVITER = "----";
        end
end

----------------------------------------------------------------------
-- Called when InviteOMatic detects that you have entered a BG
--
-- Sets up the events we want to listen for while in BG, and starts invite script
----------------------------------------------------------------------
function InviteOMatic_EnteredBG(index)
        IOM_BG_ACTIVE_INDEX = index;
        IOM_BG_ACTIVE = true;

        status, mapName, instanceID = GetBattlefieldStatus(index);
        
        local runtime = GetBattlefieldInstanceRunTime();
        
        InviteOMatic.debug("You entered "..mapName.." Runtime: "..runtime);
        
        if( InviteOMaticOptions["autoInvite"] ) then
                IOM_UPDATE_INVITE_TIMER = true;
        end
        
        if( InviteOMaticOptions["autoPurge"] ) then
                IOM_UPDATE_PURGE_TIMER = true;
        end
        
        this:RegisterEvent("CHAT_MSG_SYSTEM");
end

----------------------------------------------------------------------
-- This function purges players that are offline or has left the BG
----------------------------------------------------------------------
function InviteOMatic_DoPurge()
        if( InviteOMatic_IsDisabled() ) then
                return;
        end

        if( not InviteOMaticOptions["autoPurge"] ) then
                return;
        end

        for i=1,GetNumRaidMembers() do
                --do som check for each member determing if he is online, if he isnt, purge him
        end
end

----------------------------------------------------------------------
-- Promotes all memebers of a raid group
----------------------------------------------------------------------
function InviteOMatic_PromoteAll()
        if( InviteOMatic_IsDisabled() ) then
                return;
        end

        for i=1,GetNumRaidMembers() do
                local name = GetRaidRosterInfo(i);
                
                if( IsRaidLeader() ) then
                        PromoteToAssistant(name);
                end
                
        end
end

----------------------------------------------------------------------
-- Demotes all memebers of a raid group
----------------------------------------------------------------------
function InviteOMatic_DemoteAll()
        if( InviteOMatic_IsDisabled() ) then
                return;
        end

        for i=1,GetNumRaidMembers() do
                local name = GetRaidRosterInfo(i);
                
                if( IsRaidLeader() ) then
                        DemoteAssistant(name);
                end
                
        end
end

----------------------------------------------------------------------
-- Disbands the raid group uninviting every member
----------------------------------------------------------------------
function InviteOMatic_DisbandRaidGroup()
        if( InviteOMatic_IsDisabled() ) then
                return;
        end

        for i=1,GetNumRaidMembers() do
                --Remove player from raid
                local name = GetRaidRosterInfo(i);
                
                if( IsRaidLeader() or IsRaidOfficer() or IsPartyLeader() ) then
                        UninviteByName(name);
                end
                
        end

        for i=1,GetNumPartyMembers() do
                --Remove player from group
        end
end

----------------------------------------------------------------------
-- This function tries to invite everyone that is not already in our group
----------------------------------------------------------------------
function InviteOMatic_SendInvites()
        if( InviteOMatic_IsDisabled() ) then
                return;
        end

        if( not InviteOMaticOptions["autoInvite"] ) then
                return;
        end

        local bfCount = GetNumBattlefieldPositions();
        
        if( bfCount == 0 ) then
                return;
        end

        InviteOMatic.debug("Sending invites - InviteOMatic_SendInvites()");
        
        if( not IOM_BG_ACTIVE ) then
                InviteOMatic.debug("Not in a BG");
                return;
        end
        
        local now = GetTime();
        
        local delta = now - IOM_LAST_INVITE;
        
        if( delta < IOM_INVITE_WAIT ) then
                InviteOMatic.debug("Wait a little longer...("..delta..")");
                return;
        end

        if( not InviteOMatic_ShouldInvite(nil) ) then
                -- We got a negative from ShouldInvite, so we stop here
                return;
        end

        if( IOM_INVITE_FIRST ) then
                IOM_INVITE_FIRST = false;

                if( InviteOMaticOptions["sendInviteSpam"] ) then
                        SendChatMessage(InviteOMaticOptions["inviteMsg"], "SAY");
                end
        end
        
        -- Convert to raid if any members is in party
        InviteOMatic_MakeRaid();
        
        local count = GetNumBattlefieldPositions(); -- Number of players not in our raid
        
        if( (count > 4) and (GetNumRaidMembers() == 0) ) then
                -- Not a raid yet so only invite 4 people
                count = 5 - GetNumPartyMembers();
        end

        for i=1,count do
                posX, posY, name = GetBattlefieldPosition(i);
                
                InviteOMatic.invite(name);
        end

        IOM_LAST_INVITE = GetTime();
        
end

----------------------------------------------------------------------
-- Function to handle system messages
----------------------------------------------------------------------
function InviteOMatic_ChannelSystem(arg1)
        if( InviteOMatic_IsDisabled() ) then
                return;
        end

        local name = "";

        if( string.find(arg1, "has joined the battle") ) then
                sS, sE = string.find(arg1, "%[");
                sS2, sE2 = string.find(arg1, "%]");
                name = string.sub(arg1,sS+1,sS2-1);
                InviteOMatic_PlayerJoinedBattle(name);

        elseif( string.find(arg1, "has left the battle") ) then
                sS, sE = string.find(arg1, "[^%s%!%?]+");
                name = string.sub(arg1,sS,sE);
                InviteOMatic_PlayerLeftBattle(name);

        elseif( string.find(arg1, "declines your group invitation") ) then
                sS, sE = string.find(arg1, "[^%s%!%?]+");
                name = string.sub(arg1,sS,sE);
                InviteOMatic_PlayerDeclined(name);

        elseif( string.find(arg1, "is ignoring you") ) then
                sS, sE = string.find(arg1, "[^%s%!%?]+");
                name = string.sub(arg1,sS,sE);
                InviteOMatic_PlayerIgnores(name);

        elseif( string.find(arg1, "is already in a group") ) then
                sS, sE = string.find(arg1, "[^%s%!%?]+");
                name = string.sub(arg1,sS,sE);
                InviteOMatic_PlayerAlreadyGrouped(name);

        elseif( string.find(arg1, "joins the party") ) then
                sS, sE = string.find(arg1, "[^%s%!%?]+");
                name = string.sub(arg1,sS,sE);
                InviteOMatic_PlayerJoinedGroup(name);

        elseif( string.find(arg1, "has joined the raid group") ) then
                sS, sE = string.find(arg1, "[^%s%!%?]+");
                name = string.sub(arg1,sS,sE);
                InviteOMatic_PlayerJoinedGroup(name);
        
        elseif( string.find(arg1, "You have invited") ) then
                sS, sE = string.find(arg1, "You have invited");
                sS2, sE2 = string.find(arg1, "[^%s%!%?]+", sE+1);
                name = string.sub(arg1,sS2,sE2);
                InviteOMatic_PlayerInvitedEvent(name);

        else
                InviteOMatic.debug("Unhandled sysmsg: "..arg1);
        
        end
        
end

----------------------------------------------------------------------
-- Remove this player from the groupbug table
----------------------------------------------------------------------
function InviteOMatic_PlayerInvitedEvent(name)
        InviteOMatic.debug("You invited: ("..name..")");
        
        IOM_GROUPBUG[name] = nil;
end

----------------------------------------------------------------------
-- Resets AIG list
----------------------------------------------------------------------
function InviteOMatic_ResetAIG()
        if( InviteOMatic_IsDisabled() ) then
                return;
        end

        InviteOMatic.debug("Resetting AIG list...");
        IOM_AIG = {};
        IOM_AIG_ERROR = {};
end

----------------------------------------------------------------------
-- Resets DECLINE list
----------------------------------------------------------------------
function InviteOMatic_ResetDecline()
        if( InviteOMatic_IsDisabled() ) then
                return;
        end

        InviteOMatic.debug("Resetting Decline list...");
        IOM_DECLINE = {};
end

----------------------------------------------------------------------
-- Resets IGNORE list
----------------------------------------------------------------------
function InviteOMatic_ResetIgnore()
        if( InviteOMatic_IsDisabled() ) then
                return;
        end

        InviteOMatic.debug("Resetting Ignore list...");
        IOM_IGNORE = {};
end

----------------------------------------------------------------------
-- Player Joined Group
----------------------------------------------------------------------
function InviteOMatic_PlayerJoinedGroup(name)
        if( IOM_BG_ACTIVE ) then
                InviteOMatic_MakeRaid();
                
                IOM_AIG[name] = nil;
                IOM_AIG_ERROR[name] = nil;
                IOM_IGNORE[name] = nil;
                IOM_DECLINE[name] = nil;
                
        end
end

----------------------------------------------------------------------
-- Player Joined Battle
----------------------------------------------------------------------
function InviteOMatic_PlayerJoinedBattle(name)
        
        if( InviteOMaticOptions["autoInvite"] ) then
                InviteOMatic.invite(name);
        end
end

----------------------------------------------------------------------
-- Player Left Battle
----------------------------------------------------------------------
function InviteOMatic_PlayerLeftBattle(name)
        -- If purge is enabled, then uninvite this player

        if( InviteOMaticOptions["autoPurge"] ) then
                if( IsRaidLeader() or IsRaidOfficer() or IsPartyLeader() ) then
                        for i=1,GetNumRaidMembers() do
                                --Remove player from raid
                                local name2 = GetRaidRosterInfo(i);
                                if( name == name2 ) then
                                        UninviteByName(name);
                                        return;
                                end
                        end
                        if( GetNumRaidMembers() == 0 ) then
                                UninviteByName(name);
                        end
                end
        end
end

----------------------------------------------------------------------
-- Player Declined
----------------------------------------------------------------------
function InviteOMatic_PlayerDeclined(name)
        -- Player declined our group invite
        if( IOM_DECLINE[name] == nil ) then
                IOM_DECLINE[name] = 1;
        else
                IOM_DECLINE[name] = IOM_DECLINE[name] + 1;
                
                if( IOM_DECLINE[name] > InviteOMaticOptions["declinettl"] ) then
                        IOM_DECLINE[name] = InviteOMaticOptions["declinettl"];
                end
        end

        InviteOMatic.debug(name.." declined invitation "..(InviteOMaticOptions["declinettl"] - IOM_DECLINE[name]).." retries left");

end

----------------------------------------------------------------------
-- Player Ignores
----------------------------------------------------------------------
function InviteOMatic_PlayerIgnores(name)
        -- Player ignored you
        if( IOM_IGNORE[name] == nil ) then
                IOM_IGNORE[name] = 0;
        else
                IOM_IGNORE[name] = IOM_IGNORE[name] + 1;
                
                if( IOM_IGNORE[name] > InviteOMaticOptions["ignorettl"] ) then
                        IOM_IGNORE[name] = InviteOMaticOptions["ignorettl"];
                end
        end

        InviteOMatic.debug(name.." ingored you "..(InviteOMaticOptions["ignorettl"] - IOM_IGNORE[name]).." retries left");

end

----------------------------------------------------------------------
-- Player Already in group
----------------------------------------------------------------------
function InviteOMatic_PlayerAlreadyGrouped(name)
        -- Player is already grouped
        if( IOM_AIG[name] == nil ) then
                IOM_AIG[name] = 0;
        else
                IOM_AIG[name] = IOM_AIG[name] + 1;
                
                if( IOM_AIG[name] > InviteOMaticOptions["aigttl"] ) then
                        IOM_AIG[name] = InviteOMaticOptions["aigttl"];
                end
        end

        InviteOMatic.debug(name.." was already in group "..(InviteOMaticOptions["aigttl"] - IOM_AIG[name]).." retries left");

end

----------------------------------------------------------------------
-- Called when InviteOMatic detects that you have left a BG
----------------------------------------------------------------------
function InviteOMatic_LeftBG()
        IOM_BG_ACTIVE_INDEX = -1;
        IOM_BG_ACTIVE = false;
        IOM_LAST_INVITE = 0;
        IOM_INVITE_FIRST = true;

        IOM_AIG = {};
        IOM_AIG_ERROR = {};
        IOM_DECLINE = {};
        IOM_IGNORE = {};

        IOM_GROUPBUG = {};


        InviteOMatic.debug("You left the BattleGround");
        
        IOM_UPDATE_PURGE_TIMER = false;
        IOM_UPDATE_INVITE_TIMER = false;

        this:UnregisterEvent("CHAT_MSG_SYSTEM");
end

----------------------------------------------------------------------
-- Called On_Update
----------------------------------------------------------------------
function InviteOMatic_OnUpdate(dt)
        if( InviteOMatic_IsDisabled() ) then
                return;
        end
        
        if( dt == nil ) then
                return;
        end
        
        if( not IOM_READY ) then
                return;
        end

        if( IOM_UPDATE_INVITE_TIMER ) then
                IOM_INVITE_TIMER = IOM_INVITE_TIMER - dt;
                if( IOM_INVITE_TIMER <= 0 ) then
                        InviteOMatic.debug("Invite Timer fired...");
                        IOM_INVITE_TIMER = InviteOMaticOptions.inviteDelay;
                        if( InviteOMaticOptions.autoInvite ) then
                                InviteOMatic_SendInvites();
                        end
                end
        end

        if( IOM_UPDATE_PURGE_TIMER ) then       
                IOM_PURGE_TIMER = IOM_PURGE_TIMER - dt;
                if( IOM_PURGE_TIMER <= 0 ) then
                        InviteOMatic.debug("Purge Timer fired...");
                        IOM_PURGE_TIMER = InviteOMaticOptions.purgeDelay;
                        if( InviteOMaticOptions.autoPurge ) then
                                InviteOMatic_DoPurge();
                        end
                end
        end
end

----------------------------------------------------------------------
-- Logs the msg to the default chat frame
--
-- @param msg The message to output
----------------------------------------------------------------------
function IOM_PrintMsg(msg)
        if( InviteOMatic_IsDisabled() ) then
                return;
        end

        if (DEFAULT_CHAT_FRAME) then
                DEFAULT_CHAT_FRAME:AddMessage(msg);
        end
end

----------------------------------------------------------------------
-- Logs the debug msg to the default chat frame
--
-- @param msg The message to output
----------------------------------------------------------------------
function IOM_PrintDebugMsg(msg)
        if( InviteOMaticOptions["debug"] ) then
                InviteOMatic.log("IOM Debug - "..msg);
        end
end

----------------------------------------------------------------------
-- Checks if addon has been disabled in Khaos, and disables addon accordingly :)
----------------------------------------------------------------------
function InviteOMatic_IsDisabled()
        if( Khaos ) then
                return false;
                -- return not Khaos.getSetEnabled("InviteOMatic");
        else
                -- InviteOMatic.log("Khaos not detected, so cant check status");
          return false;
        end
end


----------------------------------------------------------------------
-- Register a Khaos config
----------------------------------------------------------------------
function InviteOMatic_RegisterKhaos()
        if( Khaos ) then
                Khaos.registerFolder( 
       {
           id = "invite";
           text = "Invite";
           helptext = "Invite helpers";
           difficulty = 1;
       }
    );
   local optionSet =
       {
           id="InviteOMatic";
           text="InviteOMatic";
           helptext="Invite Helper, with a twist!";
           difficulty=1;
           options = {
               {
                   id="InviteHeader";
                   text="InviteOMatic Settings";
                   helptext="InviteOMatic";
                   type = K_HEADER;
               };
               {
                   id="InviteAutoInvite";
                   text="Auto Invite";
                   helptext="Automatically invites everyone in a BG instance.";
                   type = K_TEXT;
                   check = true;
                   callback = InviteOMatic_InviteAutoInviteCheck;
                   feedback = function(state) end;
                   default = {
                     checked = true;
                   };
                   disabled = {
                                 checked = false;
                   };
               };
               {
                   id="InviteAutoPurge";
                   text="Auto Purge";
                   helptext="Automatically purges offline players, and players that leaves the BG.";
                   type = K_TEXT;
                   check = true;
                   callback = InviteOMatic_InviteAutoPurgeCheck;
                   feedback = function(state) end;
                   default = {
                     checked = true;
                   };
                   disabled = {
                                 checked = false;
                   };
               };
               {
                   id="InviteWhisperInvite";
                   text="Whisper Invite";
                   helptext="Automatically invites people whispering you the magic word 'invite'";
                   type = K_TEXT;
                   check = true;
                   callback = InviteOMatic_InviteWhisperCheck;
                   feedback = function(state) end;
                   default = {
                     checked = true;
                   };
                   disabled = {
                                 checked = false;
                   };
               };
               {
                   id="InviteDelay";
                   key="InviteDelay";
                   value=true;
                   text="Time between invites:";
                   helptext="This value represents the time InviteOMatic will wait between each invite cycle, the value is in seconds.";
                   type = K_SLIDER;
                   check = false;
                   setup = {
                       sliderMin = 1;
                       sliderMax = 20;
                       sliderLowText = "Fast";
                       sliderHighText = "Slow";
                       sliderStep = 1;
                       sliderText = "Invite Cycle";
                       sliderDisplayfunc = function (state) return state.slider; end;                        
                   };
                   callback = InviteOMatic_InviteCycleSliderCallback;
                   feedback = function(state) end;
                   default = {
                       slider = 10;
                   };
                   disabled = {
                                 slider = 10;
                   };
               };
               {
                   id="PurgeDelay";
                   key="PurgeDelay";
                   value=true;
                   text="Time between purges:";
                   helptext="This value represents the time InviteOMatic will wait between each purge cycle, the value is in seconds.";
                   type = K_SLIDER;
                   check = false;
                   setup = {
                       sliderMin = 1;
                       sliderMax = 20;
                       sliderLowText = "Fast";
                       sliderHighText = "Slow";
                       sliderStep = 1;
                       sliderText = "Purge Cycle";
                       sliderDisplayfunc = function (state) return state.slider; end;                        
                   };
                   callback = InviteOMatic_PurgeCycleSliderCallback;
                   feedback = function(state) end;
                   default = {
                       slider = 10;
                   };
                   disabled = {
                                 slider = 10;
                   };
               };
               {
                   id="InviteRetryHeader";
                   text="InviteOMatic Retry Settings";
                   helptext="InviteOMatic";
                   type = K_HEADER;
               };
               {
                   id="InviteAIGRetry";
                   value=true;
                   text="Already in group retries:";
                   helptext="Number of retries to invite people that are already in group.";
                   type = K_SLIDER;
                   check = false;
                   setup = {
                       sliderMin = 0;
                       sliderMax = 20;
                       sliderLowText = "None";
                       sliderHighText = "Many";
                       sliderStep = 1;
                       sliderText = "Number of Retries";
                       sliderDisplayfunc = function (state) return state.slider; end;                        
                   };
                   callback = InviteOMatic_InviteAIGRetry;
                   feedback = function(state) end;
                   default = {
                       slider = 10;
                   };
                   disabled = {
                                 slider = 10;
                   };
               };
               {
                   id="InviteDeclineRetry";
                   key="InviteDeclineRetry";
                   value=true;
                   text="Decline retries:";
                   helptext="Number of retries to invite people that decline an invitation.";
                   type = K_SLIDER;
                   check = false;
                   setup = {
                       sliderMin = 0;
                       sliderMax = 10;
                       sliderLowText = "None";
                       sliderHighText = "Many";
                       sliderStep = 1;
                       sliderText = "Number of Retries";
                       sliderDisplayfunc = function (state) return state.slider; end;                        
                   };
                   callback = InviteOMatic_InviteDeclineRetry;
                   feedback = function(state) end;
                   default = {
                       slider = 1;
                   };
                   disabled = {
                                 slider = 1;
                   };
               };
               {
                   id="InviteIgnoreRetry";
                   key="InviteIgnoreRetry";
                   value=true;
                   text="Ignore retries:";
                   helptext="Number of retries to invite people that are ignoring you.";
                   type = K_SLIDER;
                   check = false;
                   setup = {
                       sliderMin = 0;
                       sliderMax = 10;
                       sliderLowText = "None";
                       sliderHighText = "Many";
                       sliderStep = 1;
                       sliderText = "Number of Retries";
                       sliderDisplayfunc = function (state) return state.slider; end;                        
                   };
                   callback = InviteOMatic_InviteIgnoreRetry;
                   feedback = function(state) end;
                   default = {
                       slider = 1;
                   };
                   disabled = {
                                 slider = 1;
                   };
               };
               {
                   id="InviteMagicHeader";
                   text="InviteOMatic Magic Word";
                   helptext="InviteOMatic";
                   type = K_HEADER;
               };
               {
                   id="InviteMagicWord";
                   value={IOM_INVITE_REG_EXP};
                   text="Magic Word (REGEXP)";
                   helptext="A reqular expression for the magic invite word.";
                   type = K_EDITBOX;
                   callback = InivteOMatic_InviteMagicWord;
                   feedback = function(state) end;
                   
                   setup = {
                       callOn = {"enter"};
                       multiLine = true;
                   };
                   default = {
                       value = IOM_INVITE_REG_EXP;
                   };
                   disabled = {
                       value = "";
                   };
               };
               {
                   id="InviteMsgHeader";
                   text="InviteOMatic Messages";
                   helptext="InviteOMatic";
                   type = K_HEADER;
               };
               {
                   id="InviteSendSpam";
                   text="Send spam message at invite";
                   helptext="Should the addon send a spam message over SAY when doing first invite.";
                   type = K_TEXT;
                   check = true;
                   callback = InviteOMatic_SendSpamOption;
                   feedback = function(state) end;
                   default = {
                     checked = true;
                   };
                   disabled = {
                                 checked = false;
                   };
               };
               {
                   id="InviteSpamMsg";
                   value={IOM_FIRST_INVITE_SPAM_DEFAULT};
                   text="Invite Spam Message";
                   helptext="Message to spam when doing first invite round.";
                   type = K_EDITBOX;
                   callback = InivteOMatic_InviteSpamMsg;
                   feedback = function(state) end;
                   
                   setup = {
                       callOn = {"enter"};
                       multiLine = true;
                   };
                   default = {
                       value = IOM_FIRST_INVITE_SPAM_DEFAULT;
                   };
                   disabled = {
                       value = "";
                   };
               };
               {
                   id="InviteSendAIGSpam";
                   text="Send AIG spam";
                   helptext="Should a message be sent to a player who has reached the max number of Already in group retries.";
                   type = K_TEXT;
                   check = true;
                   callback = InviteOMatic_SendAIGSpamOption;
                   feedback = function(state) end;
                   default = {
                     checked = true;
                   };
                   disabled = {
                                 checked = false;
                   };
               };
                                                         {
                   id="InviteAIGSpamMsg";
                   value={IOM_ERROR_AIG_DEFAULT};
                   text="AIG Spam Message";
                   helptext="Message to send to a player who reaches the maximum number of Already in group retries.";
                   type = K_EDITBOX;
                   callback = InivteOMatic_AIGSpamMsg;
                   feedback = function(state) end;
                   setup = {
                       callOn = {"enter"};
                       multiLine = true;
                   };
                   default = {
                       value = IOM_ERROR_AIG_DEFAULT;
                   };
                   disabled = {
                       value = "";
                   };
               };
               {
                   id="InviteDebug";
                   text="Show debug messages";
                   helptext="Disable/Enable showing of debug strings, messages. (Mostly used for development)";
                   type = K_TEXT;
                   check = true;
                   callback = InviteOMatic_InviteDebugCheck;
                   feedback = function(state) end;
                   default = {
                     checked = false;
                   };
                   disabled = {
                                 checked = false;
                   };
               };
               {
                   id="InviteClearHeader";
                   text="InviteOMatic Clear Lists";
                   helptext="InviteOMatic";
                   type = K_HEADER;
               };
               {
                   id="InviteResetAIG";
                   text="Reset Already in group";
                   helptext="Resets the list of players that are already in a group";
                   type = K_BUTTON;
                   callback = InviteOMatic_ResetAIG;
                                                                         setup={buttonText="Reset AIG"};
               };
               {
                   id="InviteResetDecline";
                   text="Reset Decline";
                   helptext="Resets the list of players that declined the invite";
                   type = K_BUTTON;
                   callback = InviteOMatic_ResetDecline;
                                                                         setup={buttonText="Reset Declines"};
                                                         };
               {
                   id="InviteResetIgnore";
                   text="Reset Ignore";
                   helptext="Resets the list of players that ignored you";
                   type = K_BUTTON;
                   callback = InviteOMatic_ResetIgnore;
                                                                         setup={buttonText="Reset Ignores"};
               };
           };
           default = true;
       };
       
           Khaos.registerOptionSet(
               "invite", optionSet
           );
  else
                InviteOMatic.debug("Khaos not found");
        end
end

function InviteOMatic_InviteAutoInviteCheck(state)
        if( state.checked ) then
                InviteOMatic.debug("Auto invite enabled");
                InviteOMaticOptions["autoInvite"] = true;
                
                if( IOM_BG_ACTIVE ) then
                        IOM_UPDATE_INVITE_TIMER = true;
                end
                
        else
                InviteOMatic.debug("Auto invite disabled");
                InviteOMaticOptions["autoInvite"] = false;

                IOM_UPDATE_INVITE_TIMER = false;
        end
end

function InviteOMatic_InviteWhisperCheck(state)
        if( state.checked ) then
                InviteOMatic.debug("Whisper invite enabled");
                InviteOMaticOptions["whisperInvite"] = true;
                
        else
                InviteOMatic.debug("Whisper invite disabled");
                InviteOMaticOptions["whisperInvite"] = false;
        end
end

function InviteOMatic_InviteAutoPurgeCheck(state)
        if( state.checked ) then
                InviteOMatic.debug("Auto purge enabled");
                InviteOMaticOptions["autoPurge"] = true;

                if( IOM_BG_ACTIVE ) then
                        IOM_UPDATE_PURGE_TIMER = true;
                end

        else
                InviteOMatic.debug("Auto purge disabled");
                InviteOMaticOptions["autoPurge"] = false;

                IOM_UPDATE_PURGE_TIMER = false;
        end
end

function InviteOMatic_InviteIgnoreRetry(state)
        InviteOMatic.debug("Ignore retries set to: "..state.slider);
        InviteOMaticOptions["ignorettl"] = state.slider;
        
        -- Update old TTL values, if one is bigger
        
end

function InviteOMatic_InviteDeclineRetry(state)
        InviteOMatic.debug("Decline retries set to: "..state.slider);
        InviteOMaticOptions["declinettl"] = state.slider;
        
        -- Update old TTL values, if one is bigger
        
end

function InviteOMatic_InviteAIGRetry(state)
        InviteOMatic.debug("Already in group retries set to: "..state.slider);
        InviteOMaticOptions["aigttl"] = state.slider;
        
        -- Update old TTL values, if one is bigger
        
end

function InviteOMatic_SendAIGSpamOption(state)
        if( state.checked ) then
                InviteOMatic.debug("Sending spam message when max aig retries is reached.");
                InviteOMatic.sendAIGSpam = true;
        else
                InviteOMatic.debug("Not sending spam message when max aig retries is reached.");
                InviteOMatic.sendAIGSpam = false;
        end
end

function InviteOMatic_SendSpamOption(state)
        if( state.checked ) then
                InviteOMatic.debug("Sending spam message at first invite");
                InviteOMaticOptions["sendInviteSpam"] = true;
        else
                InviteOMatic.debug("Not sending spam message at first invite");
                InviteOMaticOptions["sendInviteSpam"] = false;
        end
end

function InviteOMatic_InviteDebugCheck(state)
        if( state.checked ) then
                InviteOMatic.debug("Debug output enabled.");
                InviteOMaticOptions["debug"] = true;
        else
                InviteOMatic.debug("Debug output disabled.");
                InviteOMaticOptions["debug"] = false;
        end
end

function InviteOMatic_PurgeCycleSliderCallback(state)
        InviteOMatic.debug("Purge Cycle set to: "..state.slider.." seconds");
        InviteOMaticOptions["purgeDelay"] = state.slider;

        IOM_PURGE_TIMER = InviteOMaticOptions["purgeDelay"];
end;

function InviteOMatic_InviteCycleSliderCallback(state)
        InviteOMatic.debug("Invite Cycle set to: "..state.slider.." seconds");
        InviteOMaticOptions["inviteDelay"] = state.slider;

        IOM_INVITE_TIMER = InviteOMaticOptions["inviteDelay"];

end;

function InivteOMatic_InviteMagicWord(state)
        InviteOMaticOptions["magicWord"] = state.value;
        InviteOMatic.debug("Magic word regexp set to: "..InviteOMaticOptions["magicWord"]);
end;

function InivteOMatic_InviteSpamMsg(state)
        InviteOMaticOptions["inviteMsg"] = state.value;
        InviteOMatic.debug("First spam message set to: "..InviteOMaticOptions["inviteMsg"]);
end;

function InivteOMatic_AIGSpamMsg(state)
        InviteOMaticOptions["aigMsg"] = state.value;
        InviteOMatic.debug("AIG spam message set to: "..InviteOMaticOptions["aigMsg"]);
end;

InviteOMatic = {
        log = IOM_PrintMsg,
        debug = IOM_PrintDebugMsg,
        invite = InviteOMatic_InvitePlayer,
        sendInvites = InviteOMatic_SendInvites,
        disbandGroup = InviteOMatic_DisbandRaidGroup,
}