Mercurial > wow > devian
diff Devian.lua @ 0:585221424a93
initial commit
author | Nenue |
---|---|
date | Tue, 15 Dec 2015 10:18:27 -0500 |
parents | |
children | a13243a4118b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Devian.lua Tue Dec 15 10:18:27 2015 -0500 @@ -0,0 +1,240 @@ +-- User: Krakyn +-- Created: 11/30/2015 7:46 AM +if not LibStub then + print('Something has happened...') +end + +Devian = LibStub("AceAddon-3.0"):NewAddon("Devian", "AceConsole-3.0", "AceEvent-3.0") +local D = _G.Devian + +local db +local msg = function(...) + D:Print(...) +end +local STATE_LOW, STATE_HIGH = 1, 2 +local PLAYER_REALM = UnitName("player") .. '-' .. GetRealmName() +local DEVIAN_FRAME = DevianDebugInfo + +local ScanAddOnList = function(args) + local list_state + + local mode = tonumber(args:match('^%d$')) + + print('ScanAddOnList(', mode, ')') + if mode == nil then + list_state = db.enabled and STATE_LOW or STATE_HIGH + db.enabled = (db.enabled == false) and true or false + print(list_state, db.enabled) + + if list_state == STATE_LOW then + BNSetDND(true) + end + + else + if mode > 2 then + print('ScanAddOnList(',mode,'): Something has happened.') + return + end + list_state = mode == STATE_LOW and STATE_LOW or STATE_HIGH + + if not db.chat_size then + db.chat_size = {} + end + if mode == STATE_LOW or mode == STATE_HIGH then + db.chat_size[list_state] = ChatFrame1:GetHeight() + end + + end + local char_list, global_list = db[PLAYER_REALM][list_state], db.global[list_state] + + local playername = UnitName("player") + + for i = 1, GetNumAddOns() do + local name = GetAddOnInfo(i) + local enableState, globalState = GetAddOnEnableState(playername, i), GetAddOnEnableState(nil, i) + + if mode == STATE_LOW or mode == STATE_HIGH then + char_list[name] = enableState + global_list[name] = globalState + else + + if char_list[name] ~= 0 and global_list[name] ~= 0 then + local value = false + if char_list[name] == 2 and global_list[name] == 1 then + value = UnitName("player") + elseif global_list[name] == 2 then + value = true + end + print('EnableAddOn(', i, ',', value,')') + EnableAddOn(i, value) + else + local value = true + if char_list[name] == 2 and global_list[name] == 1 then + value = UnitName("player") + end + print('DisableAddOn(', i, ',', value,')') + DisableAddOn(i,value) + end + + end + end + + if mode == nil then + ReloadUI() + end + if mode == STATE_LOW then + D:Print('Developement AddOn list saved.') + else + D:Print('Standard AddOn list saved.') + end +end + +-- Debug info +local function CreateMessenger() + -- TODO: throw this into an XML file + if not DEVIAN_FRAME then + DEVIAN_FRAME = CreateFrame('ScrollingMessageFrame', DEVIAN_FRAME, UIParent) + if not db.console then + DEVIAN_FRAME:Hide() + end + end + + local f = DEVIAN_FRAME + f.backdrop = f:CreateTexture('backdrop', 'BACKGROUND') + f.backdrop:SetTexture(1,1,1,1) + f.backdrop:SetGradient('HORIZONTAL', 0.2, 0.2, 0.2, 1, 1, 1) + f.backdrop:SetBlendMode('MOD') + f.backdrop:SetAllPoints(f) + f:AddMessage('init a thing') + + f:EnableMouseWheel(true) + f:EnableKeyboard(true) + f:SetScript('OnMouseWheel', function (self, delta) + local up = delta > 0 + if IsControlKeyDown() then + if up then self:ScrollToTop() + else self:ScrollToBottom() end + elseif IsShiftKeyDown() then + if up then self:PageUp() + else self:PageDown() end + else + if up then self:ScrollUp() + else self:ScrollDown() end + end + end) + + f:ScrollToBottom() + f:SetMaxLines(100) + f:SetInsertMode('BOTTOM') + f:SetPoint('BOTTOMLEFT', GENERAL_CHAT_DOCK, 'TOPLEFT', 0, 25) + f:SetPoint('TOPRIGHT', UIParent, 'TOP', 0, 0- PlayerFrame:GetHeight()) + f:SetFrameStrata('BACKGROUND') + f:SetFont([[Interface\Addons\Turok\Media\font\SourceCodePro-Regular.ttf]], 14, 'NONE') + + f:SetFading(false) + f:SetTimeVisible(2147483647) + f:SetJustifyH('LEFT') + + + D.debug_init = true +end + +local prefix_cache = {} +local function Message(prefix, ...) + + -- colorize + if not prefix_cache[prefix] then + local c = {0, 0, 0 } + local max = string.len(prefix) + for i = 1, max, 3 do + for k, v in ipairs(c) do + local j = i + (k - 1) + c[k] = c[k] + (j <= max and string.byte(prefix,j) or 0) + end + end + for k,v in ipairs(c) do + c[k] = c[k] % 255 + if c[k] < 64 then + c[k] = 0 + elseif c[k] > 127 then + c[k] = 255 + end + end + prefix_cache[prefix] = string.format('%02X%02X%02X', unpack(c)) + end + + local buffer = {'|cFF'.. prefix_cache[prefix]..prefix ..'|r'} + for i = 1, select('#',...) do + local var = select(i, ...) + + if type(var) == 'table' then + var = '<table>' + elseif type(var) == 'boolean' then + var = var and 'true' or 'false' + elseif type(var) == 'function' then + var = '<funcref>' + elseif type(var) == 'nil' then + var = 'nil' + end + + table.insert(buffer, var) + end + DEVIAN_FRAME:AddMessage(table.concat(buffer, ' ')) + table.wipe(buffer) +end + +function D:OnEnable() + if db.enabled then + DEVIAN_FRAME:Hide() + D:Print('Standard AddOn list active. Type /dvn to switch to development mode.') + else + D:Print('Development AddOn list active. Type /dvn to revert to regular operation.') + end +end + +function D:OnInitialize() + + local cherry = false + if not DevianDB then + DevianDB = { + ['global'] = {[STATE_LOW] = {}, [STATE_HIGH] = {}}, + console = true, + dnd_status = true, + dnd_message = "Debugging. Your messages may get eaten.", + } + cherry = "This is probably the first time, so:\n /dvn 2 to save your regular addon list\n /dvn 1 to save your development addon list\n /dvn to switch between the two\n /dvc to toggle print() frame" + end + db = DevianDB + + if not db[PLAYER_REALM] then + db[PLAYER_REALM] = {[STATE_LOW] = {}, [STATE_HIGH] = {} } + if not cherry then + cherry = "This character didn't have an AddOn table." + end + end + + -- inform the user if we have a virgin data table + if cherry then + D:Print(cherry) + end + + -- replace print handler and make the original available in global if possible + + CreateMessenger() + D.oldprint = getprinthandler() + if not _G.oldprint then + _G.oldprint = D.oldprint + end + setprinthandler(Message) + self:RegisterChatCommand("dvn", ScanAddOnList) + self:RegisterChatCommand("dvc", function(args) + db.console = (db.console == false) and true or false + if db.console then + DEVIAN_FRAME:Show() + else + DEVIAN_FRAME:Hide() + end + end) + + print('Master! I am here.') +end \ No newline at end of file