WoWInterface SVN EERaidAdmin

[/] [EEKarma.lua] - Rev 2

Compare with Previous | Blame | View Log

EEKarma = EERaidAdmin:NewModule("EEKarma", "AceConsole-3.0", "AceEvent-3.0", "AceComm-3.0")

local L = LibStub("AceLocale-3.0"):GetLocale("EEKarma")
--local EPGP = LibStub("EPGP");

local db
local __IsDebugging = 0
local __raidActiveGroups = EERaidAdmin.__raidActiveGroups
local __raidActivePlayers = EERaidAdmin.__raidActivePlayers
local ServerDateTime = EERaidAdmin.ServerDateTime
local SelectedMassTarget = 1

local dbkarma = nil
-- 1 - item, 2 - periodic, 3 - special

----------

local function _debug(msg, fatal)
  if __IsDebugging == 1 or fatal then
    EEKarma:Print("|cffdd0000debug: "..msg.."|r")
  end
end

local function _color(r, g, b, msg)
  if type(r) == "table" then
    if r.r then r, g, b = r.r, r.g, r.b else r, g, b = unpack(r) end
  end
  t_color = string.format("|cff%02x%02x%02x", r*255, g*255, b*255)
  if msg ~= '' then
    return t_color..msg..'|r'
  else
    return t_color
  end
end

local function _message(msg, label)
  local output = ""
  output = _color(0,1,1, 'EEKarma: ')
  if label then
    output = output.._color(0,0.7,0.7, label..': ')
  end
  output = output..msg
  print(output)  
end

local function __________()
  -- ignore, IDE cheat
end

function EEKarma:PLAYER_TARGET_CHANGED()
  if UnitExists("target") and UnitIsPlayer("target") then
    local _, class = UnitClass("target")
    self.ButtonSingleKarma:SetText("Выдать ".._color(RAID_CLASS_COLORS[class].r, RAID_CLASS_COLORS[class].g, RAID_CLASS_COLORS[class].b, UnitName("target")))
    self.ButtonSingleKarma:Enable()
  else
    self.ButtonSingleKarma:SetText("Нет цели")
    self.ButtonSingleKarma:Disable()
  end
  local size = self.ButtonSingleKarma:GetTextWidth()+30
  if size < 80 then
    size = 80
  end
    
  self.ButtonSingleKarma:SetWidth(size)
end

local function __________()
  -- ignore, IDE cheat
end

function EEKarma:KarmaParseString(karmastring)
  _debug("KarmaParseString")  
  if not karmastring then _debug("> Плохой аргумент: karmastring", 1); return false; end
  
  if karmastring ~= 'dirty' then
    local t_date, t_type, t_karma, t_message = strsplit(";", karmastring, 4)
    
    t_type = tonumber(t_type)
    t_karma = tonumber(t_karma)
    
    return t_date, t_type, t_karma, t_message
  else
    return nil
  end
end

function EEKarma:KarmaGetTotal(player)
  _debug("KarmaGet")

  local ep, gp, main = EPGP:GetEPGP(player); 
  if (not ep or not gp) then
    return 0;
  elseif (gp < 50) then
    return 1;
  else
    --_debug("KarmaGet: "..(floor(ep/gp)), 1)
    return floor(ep/gp);
  end;
end

function EEKarma:KarmaAdd(player, karma, karmatype, message, verbose)
  -- _debug("KarmaAdd for"..player.." karma: "..karma.."; message: "..message, 1)

  -- checks

  if not player then _debug("> Плохой аргумент: player", 1); return false; end
  if not karma then _debug("> Плохой аргумент: karma", 1); return false; end
  if not karmatype then _debug("> Плохой аргумент: karmatype", 1); return false; end
  if not message then _debug("> Плохой аргумент: message", 1); return false; end

  local player, karma, karmatype, message = strtrim(player), strtrim(karma), strtrim(karmatype), strtrim(message)
  
  if not string.find(karma, "^%s*[+-]*[%d]+%s*$") then _debug(">> карма должна быть числом", 1); return false; end
  if not string.find(karmatype, "^%s*[%d]+%s*$") then _debug(">> тип кармы должен быть числом", 1); return false; end
  if strlen(message) == 0 then _debug(">> комментарий обязателен", 1); return false; end

  karma = tonumber(karma);
  karmatype = tonumber(karmatype);
  
  -- Saving EPGP record  
  -- for ep,gp in gmatch(epgpString, "(%d+),(%d+)") do
  -- _debug("> find player "..player.." "..ep..":"..gp, 1)
  if (karmatype == 1) then                                      -- NEED MAIN (Use GP)
      EPGP:IncGPBy(player, message, karma);
  elseif (karmatype == 2) then                                  -- NEED OFF  (Use EP)
      EPGP:IncEPBy(player, message, -karma);
  elseif (karmatype == 3) then                                  -- DisEnchant
      -- ??
  elseif (karmatype == 0 and not (karma == 0)) then             -- Wrong GREED
      _message("wrong choise for non zero EP/GP for "..player, "Error")
  else                                                          -- GREED (Free)
      -- EPGP:IncEPBy(player, message, 0);                      
  end

  --local ep, gp, main = EPGP:GetEPGP(player);
  --_debug("> new player "..player.." EPGP is "..ep.."/"..gp)

  return true
