vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        I want to go a lot further with voting so this gets it's own file.
        For now (1.5.beta.1) it's just the stuff needed for a SyncReset vote
        Some things might seem like overkill, but as said, i want to go further with this :P
        
        Note to self:
        using meta tables like in SM_CVVote i could easly store "objects" and make them persistant
        just make sure to add metatables again in VARIABLES_LOADED, could be interesting  when making the
        parsing engine its own mod to use for other mods.
        
--]]

SW_VTL = 0;
SW_VTB = 60; -- buffer in secs to avoid people spamming votes

SW_ActiveVotes = {};
        
SW_CVote = 
{
        new = function (self, o)
                o = o or {};
                setmetatable(o, self);
                self.__index = self;
                return o;
        end,
        
        newIVData = function (self, data, from)
                o = {};
                setmetatable(o, self);
                self.__index = self;
                o.issuedBy = from;
                o:InitFromData(data);
                return o;
        end,
        InitFromData = function (self, data)
                self.vID = data[1];
                self.totalRun = tonumber(data[2]);
                self.sID = data[3];
                self.question = SW_SyncQueue:DecStr(data[4]);
                self.answerCount = tonumber(data[5]);
                self.extraData = {};
                self.timeRunning = 0;
                self.onDoneCalled = false;
                self.onHideGUICalled = false;
                
                for i=6, table.getn(data) do 
                        table.insert(self.extraData, data[i]);
                end
                self:initSpecial();
        end,
        
        initSpecial = function (self)
                local LIs = SW_SyncGetLIs();
                if self.sID == "SWRV" then
                        self.question = string.format(SW_STR_RV, self.issuedBy);
                        self.answerCount = 2;
                        self.answers = {YES,NO};
                        
                        local points =0;
                        local peers = LIs["SW_PC"];
                        local tmp = 0;
                        for k,v in pairs(LIs) do
                                
                                if SW_Friends[k] ~= nil and SW_Friends[k]["Rank"] ~= nil then
                                        if SW_Friends[k]["Rank"] == 2 then
                                                v = peers * 100;
                                        elseif SW_Friends[k]["Rank"] == 1 then
                                                v = peers * 10;
                                        else
                                                v=1;
                                        end
                                        LIs[k] = v;
                                        points = points + v;
                                end
                        end
                        self.availablePoints = points;
                        self.pointLookup = LIs;
                        self.OnDone = SW_ResetVoteDone;
                        self.OnHideGUI = SW_ResetVoteHideGUI;
                else
                        self.answers = {};
                        self.availablePoints = LIs["SW_PC"];
                        self.pointLookup = LIs;
                end
                self.results = {};
                self.hasAnswered = {};
                self.currentPoints = 0;
                
                if self.sID == "SWRV" then
                        StaticPopupDialogs["SW_ResetSyncVote"]["text"] = self.question;
                        StaticPopupDialogs["SW_ResetSyncVote"]["vID"] = self.vID;
                        StaticPopup_Show("SW_ResetSyncVote");
                end
        end,
        addVote = function (self, i, from)
                -- stop double answers
                if self.hasAnswered[from] == nil then
                        self.hasAnswered[from] = true;
                else
                        return;
                end
                local index = tonumber(i);
                if self.results[index] == nil then
                        self.results[index] = 0;
                end
                
                if self.pointLookup[from] ~= nil then
                        self.results[index] = self.results[index] + self.pointLookup[from];
                        self.currentPoints = self.currentPoints + self.pointLookup[from];
                end
        end,
        
        addAnswer = function (self, i, aStr)
                local index = tonumber(i);
                if index <= self.answerCount then
                        self.answers[index] = SW_SyncQueue:DecStr(aStr);
                end
        end,
        --called to see if this vote can safely be deleted
        expired = function (self)
                -- when we delete it isn't to important so just give 
                -- any "stuff" enough time to finish
                if self.timeRunning > 2* self.totalRun then
                        return true;
                end
                return false;
        end,
        
        updateTimePassed = function (self, sec)
                self.timeRunning = self.timeRunning + sec;
                
                
                if self.timeRunning > self.totalRun + 5 then -- add a little buffer for the last answers to arrive
                        if self.OnDone ~= nil and not self.onDoneCalled then
                                self.OnDone(self);
                                self.onDoneCalled = true;
                        end
                elseif self.timeRunning > self.totalRun then
                        if self.OnHideGUI ~= nil and not self.onHideGUICalled then
                                self.OnHideGUI(self);
                                self.onHideGUICalled = true;
                        end
                elseif self.sID == "SWRV" then
                        -- we arent interested in the "real" result, just if it is over 50%
                        if self.currentPoints * 2 > self.availablePoints then
                                if self.OnHideGUI ~= nil and not self.onHideGUICalled then
                                        self.OnHideGUI(self);
                                        self.onHideGUICalled = true;
                                end
                                if self.OnDone ~= nil and not self.onDoneCalled then
                                        self.OnDone(self);
                                        self.onDoneCalled = true;
                                end
                        end
                end
        end,
        AnswerVal = function (self, questionNr)
                if self.results[questionNr] == nil then 
                        return 0;
                else
                        return self.results[questionNr];
                end
        end,
        dumpData = function (self)
                SW_DumpTable(self);
        end,
        
};

