vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- -- 
BuddySync = AceLibrary("AceAddon-2.0"):new("AceEvent-2.0", "AceHook-2.0", "AceConsole-2.0", "AceDB-2.0", "AceModuleCore-2.0", "AceDebug-2.0")
-- -- 
local debugLevels = {"warn", "info", "notice", "off"}
-- -- 
BuddySync:RegisterDB("BuddySyncDB")
BuddySync:RegisterDefaults("profile", {Debug = nil})
-- -- 
function BuddySync:OnEnable()
        -- 
        this:RegisterEvent("CHAT_MSG_SYSTEM", "BS_onEVENT")
        this:RegisterEvent("VARIABLES_LOADED", "BS_onEVENT")
        this:RegisterEvent("FRIENDLIST_UPDATE", "BS_onEVENT")
        -- 
        self:HookScript(FriendsFrame, "OnShow", "BS_SET_SHOW")
        self:HookScript(FriendsFrameAddFriendButton, "OnClick", "BS_ADD_FRIEND")
        self:HookScript(FriendsFrameIgnorePlayerButton, "OnClick", "BS_ADD_IGNORE")
        self:HookScript(FriendsFrameRemoveFriendButton, "OnClick", "BS_DELETE_FRIEND")
        self:HookScript(FriendsFrameStopIgnoreButton, "OnClick", "BS_STOP_IGNORE")
        self:HookScript(SendMailNameEditBox, "OnChar", "SendMailFrame_SendeeAutocomplete_EXPANDED")
        -- 
end
-- -- 
function BuddySync:SendMailFrame_SendeeAutocomplete_EXPANDED()
        -- 
        local text = this:GetText();
        local textlen = strlen(text);
        local name;
        -- 
        if BuddySyncDB[BSR][TOON] then
                if ( table.getn(BuddySyncDB[BSR][TOON]) > 0 ) then
                        for i=1, table.getn(BuddySyncDB[BSR][TOON]) do
                                name = BuddySyncDB[BSR][TOON][i];
                                if ( strfind(strupper(name), strupper(text), 1, 1) == 1 ) then
                                        SendMailNameEditBox:SetText(name);
                                        SendMailNameEditBox:HighlightText(textlen, -1);
                                        return;
                                end
                        end
                end
        end
        return self.hooks[SendMailNameEditBox]["OnChar"].orig()