end

function EEKarma:KarmaMassAdd(target, karma, karmatype, message)
  _debug("KarmaMassAdd")
  
  ---------- Validations
  if not target then _debug("> плохой аргумент: target", 1); return false; end  
  if not karma then _debug("> плохой аргумент: karma", 1); return false; end
  if not karmatype then _debug("> плохой аргумент: karmatype", 1); return false; end
  if not message then _debug("> плохой аргумент: message", 1); return false; end

  local target = string.lower(target)
  local karma = karma
  local karmatype = karmatype
  local message = message

  if target ~= "guild" and target ~= "raid" then _debug("> invalid target", 1); return false; end
  if not string.find(karma, "^%s*[+-]*[%d]+%s*$") then _debug(">> карма должна быть числом", 1); return false; end
  if not string.find(karmatype, "^%s*[%d]+%s*$") then _debug(">> тип кармы должен быть числом", 1); return false; end
  if strlen(message) == 0 then _debug(">> комментарий обязателен", 1); return false; end
 
  karma = tonumber(karma)
  karmatype = tonumber(karmatype)  

  if target == "guild" then
    _message(target..", "..karma..", "..message, "Карма выдана")
    for i = 1, GetNumGuildMembers(true) do
      local name, _, _, _, _, _, _, _, online, status, _ = GetGuildRosterInfo(i)
      if online then -- OK OK  and status ~= L["<AFK>"]
        self:KarmaAdd(name, karma, karmatype, message, false)
      end
    end    
  else
    _message(target..", "..karma..", "..message, "Карма выдана")  
    for i = 1, GetNumRaidMembers() do
      local name, _, _, _, _, _, _, online, _, _, _ = GetRaidRosterInfo(i)
      if online then
        self:KarmaAdd(name, karma, karmatype, message, false)
      end
    end    
  end
  
  return true  
end

function EEKarma:SendMassNotify(terget)
  _debug("SendMassNotify")
  if target~="guild" and target~="raid" then _debug("Неверная цель для масс-оповещения"); return false; end
  if target=="guild" then
    for i=1, GetNumGuildMembers(false) do
      local name, _, _, _, _, _, _, _, online, _, _ = GetGuildRosterInfo(i)
      if online then self:SendCommMessage("LSRA", "YOURKARMA;"..self:KarmaGetTotal(name), "WHISPER", name) end
    end
  elseif target=="raid" then
    if LSRaid:IsRaidActive() then
      for i=1, GetNumRaidMembers() do
          local name, _, _, _, _, _, _, online, _, _, _ = GetRaidRosterInfo(i)
          if online then self:SendCommMessage("LSRA", "YOURKARMA;"..self:KarmaGetTotal(name), "WHISPER", name) end
      end
    else
      _message("Вы не в рейде.")
    end
  end
end

local function __________()
  -- ignore, IDE cheat
end

function EEKarma:DBCreate(name)
  return true
end

function EEKarma:DBUse(name)
  return true
end

function EEKarma:DBList()
  return true
end

function EEKarma:DBPrune(candidate)
  return true
end

function EEKarma:DBMigrate()
  return true
end

function EEKarma:DBCompact()
  return true
end

function EEKarma:DBActive()
    return true
end

local function __________()
  -- ignore, IDE cheat
end