function SW_DumpVotes()
        for k,v in pairs(SW_ActiveVotes) do
                v:dumpData();
        end
end
function SW_UpdateVoteTimers(elapsed)
        local expIDs = {};
        for k,v in pairs(SW_ActiveVotes) do
                v:updateTimePassed(elapsed);
                if v:expired() then
                        table.insert(expIDs, v.vID);
                end
        end
        for i,v in ipairs(expIDs) do
                SW_ActiveVotes[v] = nil;
        end
end
function SW_SyncVoteAnswer(data, from)
        local vID = data[1];
        
        if SW_ActiveVotes[vID] ~= nil then
                SW_ActiveVotes[vID]:addVote(data[2], from);
        else
                SW_printStr("SW_SyncVoteAnswer vID not defined, can't add vote");
        end
end

function SW_SyncIssuedVote(data, from)
        local vID = data[1];
        
        if SW_ActiveVotes[vID] == nil then
                SW_ActiveVotes[vID] = SW_CVote:newIVData(data, from);
        else
                SW_printStr("SW_SyncIssuedVote vID in use?!?.");
        end
end
function SW_SyncIssuedVoteAnswer(data, from)
        local vID = data[1];
        
        if SW_ActiveVotes[vID] ~= nil then
                SW_ActiveVotes[vID]:addAnswer(data[2], data[3]);
        else
                SW_printStr("SW_SyncIssuedVoteAnswer vID not defined, can't add answer");
        end
end
function SW_SendVote(question, runS, answers, data, specialID)
        if  (time() - SW_VTL) < SW_VTB then
                DEFAULT_CHAT_FRAME:AddMessage(SW_STR_VOTE_WARN);
                return;
        end
        SW_VTL = time();
        
        local vID = date("%H%M%S"..SW_SELF_STRING);
        local ID = "N";
        if specialID ~= nil then
                ID = specialID;
        end
        local seconds;
        if runS == nil then
                seconds = 30;
        else
                seconds = tonumber(runS);
                if seconds < 15 then
                        seconds = 15;
                end
        end
        local request = {};
        table.insert(request, vID);
        table.insert(request, seconds);
        table.insert(request, ID);
        if question == nil or type(question) ~= "string" then
                table.insert(request, "Q");
        else
                table.insert(request, SW_SyncQueue:EncStr(question));
        end
        if type(answers) == "table" then
                table.insert(request, table.getn(answers));
        else
                table.insert(request, 0);
        end
        
        if type(data) == "table" then
                for i,v in ipairs(data) do
                        table.insert(request, SW_SyncQueue:EncStr(v));
                end
        end
        
        -- hmm 255 char limit, ok for now but dont forget later on
        SW_SyncQueue:PushSWInfo("IV", request);
        
        if type(answers) == "table" then
                for i,v in ipairs(answers) do
                        -- hmm 255 char limit, ok for now but dont forget later on
                        SW_SyncQueue:PushSWInfo("IVA", {vID,i,SW_SyncQueue:EncStr(v),math.random(100)});
                end
        end
end

function SW_ResetVote()
        SW_RebuildFriendList();
        SW_SendVote(nil, nil, nil,nil,"SWRV");
        --SW_SendVote("My question~%+??",43,{'answer"1"', "answer~2"},{"data1",2},"N");
end
function SW_ResetVoteHideGUI(vote)
        StaticPopup_Hide("SW_ResetSyncVote");
end
function SW_ResetVoteDone(vote)
        StaticPopup_Hide("SW_ResetSyncVote");
        if vote:AnswerVal(1) > vote:AnswerVal(2) then
                --SW_SyncReset(newSessID, issuedBy, selfForce)
                SW_SyncReset(nil, nil, true);
                DEFAULT_CHAT_FRAME:AddMessage(SW_STR_RV_PASSED);
        else
                DEFAULT_CHAT_FRAME:AddMessage(SW_STR_RV_FAILED);
        end
        
end
        

Generated by GNU Enscript 1.6.5.90.