--[[ the original part -- just to see how ... 
        local text = this:GetText();
        local textlen = strlen(text);
        local numFriends, name;

        -- First check your friends list
        numFriends = GetNumFriends();
        if ( numFriends > 0 ) then
                for i=1, numFriends do
                        name = GetFriendInfo(i);
                        if ( strfind(strupper(name), strupper(text), 1, 1) == 1 ) then
                                this:SetText(name);
                                this:HighlightText(textlen, -1);
                                return;
                        end
                end
        end

        -- No match, check your guild list
        numFriends = GetNumGuildMembers(true);  -- true to include offline members
        if ( numFriends > 0 ) then
                for i=1, numFriends do
                        name = GetGuildRosterInfo(i);
                        if ( strfind(strupper(name), strupper(text), 1, 1) == 1 ) then
                                this:SetText(name);
                                this:HighlightText(textlen, -1);
                                return;
                        end
                end
        end
--]]
end
-- -- 
BuddySync:RegisterChatCommand({"/buddysync", "/bs"}, {
        type = "group",
        name = "BuddySync",
        args = {
                config = {
                        type            = "execute",
                        name            = "chat",
                        desc            = "ChatOutput on/off",
                        func            = function()
                                if (BuddySyncDB[BSR].OUTPUT == 0) then
                                        BuddySyncDB[BSR].OUTPUT = 1;
                                else
                                        BuddySyncDB[BSR].OUTPUT = 0;
                                end
                        end,
                },
        },
}, "BUDDYSYNC")
-- -- 
function BuddySync:BS_onEVENT(event)
        -- 
        if (event == "VARIABLES_LOADED") then
                -- setting up some vars
                BS_VER = "2.2.1";
                BSR = GetRealmName();
                pNAME = UnitName("player");
                FRIEND = "FRIEND";
                IGNORE = "IGNORE";
                TOON = "TOON";
                -- 
                if (not BuddySyncDB[BSR].OUTPUT) then
                        BuddySyncDB[BSR].OUTPUT = 1;
                end
                -- 
                if (not BuddySyncDB[BSR][TOON]) then
                        BuddySyncDB[BSR][TOON] = {};
                end
                -- 
                for i=1, table.getn(BuddySyncDB[BSR][TOON]) do
                        if (BuddySyncDB[BSR][TOON][i] == pNAME) then
                                isIN = 1;
                                break;
                        else
                                isIN = nil;
                        end
                end
                -- 
                if not isIN then
                        table.insert(BuddySyncDB[BSR][TOON], pNAME);
                end
                -- 
                syncBTN = 0;
                syncCOUNT = 0;
                inamey = nil;
                namey = nil;
                IILT = 0;
                BSFS = 0;
                BSL = {};
                iBSL = {};
                i2BSL = {};
                BSA = 0;
                BSC = 0;
                BSN = 0;
                XDA = 0;
                EFE = 0;
                -- 
                this:UnregisterEvent("VARIABLES_LOADED");
                -- 
        elseif (event == "FRIENDLIST_UPDATE" or event == "IGNORELIST_UPDATE") then
                BuddySync:BS_FRIENDS();
        elseif (event == "CHAT_MSG_SYSTEM") then
                local BSX = BSSPLIT(getglobal("ERR_FRIEND_ADDED_S"), " ");
                local BSY = BSSPLIT(getglobal("ERR_FRIEND_REMOVED_S"), " ");
                local iBSX = BSSPLIT(getglobal("ERR_IGNORE_ADDED_S"), " ");
                local iBSY = BSSPLIT(getglobal("ERR_IGNORE_REMOVED_S"), " ");
                -- 
                if (BSA == 0 and strfind(arg1, BSX[2]) and strfind(arg1, BSX[3]) and strfind(arg1, BSX[4]) or
                        strfind(arg1, BSY[2]) and strfind(arg1, BSY[3]) and strfind(arg1, BSY[4])) then
                        BuddySync:BS_CHECK(1);
                elseif (BSA == 0 and strfind(arg1, iBSX[2]) and strfind(arg1, iBSX[3]) and strfind(arg1, iBSX[4])) then
                        local namex = BSSPLIT(arg1, " ");
                        local name = namex[1];
                        iBSL[name] = {}
                        iBSL[name].inIgnoreList = 1;
                        BuddySync:BS_onSYNC();
                elseif (BSA == 0 and strfind(arg1, iBSY[2]) and strfind(arg1, iBSY[3]) and strfind(arg1, iBSY[4])) then
                        BuddySync:BS_onSYNC();
                elseif (BSA == 1 and strfind(arg1, BSX[2]) and strfind(arg1, BSX[3]) and strfind(arg1, BSX[4])) then
                        local namex = BSSPLIT(arg1, " ");
                        local name = namex[1];
                        BSL[name] = {};
                        BSL[name].inFriendList = 1;
                        BuddySyncDB[BSR][FRIEND][name] = {};
                        BuddySyncDB[BSR][FRIEND][name].inFriendList = 1;
                        BuddySync:BS_CHECK(1);
                elseif (BSA == 1 and strfind(arg1, iBSX[2]) and strfind(arg1, iBSX[3]) and strfind(arg1, iBSX[4])) then
                        local namex = BSSPLIT(arg1, " ");
                        local name = namex[1];
                        iBSL[name] = {};
                        iBSL[name].inIgnoreList = 1;
                        BuddySyncDB[BSR][IGNORE][name] = {};
                        BuddySyncDB[BSR][IGNORE][name].inIgnoreList = 1;
                        BuddySync:BS_onSYNC();
                elseif (arg1 == getglobal("ERR_FRIEND_ERROR")) then
                        EFE = 1;
                elseif (arg1 == getglobal("ERR_FRIEND_NOT_FOUND") and EFE == 0) then
                        BuddySync:BS_CHECK(0);
                end
        end
