vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
Changelog:

        Version 1.2.0
                fixed compeltely disapaering messages by a big moddification in the hook
                updated toc
                updated silvanaslib

        Version 1.1.8
                fixed a small scanning bug that would some unEquipable items show up as useable

        Version 1.1.7
                fixed 2 overflown bugs but in a bad way so the might be new probs atleast i tryed to fix it :p

        Version 1.1.5
                Fixed a small version number witch i forgot to update 

        Version 1.1.4
                now only works on chat messages or loot message

        Version 1.1.1
                small bug fix for iems whitout a level got shown whit a () level witch is now gone again

        Version 1.1.0
            basic sepport added for customiseable colors for some items witch can be set in the "CustomRecolor.lua"
        Money coloring now default to off becase of the many unforseen problems... :(
        added a new comand to get  he number of an item
        actioneer sepport fixed for actionneer version 3.6.1
        Setting now get saved and loaded back instead of jsut saved

        Version 1.0.8
                Fixed money coloring inside color strings
                Hopefully fixed the german stack overflow
                Fixed money enable or disable cmds

        Version 1.0.5
                Fixed money coloring system trigering on g2g
                Fixed error when a nil message was send
                Fixed compatibiltie whit Nerfed Combatlog (but not the actual prob that was casing the bug)

        Version 1.0.3
            Fixed bug where some item strings where nolonger localised
            Fixed a bug where multiple item links in 1 chat message all would link to the first item
            Money / itemlink coloing can now be turned on / off seperately

        Version 1.0.0
                First working version, after lots of debugging :p

Known Bugs:

Todo:
        Code Cleanup (it was nice but after the latest fixed its pure crap again..
--]]

--main global var
ItemLinkRecolor = {
        AddonName       = "ItemLinkRecolor",
        ["NAME"]                = "|cFF33CC66Item Link Recolor|r",
        ["VERSION"]     = "(|cFF9900001|cFFFFFFFF.|cFF9900002|cFFFFFFFF.|cFF9900000|cFFFFFFFF)|r",
        ["AUTHOR"]      = "|cff993366Silvanas|r",
        ["ENABLED"]             = true,
        ["ILENABLED"]   = true,
        ["MLENABLED"]   = false,
}
--

--event that we will color
local ItemLinkRecolor_AllowedEvents = {
        ["CHAT_MSG_CHANNEL"]    = true,
        ["CHAT_MSG_LOOT"]               = true,
        ["CHAT_MSG_OFFICER"]    = true,
        ["CHAT_MSG_PARTY"]              = true,
        ["CHAT_MSG_RAID"]               = true,
        ["CHAT_MSG_RAID_LEADER"]= true,
        ["CHAT_MSG_SAY"]                = true,
        ["CHAT_MSG_WHISPER"]    = true,
        ["CHAT_MSG_YELL"]               = true,
        ["CHAT_MSG_GUILD"]              = true,
}
--

--local hook pointer
local ILR_ItemLinkRecolor_OnEvent_Hook  --hooks chatframe events (needed to know the "this:")
--

--events array
local ItemLinkRecolorEventArray = {}
function ItemLinkRecolor_Event() ItemLinkRecolorEventArray[event]() end
--

-------------------
--event triggered--
-------------------
--onload
function ItemLinkRecolor_Load()
        --load up the custom coloring var
        --[[if not ItemLinkRecolor_Custom then
            --Silvanas.Print("|cFFFF0000Warning:|r No Costum database detected")
                ItemLinkRecolor_Custom = {} --it has tobe a table to prevent errors further down
        else
            Silvanas.Print("Costum table loaded")
        
        end
        --]]
        
        --register events
        ItemLinkRecolorEventArray = {
                ["VARIABLES_LOADED"]    = ItemLinkRecolor_Event_Variables_Loaded,
                ["ADDON_LOADED"]                = ItemLinkRecolor_Event_Addon_Loaded
        }
        this:RegisterEvent("VARIABLES_LOADED")
        this:RegisterEvent("ADDON_LOADED")

        --set up commands
    Silvanas.AddCmd("ITEMLINKRECOLOR_CMD",ItemLinkRecolor_Cmd_ItemLinkRecolor,{"ilr","ItemLinkRecolor"})
