diff Core.lua @ 0:47fac96968e1

First commit
author John@Yosemite-PC
date Fri, 02 Mar 2012 00:15:09 -0500
parents
children 21c58930f74e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Core.lua	Fri Mar 02 00:15:09 2012 -0500
@@ -0,0 +1,548 @@
+-- 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 
+-- ( ) 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
+-- 2) a.x === a["x"]
+-- 3) a["1"] =/= a[1]
+
+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")
+    bsk:CreateWorkingStateFromChanges()
+end
+
+function bsk:OnEnable()
+    --self:HandleCommand()
+end
+
+function bsk:HandleCommand(paramIn)
+    local param = { strsplit(" ", paramIn) }
+    local FixPlayerName = 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] == "players" then
+        bsk:PrintPlayers()
+    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] == "player" then
+            --if param[3] == "all" then
+            --    bsk:Pop
+            --else
+                local player = FixPlayerName(param[3])
+                bsk:AddPlayer(player)
+            --end
+        elseif param[2] == "list" then
+            bsk:CreateList(param[3])
+        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 player = FixPlayerName(param[2])
+        bsk:Print(string.format("Fixed player name %s to %s",param[2],player))
+        bsk:SuicidePlayer(player,param[3])
+    elseif param[1] == "show" then
+        if param[2] == nil or param[2] == "" then
+            bsk:PrintTable(param)
+            return
+        end
+        bsk:PrintLists(param[2])
+    end
+
+    -- TODO: add options
+    --
+    -- for now: launch GUI
+    --
+
+    --if self.frame == nil then
+        --self:CreateGUI()
+        --self:ShowGUI()
+    --else
+        --self:ShowGUI()
+    --end
+
+end
+--MULTIBYTE_FIRST_CHAR = "^([\192-\255]?%a?[\128-\191]*)"
+--function GetNamePattern(name)
+--    local u = name:match(MULTIBYTE_FIRST_CHAR):upper()
+ 
+--    if not u or u:len() == 0 then Prat.Print("GetNamePattern: name error", name) return end
+--    local l = u:lower()
+--    local namepat 
+--    if u == l then
+--        namepat = name:lower()
+--    elseif u:len() == 1 then
+--        namepat = "["..u..l.."]"..name:sub(2):lower()
+--    elseif u:len() > 1 then 
+--        namepat = ""
+--        for i=1,u:len() do
+--            namepat = namepat .. "[" .. u:sub(i,i)..l:sub(i,i).."]"
+--        end
+--        namepat = namepat .. name:sub(u:len()+1)
+--    end
+--    return "%f[%a\192-\255]"..namepat.."%f[^%a\128-\255]"
+--end
+--AnyNamePattern = "%f[%a\192-\255]([%a\192-\255]+)%f[^%a\128-\255]"  
+
+
+function bsk:CreateGUI()
+
+    -- Create a container frame
+    self.frame = AceGUI:Create("Frame")
+    self.frame:SetCallback("OnClose",function(widget) AceGUI:Release(widget) end)
+    self.frame:SetTitle("BSK")
+    self.frame:SetLayout("Flow")
+    self.frame:SetHeight(700) 
+    self.frame:SetWidth(350)
+    local tab = AceGUI:Create("TabGroup")
+    tab:SetLayout("Flow")
+    tab:SetTabs(
+        {
+            {
+                text="Tab 1",
+                value="tab1"
+            },
+
+            {
+                text="Tab 2",
+                value="tab2"
+            },
+            {
+                text="Tab 3",
+                value="tab3"
+            },
+            {
+                text="Tab 4",
+                value="tab4"
+            }
+        }
+    )
+	tab.width = "fill"
+	tab.height = "fill"
+
+    tab:SetCallback("OnGroupSelected",ChangeTab)
+    tab:SelectTab("tab1")
+    self.frame:AddChild(tab)
+
+    -- Create a button
+    --local btn = AceGUI:Create("Button")
+    --btn:SetWidth(170)
+    --btn:SetText("Button !")
+    --btn:SetCallback("OnClick", function() print("Click!") end)
+    -- Add the button to the container
+    --self.frame:AddChild(btn)
+end
+
+bsk.defaults = {
+    profile = {
+        players = {},
+        changes = {},
+        listBase = {}
+    }
+}
+
+bsk.options = {
+    name= 'bsk',
+    type = 'group',
+    args = 
+    {
+        version =
+        {
+            type = "execute",
+            name = "Version query",
+            desc = "Check others' versions",
+            func = function(self) self:Print("TODO") end
+        }
+    }
+}
+function ChangeTab(container, event, group)
+    container:ReleaseChildren()
+    if group == "tab2" then
+        local desc = AceGUI:Create("Label")
+        desc:SetText("This is Tab 1")
+        desc:SetFullWidth(true)
+        container:AddChild(desc)
+
+        local button = AceGUI:Create("Button")
+        button:SetText("Tab 1 Button")
+        button:SetWidth(200)
+        container:AddChild(button)
+    elseif group == "tab1" then
+        local item2 = {string="item2!", color = {r=1,g=0,b=0.5} }
+        local itemList = {"Item1", item2, "Item3", "Item4"}
+
+        local myMultiSelect = AceGUI:Create("MultiSelect")
+        myMultiSelect:SetLabel("My Multi Select")
+        myMultiSelect:SetWidth(200)
+        myMultiSelect:SetHeight(400)
+        myMultiSelect:SetItemList(itemList)
+        myMultiSelect:SetMultiSelect(false)
+        container:AddChild(myMultiSelect)
+    end
+end
+
+
+
+
+
+
+
+
+
+
+
+--[[----------------------------------
+--  MultiSelect widget for AceGUI-3.0
+--  Written by Shirokuma
+--]]----------------------------------
+
+
+--[[-----------------
+-- AceGUI
+--]]-----------------
+--local AceGUI = LibStub("AceGUI-3.0")
+
+--[[-----------------
+-- Lua APIs
+--]]-----------------
+local format, pairs, tostring = string.format, pairs, tostring
+
+--[[-----------------
+-- WoW APIs
+--]]-----------------
+local CreateFrame, UIParent = CreateFrame, UIParent
+
+--[[-----------------
+-- Frame Elements
+--]]-----------------
+local FrameBackdrop = {
+	bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
+	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
+	tile = true, tileSize = 16, edgeSize = 16,
+	insets = { left = 3, right = 3, top = 3, bottom = 3 }
+}
+
+
+--[[-----------------
+-- Widget Info
+--]]-----------------
+local widgetType = "MultiSelect"
+local widgetVersion = 1
+
+
+--[[-----------------
+-- Event Code
+--]]-----------------
+local function Label_OnEnter(label)
+	local self = label.obj
+	local value = label
+	self:Fire("OnLabelEnter", value)
+end
+
+local function Label_OnLeave(label)
+	local self = label.obj
+	local value = label
+	self:Fire("OnLabelEnter", value)
+end
+
+local function Label_OnClick(label)
+	local self = label.obj
+	local value = label
+	self:Fire("OnLabelClick", value)
+	AceGUI:ClearFocus()
+end
+
+
+--[[-----------------
+-- MultiSelect Code
+--]]-----------------
+do
+	local function OnAcquire(self)  -- set up the default size
+		self:SetWidth(200)
+		self:SetHeight(400)
+	end
+	
+	local function SetWidth(self, w)  -- override the SetWidth function to include the labelframe
+		self.frame:SetWidth(w)
+		self.labelframe:SetWidth(w-33)
+	end	
+	
+	local function SetLabel(self, text)  -- sets the multiselect label text
+		self.label:SetText(text)
+	end
+	
+	local function SetMultiSelect(self, value)  -- set if multiple values can be selected simultaneously
+		self.multiselect = value
+	end
+	
+	local function AddItem(self, str, color)  -- add an item (create a new item label object)
+	    local color = color
+		local label = CreateFrame("Button", nil, self.labelframe)
+		label.selected = false
+		label.obj = self
+		label:SetHeight(18)
+		label:SetPoint("TOPLEFT", self.labelframe, "TOPLEFT", 0, -(getn(self.labels) * 18))
+		label:SetPoint("TOPRIGHT", self.labelframe, "TOPRIGHT", 0, -(getn(self.labels) * 18))
+		self.labels[getn(self.labels) + 1] = label
+		self.labelframe:SetHeight(getn(self.labels) * 18)
+		
+		local text = label:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
+		text:SetJustifyH("LEFT")
+		text:SetPoint("TOPLEFT",label,"TOPLEFT",5,0)
+		text:SetPoint("BOTTOMRIGHT",label,"BOTTOMRIGHT",-5,0)
+		if color ~= nil then
+		    text:SetTextColor(color.r,color.g,color.b)
+		end
+		text:SetText(str)
+		label.text = text
+		
+		local highlight = label:CreateTexture(nil, "OVERLAY")
+		highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
+		highlight:SetBlendMode("ADD")
+		highlight:SetHeight(14)
+		highlight:ClearAllPoints()
+		highlight:SetPoint("RIGHT",label,"RIGHT",0,0)
+		highlight:SetPoint("LEFT",label,"LEFT",0,0)
+		highlight:Hide()
+		label.highlight = highlight
+		
+		label:SetScript("OnEnter", function(this)
+			this.highlight:Show()
+			Label_OnEnter(this)
+		end)
+		label:SetScript("OnLeave", function(this)
+			if not this.selected then
+				this.highlight:Hide()
+			end
+		end)
+		label:SetScript("OnClick", function(this)
+			if not this.selected then
+				this.selected = true
+				if not self.multiselect then
+					for index, items in pairs(self.labels) do
+						if self.labels[index] ~= this and self.labels[index].selected then
+							self.labels[index].selected = false
+							self.labels[index].highlight:Hide()
+						end
+					end
+				end
+			else
+				this.selected = false
+			end
+			Label_OnClick(this)
+		end)
+	end
+	
+	local function GetItem(self, text)  -- find an object based on the text parameter
+		for _, value in pairs(self.labels) do
+			if value.text:GetText() == text then
+				return value
+			end
+		end
+		return nil
+	end
+	
+	local function GetText(self, value)  -- get the text of a label object
+		for _,item in pairs(self.labels) do
+			if value == item then
+				return item.text:GetText()
+			end
+		end
+		return nil
+	end
+	
+	local function SetText(self, value, text)  -- set the text of a label object
+		for _, item in pairs(self.labels) do
+			if value == item then
+				value.text:SetText(text)
+			end
+		end
+	end
+	
+	local function IsSelected(self, value)  -- return if the label object is currently selected
+		for _, item in pairs(self.labels) do
+			if value == item then
+				return item.selected
+			end
+		end
+		return nil
+	end
+	
+	local function GetSelected(self)  -- return a table of the currently selected label objects
+		local selectedList = {}
+		for _, item in pairs(self.labels) do
+			if item.selected then
+				table.insert(selectedList, item)
+			end
+		end
+		return selectedList
+	end
+		
+	local function SetItemList(self, list)  -- create new labels from a list of strings
+		for _,item in pairs(self.labels) do
+			item:Hide()
+			item:ClearAllPoints()
+		end
+		
+		self.labels = {}
+		
+		if list then
+			for _,item in pairs(list) do
+			    if type(item) == "string" then
+				    self:AddItem(item)
+                elseif type(item) == "table" then
+                    if item.string ~= nil and type(item.string) == "string" then
+                        if item.color ~= nil then
+                            if type(item.color) == "table" and item.color.r ~= nil and item.color.g ~= nil and item.color.b ~= nil then
+                                self:AddItem(item.string, item.color)
+                            else
+                                assert(false and "setitemlist: item.color is set, but nonsense")
+                            end
+                        else
+                            self:AddItem(item.string)
+                        end
+                    else
+                        assert( false and "setitemlist: item is table without .string member")
+                    end
+                else
+                    assert(false and "SetItemList: nonsense list entry")
+                end
+			end
+		end
+	end
+
+	local function RemoveItem(self, item)  -- delete an item
+		local function RedrawFrame()
+			for index,value in pairs(self.labels) do
+				value:SetPoint("TOPLEFT", self.labelframe, "TOPLEFT", 0, (-(index-1) * 18))
+				value:SetPoint("TOPRIGHT", self.labelframe, "TOPRIGHT", 0,(-(index-1) * 18))
+			end
+		end
+		
+		for index, value in pairs(self.labels) do
+			if value == item then
+				table.remove(self.labels, index)
+				item:Hide()
+				item:ClearAllPoints()
+				RedrawFrame()
+			end
+		end
+	end
+	
+	local function SetSelected(self, item, value)
+		if value then
+			if not self.multiselect then  -- test
+				for _, value in pairs(self.labels) do
+					value.selected = false
+					value.highlight:Hide()
+				end
+			end
+			item.selected = true
+			item.highlight:Show()
+		else
+			item.selected = false
+			item.highlight:Hide()
+		end
+	end
+	
+	local function Constructor()  -- widget constructor
+		local frame = CreateFrame("Frame", nil, UIParent)
+		local backdrop = CreateFrame("Frame", nil, frame)
+		local self = {}
+		local labels = {}
+		
+		self.type = widgetType
+		self.frame = frame
+		self.backdrop = backdrop
+		self.labels = {}
+		self.multiselect = true
+		frame.obj = self
+		
+		local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
+		label:SetJustifyH("LEFT")
+		label:SetPoint("TOPLEFT", 5, 0)
+		label:SetPoint("TOPRIGHT", -5, 0)
+		label:SetHeight(14)
+		label:SetText("MultiSelect")
+		self.label = label
+		
+		backdrop:SetBackdrop(FrameBackdrop)
+		backdrop:SetBackdropColor(0, 0, 0)
+		backdrop:SetBackdropBorderColor(0.4, 0.4, 0.4)
+		backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 5, -14)
+		backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -5, 0)
+		
+		local scrollframe = CreateFrame("ScrollFrame", format("%s@%s@%s", widgetType, "ScrollFrame", tostring(self)), frame, "UIPanelScrollFrameTemplate")
+		scrollframe:SetPoint("TOPLEFT", backdrop, "TOPLEFT", 5, -6)
+		scrollframe:SetPoint("BOTTOMRIGHT", backdrop, "BOTTOMRIGHT", -28, 6)
+		scrollframe.obj = self
+		self.scrollframe = scrollframe
+		
+		local labelframe = CreateFrame("Frame", nil, scrollframe)
+		labelframe:SetAllPoints()
+		labelframe.obj = self
+		scrollframe:SetScrollChild(labelframe)
+		self.labelframe = labelframe
+
+		-- method listing
+		self.OnAcquire = OnAcquire
+		self.SetLabel = SetLabel
+		self.AddItem = AddItem
+		self.SetWidth  = SetWidth
+		self.SetMultiSelect = SetMultiSelect
+		self.SetItemList = SetItemList
+		self.GetItem = GetItem
+		self.RemoveItem = RemoveItem
+		self.GetText = GetText
+		self.SetText = SetText
+		self.IsSelected = IsSelected
+		self.GetSelected = GetSelected
+		self.SetSelected = SetSelected
+		
+		AceGUI:RegisterAsWidget(self)
+		return self
+	end
+	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
+end
+