function EEKarma:MassTarget_Select()
  _debug("MassTarget_Select")
  local ndb=this:GetID()
  UIDropDownMenu_SetSelectedID(self.MassTarget, ndb)
  SelectedMassTarget=ndb  
end

function EEKarma:MassTarget_Initialize()
  _debug("MassTarget_Initialize")
  info = {}
  --
  info.text = "Рейд"
  info.checked = 1 == SelectedMassTarget
  info.func = function() EEKarma:MassTarget_Select() end
  UIDropDownMenu_AddButton(info)
  --
  info.text = "Гильдия"
  info.checked = 2 == SelectedMassTarget
  info.func = function() EEKarma:MassTarget_Select() end
  UIDropDownMenu_AddButton(info)
end

function EEKarma:CreateFrames()
  self.Anchor = CreateFrame("Frame", nil, UIParent)
  self.Anchor:SetScript("OnShow", function() EEKarma:OnShow() end )
  self.Anchor:SetScript("OnHide", function() EEKarma:OnHide() end )
  self.Anchor:SetFrameStrata("HIGH")  
  local SingleKarmaLabel = self.Anchor:CreateFontString(nil,"ARTWORK","GameFontNormal")
  SingleKarmaLabel:SetText("Индивидуальная раздача")
  SingleKarmaLabel:SetPoint("TOPLEFT",self.Anchor,"TOPLEFT",30,-45)
  
  self.SingleKarma = CreateFrame("EditBox", "SingleKarma", self.Anchor, "InputBoxTemplate")
  self.SingleKarma:SetPoint("TOPLEFT", self.Anchor, "TOPLEFT", 30, -60)
  self.SingleKarma:SetWidth(40)
  self.SingleKarma:SetHeight(22)
  self.SingleKarma:SetAutoFocus(false)
  self.SingleKarma:ClearFocus()
  
  self.SingleMessage = CreateFrame("EditBox", "SingleMessage", self.Anchor, "InputBoxTemplate")
  self.SingleMessage:SetPoint("LEFT", self.SingleKarma, "RIGHT", 10, 0)
  self.SingleMessage:SetWidth(240)
  self.SingleMessage:SetHeight(22)
  self.SingleMessage:SetAutoFocus(false)
  self.SingleMessage:ClearFocus()
  
  self.ButtonSingleKarma = CreateFrame("Button",nil,self.Anchor,"OptionsButtonTemplate")
  self.ButtonSingleKarma:SetHeight(26)
  self.ButtonSingleKarma:SetScript("OnClick", function()
    EEKarma:KarmaAdd(UnitName("target"), EEKarma.SingleKarma:GetText(), "3", EEKarma.SingleMessage:GetText())
    EEKarma.SingleKarma:SetText("")
    EEKarma.SingleMessage:SetText("")
  end )  
  self.ButtonSingleKarma:SetPoint("LEFT", self.SingleMessage, "RIGHT", 20, 0)
  
  local MassKarmaLabel = self.Anchor:CreateFontString(nil,"ARTWORK","GameFontNormal")
  MassKarmaLabel:SetText("Массовая раздача")
  MassKarmaLabel:SetPoint("TOPLEFT", self.Anchor, "TOPLEFT", 30, -105)
  
  self.MassKarma = CreateFrame("EditBox", "MassKarma", self.Anchor, "InputBoxTemplate")
  self.MassKarma:SetPoint("TOPLEFT", self.Anchor, "TOPLEFT", 30, -120)
  self.MassKarma:SetWidth(40)
  self.MassKarma:SetHeight(22)
  self.MassKarma:SetAutoFocus(false)
  self.MassKarma:ClearFocus()
  
  self.MassMessage = CreateFrame("EditBox", "MassMessage", self.Anchor, "InputBoxTemplate")
  self.MassMessage:SetPoint("LEFT", self.MassKarma, "RIGHT", 10, 0)
  self.MassMessage:SetWidth(240)
  self.MassMessage:SetHeight(22)
  self.MassMessage:SetAutoFocus(false)
  self.MassMessage:ClearFocus()
  
  self.MassTarget = CreateFrame("Button","MassTarget",self.Anchor,"UIDropDownMenuTemplate")
  self.MassTarget:SetScript("OnShow", function()    
    UIDropDownMenu_Initialize(self.MassTarget, self.MassTarget_Initialize)
    UIDropDownMenu_SetSelectedID(self.MassTarget, SelectedMassTarget)
    UIDropDownMenu_SetWidth(self.MassTarget, 90)
  end )  
  self.MassTarget:SetPoint("LEFT", self.MassMessage, "RIGHT", -10, -3)
  
  self.ButtonMassKarma = CreateFrame("Button",nil,self.Anchor, "OptionsButtonTemplate")
  self.ButtonMassKarma:SetHeight(26)
  self.ButtonMassKarma:SetText("Выдать")
  self.ButtonMassKarma:SetScript("OnClick", function()
    -- TODO: magic numbers :/
    if SelectedMassTarget == 1 then
      EEKarma:KarmaMassAdd("raid", EEKarma.MassKarma:GetText(), "3", EEKarma.MassMessage:GetText())
    else 
      EEKarma:KarmaMassAdd("guild", EEKarma.MassKarma:GetText(), "3", EEKarma.MassMessage:GetText())
    end
    EEKarma.MassKarma:SetText("")
    EEKarma.MassMessage:SetText("")
  end )  
  self.ButtonMassKarma:SetPoint("LEFT", self.MassMessage, "RIGHT", 135, 0)
  
  -- self.KarmaStartRaid = CreateFrame("Button", nil, self.Anchor, "OptionsButtonTemplate")
  -- self.KarmaStartRaid:SetWidth(120)
  -- self.KarmaStartRaid:SetHeight(26)
  -- self.KarmaStartRaid:SetText("Начало рейда")
  -- self.KarmaStartRaid:SetScript("OnClick", function()  
  --   EEKarma.MassKarma:SetText("2")
  --   EEKarma.MassMessage:SetText("Карма за начало рейда: "..GetRealZoneText())
  -- end )  
  -- self.KarmaStartRaid:SetPoint("TOPLEFT", self.Anchor, "TOPLEFT", 20, -170)
  -- 
  -- self.KarmaStopRaid = CreateFrame("Button", nil, self.Anchor, "OptionsButtonTemplate")
  -- self.KarmaStopRaid:SetWidth(120)
  -- self.KarmaStopRaid:SetHeight(26)
  -- self.KarmaStopRaid:SetText("Конец рейда")
  -- self.KarmaStopRaid:SetScript("OnClick", function()  
  --   EEKarma.MassKarma:SetText("2")
  --   EEKarma.MassMessage:SetText("Карма за конец рейда")
  -- end )  
  -- self.KarmaStopRaid:SetPoint("TOPLEFT", self.KarmaStartRaid, "BOTTOMLEFT", 0, -5)
  