end

---on event
--this is after ll saved variabled ar laoded back in mem
function ItemLinkRecolor_Event_Variables_Loaded()
    --function to reset saved variables
        local ItemLinkRecolorReset = function()
                ItemLinkRecolorSavedVars = {
                    ["VERSION"] = ItemLinkRecolor["VERSION"],
                        ["ENABLED"] = ItemLinkRecolor["ENABLED"],
                        ["ILENABLED"] = ItemLinkRecolor["ILENABLED"],
                        ["MLENABLED"] = ItemLinkRecolor["MLENABLED"],
                }
        end

        --basic chatframe event hook
        ILR_ItemLinkRecolor_OnEvent_Hook = ChatFrame_OnEvent
        ChatFrame_OnEvent = ItemLinkRecolor_ChatFrame_OnEvent

        --load up saved variables
        if not ItemLinkRecolorSavedVars then
                --if there are no saved vars thne well relaod the default
                ItemLinkRecolorReset()
        else
            if ItemLinkRecolorSavedVars["VERSION"] and ItemLinkRecolorSavedVars["VERSION"] == ItemLinkRecolor["VERSION"] then
                --if there are saved vars and they are saved under the good version then load em up
                ItemLinkRecolor["ENABLED"] = ItemLinkRecolorSavedVars["ENABLED"]
                        ItemLinkRecolor["ILENABLED"] = ItemLinkRecolorSavedVars["ILENABLED"]
                        ItemLinkRecolor["MLENABLED"] = ItemLinkRecolorSavedVars["MLENABLED"]            
                else
                        --if there are saved vars but under the wrong version then reload the default
                        ItemLinkRecolorReset()
                end
        end
        
        --loaded message
        Silvanas.Print(ItemLinkRecolor["NAME"] .." |cFFFFFFFFversion: ".. ItemLinkRecolor["VERSION"] .." |cFFFFFFFFloaded.|r")
end

