WIM_VERSION = "1.2.10"; WIM_Windows = {}; WIM_EditBoxInFocus = nil; WIM_NewMessageFlag = false; WIM_NewMessageCount = 0; WIM_Icon_TheMenu = nil; WIM_Icon_UpdateInterval = .5; WIM_CascadeStep = 0; WIM_MaxMenuCount = 20; WIM_ClassIcons = {}; WIM_ClassColors = {}; WIM_AlreadyCheckedGuildRoster = false; WIM_GuildList = {}; --[Not saved between sessions: Autopopulates from GUILD_ROSTER_UPDATE event WIM_FriendList = {}; --[Not saved between sessions: Autopopulates from FRIENDLIST_SHOW & FRIENDLIST_UPDATE event WIM_Alias = {}; WIM_Filters = nil; WIM_ToggleWindow_Timer = 0; WIM_ToggleWindow_Index = 1; WIM_RecentList = {}; --[Not saved between sessions: Store's list of recent conversations. WIM_History = {}; WIM_Data_DEFAULTS = { versionLastLoaded = "", showChangeLogOnNewVersion = true, enableWIM = true, iconPosition=337, showMiniMap=true, displayColors = { wispIn = {r=0.5607843137254902, g=0.03137254901960784, b=0.7607843137254902}, wispOut = {r=1, g=0.07843137254901961, b=0.9882352941176471}, sysMsg = {r=1, g=0.6627450980392157, b=0}, errorMsg = {r=1, g=0, b=0}, webAddress = {r=0, g=0, b=1}, }, fontSize = 12, windowSize = 1, windowAlpha = .8, supressWisps = true, keepFocus = false, popNew = true, popUpdate = true, popOnSend = true, popCombat = false, autoFocus = false, playSoundWisp = true, showToolTips = true, sortAlpha = true, winSize = { width = 384, height = 256 }, winLoc = { left =242 , top =775 }, winCascade = { enabled = true, direction = "downright" }, miniFreeMoving = { enabled = false; left = 0, top = 0 }, characterInfo = { show = true, classIcon = true, details = true, classColor = true }, showTimeStamps = true, showShortcutBar = true, enableAlias = true, enableFilter = true, aliasAsComment = true, enableHistory = true, historySettings = { recordEveryone = false, recordFriends = true, recordGuild = true, colorIn = { r=0.4705882352941176, g=0.4705882352941176, b=0.4705882352941176 }, colorOut = { r=0.7058823529411764, g=0.7058823529411764, b=0.7058823529411764 }, popWin = { enabled = true, count = 25 }, maxMsg = { enabled = true, count = 200 }, autoDelete = { enabled = true, days = 7 } } }; --[initialize defualt values WIM_Data = WIM_Data_DEFAULTS; WIM_CascadeDirection = { up = { left = 0, top = 25 }, down = { left = 0, top = -25 }, left = { left = -50, top = 0 }, right = { left = 50, top = 0 }, upleft = { left = -50, top = 25 }, upright = { left = 50, top = 25 }, downleft = { left = -50, top = -25 }, downright = { left = 50, top = -25 } }; WIM_IconItems = { }; function WIM_OnLoad() SlashCmdList["WIM"] = WIM_SlashCommand; SLASH_WIM1 = "/wim"; end function WIM_Incoming(event) --[Events if(event == "VARIABLES_LOADED") then if(WIM_Data.enableWIM == nil) then WIM_Data.enableWIM = WIM_Data_DEFAULTS.enableWIM; end; if(WIM_Data.versionLastLoaded == nil) then WIM_Data.versionLastLoaded = ""; end; if(WIM_Data.showChangeLogOnNewVersion == nil) then WIM_Data.showChangeLogOnNewVersion = WIM_Data_DEFAULTS.showChangeLogOnNewVersion; end; if(WIM_Data.displayColors == nil) then WIM_Data.displayColors = WIM_Data_DEFAULTS.displayColors; end; if(WIM_Data.displayColors.sysMsg == nil) then WIM_Data.displayColors.sysMsg = WIM_Data_DEFAULTS.displayColors.sysMsg; end; if(WIM_Data.displayColors.errorMsg == nil) then WIM_Data.displayColors.errorMsg = WIM_Data_DEFAULTS.displayColors.errorMsg; end; if(WIM_Data.fontSize == nil) then WIM_Data.fontSize = WIM_Data_DEFAULTS.fontSize; end; if(WIM_Data.windowSize == nil) then WIM_Data.windowSize = WIM_Data_DEFAULTS.windowSize; end; if(WIM_Data.windowAlpha == nil) then WIM_Data.windowAlpha = WIM_Data_DEFAULTS.windowAlpha; end; if(WIM_Data.supressWisps == nil) then WIM_Data.supressWisps = WIM_Data_DEFAULTS.supressWisps; end; if(WIM_Data.keepFocus == nil) then WIM_Data.keepFocus = WIM_Data_DEFAULTS.keepFocus; end; if(WIM_Data.popNew == nil) then WIM_Data.popNew = WIM_Data_DEFAULTS.popNew; end; if(WIM_Data.popUpdate == nil) then WIM_Data.popNew = WIM_Data_DEFAULTS.popUpdate; end; if(WIM_Data.autoFocus == nil) then WIM_Data.autoFocus = WIM_Data_DEFAULTS.autoFocus; end; if(WIM_Data.playSoundWisp == nil) then WIM_Data.playSoundWisp = WIM_Data_DEFAULTS.playSoundWisp; end; if(WIM_Data.showToolTips == nil) then WIM_Data.showToolTips = WIM_Data_DEFAULTS.showToolTips; end; if(WIM_Data.sortAlpha == nil) then WIM_Data.sortAlpha = WIM_Data_DEFAULTS.sortAlpha; end; if(WIM_Data.winSize == nil) then WIM_Data.winSize = WIM_Data_DEFAULTS.winSize; end; if(WIM_Data.miniFreeMoving == nil) then WIM_Data.miniFreeMoving = WIM_Data_DEFAULTS.miniFreeMoving; end; if(WIM_Data.popCombat == nil) then WIM_Data.popCombat = WIM_Data_DEFAULTS.popCombat; end; if(WIM_Data.characterInfo == nil) then WIM_Data.characterInfo = WIM_Data_DEFAULTS.characterInfo; end; if(WIM_Data.showTimeStamps == nil) then WIM_Data.showTimeStamps = WIM_Data_DEFAULTS.showTimeStamps; end; if(WIM_Data.showShortcutBar == nil) then WIM_Data.showShortcutBar = WIM_Data_DEFAULTS.showShortcutBar; end; if(WIM_Data.enableAlias == nil) then WIM_Data.enableAlias = WIM_Data_DEFAULTS.enableAlias; end; if(WIM_Data.enableFilter == nil) then WIM_Data.enableFilter = WIM_Data_DEFAULTS.enableFilter; end; if(WIM_Data.aliasAsComment == nil) then WIM_Data.aliasAsComment = WIM_Data_DEFAULTS.aliasAsComment; end; if(WIM_Data.enableHistory == nil) then WIM_Data.enableHistory = WIM_Data_DEFAULTS.enableHistory; end; if(WIM_Data.historySettings == nil) then WIM_Data.historySettings = WIM_Data_DEFAULTS.historySettings; end; if(WIM_Data.winLoc == nil) then WIM_Data.winLoc = WIM_Data_DEFAULTS.winLoc; end; if(WIM_Data.winCascade == nil) then WIM_Data.winCascade = WIM_Data_DEFAULTS.winCascade; end; if(WIM_Data.popOnSend == nil) then WIM_Data.popOnSend = WIM_Data_DEFAULTS.popOnSend; end; if(WIM_Data.versionLastLoaded == nil) then WIM_Data.versionLastLoaded = WIM_Data_DEFAULTS.versionLastLoaded; end; if(WIM_Filters == nil) then WIM_LoadDefaultFilters(); end ShowFriends(); --[update friend list if(IsInGuild()) then GuildRoster(); end; --[update guild roster ItemRefTooltip:SetFrameStrata("TOOLTIP"); WIM_HistoryPurge(); WIM_InitClassProps(); WIM_SetWIM_Enabled(WIM_Data.enableWIM); if(WIM_VERSION ~= WIM_Data.versionLastLoaded) then WIM_Help:Show(); end WIM_Data.versionLastLoaded = WIM_VERSION; if(WIM_Data.miniFreeMoving.enabled) then if(WIM_Data.showMiniMap == false) then WIM_IconFrame:Hide(); else WIM_IconFrame:Show(); WIM_IconFrame:SetFrameStrata("HIGH"); WIM_IconFrame:SetPoint("TOPLEFT", "UIParent", "BOTTOMLEFT",WIM_Data.miniFreeMoving.left,WIM_Data.miniFreeMoving.top); end else WIM_Icon_UpdatePosition(); end elseif(event == "TRADE_SKILL_SHOW" or event == "CRAFT_SHOW") then --[hook tradeskill window functions WIM_HookTradeSkill(); elseif(event == "GUILD_ROSTER_UPDATE") then WIM_LoadGuildList(); WIM_AlreadyCheckedGuildRoster = true; elseif(event == "FRIENDLIST_SHOW" or event == "FRIENDLIST_UPDATE") then WIM_LoadFriendList(); else if(WIM_AlreadyCheckedGuildRoster == false) then if(IsInGuild()) then GuildRoster(); end; --[update guild roster end WIM_ChatFrame_OnEvent(event); end end function WIM_ChatFrame_OnEvent(event) if( WIM_Data.enableWIM == false) then return; end local msg = ""; if(event == "CHAT_MSG_AFK" or event == "CHAT_MSG_DND") then local afkType; if( event == "CHAT_MSG_AFK" ) then afkType = "AFK"; else afkType = "DND"; end msg = "<"..afkType.."> |Hplayer:"..arg2.."|h"..arg2.."|h: "..arg1; WIM_PostMessage(arg2, msg, 3); ChatEdit_SetLastTellTarget(ChatFrameEditBox,arg2); elseif(event == "CHAT_MSG_WHISPER") then if(WIM_FilterResult(arg1) ~= 1 and WIM_FilterResult(arg1) ~= 2) then msg = "[|Hplayer:"..arg2.."|h"..WIM_GetAlias(arg2, true).."|h]: "..arg1; WIM_PostMessage(arg2, msg, 1, arg2, arg1); end ChatEdit_SetLastTellTarget(ChatFrameEditBox,arg2); elseif(event == "CHAT_MSG_WHISPER_INFORM") then if(WIM_FilterResult(arg1) ~= 1 and WIM_FilterResult(arg1) ~= 2) then msg = "[|Hplayer:"..UnitName("player").."|h"..WIM_GetAlias(UnitName("player"), true).."|h]: "..arg1; WIM_PostMessage(arg2, msg, 2, UnitName("player") ,arg1); end elseif(event == "CHAT_MSG_SYSTEM") then local tstart,tfinish = string.find(arg1, "\'(%a+)\'"); if(tstart ~= nil and tfinish ~= nil) then user = string.sub(arg1, tstart+1, tfinish-1); user = string.gsub(user, "^%l", string.upper) tstart, tfinish = string.find(arg1, "playing"); if(tstart ~= nil and WIM_Windows[user] ~= nil) then -- player not playing, can't whisper msg = "|Hplayer:"..user.."|h"..user.."|h is not currently playing!"; WIM_PostMessage(user, msg, 4); end end end end function WIM_ChatFrameSupressor_OnEvent(event) if(WIM_Data.enableWIM == false) then return true; end local msg = ""; if(event == "CHAT_MSG_AFK" or event == "CHAT_MSG_DND") then if(WIM_Data.supressWisps) then return false; --[ false to supress from chatframe else return true; end elseif(event == "CHAT_MSG_WHISPER") then if(WIM_Data.supressWisps) then if(WIM_FilterResult(arg1) == 1) then return true; else return false; --[ false to supress from chatframe end else if(WIM_FilterResult(arg1) == 2) then return false; else return true; end end elseif(event == "CHAT_MSG_WHISPER_INFORM") then if(WIM_Data.supressWisps) then if(WIM_FilterResult(arg1) == 1) then return true; else return false; --[ false to supress from chatframe end else if(WIM_FilterResult(arg1) == 2) then return false; else return true; end end elseif(event == "CHAT_MSG_SYSTEM") then local tstart,tfinish = string.find(arg1, "\'(%a+)\'"); if(tstart ~= nil and tfinish ~= nil) then user = string.sub(arg1, tstart+1, tfinish-1); user = string.gsub(user, "^%l", string.upper) tstart, tfinish = string.find(arg1, "playing"); if(tstart ~= nil and WIM_Windows[user] ~= nil) then -- player not playing, can't whisper if(WIM_Data.supressWisps) then return false; --[ false to supress from chatframe else return true; end end end return true; end return true; end function WIM_PostMessage(user, msg, ttype, from, raw_msg) --[[ ttype: 1 - Wisper from someone 2 - Wisper sent 3 - System Message 4 - Error Message 5 - Show window... Do nothing else... ]]-- local f,chatBox; local isNew = false; if(WIM_Windows[user] == nil) then if(getglobal("WIM_msgFrame"..user)) then f = getglobal("WIM_msgFrame"..user); else f = CreateFrame("Frame","WIM_msgFrame"..user,UIParent, "WIM_msgFrameTemplate"); end WIM_SetWindowProps(f); WIM_Windows[user] = { frame = "WIM_msgFrame"..user, newMSG = true, is_visible = false, last_msg=time(), waiting_who=false, class="", level="", race="", guild="" }; f.theUser = user; getglobal("WIM_msgFrame"..user.."From"):SetText(WIM_GetAlias(user)); WIM_Icon_AddUser(user); isNew = true; WIM_SetWindowLocation(f); if(WIM_Data.characterInfo.show) then WIM_SendWho(user); end; WIM_UpdateCascadeStep(); WIM_DisplayHistory(user); if(WIM_History[user]) then getglobal(f:GetName().."HistoryButton"):Show(); end end f = getglobal("WIM_msgFrame"..user); chatBox = getglobal("WIM_msgFrame"..user.."ScrollingMessageFrame"); msg = WIM_ConvertURLtoLinks(msg); WIM_Windows[user].newMSG = true; WIM_Windows[user].last_msg = time(); if(ttype == 1) then WIM_PlaySoundWisp(); WIM_AddToHistory(user, from, raw_msg, false); WIM_RecentListAdd(user); chatBox:AddMessage(WIM_getTimeStamp()..msg, WIM_Data.displayColors.wispIn.r, WIM_Data.displayColors.wispIn.g, WIM_Data.displayColors.wispIn.b); elseif(ttype == 2) then WIM_AddToHistory(user, from, raw_msg, true); WIM_RecentListAdd(user); chatBox:AddMessage(WIM_getTimeStamp()..msg, WIM_Data.displayColors.wispOut.r, WIM_Data.displayColors.wispOut.g, WIM_Data.displayColors.wispOut.b); elseif(ttype == 3) then chatBox:AddMessage(msg, WIM_Data.displayColors.sysMsg.r, WIM_Data.displayColors.sysMsg.g, WIM_Data.displayColors.sysMsg.b); elseif(ttype == 4) then chatBox:AddMessage(msg, WIM_Data.displayColors.errorMsg.r, WIM_Data.displayColors.errorMsg.g, WIM_Data.displayColors.errorMsg.b); end if( WIM_PopOrNot(isNew) or (ttype==2) or (ttype==5) ) then WIM_Windows[user].newMSG = false; if(ttype == 2 and WIM_Data.popOnSend == false) then --[ do nothing, user prefers not to pop on send else f:Show(); end end WIM_UpdateScrollBars(chatBox); WIM_Icon_DropDown_Update(); if(WIM_HistoryFrame:IsVisible()) then WIM_HistoryViewNameScrollBar_Update(); WIM_HistoryViewFiltersScrollBar_Update(); end end function WIM_SetWindowLocation(theWin) local CascadeOffset_Left = 0; local CascadeOffset_Top = 0; if(WIM_Data.winCascade.enabled) then CascadeOffset_Left = WIM_CascadeDirection[WIM_Data.winCascade.direction].left; CascadeOffset_Top = WIM_CascadeDirection[WIM_Data.winCascade.direction].top; end theWin:SetPoint( "TOPLEFT", "UIParent", "BOTTOMLEFT", (WIM_Data.winLoc.left + WIM_CascadeStep*CascadeOffset_Left), (WIM_Data.winLoc.top + WIM_CascadeStep*CascadeOffset_Top) ); end function WIM_PopOrNot(isNew) if(isNew == true and WIM_Data.popNew == true) then if(WIM_Data.popCombat and UnitAffectingCombat("player")) then return false; else return true; end elseif(WIM_Data.popNew == true and WIM_Data.popUpdate == true) then if(WIM_Data.popCombat and UnitAffectingCombat("player")) then return false; else return true; end else return false; end end function WIM_UpdateScrollBars(smf) local parentName = smf:GetParent():GetName(); if(smf:AtTop()) then getglobal(parentName.."ScrollUp"):Disable(); else getglobal(parentName.."ScrollUp"):Enable(); end if(smf:AtBottom()) then getglobal(parentName.."ScrollDown"):Disable(); else getglobal(parentName.."ScrollDown"):Enable(); end end function WIM_isLinkURL(link) if (strsub(link, 1, 3) == "url") then return true; else return false; end end function WIM_DisplayURL(link) local theLink = ""; if (string.len(link) > 4) and (string.sub(link,1,4) == "url:") then theLink = string.sub(link,5, string.len(link)); end --show UI to show url so it can be copied if(theLink) then WIM_urlCopyUrlBox:SetText(theLink); WIM_urlCopy:Show(); WIM_urlCopyUrlBox:HighlightText(0); end end function WIM_ConvertURLtoLinks(text) local preLink, midLink, postLink; preLink = "|Hurl:"; midLink = "|h|cff"..WIM_RGBtoHex(WIM_Data.displayColors.webAddress.r, WIM_Data.displayColors.webAddress.g, WIM_Data.displayColors.webAddress.b); postLink = "|h|r"; text = string.gsub(text, "(%a+://[%w_/%.%?%%=~&-]+)", preLink.."%1"..midLink.."%1"..postLink); return text; end function WIM_SlashCommand(msg) if(msg == "" or msg == nil) then WIM_Options:Show(); elseif(msg == "reset") then WIM_Data = WIM_Data_DEFAULTS; elseif(msg == "clear history") then WIM_History = {}; elseif(msg == "reset filters") then WIM_LoadDefaultFilters(); elseif(msg == "history") then WIM_HistoryFrame:Show(); elseif(msg == "help") then WIM_Help:Show(); end end function WIM_Icon_Move(toDegree) WIM_Data.iconPosition = toDegree; WIM_Icon_UpdatePosition(); end function WIM_Icon_UpdatePosition() if(WIM_Data.showMiniMap == false) then WIM_IconFrame:Hide(); else if(WIM_Data.miniFreeMoving.enabled == false) then WIM_IconFrame:SetPoint( "TOPLEFT", "Minimap", "TOPLEFT", 54 - (78 * cos(WIM_Data.iconPosition)), (78 * sin(WIM_Data.iconPosition)) - 55 ); end WIM_IconFrame:Show(); end end function WIM_SetWindowProps(theWin) if(WIM_Data.showShortcutBar) then getglobal(theWin:GetName().."ShortcutFrame"):Show(); local tHeight = WIM_Data.winSize.height; if(tHeight < 240) then tHeight = 240; end theWin:SetHeight(tHeight); else getglobal(theWin:GetName().."ShortcutFrame"):Hide(); theWin:SetHeight(WIM_Data.winSize.height); end theWin:SetWidth(WIM_Data.winSize.width); theWin:SetScale(WIM_Data.windowSize); theWin:SetAlpha(WIM_Data.windowAlpha); getglobal(theWin:GetName().."ScrollingMessageFrame"):SetFont("Fonts\\FRIZQT__.TTF",WIM_Data.fontSize); getglobal(theWin:GetName().."ScrollingMessageFrame"):SetAlpha(1); getglobal(theWin:GetName().."MsgBox"):SetAlpha(1); getglobal(theWin:GetName().."ShortcutFrame"):SetAlpha(1); end function WIM_SetAllWindowProps() for key in WIM_Windows do WIM_SetWindowProps(getglobal(WIM_Windows[key].frame)); end end function WIM_Icon_DropDown_Init(level) local dropdown; if ( UIDROPDOWNMENU_OPEN_MENU ) then dropdown = getglobal(UIDROPDOWNMENU_OPEN_MENU); else dropdown = this; end WIM_Icon_DropDown_InitButtons(); end function WIM_Icon_ToggleDropDown() ToggleDropDownMenu(1, nil, WIM_Icon_DropDown); --local tMenu = getglobal("DropDownList"..UIDROPDOWNMENU_MENU_LEVEL); --tMenu:ClearAllPoints(); --tMenu:SetPoint("TOPRIGHT", "WIM_IconFrameButton", "BOTTOMLEFT", 0, 0); WIM_Icon_DropDown:SetWidth(DropDownList1Button1:GetWidth()+50); DropDownList1:SetScale(UIParent:GetScale()); end function WIM_Icon_DropDown_InitButtons() local info = {}; info = { }; info.text = "Conversations"; info.isTitle = 1; info.justifyH = "LEFT"; info.notCheckable = 1; UIDropDownMenu_AddButton(info); local tList = { }; local tListActivity = { }; local tCount = 0; for key in WIM_IconItems do table.insert(tListActivity, key); tCount = tCount + 1; end --[first get a sorted list of users by most frequent activity table.sort(tListActivity, WIM_Icon_SortByActivity); --[account for only the allowable amount of active users for i=1,table.getn(tListActivity) do if(i <= WIM_MaxMenuCount) then table.insert(tList, tListActivity[i]); end end WIM_NewMessageCount = 0; if(tCount == 0) then info = { }; info.justifyH = "LEFT" info.text = " - None -"; info.notClickable = 1; info.notCheckable = 1; UIDropDownMenu_AddButton(info); else if(WIM_Data.sortAlpha) then table.sort(tList); end WIM_NewMessageFlag = false; for i=1, table.getn(tList) do if( WIM_Windows[tList[i]].newMSG and WIM_Windows[tList[i]].is_visible == false) then WIM_IconItems[tList[i]].textR = 77/255; WIM_IconItems[tList[i]].textG = 135/255; WIM_IconItems[tList[i]].textB = 224/255; WIM_NewMessageFlag = true; WIM_NewMessageCount = WIM_NewMessageCount + 1; else WIM_IconItems[tList[i]].textR = 255; WIM_IconItems[tList[i]].textG = 255; WIM_IconItems[tList[i]].textB = 255; end UIDropDownMenu_AddButton(WIM_IconItems[tList[i]]); end end if(WIM_Data.enableWIM == true) then if(WIM_NewMessageFlag == true) then WIM_IconFrameButton:SetNormalTexture("Interface\\AddOns\\WIM\\Images\\miniEnabled"); else WIM_IconFrameButton:SetNormalTexture("Interface\\AddOns\\WIM\\Images\\miniDisabled"); end else --show wim disabled icon WIM_IconFrameButton:SetNormalTexture("Interface\\AddOns\\WIM\\Images\\miniOff"); end end function WIM_Icon_AddUser(theUser) UIDROPDOWNMENU_INIT_MENU = "WIM_Options_DropDown"; UIDROPDOWNMENU_OPEN_MENU = UIDROPDOWNMENU_INIT_MENU; local info = { }; info.text = theUser; info.justifyH = "LEFT" info.isTitle = nil; info.notCheckable = 1; info.value = WIM_Windows[theUser].frame; info.func = WIM_Icon_PlayerClick; WIM_IconItems[theUser] = info; table.sort(WIM_IconItems); WIM_Icon_DropDown_Update(); end function WIM_Icon_PlayerClick() if(this.value ~= nil) then getglobal(this.value):Show(); --[local user = getglobal(this.value.."From"):GetText(); local user = getglobal(this.value).theUser; WIM_Windows[user].newMSG = false; WIM_Windows[user].is_visible = true; WIM_Icon_DropDown_Update(); end end function WIM_Icon_DropDown_Update() UIDropDownMenu_Initialize(WIM_Icon_DropDown, WIM_Icon_DropDown_Init, "MENU"); end function WIM_Icon_OnUpdate(elapsedTime) if(WIM_NewMessageFlag == false) then this.TimeSinceLastUpdate = 0; if(WIM_Icon_NewMessageFlash:IsVisible()) then WIM_Icon_NewMessageFlash:Hide(); end return; end this.TimeSinceLastUpdate = this.TimeSinceLastUpdate + elapsedTime; while (this.TimeSinceLastUpdate > WIM_Icon_UpdateInterval) do if(WIM_Icon_NewMessageFlash:IsVisible()) then WIM_Icon_NewMessageFlash:Hide(); else WIM_Icon_NewMessageFlash:Show(); end this.TimeSinceLastUpdate = this.TimeSinceLastUpdate - WIM_Icon_UpdateInterval; end end function WIM_UpdateCascadeStep() WIM_CascadeStep = WIM_CascadeStep + 1; if(WIM_CascadeStep > 10) then WIM_CascadeStep = 0; end end function WIM_PlaySoundWisp() if(WIM_Data.playSoundWisp == true) then PlaySoundFile("Interface\\AddOns\\WIM\\Sounds\\wisp.wav"); end end function WIM_Icon_SortByActivity(user1, user2) if(WIM_Windows[user1].last_msg > WIM_Windows[user2].last_msg) then return true; else return false; end end function WIM_RGBtoHex(r,g,b) return string.format ("%.2x%.2x%.2x",r*255,g*255,b*255); end function WIM_Icon_OnEnter() GameTooltip:SetOwner(this, "ANCHOR_LEFT"); GameTooltip:SetText("WIM v"..WIM_VERSION.." "); GameTooltip:AddDoubleLine("Conversation Menu", "Left-Click", 1,1,1,1,1,1); GameTooltip:AddDoubleLine("Show New Messages", "Right-Click", 1,1,1,1,1,1); GameTooltip:AddDoubleLine("WIM Options", "/wim", 1,1,1,1,1,1); end function WIM_ShowNewMessages() for key in WIM_Windows do if(WIM_Windows[key].newMSG == true) then getglobal(WIM_Windows[key].frame):Show(); WIM_Windows[key].newMSG = false; end end WIM_Icon_DropDown_Update(); end function WIM_SendWho(name) WIM_Windows[name].waiting_who = true; SetWhoToUI(1); SendWho("\""..name.."\""); end function WIM_ShowAll() for key in WIM_Windows do getglobal(WIM_Windows[key].frame):Show(); end end function WIM_CloseAllConvos() for key in WIM_Windows do WIM_CloseConvo(key); end end function WIM_CloseConvo(theUser) if(WIM_Windows[theUser] == nil) then return; end; --[ fail silently getglobal(WIM_Windows[theUser].frame):Hide(); getglobal(WIM_Windows[theUser].frame.."ScrollingMessageFrame"):Clear(); getglobal(WIM_Windows[theUser].frame.."ClassIcon"):SetTexture("Interface\\AddOns\\WIM\\Images\\classBLANK"); getglobal(WIM_Windows[theUser].frame.."CharacterDetails"):SetText(""); WIM_Windows[theUser] = nil; WIM_IconItems[theUser] = nil; WIM_Icon_DropDown_Update(); end function WIM_InitClassProps() WIM_ClassIcons[WIM_LOCALIZED_DRUID] = "Interface\\AddOns\\WIM\\Images\\classDRUID"; WIM_ClassIcons[WIM_LOCALIZED_HUNTER] = "Interface\\AddOns\\WIM\\Images\\classHUNTER"; WIM_ClassIcons[WIM_LOCALIZED_MAGE] = "Interface\\AddOns\\WIM\\Images\\classMAGE"; WIM_ClassIcons[WIM_LOCALIZED_PALADIN] = "Interface\\AddOns\\WIM\\Images\\classPALADIN"; WIM_ClassIcons[WIM_LOCALIZED_PRIEST] = "Interface\\AddOns\\WIM\\Images\\classPRIEST"; WIM_ClassIcons[WIM_LOCALIZED_ROGUE] = "Interface\\AddOns\\WIM\\Images\\classROGUE"; WIM_ClassIcons[WIM_LOCALIZED_SHAMAN] = "Interface\\AddOns\\WIM\\Images\\classSHAMAN"; WIM_ClassIcons[WIM_LOCALIZED_WARLOCK] = "Interface\\AddOns\\WIM\\Images\\classWARLOCK"; WIM_ClassIcons[WIM_LOCALIZED_WARRIOR] = "Interface\\AddOns\\WIM\\Images\\classWARRIOR"; WIM_ClassColors[WIM_LOCALIZED_DRUID] = "ff7d0a"; WIM_ClassColors[WIM_LOCALIZED_HUNTER] = "abd473"; WIM_ClassColors[WIM_LOCALIZED_MAGE] = "69ccf0"; WIM_ClassColors[WIM_LOCALIZED_PALADIN] = "f58cba"; WIM_ClassColors[WIM_LOCALIZED_PRIEST] = "ffffff"; WIM_ClassColors[WIM_LOCALIZED_ROGUE] = "fff569"; WIM_ClassColors[WIM_LOCALIZED_SHAMAN] = "f58cba"; WIM_ClassColors[WIM_LOCALIZED_WARLOCK] = "9482ca"; WIM_ClassColors[WIM_LOCALIZED_WARRIOR] = "c79c6e"; end function WIM_UserWithClassColor(theUser) if(WIM_Windows[theUser].class == "") then return theUser; else if(WIM_ClassColors[WIM_Windows[theUser].class]) then return "|cff"..WIM_ClassColors[WIM_Windows[theUser].class]..WIM_GetAlias(theUser); else return WIM_GetAlias(theUser); end end end function WIM_SetWhoInfo(theUser) local classIcon = getglobal(WIM_Windows[theUser].frame.."ClassIcon"); if(WIM_Data.characterInfo.classIcon and WIM_ClassIcons[WIM_Windows[theUser].class]) then classIcon:SetTexture(WIM_ClassIcons[WIM_Windows[theUser].class]); else classIcon:SetTexture("Interface\\AddOns\\WIM\\Images\\classBLANK"); end if(WIM_Data.characterInfo.classColor) then getglobal(WIM_Windows[theUser].frame.."From"):SetText(WIM_UserWithClassColor(theUser)); end if(WIM_Data.characterInfo.details) then local tGuild = ""; if(WIM_Windows[theUser].guild ~= "") then tGuild = "<"..WIM_Windows[theUser].guild.."> "; end getglobal(WIM_Windows[theUser].frame.."CharacterDetails"):SetText("|cffffffff"..tGuild..WIM_Windows[theUser].level.." "..WIM_Windows[theUser].race.." "..WIM_Windows[theUser].class.."|r"); end end function WIM_getTimeStamp() if(WIM_Data.showTimeStamps) then return "|cff"..WIM_RGBtoHex(WIM_Data.displayColors.sysMsg.r, WIM_Data.displayColors.sysMsg.g, WIM_Data.displayColors.sysMsg.b)..date("%H:%M").."|r "; else return ""; end end function WIM_Bindings_EnableWIM() WIM_SetWIM_Enabled(not WIM_Data.enableWIM); end function WIM_SetWIM_Enabled(YesOrNo) WIM_Data.enableWIM = YesOrNo WIM_Icon_DropDown_Update(); end function WIM_LoadShortcutFrame() local tButtons = { { icon = "Interface\\Icons\\Ability_Hunter_AimedShot", cmd = "target", tooltip = "Target" }, { icon = "Interface\\Icons\\Spell_Holy_BlessingOfStrength", cmd = "invite", tooltip = "Invite" }, { icon = "Interface\\Icons\\INV_Misc_Bag_10_Blue", cmd = "trade", tooltip = "Trade" }, { icon = "Interface\\Icons\\INV_Helmet_44", cmd = "inspect", tooltip = "Inspect" }, { icon = "Interface\\Icons\\Ability_Physical_Taunt", cmd = "ignore", tooltip = "Ignore" }, }; for i=1,5 do getglobal(this:GetName().."ShortcutFrameButton"..i.."Icon"):SetTexture(tButtons[i].icon); getglobal(this:GetName().."ShortcutFrameButton"..i).cmd = tButtons[i].cmd; getglobal(this:GetName().."ShortcutFrameButton"..i).tooltip = tButtons[i].tooltip; end getglobal(this:GetName().."ShortcutFrame"):SetScale(.75); end function WIM_ShorcutButton_Clicked() local cmd = this.cmd; local theUser = this:GetParent():GetParent().theUser; if(cmd == "target") then TargetByName(theUser, true); elseif(cmd == "invite") then InviteByName(theUser); elseif(cmd == "trade") then TargetByName(theUser, true); InitiateTrade("target"); elseif(cmd == "inspect") then TargetByName(theUser, true); InspectUnit("target"); elseif(cmd == "ignore") then getglobal(this:GetParent():GetParent():GetName().."IgnoreConfirm"):Show(); end end function WIM_GetAlias(theUser, nameOnly) if(WIM_Data.enableAlias and WIM_Alias[theUser] ~= nil) then if(WIM_Data.aliasAsComment) then if(nameOnly) then return theUser; else return theUser.." |cffffffff- "..WIM_Alias[theUser].."|r"; end else return WIM_Alias[theUser]; end else return theUser; end end function WIM_FilterResult(theMSG) if(WIM_Data.enableFilter) then local key, a, b; for key in WIM_Filters do if(strfind(strlower(theMSG), strlower(key)) ~= nil) then if(WIM_Filters[key] == "Ignore") then return 1; elseif(WIM_Filters[key] == "Block") then return 2; end end end return 0; else return 0; end end function WIM_CanRecordUser(theUser) if(WIM_Data.historySettings.recordEveryone) then return true; else if(WIM_Data.historySettings.recordFriends and WIM_FriendList[theUser]) then return true; elseif(WIM_Data.historySettings.recordGuild and WIM_GuildList[theUser]) then return true; end end return false; end function WIM_AddToHistory(theUser, userFrom, theMessage, isMsgIn) local tmpEntry = {}; if(WIM_Data.enableHistory) then --[if history is enabled if(WIM_CanRecordUser(theUser)) then --[if record user getglobal(WIM_Windows[theUser].frame.."HistoryButton"):Show(); tmpEntry["stamp"] = time(); tmpEntry["date"] = date("%m/%d/%y"); tmpEntry["time"] = date("%H:%M"); tmpEntry["msg"] = WIM_ConvertURLtoLinks(theMessage); tmpEntry["from"] = userFrom; if(isMsgIn) then tmpEntry["type"] = 2; else tmpEntry["type"] = 1; end if(WIM_History[theUser] == nil) then WIM_History[theUser] = {}; end table.insert(WIM_History[theUser], tmpEntry); if(WIM_Data.historySettings.maxMsg.enabled) then local tOver = table.getn(WIM_History[theUser]) - WIM_Data.historySettings.maxMsg.count; if(tOver > 0) then for i = 1, tOver do table.remove(WIM_History[theUser], 1); end end end if(WIM_Options:IsVisible()) then WIM_HistoryScrollBar_Update(); end end end end function WIM_SortHistory(a, b) if(a.stamp < b.stamp) then return true; else return false; end end function WIM_DisplayHistory(theUser) if(WIM_History[theUser] and WIM_Data.enableHistory and WIM_Data.historySettings.popWin.enabled) then table.sort(WIM_History[theUser], WIM_SortHistory); for i=table.getn(WIM_History[theUser])-WIM_Data.historySettings.popWin.count-1, table.getn(WIM_History[theUser]) do if(WIM_History[theUser][i]) then --WIM_GetAlias msg = "|Hplayer:"..WIM_History[theUser][i].from.."|h["..WIM_GetAlias(WIM_History[theUser][i].from, true).."]|h: "..WIM_History[theUser][i].msg; if(WIM_Data.showTimeStamps) then msg = WIM_History[theUser][i].time.." "..msg; end if(WIM_History[theUser][i].type == 1) then getglobal("WIM_msgFrame"..theUser.."ScrollingMessageFrame"):AddMessage(msg, WIM_Data.historySettings.colorIn.r, WIM_Data.historySettings.colorIn.g, WIM_Data.historySettings.colorIn.b); elseif(WIM_History[theUser][i].type == 2) then getglobal("WIM_msgFrame"..theUser.."ScrollingMessageFrame"):AddMessage(msg, WIM_Data.historySettings.colorOut.r, WIM_Data.historySettings.colorOut.g, WIM_Data.historySettings.colorOut.b); end end end end --getglobal("WIM_msgFrame"..theUser.."ScrollingMessageFrame"):AddMessage(" "); end function WIM_LoadDefaultFilters() WIM_Filters = {}; WIM_Filters["^LVBM"] = "Ignore"; WIM_Filters["^YOU ARE BEING WATCHED!"] = "Ignore"; WIM_Filters["^YOU ARE MARKED!"] = "Ignore"; WIM_Filters["^YOU ARE CURSED!"] = "Ignore"; WIM_Filters["^YOU HAVE THE PLAGUE!"] = "Ignore"; WIM_Filters["^YOU ARE BURNING!"] = "Ignore"; WIM_Filters["^YOU ARE THE BOMB!"] = "Ignore"; WIM_Filters["VOLATILE INFECTION"] = "Ignore"; WIM_Filters["^ 0) then DEFAULT_CHAT_FRAME:AddMessage("[WIM]: Purged "..delCount.." out-dated messages from history."); end end end function WIM_ToggleWindow_OnUpdate(elapsedTime) WIM_ToggleWindow_Timer = WIM_ToggleWindow_Timer + elapsedTime; while (WIM_ToggleWindow_Timer > 1) do WIM_ToggleWindow:Hide(); WIM_ToggleWindow_Timer = 0; end end function WIM_RecentListAdd(theUser) local found = 0; for i=1, table.getn(WIM_RecentList) do if(WIM_RecentList[i] == theUser) then found = 1; break; end end if(found > 0) then table.remove(WIM_RecentList, found); end table.insert(WIM_RecentList, 1, theUser); end function WIM_ToggleWindow_Toggle() if(table.getn(WIM_RecentList) == 0) then return; end if(WIM_RecentList[WIM_ToggleWindow_Index] == nil) then WIM_ToggleWindow_Index = 1; end WIM_ToggleWindowUser:SetText(WIM_GetAlias(WIM_RecentList[WIM_ToggleWindow_Index], true)); WIM_ToggleWindow.theUser = WIM_RecentList[WIM_ToggleWindow_Index]; WIM_ToggleWindowCount:SetText("Recent Conversation "..WIM_ToggleWindow_Index.." of "..table.getn(WIM_RecentList)); if(WIM_Windows[WIM_RecentList[WIM_ToggleWindow_Index]]) then if(WIM_Windows[WIM_RecentList[WIM_ToggleWindow_Index]].newMSG) then WIM_ToggleWindowStatus:SetText("New message!"); WIM_ToggleWindowIconNew:Show(); WIM_ToggleWindowIconRead:Hide(); else WIM_ToggleWindowStatus:SetText("No new messages."); WIM_ToggleWindowIconRead:Show(); WIM_ToggleWindowIconNew:Hide(); end else WIM_ToggleWindowStatus:SetText("Conversation closed."); WIM_ToggleWindowIconRead:Show(); WIM_ToggleWindowIconNew:Hide(); end WIM_ToggleWindow_Timer = 0; WIM_ToggleWindow:Show(); WIM_ToggleWindow_Index = WIM_ToggleWindow_Index + 1; end