end

function EEKarma:OnShow()
  _debug("OnShow")
end

function EEKarma:OnHide()
  _debug("OnHide")
end

function EEKarma:OnInitialize()
  _debug("OnInitialize")
  --self.db = EERaidAdmin:GetDatabaseNamespace("EERaidAdminDB")
  self.db = LibStub("AceDB-3.0"):New("EERaidAdminDB")
  db = self.db.global
  
  self:DBUse(db['ActiveDB'])  
  self:RegisterComm("LSRC")
  
  self:RegisterEvent("PLAYER_TARGET_CHANGED")
  -- self:RegisterEvent("RAID_ROSTER_UPDATE")  
  -- self:RegisterEvent("LOOT_OPENED")
  -- self:RegisterEvent("LOOT_CLOSED")
  -- self:RegisterEvent("LOOT_SLOT_CLEARED")  
  -- self:RegisterEvent("CHAT_MSG_SYSTEM")
  
  self:CreateFrames()
  self:PLAYER_TARGET_CHANGED()
  self.Anchor:Hide()
end


function EEKarma:OnCommReceived(prefix, message, distribution, sender)
  _debug("OnCommReceived")
  local tokens = { strsplit(";", message) }
  if prefix == "LSRC" then 
    if tokens[1] == "GETKARMA" then
      local lootmethod, masterlooterPartyID, _ = GetLootMethod(); -- check if ML
      if lootmethod == "master" and masterlooterPartyID == 0 and EERaid:IsRaidActive() then
         self:SendCommMessage("LSRA", "YOURKARMA;"..self:KarmaGetTotal(sender), "WHISPER", sender)
      end
    end
  end
end

function EEKarma:OnEnable()
  _debug("OnEnable")
end

function EEKarma:OnDisable()
  _debug("OnDisable")
end

Compare with Previous | Blame