view Core.lua @ 43:4109683c3172

Kept AceConsole embedded - it handily disables the chat commands when the addon is disabled Did a little passthrough to properly set the self param for commands like Print()
author John@Yosemite-PC
date Thu, 15 Mar 2012 22:27:51 -0400
parents 72055fc7e115
children 8913e7d79cad
line wrap: on
line source
-- ideas: last attended data and/or remove people who haven't attended in X days

-- 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
-- (*) lists store number slots rather than flat indexing
-- ( ) database and comm versioning
-- ( ) limited communication - everyone trusts the loot master
-- ( ) single user + admin gui (manual suicides)
-- ( ) single user + admin gui (master loot)
-- ( ) communication and list merging/trimming
-- ( ) admins
-- ( ) players gui
-- ( ) undo
-- ( ) crypto / protection against tampering
-- ( ) alt tracking
-- (_) reserves

local _G=_G
local strsplit=strsplit
local string=string
local sformat=string.format
local bsk = LibStub("AceAddon-3.0"):NewAddon("bsk","AceConsole-3.0")
-- "AceHook-3.0", "AceComm-3.0", "AceSerializer-3.0"
_G.bsk=bsk
local L = LibStub("AceLocale-3.0"):GetLocale("bsk", false)
setfenv(1,bsk)

local pkgrev = " @project-revision@ "

-- 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

-- These two functions properly format the call to AceConsole:Print(), which
-- needs a full object. Calling "Print" will call the mixed-in console functions
-- but without a self parameter because of the namespacing. I would disembed
-- console, except that it has handy OnDisable behavior to disable chat
-- commands.
function print(...)
    bsk:Print(...)
end

function printf(...)
    bsk:Printf(...)
end

function OnInitialize()

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

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

    local HandlePassThrough = function(...) HandleCommand(...) end
    bsk:RegisterChatCommand("bsk", HandlePassThrough)
end

function OnEnable()
    CreateWorkingStateFromChanges(db.profile.changes)
    --CreateGUI()
end

function 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
        print("need args")
        return
    end
    if param[1] == "persons" then
        PrintPersons()
    elseif param[1] == "changes" then
        PrintChanges()
    elseif param[1] == "delete" then
        if param[2] == nil or param[2] == "" or param[3] == nil or param[3] == "" then
            PrintTable(param)
            return
        end
        if param[2] == "list" then
            DeleteList(param[3])
        elseif param[2] == "personfromlist" then
            if param[4] == nil or param[4] == "" then
                PrintTable(param)
                return
            end
            local person = FixPersonName(param[3])
            RemovePersonFromList(person, param[4])
        elseif param[2] == "person" then
            local person = FixPersonName(param[3])
            RemovePerson(person)
        else
            printf("Deleting anything of type %s is not supported",param[2])
        end
    elseif param[1] == "nuke" then
        if param[2] == nil or param[2] == "" then
            PrintTable(param)
            return
        end
        local person = FixPersonName(param[2])
        NukePerson(person)
    elseif param[1] == "add" then
        if param[2] == nil or param[2] == "" then
            PrintTable(param)
            return
        end
        if param[3] == nil or param[3] == "" then
            PrintTable(param)
            return
        end
        if param[2] == "person" then
            if param[3] == "all" then
                AddMissingPersons()
            else
                local person = FixPersonName(param[3])
                AddPerson(person)
            end
        elseif param[2] == "list" then
            CreateList(param[3])
        elseif param[2] == "tolist" then
            if param[4] == nil or param[4] == "" then
                PrintTable(param)
                return
            end
            local person = FixPersonName(param[3])
            AddPersonToListEnd(person,param[4])
        elseif param[2] == "tolistrandom" then
            if param[4] == nil or param[4] == "" then
                PrintTable(param)
                return
            end
            local person = FixPersonName(param[3])
            AddPersonToListRandom(person,param[4])
        end
    elseif param[1] == "populate" then
        if param[2] == nil or param[2] == "" or param[3] == nil or param[3] == "" then
            PrintTable(param)
            return
        end
        -- list = p2
        local index = GetListIndex(param[2])
        if param[3] == "random" then
            PopulateListRandom(index)
        end
    elseif param[1] == "suicide" then
        if param[2] == nil or param[2] == "" or param[3] == nil or param[3] == "" then
            PrintTable(param)
            return
        end
        local person = FixPersonName(param[2])
        SuicidePerson(person,param[3])
    elseif param[1] == "lists" then
        if param[2] == nil or param[2] == "" then
            PrettyPrintLists()
            return
        else
            local listIndex = GetListIndex(param[2])
            PrettyPrintList(listIndex)
        end
    elseif param[1] == "reserve" then
        if param[2] == nil or param[2] == "" then
            printtable(param)
            return
        end
        local person = FixPersonName(param[2])
        AddReserve(person)
    elseif param[1] == "trim" then
        if param[2] == nil or param[2] == "" then
            printtable(param)
            return
        end
        TrimLists(param[2])
    elseif param[1] == "rename" then
        if param[2] == nil or param[2] == "" or param[3] == nil or param[3] == "" then
            printtable(param)
            return
        end
        RenameList(param[2],param[3])
    elseif param[1] == "selfdestruct" then
        SelfDestruct()
    else
        CreateGUI()
    end

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

end

defaults = {
    profile = {
        persons = {},
        changes = {},
        lists = {}
    }
}