view Core.lua @ 9:daed0597deba

Pretty printing for lists A decision on how to index them up Bug about reverse list maintenance fixed. Next step noted.
author John@Doomsday
date Wed, 07 Mar 2012 14:56:25 -0500
parents b05fcb225c4a
children 99c279ab0b75
line wrap: on
line source
-- ideas: last attended data and/or remove people who haven't attended in X days
-- and/or just a "remove from all lists" option


-- order of implementation
-- (_) lists fully functional (/script interface)
-- (_) lists single-user functional via command line interface 
-- ( ) all actions should reference the player list rather than player names
-- ( ) player entries should persist as long as any list or change references
-- ( ) convert slist entries down to a delimited string - much smaller
-- ( ) lists store number slots rather than flat indexing
-- ( ) single user + admin gui (manual suicides)
-- ( ) single user + admin gui (master loot)
-- ( ) communication and list trimming
-- ( ) admins
-- ( ) players gui
-- ( ) crypto / protection against tampering
-- ( ) alt tracking
-- ( ) reserves

-- important things to remember:
-- 1) ipairs iterates from 1 until the first missing int index -> no gaps if int
-- indexing
-- 2) a.x === a["x"]
-- 3) a["1"] =/= a[1]
-- 4) table.remove() works ok if reverse iterating, terrible at anything else
-- 5) pairs() does not have a guaranteed iteration order

bsk = LibStub("AceAddon-3.0"):NewAddon("bsk","AceConsole-3.0", "AceHook-3.0", "AceComm-3.0", "AceSerializer-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("bsk", false)

local AceGUI = LibStub("AceGUI-3.0")

function bsk:OnInitialize()

    self.db = LibStub("AceDB-3.0"):New("BskDB", self.defaults, "Default")

    self.options.args.profile = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db)
    LibStub("AceConfig-3.0"):RegisterOptionsTable("bsk", self.options)
    self.optionsFrame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions("bsk", "bsk")

    self:RegisterChatCommand("bsk", "HandleCommand")
end

function bsk:OnEnable()
    bsk:CreateWorkingStateFromChanges(self.db.profile.changes)
    --self:HandleCommand()
end

function bsk:HandleCommand(paramIn)
    local param = { strsplit(" ", paramIn) }
    local FixPersonName = function(p)
        p = p:lower()
        -- next two lines from sylvanaar
        local MULTIBYTE_FIRST_CHAR = "^([\192-\255]?%a?[\128-\191]*)"
        return string.gsub(p, MULTIBYTE_FIRST_CHAR, string.upper, 1)  
    end

    if param[1] == nil or param[1] == "" then
        bsk:Print("need args")
        return
    end
    if param[1] == "persons" then
        bsk:PrintPersons()
    elseif param[1] == "changes" then
        bsk:PrintChanges()
    elseif param[1] == "add" then
        if param[2] == nil or param[2] == "" then
            bsk:PrintTable(param)
            return
        end
        if param[3] == nil or param[3] == "" then
            bsk:PrintTable(param)
            return
        end
        if param[2] == "person" then
            if param[3] == "all" then
                bsk:AddMissingPersons()
            else
                local person = FixPersonName(param[3])
                bsk:AddPerson(person)
            end
        elseif param[2] == "list" then
            bsk:CreateList(param[3])
        elseif param[2] == "persontolist" then
            if param[4] == nil or param[4] == "" then
                bsk:PrintTable(param)
                return
            end
            local person = FixPersonName(param[3])
            bsk:AddPersonToList(person,param[4])
        end
    elseif param[1] == "populate" then
        if param[2] == nil or param[2] == "" or param[3] == nil or param[3] == "" then
            bsk:PrintTable(param)
            return
        end
        -- list = p2
        local index = bsk:GetListIndex(param[2])
        if param[3] == "random" then
            bsk:PopulateListRandom(index)
        end
    elseif param[1] == "suicide" then
        if param[2] == nil or param[2] == "" or param[3] == nil or param[3] == "" then
            bsk:PrintTable(param)
            return
        end
        local person = FixPersonName(param[2])
        bsk:Print(string.format("Fixed player name %s to %s",param[2],person))
        bsk:SuicidePerson(person,param[3])
    elseif param[1] == "show" then
        if param[2] == nil or param[2] == "" then
            bsk:PrintTable(param)
            return
        end
        bsk:PrettyPrintLists(param[2])
    elseif param[1] == "trim" then
        if param[2] == nil or param[2] == "" then
            bsk:PrintTable(param)
            return
        end
        bsk:TrimLists(param[2])
    end

    --if self.frame == nil then
        --self:CreateGUI()
        --self:ShowGUI()
    --else
        --self:ShowGUI()
    --end

end

bsk.defaults = {
    profile = {
        persons = {},
        changes = {},
        listBase = {}
    }
}