end
-- -- 
function BuddySync:BS_FRIENDS()
        --
        local numFriends = GetNumFriends();
        local numIgnores = GetNumIgnores();
        --
        if (not BuddySyncDB or not BuddySyncDB[BS_VER]) then
                BuddySyncDB = {};
                BuddySyncDB[BS_VER] = 1;
        end     
        --
        if (not BuddySyncDB[BSR]) then
                BuddySyncDB[BSR] = {};
                BuddySyncDB[BSR][FRIEND] = {};
                BuddySyncDB[BSR][IGNORE] = {};
        end     
        --
        for j = 1, numIgnores do
                local name = GetIgnoreName(j);
                if (name and name ~= getglobal("UNKNOWN")) then
                        if (not iBSL[name]) then
                                iBSL[name] = {};
                                iBSL[name].inIgnoreList = 1;
                        end
                        if (not BuddySyncDB[BSR][IGNORE][name]) then
                                BuddySyncDB[BSR][IGNORE][name] = {};
                                BuddySyncDB[BSR][IGNORE][name].inIgnoreList = 1;
                        end
                end
        end
        --
        for i = 1, numFriends do
                local name = GetFriendInfo(i);
                if (name and name ~= getglobal("UNKNOWN")) then
                        if (not BSL[name]) then
                                BSL[name] = {};
                                BSL[name].inFriendList = 1;
                        end
                        if (not BuddySyncDB[BSR][FRIEND][name]) then
                                BuddySyncDB[BSR][FRIEND][name] = {};
                                BuddySyncDB[BSR][FRIEND][name].inFriendList = 1;
                        end
                end
        end
        --
        if (XDA == 0) then
                XDA = 1;
                BuddySync:BS_onSYNC();
        end
        --
end
--
function BuddySync:BS_CHECK(BSN)
        --
        EFE = 0;
        --
        if (syncBTN == 0 and BSN == 0) then
                if (BuddySyncDB[BSR]) then
                        if (BuddySyncDB[BSR][FRIEND]) then
                                if (BuddySyncDB[BSR][FRIEND][namey]) then
                                        if (BuddySyncDB[BSR][FRIEND][namey].inFriendList == 1) then
                                                DEFAULT_CHAT_FRAME:AddMessage("AddBuddy: |c00bfffff" .. namey .. "|r"..BS_PLAYER_NOT_FOUND_A..BSR..".", 1.0, 0.25, 0.0, 1.0);
                                                DEFAULT_CHAT_FRAME:AddMessage("AddBuddy: "..BS_PLAYER_NOT_FOUND_B, 1.0, 0.25, 0.0, 1.0);
                                                BuddySyncDB[BSR][FRIEND][namey] = nil;
                                        end
                                end
                        end
                end
        elseif (syncBTN == 1 and BSN == 0) then
                if (BuddySyncDB[BSR]) then
                        if (BuddySyncDB[BSR][IGNORE]) then
                                if (BuddySyncDB[BSR][IGNORE][inamey]) then
                                        if (BuddySyncDB[BSR][IGNORE][inamey].inIgnoreList == 1 and i2BSL[inamey].Try == 0) then
                                                if (BuddySyncDB[BSR].OUTPUT == 1) then
                                                        DEFAULT_CHAT_FRAME:AddMessage("AddIgnore: |c00bfffff" .. inamey .. "|r"..BS_PLAYER_NOT_FOUND_I..BSR..".", 1.0, 0.25, 0.0, 1.0);
                                                end
                                                syncCOUNT = 0;
                                                i2BSL[inamey].Try = 1;
                                                BuddySync:BS_onSYNC();
                                        end
                                end
                        end
                end
        end
        --
        if (BSN == 1 and BuddySyncDB[BSR][FRIEND]) then
                for i,j in BuddySyncDB[BSR][FRIEND] do
                        if (not BSL[i] and BuddySyncDB[BSR][FRIEND][i].inFriendList == 0) then
                                -- nothing
                        elseif (not BSL[i] and BuddySyncDB[BSR][FRIEND][i].inFriendList == 1) then
                                if (i ~= pNAME) then
                                        namey = i;
                                        BSL[i] = {};
                                        BSL[i].inFriendList = 1;
                                        AddFriend(i);
                                        return namey;
                                end
                        elseif (BSL[i].inFriendList == 1 and BuddySyncDB[BSR][FRIEND][i].inFriendList == 0) then
                                namey = i;
                                BSL[i] = {};
                                BSL[i].inFriendList = 0;
                                RemoveFriend(i);
                                return namey;
                        end
                end
        end
        --
