--[[ Name: Prat_Who Revision: $Revision: 16019 $ Author(s): Krtek (krtek4@gmail.com) Website: http://www.wowace.com/files/index.php?path=Prat/ Documentation: http://www.wowace.com/wiki/Prat/Integrated_Modules#Who SVN: http://svn.wowace.com/wowace/trunk/Prat/ Description: Module for Prat that makes it easy to copy URL"s in chat windows. Dependencies: Prat ]] PRAT_WHO_FRAME_HEIGHT = 16 LIST_TO_DISPLAY = 20 local L = AceLibrary("AceLocale-2.2"):new("PratWho") L:RegisterTranslations("enUS", function() return { ["Who"] = true, ["Adds actions for channels and /chatwho."] = true, ["List user(s) on channel."] = true, [" (see /PRAT who chanlist)"] = true, ["Chanlist"] = true, ["Channel List."] = true, ["Join message"] = true, ["Toggle showing of join message."] = true, ["Leave message"] = true, ["Toggle showing of leave message."] = true, ["GUI"] = true, ["Toggle showing information in a nice GUI or in default chat window."] = true, ["Toggle"] = true, ["Toggle the module on and off."] = true, ["Channels listing"] = true, ["Who is on that chan"] = true, ["Back to channel list"] = true, } end) L:RegisterTranslations("ruRU", function() return { ["Who"] = "Who", ["Adds actions for channels and /chatwho."] = "Добавляет действия для каналов и /chatwho.", ["List user(s) on channel."] = "Список пользователей канала.", [" (see /PRAT who chanlist)"] = "<название канала> (см. /PRAT who chanlist)", ["Chanlist"] = "Chanlist", ["Channel List."] = "Список каналов.", ["Join message"] = "Сообщение присоединения", ["Toggle showing of join message."] = "Вкл/Выкл показ сообщения при присоед.", ["Leave message"] = "Сообщение ухода", ["Toggle showing of leave message."] = "Вкл/Выкл показ сообщения при уходе.", ["GUI"] = "GUI", ["Toggle showing information in a nice GUI or in default chat window."] = "Вкл/Выкл показать информации в хорошем GUI или в стандартном окне чата.", ["Toggle"] = "Вкл/Выкл", ["Toggle the module on and off."] = "Вкл/Выкл модуль.", ["Channels listing"] = "Список каналов", ["Who is on that chan"] = "Кто сейчас в этом канале", ["Back to channel list"] = "Вернуться к списку каналов", } end) L:RegisterTranslations("zhCN", function() return { ["Who"] = "查询", ["Adds actions for channels and /chatwho."] = "输入/chatwho列出频道和聊天对象.", ["List user(s) on channel."] = "列出频道中的用户。", [" (see /PRAT who chanlist)"] = "<频道名称> (查看 /PRAT who chanlist)", ["Chanlist"] = "频道列表", ["Channel List."] = "频道列表。", ["Join message"] = "加入信息", ["Toggle showing of join message."] = "显示加入信息。", ["Leave message"] = "离开信息", ["Toggle showing of leave message."] = "显示离开信息。", ["GUI"] = "图形界面", ["Toggle showing information in a nice GUI or in default chat window."] = "在图形界面或默认聊天窗口显示信息。", ["Toggle"] = "切换", ["Toggle the module on and off."] = "切换此模块打开与关闭。", ["Channels listing"] = "频道列表", ["Who is on that chan"] = "在此频道查询", ["Back to channel list"] = "返回频道列表", } end) L:RegisterTranslations("koKR", function() return { ["Who"] = "누구", ["Adds actions for channels and /chatwho."] = "채널 목록과 /chatwho에 대한 동작을 추가합니다.", ["List user(s) on channel."] = "채널 사용자 목록입니다.", [" (see /PRAT who chanlist)"] = "<채널명> (명령어: /PRAT who chanlist)", ["Chanlist"] = "채널목록", ["Channel List."] = "채널 목록입니다.", ["Join message"] = "참여 메세지", ["Toggle showing of join message."] = "참여 메세지 표시를 전환합니다.", ["Leave message"] = "나감 메세지", ["Toggle showing of leave message."] = "나감 메세지 표시를 전환합니다.", ["GUI"] = "GUI", ["Toggle showing information in a nice GUI or in default chat window."] = "기본대화창이나 GUI 에 정보 표시를 전환합니다.", ["Toggle"] = "전환", ["Toggle the module on and off."] = "모듈 켜고 끄기를 전환합니다.", ["Channels listing"] = "채널 목록", ["Who is on that chan"] = "채널 접속 목록", ["Back to channel list"] = "목록으로 돌아가기", } end) Prat_Who = Prat:NewModule("who") function Prat_Who:OnInitialize() self.db = Prat:AcquireDBNamespace("Who") Prat:RegisterDefaults("Who", "profile", { on = true, join = false, leave = false, gui = true, }) PratWhoFrame:RegisterForDrag("LeftButton"); self.wantInfo = false; self.info = ""; self.lastChannel = ""; self.List = {}; self.selectedInList = 1; Prat.Options.args.who = { name = L["Who"], desc = L["Adds actions for channels and /chatwho."], type = "group", args = { who = { name = L["Who"], desc = L["List user(s) on channel."], type = "text", usage = L[" (see /PRAT who chanlist)"], get = false, set = function(v) Prat_Who:Who(v); end, validate = function(v) return self:CheckChan(v); end, error = "%s is not a valid channel (see /PRAT who chanlist)", }, chanlist = { name = L["Chanlist"], desc = L["Channel List."], type = "execute", func = function(v) Prat_Who:ChannelList(v); end, }, join = { name = L["Join message"], desc = L["Toggle showing of join message."], type = "toggle", get = function() return self.db.profile.join end, set = function(v)self.db.profile.join = v end, }, leave = { name = L["Leave message"], desc = L["Toggle showing of leave message."], type = "toggle", get = function() return self.db.profile.leave end, set = function(v)self.db.profile.leave = v end, }, gui = { name = L["GUI"], desc = L["Toggle showing information in a nice GUI or in default chat window."], type = "toggle", get = function() return self.db.profile.gui end, set = function(v)self.db.profile.gui = v end, }, toggle = { name = L["Toggle"], desc = L["Toggle the module on and off."], type = "toggle", order = 200, get = function() return self.db.profile.on end, set = function() self.db.profile.on = Prat:ToggleModuleActive("who") end } } } end function Prat_Who:OnEnable() self:Hook("ChatFrame_OnEvent") end function Prat_Who:Who(channel) self.wantInfo = true; self.List = {}; self.lastChannel = channel; ListChannelByName(channel); end function Prat_Who:ShowWho() for name in string.gfind(self.info, "([%S]+)[%s]*") do table.insert(self.List, Prat_Who:BeautifyName(name)) end local function whoSort(a, b) local aWeight = 100 if string.find(a, ".+%(owner%)") then aWeight = 0 elseif string.find(a, ".+%(moderator%)") then aWeight = 50 elseif string.find(a, ".+%(muted%)") then aWeight = 200 end local bWeight = 100 if string.find(b, ".+%(owner%)") then bWeight = 0 elseif string.find(b, ".+%(moderator%)") then bWeight = 50 elseif string.find(b, ".+%(muted%)") then bWeight = 200 end if ( aWeight == bWeight ) then return a < b else return aWeight < bWeight end end table.sort(self.List, whoSort) if ( self.db.profile.gui ) then Prat_Who:UpdateFrame() else local text = "" for i,name in self.List do text = text .. name .. " " end text = "This feature is buggy for time, please use the GUI mode :D" Prat_Who:NotGuiShow(text) end end function Prat_Who:ChannelList() local chanList = self:GetChannelList(); self.List = {} for number, name in chanList do table.insert(self.List, number .. ". " .. name); end if ( self.db.profile.gui ) then Prat_Who:UpdateFrame() else local text = "" for i,name in self.List do text = text .. name .. " " end Prat_Who:NotGuiShow(text) end end function Prat_Who:GetChannelList() self.lastChannel = ""; local chanList = {}; local id, name for i=1, 10 do id, name = GetChannelName(i) if ( id > 0 and name ) then table.insert(chanList, id, name) end end return chanList end function Prat_Who:CheckChan(channel) local id, name = GetChannelName(channel) if ( id > 0 and name ) then return true else return false end end -- The Hooking method isn"t good if some other addons need the information that are kept :( function Prat_Who:ChatFrame_OnEvent(event) if ( ( event == "CHAT_MSG_CHANNEL_LIST" ) and self.wantInfo) then self.info = arg1 if not ( strsub(self.info,1,1) == "[" ) then self:ShowWho() end return; end; if ( event == "CHAT_MSG_CHANNEL_JOIN" and self.db.profile.join and not self.db.profile.leave ) then return; end if ( event == "CHAT_MSG_CHANNEL_LEAVE" and self.db.profile.leave ) then return; end self.hooks.ChatFrame_OnEvent(event); end -- Utility function local beautifyTable = { { pattern = "%*(.+)", replacement = "%1 (owner)", patternB = "(.+) %(owner%)", replacementB = "%1" }, { pattern = "@(.+)", replacement = "%1 (moderator)", patternB = "(.+) %(moderator%)", replacementB = "%1" }, { pattern = "#(.+)", replacement = "%1 (muted)", patternB = "(.+) %(muted%)", replacementB = "%1" }, } function Prat_Who:BeautifyName(name) -- * channel owner, @ channel moderator, # muted/unvoiced. if name then name = string.gsub(name, ",", ""); for id, option in beautifyTable do name = string.gsub(name, option["pattern"], option["replacement"]); end return name end end function Prat_Who:DebeautifyName(name) if name then for id, option in beautifyTable do name = string.gsub(name, option["patternB"] , option["replacementB"]); end return name end end function Prat_Who:Invite() InviteByName(Prat_Who:DebeautifyName(self.List[self.selectedInList])); end function Prat_Who:Whisper() local name = Prat_Who:DebeautifyName(self.List[self.selectedInList]); if ( not ChatFrameEditBox:IsVisible() ) then ChatFrame_OpenChat("/w "..name.." "); else ChatFrameEditBox:SetText("/w "..name.." "); end ChatEdit_ParseText(ChatFrame1.editBox, 0); end -- Frame function function Prat_Who:NotGuiShow(text) Prat:Print(tostring(text)) end function Prat_Who:HideFrame() PratWhoFrame:Hide(); Prat_Who.wantInfo = false; end function Prat_Who:UpdateFrame() local listLength = table.getn(self.List) local listOffset = FauxScrollFrame_GetOffset(PratWhoScrollFrame); local listIndex; local listButton; if ( not PratWhoFrame:IsVisible() ) then PratWhoFrame:Show(); self.selectedInList = 1; end if ( self.lastChannel == "" ) then PratWhoTitle:SetText(L["Channels listing"]); PratWhoInviteButton:Hide(); PratWhoWhisperButton:Hide(); PratWhoToggleButton:SetText(L["Who is on that chan"]); else local id, name = GetChannelName(self.lastChannel) PratWhoTitle:SetText(listLength .. " users on " .. id .. ". " .. name); PratWhoInviteButton:Show(); PratWhoWhisperButton:Show(); PratWhoToggleButton:SetText(L["Back to channel list"]); end for i=1, LIST_TO_DISPLAY, 1 do listIndex = i + listOffset listButton = getglobal("PratWhoButton"..i); if ( listIndex > listLength ) then listButton:Hide(); else listButton:SetID(listIndex); if ( listIndex == self.selectedInList ) then listButton:LockHighlight(); else listButton:UnlockHighlight(); end local name = self.List[listIndex] if Prat_PlayerNames then local nameBis = string.gsub(name, "(.+) %(.+%)", "%1") local nameColored = Prat_PlayerNames:addInfo(nameBis) name = string.gsub(name, nameBis, nameColored) end getglobal("PratWhoButton"..i.."ButtonTextName"):SetText(name); listButton:Show(); end end FauxScrollFrame_Update(PratWhoScrollFrame, listLength, LIST_TO_DISPLAY, PRAT_WHO_FRAME_HEIGHT ); end function Prat_Who:RefreshFrame() if ( self.lastChannel == "" ) then Prat_Who:ChannelList(); else Prat_Who:Who(self.lastChannel); end end function Prat_Who:Button_OnClick() self.selectedInList = this:GetID(); Prat_Who:UpdateFrame() end function Prat_Who_UpdateFrame() -- FauxScrollFrame_OnVerticalScroll() seems to doesn"t accept member function, so I have to declare this one Prat_Who:UpdateFrame() end function Prat_Who:ToggleChanListWho() if ( self.lastChannel ~= "" ) then self.lastChannel = "" else self.lastChannel = string.gsub(self.List[self.selectedInList], "(%d+)%..+", "%1") end Prat_Who:RefreshFrame() end