--this is whenever an addon gets loaded, oO so quite a lot :(
function ItemLinkRecolor_Event_Addon_Loaded()
        --auctoineer doesnt like our moddified item names :( so we build deffierent string jsut for auctioneer
        if arg1 == "EnhTooltip" then
                ItemLinkRecolor_Auctioneer = true
        end
end     
-------------------
-------------------
-------------------

-----------------------
--chat hook functions--
-----------------------
--this function takes over the real "ChatFrame_OnEvent" and calls the real one afterwards
function ItemLinkRecolor_ChatFrame_OnEvent(event)
    --if we got this addon enabled
        if ItemLinkRecolor["ENABLED"] then
                --if we allow this event
                if ItemLinkRecolor_AllowedEvents[event] then
                        --if we got money coloring enabled
                        if ItemLinkRecolor["MLENABLED"] then
                                --Parse money strings and return them in color
                        arg1 = string.gsub(arg1,"([|]-[c]-%x-[%.,gG]-%d+%s-[gGsScC]%a*)",ItemLinkRecolor_Moneyrize)
                        end
                        --if we got itemlink coloring enabled
                        if ItemLinkRecolor["ILENABLED"] then
                                --find an item links and return new colored ones
                        arg1 = string.gsub(arg1,"(|Hitem:%d+:%d+:%d+:%d+|h.-|h)",ItemLinkRecolor_Colorize)
                end
                end
        end
        --Call the orriginal function
        ILR_ItemLinkRecolor_OnEvent_Hook(event)
end
-----------------------
-----------------------
-----------------------

----------------------
--coloring functions--
----------------------
function ItemLinkRecolor_Colorize(texty)
        --dont call print functions here else u overflow the stack use a text hook instead
        --text = string.format("|cFFFF0000H|cFFFFFFFF:|r %s",text)
        
        --parse elements of the link
        local _,_,link,itemnum = string.find(texty,"^|H(item:(%d+):%d+:%d+:%d+)|h")
        
        --Silvanas.Print(itemnum ..", ".. Silvanas.VarPrint(ItemLinkRecolor_Custom[itemnum]))
        
        --get the item atributes
        local itemnamereal,_,itemquality,itemlevel = GetItemInfo(link)
        local itemname = itemnamereal
        
        --if something went wrong ignore this chat link and return wutever text we recieved
        if type(itemquality) == "nil" then --cant just check if its tru since it can also be 0
                return texty
        end

        --get the quality color
        local itemqualitycolor = Silvanas.Select(4,GetItemQualityColor(itemquality))

        --custom stuff
        --[[if ItemLinkRecolor_Custom[itemnum] or ItemLinkRecolor_Custom[itemnamereal] then
            Silvanas.print("Customizing")
                itemname = ItemLinkRecolor_Custom[itemnum].custom_itemname or ItemLinkRecolor_Custom[itemnamereal].custom_itemname or itemname
                itemqualitycolor = ItemLinkRecolor_Custom[itemnum].custom_itemcolor or ItemLinkRecolor_Custom[itemnamereal].custom_itemcolor or itemqualitycolor
        end
        --]]

        --build the level display
        local playerlevel = UnitLevel("player")
        local itemlevelcolor = nil

        --custom levelname
        --[[if (ItemLinkRecolor_Custom[itemnum] and ItemLinkRecolor_Custom[itemnum].custom_levelname) or (ItemLinkRecolor_Custom[itemnamereal] and ItemLinkRecolor_Custom[itemnamereal].custom_levelname) then
                itemlevel = ItemLinkRecolor_Custom[itemnum].custom_levelname or ItemLinkRecolor_Custom[itemnamereal].custom_levelname
        end
        --]]

    if itemlevel == 0 then
            --items that dont have a min level
            itemlevel = ""
            itemlevelcolor = ""
        else
                --if it isnt a costum string
            if type(itemlevel) == "number" then
                        if itemlevel > (playerlevel + 5) then
                                itemlevelcolor = "FF0000"
                        elseif itemlevel > playerlevel then
                        itemlevelcolor = "FF9933"
                        elseif itemlevel == playerlevel then
                        itemlevelcolor = "FFFF00"
                        elseif itemlevel > (playerlevel - 5) then
                        itemlevelcolor = "00FF00"
                        else
                        itemlevelcolor = "999999"
                        end
                else
                    --default color for text type levlenames
                        itemlevelcolor = "FFFFFF"
                end
                
                --custom level color
                --[[if (ItemLinkRecolor_Custom[itemnum] and ItemLinkRecolor_Custom[itemnum].custom_levelcolor) or (ItemLinkRecolor_Custom[itemnamereal] and ItemLinkRecolor_Custom[itemnamereal].custom_levelcolor) then
                        itemlevelcolor = ItemLinkRecolor_Custom[itemnum].custom_levelcolor or ItemLinkRecolor_Custom[itemnamereal].custom_levelcolor
                end
                --]]
                
                --finish the itemlevelcolor
                itemlevelcolor = "|cFF".. itemlevelcolor
        end
        
        --check if we can use it or not
        local bracketcolor = nil
        
        --custom bracket colors
        --[[if ItemLinkRecolor_Custom[itemnum] or ItemLinkRecolor_Custom[itemnamereal] then
            if type(ItemLinkRecolor_Custom[itemnum].custom_Equipable) == "nil" and type(ItemLinkRecolor_Custom[itemnamereal].custom_Equipable) == "nil" then
                elseif ItemLinkRecolor_Custom[itemnum].custom_Equipable or ItemLinkRecolor_Custom[itemnamereal].custom_Equipable then
                    bracketcolor = itemqualitycolor
                else
                    bracketcolor = "|cFFFF0000"
                end
        end
        --]]

        --if it isnt already se by the customiseable part
        if not bracketcolor then
        if type(itemlevel) == "number" and itemlevel > playerlevel then
                --if the level is already to high then make the brackets red
                bracketcolor = "|cFFFF0000"
                else
                --see if its Equipable
                        if ItemLinkRecolor_CanEquip(link) then
                                bracketcolor = itemqualitycolor
                        else
                        bracketcolor = "|cFFFF0000"
                        end
                end
        end
        
        --build and return the return value
        if ItemLinkRecolor_Auctioneer then
                --auctoineer doesnt like our moddified item names :( so we build deffierent string jsut for auctioneer
                --so we leave the actual link as it is
                if type(itemlevel) == "string" and itemlevel == "" then
                        --dont dispaly he level for item whitout a minuim level
                        return "|r".. bracketcolor .."(|r".. itemqualitycolor .. texty .."|r".. bracketcolor ..")|r"
                else
                        return "|r".. bracketcolor .."(|r".. itemlevelcolor .. itemlevel .."|r".. itemqualitycolor .. texty .."|r".. bracketcolor ..")|r"
                end
        else
                --else orriginal nicer way
                if type(itemlevel) == "string" and itemlevel == "" then
                        --dont dispaly he level for item whitout a minuim level
                        return "|r|H".. link .."|h".. bracketcolor .."[|r".. itemqualitycolor .. itemname .."|r".. bracketcolor .."]|r|h"
                else
                        return "|r|H".. link .."|h".. bracketcolor .."[|r".. itemlevelcolor .."(".. itemlevel ..")|r" .. itemqualitycolor .. itemname .."|r".. bracketcolor .."]|r|h"
                end
        end
end

--the coloring fuction of money
function ItemLinkRecolor_Moneyrize(texty)
    --dont call print functions here else u overflow the stack use a text hook instead
        --text = string.format("|cFFFF0000H|cFFFFFFFF:|r %s",text)

        --if it isnt a g2g message
        if string.find(texty,"[gG]2[gG]") then
                return texty
        end
        
        --if its contains a color code
        local colorcode,returntext
        colorcode = Silvanas.Select(3,string.find(texty,"^|c(%x+)"))
        
        --if we are trying to color inside the colorcode then ignore this money and return wutever txt we had
        if colorcode then
                if string.len(colorcode) < 8 then
                        return texty
                else
                        --cut off the color code but still and it in the end
                        colorcode = string.sub(texty,1,10)
                        returntext = string.sub(texty,11)
                end
        else
            returntext = texty
            colorcode = ""
        end

    --parse money
    local _,_,money1,money2,moneytype,moneystr = string.find(texty,"^(%d-)[%.,]-(%d+)%s-([gGsScC])(%a*)$")
    
    --if something went wrong ignore this chat link and return wutever text we recieved
    if moneytype then
        moneytype = string.upper(moneytype)
    else
        --if something went wrong ignore this chat link and return wutever text we recieved
        return texty
    end
    
    --see if moneystr is part of an other word
    if moneystr ~= "" then
        moneystr = string.lower(moneystr)
        --see if our moneytype and moneystr are valid
        if moneytype == "G" then
                if moneystr ~= "old" then
                                return texty
                        end
                elseif moneytype == "S" then
                        if moneystr ~= "ilver" then
                                return texty
                        end
                else
                        if moneystr ~= "opper" then
                                return texty
                        end
                end
        end 
    
    --if there is no comma or dot but only 1 number
    if money1 == "" then
        --if something went wrong ignore this chat link and return wutever text we recieved
                if money2 == "" then
            return texty
                end
                
                --if there is only 1 number then store it in money1 and make money2 0
        money1 = money2
        money2 = 0
        end
        
    --if something went wrong ignore this chat link and return wutever text we recieved
        if (money2 ~= 0) and (moneytype == "C") then
                --cant hace a comma when the moneytype is "C"'opper'
        return texty
        end

        --calc the money in copper
        local mcalc = { ["G"] = 10000,
                                ["S"] = 100,
                                ["C"] = 1,      }
                                
        local moneycopper = (tonumber(money1)*mcalc[moneytype]) + (tonumber(money2)*(mcalc[moneytype] / 100))

    --[[--TEMP FIX FOR NUFED COMBAT LOG
        --if money is 0 then ignore it
        if moneycopper == 0 then
            return texty
        end--]]
        
    --get the player his money
        local playermoney = GetMoney()

        --do the money compare
        local quartplayermoney = playermoney / 4
        
        if moneycopper > (playermoney*2) then
                local moneycoler = "FF0000"
        elseif moneycopper > playermoney then
            local moneycoler = "FF9933"
        elseif (moneycopper <= playermoney) and (moneycopper > (quartplayermoney*3)) then
                local moneycoler = "FFFF00"
        elseif (moneycopper <= (quartplayermoney*3)) and (moneycopper > quartplayermoney) then
            local moneycoler = "00FF00"
        else
            local moneycoler = "999999"
        end

        --return the new text
        return "|cFF".. moneycoler .. returntext .."|r".. colorcode
end
----------------------
----------------------
----------------------

---------------------
--Checkup Functions--
---------------------
function ItemLinkRecolor_CanEquip(link)
        --dont call print functions here else u overflow the stack use a text hook instead
        --text = string.format("|cFFFF0000H|cFFFFFFFF:|r %s",text)
        
        --tooltip scan function
        local ItemLinkRecolor_ToolTipTextIsRed = function(TooltipFrame)
                if TooltipFrame and TooltipFrame:IsVisible() then --dont scan colors of invisable frames
                        --gets its colors
                        local ttca,ttcr,ttcg,ttcb
                        ttcr,ttcg,ttcb,ttca = TooltipFrame:GetTextColor()
                        
                --if its red then we assume we cant use this item (yes its not a clean and save way but it saves cpu usage)
                        --if (ttcr == 0.99999780301005) and (ttcg == 0.12548992037773) and (ttcb == 0.12548992037773) and (ttca == 0.99999779462814) then
                        if ttcr > 0.99999 and (ttcg > 0.125 and ttcg < 0.126) and (ttcb > 0.125 and ttcb < 0.126) and (ttca > 0.99999) then
                                return true
                        end
                end
                return false
        end 
        
        --first clear the tooltip
        ItemLinkRecolorScanningTooltip:ClearLines()
        
    --set the link
        ItemLinkRecolorScanningTooltip:SetHyperlink(link)
        
        --oke we search in a hidden tooltip to find if there are any red lines so we cant use it :p
        local TooltipText
        local i
        
        for i=1,ItemLinkRecolorScanningTooltip:NumLines(),1 do --go over each line
            --get one left text object
                TooltipTextFrame = getglobal("ItemLinkRecolorScanningTooltipTextLeft".. i)
                
                --if the text is red we return false since we assume we cant Equip it
                if ItemLinkRecolor_ToolTipTextIsRed(TooltipTextFrame) then
                        return false
                end
                
                if (i == 2) or (i == 3) then --2,3 RIGHT is the armor type
                        --get the right text object
                    TooltipTextFrame = getglobal("ItemLinkRecolorScanningTooltipTextRight".. i)
                        
                        --if the text is red we return false since we assume we cant Equip it
                        if ItemLinkRecolor_ToolTipTextIsRed(TooltipTextFrame) then
                                return false
                        end     
                end
        end

        --if nothing in red was found we assume we can use use it
        return true
end

------------
--commands--
------------
function ItemLinkRecolor_Cmd_ItemLinkRecolor(msg)
        --if there is any parameter given to the command
        if msg ~= "" then
            --to lower case so its nolonger case sensetive
                msg = string.lower(msg)
                
                --stringsub it so we only extract the part we need espacilay hand if u have multiple parameters
                if string.sub(msg,1,6) == "enable" then
                        --set the vars
                    ItemLinkRecolor["ENABLED"] = true
                    ItemLinkRecolorSavedVars["ENABLED"] = true
                    
                        --update mod intoo the silvanasaddonlib
                Silvanas.AddMod(ItemLinkRecolor)
                
                --print the messsage
                Silvanas.Print(ItemLinkRecolor["NAME"] .." Enabled")
                return
                                
        elseif string.sub(msg,1,7) == "disable" then
                --set the vars
                    ItemLinkRecolor["ENABLED"] = false
                    ItemLinkRecolorSavedVars["ENABLED"] = false
                    
                    --update mod intoo the silvanasaddonlib
                Silvanas.AddMod(ItemLinkRecolor)
                
                --print the messsage
                Silvanas.Print(ItemLinkRecolor["NAME"] .." Disabled")
                return
                
                elseif string.sub(msg,1,8) == "itemlink" then
                        if string.sub(msg,10,15) == "enable" then
                                --set the vars
                                ItemLinkRecolor["ILENABLED"] = true
                                ItemLinkRecolorSavedVars["ILENABLED"] = true
                                
                        --update mod intoo the silvanasaddonlib
                        Silvanas.AddMod(ItemLinkRecolor)

                                --print the messsage
                        Silvanas.Print(ItemLinkRecolor["NAME"] .." ItemLink Colering Enabled")
                        return
                                
                        elseif string.sub(msg,10,16) == "disable" then
                                --set the vars
                                ItemLinkRecolor["ILENABLED"] = false
                                ItemLinkRecolorSavedVars["ILENABLED"] = false

                        --update mod intoo the silvanasaddonlib
                        Silvanas.AddMod(ItemLinkRecolor)
                        
                                --print the messsage
                        Silvanas.Print(ItemLinkRecolor["NAME"] .." ItemLink Colering Disabled")
                    return
                    
                        end
                elseif string.sub(msg,1,5) == "money" then
                        if string.sub(msg,7,13) == "enable" then
                            --set the vars
                            ItemLinkRecolor["MLENABLED"] = true
                                ItemLinkRecolorSavedVars["MLENABLED"] = true

                        --update mod intoo the silvanasaddonlib
                        Silvanas.AddMod(ItemLinkRecolor)
                        
                                --print the messsage
                        Silvanas.Print(ItemLinkRecolor["NAME"] .." Money Colering Enabled")
                        return
                        
                        elseif string.sub(msg,7,14) == "disable" then
                        --set the vars
                        ItemLinkRecolor["MLENABLED"] = false
                                ItemLinkRecolorSavedVars["MLENABLED"] = false
                                
                        --update mod intoo the silvanasaddonlib
                        Silvanas.AddMod(ItemLinkRecolor)
                        
                                --print the messsage
                        Silvanas.Print(ItemLinkRecolor["NAME"] .." Money Colering Disabled")
                        return
                        
                        end
                elseif string.sub(msg,1,6) == "getnum" then
                    Silvanas.Print(string.gsub(msg,"|","!"))
                
                        --get the number and name
                        local x,inum,iname
                        x,x,inum,iname = string.find(msg,"|hitem:(%d+):%d+:%d+:%d+|h(.-)|h",8)
                        
                        Silvanas.Print(Silvanas.VarPrint(inum) ..", ".. Silvanas.VarPrint(iname))
                        
                        --if we could find it
                        if inum and iname then
                                Silvanas.Print(ItemLinkRecolor["NAME"] ..": The ItemNumber of ".. iname .." is: ".. inum)                                               
                        else
                                Silvanas.Print(ItemLinkRecolor["NAME"] ..": Invalid itemlink")  
                        end
                        return
                                                
                end
        end
        --basic help display for unknown commands
        Silvanas.Print(ItemLinkRecolor["NAME"] .." |cFFFFFFFFversion: ".. ItemLinkRecolor["VERSION"] .." |cFF999999ItemLinkRecolor Options:")
        Silvanas.Print("|cFF999999/ItemLinkRecolor (/ilr) |cFFFFFF99[option]|cFFFFFFFF: |cFF999999Sets |cFFFFFF99[option]")
    Silvanas.Print("|cFFFFFF99Enabled |cFFFFFFFF:Turns ".. ItemLinkRecolor["NAME"] .." |cFF9999FF[on]")
    Silvanas.Print("|cFFFFFF99Disabled |cFFFFFFFF:Turns ".. ItemLinkRecolor["NAME"] .." |cFF9999FF[off]")
        Silvanas.Print("|cFFFFFF99ItemLink Enabled|cFFFFFFFF:Turns ItemLink Coloring |cFF9999FF[on]")
        Silvanas.Print("|cFFFFFF99ItemLink Disabled|cFFFFFFFF:Turns ItemLink Coloring |cFF9999FF[off]")
        Silvanas.Print("|cFFFFFF99Money Enabled|cFFFFFFFF:Turns ItemLink Coloring |cFF9999FF[on]")
        Silvanas.Print("|cFFFFFF99Money Disabled|cFFFFFFFF:Turns Money Coloring |cFF9999FF[off]")
        Silvanas.Print("|cFFFFFF99GetNum <ItemLink>|cFFFFFFFF:Gets the ItemNumber out of the ItemLink")
end
------------
------------
------------

Generated by GNU Enscript 1.6.5.90.