end
--
function BuddySync:BS_onSYNC()
        --
        syncCOUNT = syncCOUNT + 1;
        syncBTN = 1;
        --
        if (BuddySyncDB[BSR][IGNORE]) then
                for ii,jj in BuddySyncDB[BSR][IGNORE] do
                        if (not i2BSL[ii] and ii) then
                                i2BSL[ii] = {};
                                i2BSL[ii].Try = 0;
                        elseif (syncCOUNT == 2 and ii) then
                                i2BSL = {};
                                i2BSL[ii] = {};
                                i2BSL[ii].Try = 0;
                                syncCOUNT = 0;
                        end
                                if (not iBSL[ii] and BuddySyncDB[BSR][IGNORE][ii].inIgnoreList == 0) then
                                        XDA = 0;
                                        syncCOUNT = 0;
                                        inamey = ii;
                                        iBSL[ii] = {};
                                        iBSL[ii].inIgnoreList = 3;
                                        BuddySync:BS_FRIENDS();
                                        return inamey;
                                elseif (not iBSL[ii] and BuddySyncDB[BSR][IGNORE][ii].inIgnoreList == 1) then
                                        if (i2BSL[ii].Try == 0) then
                                                inamey = ii;
                                                AddIgnore(ii);
                                                return inamey;
                                        end
                                elseif (iBSL[ii].inIgnoreList == 1 and BuddySyncDB[BSR][IGNORE][ii].inIgnoreList == 0) then
                                        inamey = ii;
                                        iBSL[ii] = {};
                                        iBSL[ii].inIgnoreList = 0;
                                        DelIgnore(ii);
                                        return inamey;
                                end
                end
        end
        --
end
--
function BuddySync:BS_SET_SHOW()
        --
        if (XDA == 1) then
        syncBTN = 0;
        BuddySync:BS_CHECK(1);
        end
        --
        return self.hooks[FriendsFrame]["OnShow"].orig()
        --
end
--
function BuddySync:BS_ADD_FRIEND()
        --
        BSA = 1;
        --
        return self.hooks[FriendsFrameAddFriendButton]["OnClick"].orig()
        --
end
--
function BuddySync:BS_DELETE_FRIEND()
        --
        BSA = 0;
        --
        local BSS = GetSelectedFriend();
        local name = GetFriendInfo(BSS);
        --
        BSL[name].inFriendList = 0;
        BuddySyncDB[BSR][FRIEND][name].inFriendList = 0;
        --
        return self.hooks[FriendsFrameRemoveFriendButton]["OnClick"].orig()
        --
end
--
function BuddySync:BS_ADD_IGNORE()
        --
        BSA = 1;
        --
        return self.hooks[FriendsFrameIgnorePlayerButton]["OnClick"].orig()
        --
end
--
function BuddySync:BS_STOP_IGNORE()
        --
        BSA = 0;
        --
        local BSS = GetSelectedIgnore();
        local name = GetIgnoreName(BSS);
        --
        iBSL[name].inIgnoreList = 0;
        BuddySyncDB[BSR][IGNORE][name].inIgnoreList = 0;
        --
        return self.hooks[FriendsFrameStopIgnoreButton]["OnClick"].orig()
        --
end
-- -- 
function BSSPLIT(text, separator, t, noPurge)
        -- 
        local value;
        local mstart, mend = 1;
        local oldn, numMatches = 0, 0;
        local regexKey = "([^"..separator.."]+)";
        local sfind = strfind;
        -- 
        if ( not t ) then
                t = {};
        else
                oldn = table.getn(t);
        end
        -- 
        mstart, mend, value = sfind(text, regexKey, mstart);
        -- 
        while (value) do
                numMatches = numMatches + 1;
                t[numMatches] = value
                mstart = mend + 1;
                mstart, mend, value = sfind(text, regexKey, mstart);
        end
        -- 
        if ( not noPurge ) then
                for i = numMatches+1, oldn do
                        t[i] = nil;
                end
        end
        -- 
        table.setn(t, numMatches);
        return t;
end

Generated by GNU Enscript 1.6.5.90.