diff --git a/FreshShit/WhoSniffer/event.lua b/FreshShit/WhoSniffer/event.lua index 328cea2..7785c7a 100644 --- a/FreshShit/WhoSniffer/event.lua +++ b/FreshShit/WhoSniffer/event.lua @@ -1,42 +1,54 @@ -- WHO_LIST_UPDATE function() - for i = 1, GetNumWhoResults() do - local name, guild, level, race, class, zone = GetWhoInfo(i) - if zone ~= "Siege of Orgrimmar" then - local faction = aura_env.raceMap[race] - if not faction then print("Unknown faction for race", race) end - if faction == "Alliance" then - local player = aura_env.alliance[name] - if not player then - player = Player.new(name, guild, race, class, zone) - local timestamp = date("%Y-%m-%dT%H:%M:%S") - if not WeakAurasSaved.Cyka.WhoSniffer[name] then WeakAurasSaved.Cyka.WhoSniffer[name] = {} end - WeakAurasSaved.Cyka.WhoSniffer[name][timestamp] = { - ["name"] = name, - ["guild"] = guild, - ["race"] = race, - ["class"] = class, - ["zone"] = zone, - } + for i = 1, GetNumWhoResults() do + local name, guild, level, race, class, zone = GetWhoInfo(i) + ---@type WHOQuery + local query = aura_env.lastQuery + if not query then + print("No query wtf?") + return + end + ---@type WHOFilter[] + local filters = query.filters + for _, filter in pairs(filters) do + if not filter(name, guild, level, race, class, zone) then + --print("Filter failed", filter, name, guild, level, race, class, + -- zone) + return + end + end - local stinky = WeakAurasSaved.Cyka.stinkies[name] - if stinky then - PlaySoundFile("Interface\\Sounds\\Domination.ogg", "Master") - else - PlaySoundFile("Interface\\Sounds\\Cloak.ogg", "Master") - end + local player = aura_env.stinkies[name] + if not player then + player = Player.new(name, guild, race, class, zone) + local timestamp = date("%Y-%m-%dT%H:%M:%S") + if not WeakAurasSaved.Cyka.WhoSniffer[name] then + WeakAurasSaved.Cyka.WhoSniffer[name] = {} + end + WeakAurasSaved.Cyka.WhoSniffer[name][timestamp] = { + ["name"] = name, + ["guild"] = guild, + ["race"] = race, + ["class"] = class, + ["zone"] = zone + } - aura_env.Notify(player) - end - player:Touch() - player.zone = zone - aura_env.alliance[name] = player - end - end - end - -- Turns out WA cannot do this ( - -- aura_env.UpdateMacro() - _G["FriendsFrameCloseButton"]:Click() + local stinky = WeakAurasSaved.Cyka.stinkies[name] + if stinky then + PlaySoundFile("Interface\\Sounds\\Domination.ogg", "Master") + else + PlaySoundFile("Interface\\Sounds\\Cloak.ogg", "Master") + end + + aura_env.Notify(player) + end + player:Touch() + player.zone = zone + aura_env.stinkies[name] = player + end + -- Turns out WA cannot do this ( + -- aura_env.UpdateMacro() + _G["FriendsFrameCloseButton"]:Click() end ---/run WeakAurasSaved.Cyka.WhoSniffer = {} \ No newline at end of file +-- /run WeakAurasSaved.Cyka.WhoSniffer = {} diff --git a/FreshShit/WhoSniffer/event2.lua b/FreshShit/WhoSniffer/event2.lua index 54d55a8..c4b84cd 100644 --- a/FreshShit/WhoSniffer/event2.lua +++ b/FreshShit/WhoSniffer/event2.lua @@ -2,11 +2,11 @@ ---@type allstates allstates function(allstates) local now = GetTime() - for k, v in pairs(aura_env.alliance) do + for k, v in pairs(aura_env.stinkies) do local ago = now - v.lastSeen if ago > aura_env.ttl then allstates[k] = { show = false, changed = true } - aura_env.alliance[k] = nil + aura_env.stinkies[k] = nil PlaySoundFile("Interface\\Sounds\\Uncloak.ogg", "Master") aura_env.NotifyGone(v) diff --git a/FreshShit/WhoSniffer/event3.lua b/FreshShit/WhoSniffer/event3.lua index 850432a..25d5517 100644 --- a/FreshShit/WhoSniffer/event3.lua +++ b/FreshShit/WhoSniffer/event3.lua @@ -1,8 +1,11 @@ -- TICKER_1000 function() + if aura_env.queryPending then return end SetWhoToUI(1) + ---@type WHOQuery local query = aura_env.whoQueries[aura_env.whoQueryIdx] - SendWho(query) + aura_env.lastQuery = query + SendWho(query.query) aura_env.whoQueryIdx = aura_env.whoQueryIdx + 1 if aura_env.whoQueryIdx > #aura_env.whoQueries then aura_env.whoQueryIdx = 1 diff --git a/FreshShit/WhoSniffer/export b/FreshShit/WhoSniffer/export index d13a787..ec32dca 100644 --- a/FreshShit/WhoSniffer/export +++ b/FreshShit/WhoSniffer/export @@ -1 +1 @@ -!DVr2UnYXX)fAiesykAET6yH1IirrQJvxrdLvIPefBXPj5SC400Zb1HTiSDs(aYZjpKxY77dXajbij)cs)rPQ(yU4WlTjagXYs7mDxD1vx3DnD3SqZ6n1CAQvmxH1YvQP2GMA64)dT21MDxtTDp9YtAQDlZwNAVdPDFDB2WMA7yA84JeB9XTQZyMUgqt3FANoou3M1wDJsfxpFHnkS2gBU(BkvUyZoRwETMApib4KIB8MCBuQu5nxl)MLw)nn1iwT7XSpJzy52uRs1tQx9C1uwHzYSbQ5Kcnpjpmu(FlX)BzSryaazQnK0MIVQrA7AWSC4RkxITl8aashdldNEINHhfTcp7AB0Tl12rmb19BaFuNERxNo1FyiTP2(vp6SAxCe0p)vINnPimbdPMMhO7iWRJ3T0rulxnyug33u7MkBRv)gT6BFoGmpCs1gAsEaqUpONzt5GQDw1JaKZBdMmkX0TxtnlYaQJIs9ScinxrtTzMEdScw62eDdphGhLppYsngqqwryoHMoq4yJ3iwho02mlG(LlllMffr8aIH1IdTpVDXGhgbX0ORvGGgOo(cdKPiN5CAxPeea1Kr46IEo0BABsCCAElNV3gBCGhO5PyqIEJ3QJXJ04ncnFRuroS2vbU2vbU2vbU2v(CVHtUCwjLpZTjMcMDhBq6aQlexc)DH2kcJ4PQ6DH1S234rSPJBvZZ0CCRl7zaOrZMVafkw6paszJ2GPM3q1q1qA(eu)IbsnbFdmgn0fd58DrvExHWf5zaxgyHwU1aDFy1OD(27EWfAiBIRzuuHxL5xzGTAma0hpbm9CzThbgaCCTE(sOQJb4a4YEmnlJoDO27bmFSLn3Rl9UVP2fAR)bb1CPHoOLEIV5BnKJiirTkNxTQVxJdS4tBboL2XOR0CHA2rAXx)0ZaKy3(iQvxeLLwdvG9CbKE6q3aLbuDYi07GsXr8fYTOvTl12Iy(vQftX14dX3YM55AAGCY67FqL3F6f1p6GtQcYrgyXYz4fkNi3O9mvr4oG0nCql7607HxwXACRviDzH83LFkE4(5Sn69Hj(yIcPRs(imSg6jef7sDAJsI7e6ffrpODiGDxtqxSp9be7UgDEq4ydKdSXTor2IPuYxiV0uLlQ2riIf9DBtmYXspXrWwiQOgAPeEAfeLGGadwS7OtoQn554YgGY5lgQJUeuUSboedfLTfgfABdVVeXI00z3iWnsLYN0m6mUfqSGFdkP)2GCZrJmIQNRYd9jJB52JAnLU2ACRV9PXTOw6JpCwijxGv(mWxeOcJ6XhU6QR(l5(Dh3cdjEd1AKOXoguti3aBWb0XKHaYj3As)shieMv3SJBjE4DrGLyAAawj0ja(mEqZOaZNuUZBNfc531J9R8O2pO6nsNUUGVzlVb3clWWTdrFDiDPWa9aQ6Y9p9yrdnUocycvHJjTTbf6oEwPZePBLgf2JyPKu)7bgEXGjc7ny2tIetEzXcAw0Xqc4IEClULt0HytD9STc4cMmiqhNE4QWJB552zdWAjnFSiX1s8Jeqtu3b0nYprpg82lmr7c4)mbT435D9mmP8b9LBXHrNf0zmm0MJbocE7Tp4stBKzsyr1FaW3XPTwelD(RiYluCDPs)edYFWIzyCRppYkq9d10Hgc)f2SC0zOyXslZmuCUZqXIXNHsBUmZqP5pdLJXLkwU8YmdLtEgE9SyUFM4YFPYg)FJoUiWRuQr4oK3ZSncK9aEQ7sDfo(J6xqcGjTdmYBH99qjwrTFuOBc7NHeDnEFclOSrNMScKg2UIphBPEGbUE7qIWjJz5nnduu4YH5lJVYswQkGhNZ5i1f8VT8Fkxo1YpNnDy6uJBLkB8PCvoTKzPvs8NRfDc4utmFljQJKOcJCGYGCQiB5IgpqejmOxEue0IjFOgvXDoq)ELFW49zqDeilGos1D1Rs98F45F6LF45)9lF)Z)0Z)v43)4vPGfCaqpcaDQnKj(Gbe7Ra2b2WUE4wd4VAdVUV3aIL6LDVJy3r9YjgD7b80QM(TSNfBa9vmh7AtOwud1RxYabI)C(EpGRu3WoevqS7pU1b2Ovrek6Ryg6riOJqsSdIoO9yZYX029iDLu84ddli8t6iktTbSqAN6AEZP2h3ys4vAJuxyPtj6ZaG6WmqTMfa2mtZz0)oMmMyfodG2JDlKT6maGlsv9VTmPPOGWzRZgKaX)SHJRumNztizMnqcTIzdZx5zoKAtMXANt1WMkTOZaOVgIFrmj2qqL5jrc0oNZsmUo7Cwikn5zdws63ZEebA9Zbos3FrpceZijv(NuPdI7JA6zB7BpfKyU0LxKetfWhjXtCNujMrAxpd8FsOh0MnXoKZsc98ipJ5e6agHRgLgkBwjngZHqOi6rP4eaigLNaerxbjaqSvscqeDffgavGjfZw1Nf9o(QsLNrACHKvsUzfevw5uNvmbzMA(0ybzebzPUdOUeUIr6V9PSr4At7NBUXaCGkIYfNmv)8uctooR5e8)TKcIKHrkc2sjmsgkHyylP8izyKsITuYKKHsin2skwMag)m(qUw40jcziwN51Uxubec(04cbkUWi2J6w3yanDMPJCrcLle(LIyw00OaFpdiUPtTcWne)IzufKQQVSbATWAyYw2E0mtcIsDRicdpn1mzNUgtSbJS3OJnZm42rj8VRDTAR4SIZ3zJeUVhRqvhOrGe)6SCgqMyj)9uKC8IuyH4jqCjX22GzJEud(b9TwzTn3zTDJ6d(migKUisEuGRvEJk7SD8G6y5lJcR0b)27wA9IrH(CwxpACGLiVwTYRTrmkbZX0njKxJ)FXI1rjyM0V3cJoPcEuPCHQLIrZA9iYmrIJ285xp)U7oriPeizb8LQvz9Q7elHbInO02Fs23gRVXgvRgd5mR(td55ZxR2MBepLfpd9PXaxVs(TJZsgGr(desCbtPs5RSPFavFnOiLdkSP5Kvn5wM(dbrvL91b3RxFqxDeUre0CXW2j9erJZKCTr4oTZzy5qTDtJ4p7egnFHlMzGWwFe38otMPSHOQ6gU8vs6uWGWbyzy6)xjE)aZWkDQRSWUXzeXwO6do39BRtXVgHfgGoPssjARX1(t43bZEc7Wg8POn00W1Fd2(4n2UH5vdn0Kkk8PA64X7sfQBdh(6nvmwJpMKlSKWISRPGb5ka4cUojRfGDjucKS6UGaSDp)vyQ0ng)ukXMDdrX4RPU(ZZKAr0r4tVG3cZXa(7tvFqT8udIljcjRfzuQKy(cjxMQiOBfsof4ZL)vHYjQlpUSYcu(HCoGr2WCbdHTGcDXwEQMByCTkixWkkubGsmTxz1CENpn7)vc8fnX7y3fz5aWTaROaCgBn53rdCmI1fgeojlSHYSCvzF5tqHy((oJg6xL546ZHMsom8a0xhxbpjn5boDNw2fSo(jaJVYRWOmHo8DKvit(qmNYKoKVPYFv(QkDJq0xMywo3Gj)sBViQnjAvKynFWeHDfo1bCNnu133IV4FkUzZslJ2tLZ5ptLtIcd()NsQ5FGqeF3r1xNBMh3JyNKJPCEps8eMe9KIWhMttTl3)0Bo6aycU4SD3UE1Whoejfj)GUYzwrLRUk)BhfESGJOesjr4CsuKYS8TFCI3Gl7XoN64z66KoZm)wmX23PjqfMjV)t1MBauFGvhwIF0gvSDIm0(wHYTxwDVg4)EDYLVMBE4pyH9Wqqvh0XVWQVf7oRqDZx3iYsjP3mt5RoGyoGIIu7L5vRCvK(GYqmr6Cnqo41ZOe4Q1LcjZEg93RvWuEM0ELE3RRkbtzr5cBs1XLmquVvm1xWtYVz1vgS6k61xz)3UYXVDfTula(wWpuTKrTqFUAfSr(O1ZHmwem2WFrFD8njoVFAKcXGCpec5WsmwUetoyP0Bjgnxl)A)QJSuJLRCihSurzjgnQsjhSy7(ZDS89uTGQGoUgw9f53KK0J3nSd45zIfwruHYfZkt9dAIPX8S0RzycMbhGBxeCzqV6kERoxD1UmihD(5VjhRBx0LdSXyhCxLlGfYS)izlpXuXKr6)AOdrAnZdSy52mzQml0h7nQNS3YlPw6mZdU5v9UjOXy(HXroCkvXC6F)qmyBDiTlhzL2UCBWyHyj2Wjd1MWTcMo6asQWbHxG3SxJu1SnGjYHFc7aPMdDhpxxMvQRFBftJ29thEh3FHT3IEoEIFcwLjs0ZqhsKa9XPN0jpvEiScYlsLJs9dQ8(QNFZBWtnx0CLcNnsauH3ogW)bhQU43cn4XGev8BBYIOaXZNwbt)0kLIe)KUIej5ZZQyjt8RtBI5iWH)DHKR8pm8SDK4V8A0xfrPLtp5cJxuum(CpIf)tfP2dyRNwgfBjM5Bz)17Z4cR2lPxJe2It6rzMLdK)BLzXCcLlQ91RjyEKG4JYTGHXJg(EuUfnaEKa3IeGxOrfoK9OClAq7ibRhLBbdx3ifU1WubfOygJ5PL(4F0jUfYIfwo8yYPmJJVP31YvOdF)SaazwsC6)zRg9w1xJj9YIJjSQp8tl8FcUsw4ug8D5mhjy8FIVgwIHMilCjg)qBwxByZ915rrWDLXJBLAjqH6erhDJzGx7Lah07hAiWcgdkw8i8mQ9kXlEUIXWXVgwBW3JfuTxM5CrSuwWu4xMm9M)5YkuLpNt9xA3J2UFSIHOoX7O1Hx0JV9SRtts5avkwoqjK6uSCGILLuH85ZpVfXKznHJk563OXlPsD2fhKUWKjj9nId)Cyf8GJFwJKoUAxhg1w6aUtZrsiCp1t5wYDe9KAYDQNiCqUtFwIhsUK96pRZA3e14lXAL9Qvck)PQeu81OduCAQabzth(0IhV4VHQeAI1oTrHRJkLcgHm9XelX8HrRoRnDaBeDQvNTqMOQxv6rCLuCAjOQHGzzE5(hasHZd(aKkyCzz(FGGfVqpFGZGhHx2pRhexLJr06cWoMPZVxvUrVlxU87)tsxejTpauh)IUCu1A1JC3N25061p944x6QjVRtXVVzt9oxPIicRY2goQ7igEnNAQvdcsnU1XmlWd)XuDdpqZ6oMT(L2KHn1QAYvCJFf88V0wHV5m(hkuqyippOb3VhnV2ThI3qniStRQ37sE8bCxyAdy9boVnv98acW4jWBp)xE(V9YVN)7hF(F(Yp(8p9Y3Jn)NE53(Y3)8)45)1l)i(6F(5p(Ypa9(Xx(DWVqhWVF85)osc4HwWK6IitJRbYFeL8Qw7XyUYNRlEsCzCUNQUjBRVr(GlC4N(DmKFR5o8x)4Hz(61yLUTNO1r4fnRiETXA(Fc \ No newline at end of file +!nZt2YnYrY9VGnyyGqKq4GdVcr5LhaKCeVeBqrBHHGOi6caTyJUW0hKdNreH212Fa(z7h8l(D9Gve2ocB)lq(h5mRJ(cv3aGZSXkbroORkR8QYmRSYQA2PANwDm86yuRC11kxVJXOogM4)dTsC7Dm1zG)WoNwFTkDmUL5AsD3L07otx24og7AB9XpsCnN0TfJz7Bbnrc8hYCpBSVfZXdWHFhJhpRFFpQFNtRTXBkVr96RU5Av2S(6VPJXaxlZwpoM2X4I9vyFpMnZfg4Pv7CAfym8FxN)7vXgbe6nM0JIDzq6POJHNpX1xqqlhl536dF1Bi)7Wt(UwdgqD9eyVvyd4xnP3g0VVGzoSXXN38YJH(5pscCj1qQsTTpYukuEb3sVN64BaJY6dDmUzVDmADJrRDUaqwaYagJTjpcipe0ZDPCqnoVXXaY5TbeJsSbfSHdze1tXPborSMVOPEm7GrogcrVkkK(uxhI9paceOda1XAaR6ynIGQK4AePy4WCGFBccdcWnIg9O9yoGmbeyeXYz(HouZoFWdJGyBnWPJXEnoTvJl4ChxaHjwudDbDqKfJnJWT)c8O30ZM4515wU(Vh24OaWstPOe9MUvpRpst3i08Tsd34Myv5Myv5Myv5Myvk)go7YvLuoL7rSfkDBRrWm7PVrzSI9k(wdZbGaB8(aIlDs3Mb22t6E1qlabgUCrtyAz(impB1BGllySAOgi3IwZEmy(sQjbiEOJX(ND1PaciMwbEaivQG2boGQZXVjy7dsHXf7S)rxAG8BpWX7CMfAuPuYccO8)wfNrS7lHP1zNdtESE3RmGwVsDKawG3)vdzgow97tDpaMfWw28Gb0hEFZlnw)Ne(TxzzIXfEJIYnDbdyHqAS3fnAG8n7Hi7vbRCKdNtGN7JWdEGeFc)zqU6Bnqm))bjh3CLnQxB9kv3O6ABS56VP(Q160FLvxJdSPvSqmGHYX8PMBrQ6lCball0cj0BNf4BBH62whE0EF3zx264JoTbWimWlMpfuDvTkKE5AUWJizA5HE7TOFaEyjNjDxImGflYxLmMFEaukx5satHg2wM0PdFkJtXvRwoJdeY6(uVEOO(GyoOgg(Qpbm27yicKaYiBs3tz(w9FSJXD0hrZkXd2Ya6vRi9p46KDf6qrF32bdwVWeogzAIwMjWECYk4qb3b(kiSjjEmtau11lWZNncvUxo2e9jvXobTfdJ31tymASd88mwuWWKDJaFixj)MHv)jDbohCzPK72bcI5zqUNAwEVhVJmPR)qQtgDT9KUF6PjDPoMtEBEiPCKhvo4lbuXr9K3UYkR8h5b7M0fxp6gQZ9Ig7BrTHfGDb)StiJbKtU1M(nEW6hodwEsxXx(2eW65B5CNf1BkGpNVIvsG5eLhX0BUq(ddzFFa1ng6DcgDl1fa)Qdpd76XKdW3hcvkGjr7WYHEKbuyebu(ypr0q7RtaMWK4espxWIVFGtXsj6wzLH9iepD9FaeZnByEpY0NdteGWoP7TqQouItciaDKpx0IeYutAr8VoHuPktQyyrnl6ymbcAoPl3Fm5qCP(bUor6rBgSMfxI4odt6g43FdWhSiFSG4nPR4JeqB0IeS4Qmvpw82Rov7c4)dcEjSZhgAzt5d6B2MdJjlQZuyOhhdCeS1Tp6tlAvAAyrNkaWVLZBDjoM8hrKxT26sxPPgu4Gfuys3VkHeO(qT9OXWF1nxnjfQvR(IqHAZKc1QLMc13CrOq9ztHvtPLQT6QlcfwvpfE9QyE0R0Z)sJn()MCCjGxzuJW9wEp57ei7bI5pG6lwojzKfja20((P8JvKsHUP8Fgtmn49j8GwojzwwG04(vCAST6lmiGEFscnzkpVSCqXjxomFtAjt)SQaEKMZywxO)2o8BLlRe)YU0XflmPBHLttYv48sPf2ijKwZlb4CtQylATr0AWih40lDgfCoD4DTrG7BzdBYsmUM8VJl(eIe(s0rupMfwkuQbc9OooGkHj2ckYEDOpWPTY6SiNClhI0szgYft)xmpq9hrH8KXfOl(PNGX(PBUXYXK(bE3kA(KguH4O87dvaVpjVLaQqHC7ibEkidD9qEl586tQPpyVJK46kXA1yEKBP0YGimiWY2mEd2qEI2BPIbSSilP4aWnlI3WhHebcFU0wPIsGPdhNluHjGKimSOdON1)mxyVrJgrCv8z8PjKFvSPI7KmLIxKSqk)FEwLFKNJIi3rLotesrVtGa(j)mWbf4ChefcWvihwiwm1SeSDSbfVtp6xEPbbBEKMWbOY6TSmt324)E9IOqYcdBJAiLKwimSri4jtevKwEuV80xHgxlwBYCGF8iZpOYEkslNDsXPhpph600lQV2vVoHZAziUqXcdw5DfE(F(5F7L)0Z)FV8lp)Bp)Fa)8V8UcyS2pH(Z6Wunnyk7W5Z(tHpcCrOL27Gq9yd7hG7nN)Ol84HbJioQh2)bIBF1dNAnyimL3WoSLdCyJOCH4ZGR(uM(PlN2uplfv9)AOO23LqDOwQhVIbRygQ4(UaW(RLLBmvjX9UjDpYftBjHA9hywMj0QhJ65(i6G2trLtO9gsg8xt1EYTDTDycuHaeBxx4MnSSt42gUJ4KRs3gu39kiMglCiwuQ4sx7cxclcsmZbGwafOo5bGlZ2oN(31MXeZd5a0bSBTTYJkCVhv)HrVsacFYpFqI80YhoU)3mOMW(jFGe2U5dZpeypM6sYr25C9TmxhAoa9JW2Gi2exyVjZAgjYhAgIyApRziik)T8btNxy(JiY3CgWrg83mK4Il6NYKpwUvXxvA6kbf6ofv0i5ksjsSwaFIKNX8d0MvnpJbT9iskqthsQOPhrwoA6adoyqPXQjIKhZoR9KCSgasX5AGiPeObGusIgiskr62rGszN5(bsLAw(PK9k3IGGjYCdccD52sLQEyKQZTvkw9qjuPBl1T6HrQv3wPF1dLqZUTufp)BejMpvlwqVHjv2i4LKuiYOdG4aQFlRr0ILMgjIsjOdpznTWsUbAiCXiIFXclbsT4hm)UOIueohaTwDnCB2Ub0sFwlJh9jfzuMz1q6WxJ(VqecN2ssNszolMj9tPa)5EnBUK3sE)SlQadJ2fRQ3TJSWUEz(erjDBtv3qNo3JRiUUwmxvW49wBZDxB)KbTphw0YmAP)MRUXE7Ut61(Xd)nm2)o7xF9AjH4c2GGWfhA2S5QRTrkQGPZ6hdc4)sTyhLGvK57CWLNcz4vR2OEkUXyijwQivQSEL93FQ1HczM6n3B9g7MkRaIlyMFNcKnwFJnA0ifkyo3frIMn3CJ0zFeyzgjoRVxLDsloJWLTtP6QxVYEBwi9uyIZuiUp60fo)wM5Jrljk7RpwUV7aJL7XArH2XwUEfNAP0s6lpopIBzlhpQRFre)lpLv7x7JRQlC6VN7NxQug1eRHPLpxskwageoair5WFlX7pXSCkw4Doy3ifrSfR6zZSKRMu8KXDWvx1DQeI2AFDib)zEY6tvKvWz3ySTLFynwdXRUsieJOjlcaFXQcX62YJlVfYQ2csbthwKDLbgKsaOf890BfGDjmcKQ6bWeyVHHsyHITN8ubr9oJXX4JfU(RkvyESr4KxOBbAmI)CM2dkXtni(mrS5Ar6GQzSWjjFM6K02o28uuqp(P3xwC6VOyTmW5VLRbSwoUwWs4lOqNq8cXEBRRvRYfjjsbiZCvLLO7Bd51WZGoCkjDh7ppIba3Cijr4uklHn0gHvip4QVjokxPFZyzkPQm6czKyk7WGpJvhn5u2VXijhg(kLtvBmDwUJ8gKvAfyXcL5vHpYpujzgB4ZOkqM1HGMISn(Sw3xIjvIQYhv5xet2kLYl7gmlxAVCmXY3dsBT(WmE9flaa4E5yhw72Cf3tPDXw453dujK(705yX5iXNL)smVkZhn3z5Ve0539wil2vtuCjCuxvLCV4HPUtHzCZdfO6MH8BCKpSfft5i96yC1HNDZXhby8YZ3FNwnsFThvCXkRWlcACqHGKAstse4uuf8L57j60GrxnKDb1lW23RyPCVIaZ)zmO2XfG6JC6Z0ExcsCshFV(ZTss4OZ3st1g1EMRCNu5WY)KxhdUHG)3PSq4FWV)FBHszpIS2tJ2txxZ55e)OftjOXpIoo3uoZdQl0pQV80GIsTn8Gh1ozoLAsa(cDcsZqNgj8sTB45esSSPMfc56LNtJQ5GsXFkJAQSOBov7eQmOrgtGJJQQ1uBWOnkQxNJ9QAWZWGnIeNlJKtF41vKPumpg8XZNmsuLECtxW6s)9RS0OvwYS1shU1sNS1sg55zmN35oPIyonIMpCLkB)5AQCrOq7qLZ1PRJqwFAxahPCZTZz(yTlWNbLdAExfUDbC(woiXu)CmgUXHCqZRFw7cOPKCq6lCN6Zt6CtsxEt01qezx3KWS8CIB3Pq18zuHEogSahtiYeyLFewgI(GI7DVJ3Q37E3(myZF8RUCz2GbyiRcNaR5qDZZbi)lEZ8t89SzK7we6QpOK6tQeDNoV2CDteqVfVyRflLv)ZQEUzfoehX4uLqpbBGH2BbXP9KLD9QDaZvIJOOd4UvhILdOyYbOR4rX59BoODHMUwaH84xvEqH7r3nW3N5u46T2Z2Q3DfJx1LjD)A3G5(AcJjvQYRtKVOmvWOxRKuVvk6EHx08MNiVh4rzJgpdWwhT3314IBEtLkX3EoX2gcB5Jhvu0xJsomSTPlMMd7Huvo)luj1K4NmqKSoNoRGLolSG9AxJKd)3gBULFzpY3Fpu8AFNkUDxVHsbJx1ACvYHeh(X9fwBGNMdFPq7yjMfN49R2L)sNElOtVMTVw8(sZru3p715NXcMIAG(zVK59LFvlAEF5x1YMIROWcVW59LFvlDEV84tMJrHB7VquHRwo)vCxSBcA)0EiZ3QNXhtzLBC6cASw5Q95vKcaO0cIZWZR8(TuhpxXffht5v)zUQTMqjZD5rcd5mJzW0FsldlWq1QcxGXp2LnWL651IVkcE8m8AtSifFs9(hMC7qqu7fah0pm2sGfCnO0NK7x9QXl(YkHLC51OAJo2DW0ErO584Pmh47Px1wwZ74he(hQ6HLQgxQIrfLFXmQ7vVH0E3fMZtI8G4EqbjFVXYV(y6YcQEQSGYOYA5kgvRmB5y6KRWrPV0A8yP6VSC5uuydEnYAXU8OIvlL8(LKvTXYUMyXUzK6U8RX2avgxAVu3ECdGvbUtCH2fYujn4i99RvFhjFZssOTsahKG3Fq7vVv)st5DlFNUyV6ZkpLDOMcYQZiC1VagH1En2G1YYemHvt473w6ZFiwrX1wgD8ImNyEkAeYSC1Aq)2KfQ3LoIDpnZc1h3yhnZ2BiXxYXfLGQgcMm8vhEeOoVi68YvW4Zk9LFQfFbI)jU(9E8La25rXBX690wcWoHzYFfX9t(2K7ZFFJ1(xcGFcOl)9994gnBL49(E3ZA16Sts)EEp97uD6xq7mFnVvRBdMH9S8KV51I3A83(39X3w6hxJv)2H)((pobP)lqq4BJE8xO5WBVmyoiVI2rVx1n(Gp5JpI7q1ye7oWH0LQ((icmDtGNE(F)5)Zx(N4)8Rp))8YF(5F7LFbB(F9L)Hx(LN)VF()9L)m(4)2Z)6l)jO3F9L)r4hOd4NF95)lKQ4DYXM6JiZGB2Z)kASPADiJ5l)ElX3eAKpqvVY(RVrLO)el85)xvb89NVJrtiNPjDpH5ajCCc10kyKO37XxR(A4ljFN))d \ No newline at end of file diff --git a/FreshShit/WhoSniffer/init.lua b/FreshShit/WhoSniffer/init.lua index 2d47e09..865e0d3 100644 --- a/FreshShit/WhoSniffer/init.lua +++ b/FreshShit/WhoSniffer/init.lua @@ -3,14 +3,16 @@ if not WeakAurasSaved.Cyka.WhoSniffer then WeakAurasSaved.Cyka.WhoSniffer = {} e ---@class aura_env ---@field raceMap table ----@field alliance table +---@field stinkies table ---@field classColors table ----@field whoQuery string +---@field whoQueries table ---@field ttl number ---@field messageQueue WHOMessage[] ---@field UpdateMacro fun() ---@field Notify fun(Player) ---@field NotifyGone fun(Player) +---@field queryPending boolean +---@field lastQuery WHOQuery ---@class WHOMessage ---@field message string @@ -19,77 +21,112 @@ if not WeakAurasSaved.Cyka.WhoSniffer then WeakAurasSaved.Cyka.WhoSniffer = {} e ---@param input string ---@return number local function utf8len(input) - local len = 0 - local i = 1 - local n = #input - while i <= n do - local c = input:byte(i) - if c >= 0 and c <= 127 then - i = i + 1 - elseif c >= 194 and c <= 223 then - i = i + 2 - elseif c >= 224 and c <= 239 then - i = i + 3 - elseif c >= 240 and c <= 244 then - i = i + 4 - else - i = i + 1 - end - len = len + 1 - end - return len + local len = 0 + local i = 1 + local n = #input + while i <= n do + local c = input:byte(i) + if c >= 0 and c <= 127 then + i = i + 1 + elseif c >= 194 and c <= 223 then + i = i + 2 + elseif c >= 224 and c <= 239 then + i = i + 3 + elseif c >= 240 and c <= 244 then + i = i + 4 + else + i = i + 1 + end + len = len + 1 + end + return len end ---@param input string ---@param targetLength number ---@param left boolean ---@return string local function padString(input, targetLength, left) - left = left or false - local len = utf8len(input) - if len < targetLength then - if left then - input = input .. string.rep(" ", targetLength - len) - else - input = string.rep(" ", targetLength - len) .. input - end - end - return input + left = left or false + local len = utf8len(input) + if len < targetLength then + if left then + input = input .. string.rep(" ", targetLength - len) + else + input = string.rep(" ", targetLength - len) .. input + end + end + return input +end + +---@class WHOQuery +---@field query string +---@field filters WHOFilter[] +WHOQuery = { + ---@param query string + ---@param filters WHOFilter[] + ---@return WHOQuery + new = function(query, filters) + local self = setmetatable({}, {__index = WHOQuery}) + self.query = query + self.filters = filters + return self + end +} + +---@alias WHOFilter fun(name: string, guild: string, level: number, race: string, class: string, zone: string): boolean +---@type WHOFilter +local NotSiegeOfOrgrimmarFilter = function(name, guild, level, race, class, zone) + if not zone then return false end + return zone ~= "Siege of Orgrimmar" +end +---@type WHOFilter +local AllianceFilter = function(name, guild, level, race, class, zone) + if not race then return false end + if not aura_env.raceMap[race] then return false end + return aura_env.raceMap[race] == "Alliance" end aura_env.messageQueue = {} aura_env.ttl = 6 aura_env.whoQueryIdx = 1 -aura_env.whoQueries = { - "g-\"БеспредеЛ\"", - "z-\"Orgrimmar\" z-\"Durotar\" r-\"Human\" r-\"Dwarf\" r-\"Night Elf\" r-\"Gnome\"", - "z-\"Orgrimmar\" z-\"Durotar\" r-\"Draenei\" r-\"Worgen\" r-\"Kul Tiran\" r-\"Dark Iron Dwarf\" r-\"Void Elf\" r-\"Lightforged Draenei\" r-\"Mechagnome\"" -} +---@type table +aura_env.whoQueries = {} +aura_env.whoQueries[1] = WHOQuery.new("g-\"БеспредеЛ\"", {}) +aura_env.whoQueries[2] = WHOQuery.new( + "z-\"Orgrimmar\" z-\"Durotar\" r-\"Human\" r-\"Dwarf\" r-\"Night Elf\" r-\"Gnome\"", + {NotSiegeOfOrgrimmarFilter, AllianceFilter}) +aura_env.whoQueries[3] = WHOQuery.new( + "z-\"Orgrimmar\" z-\"Durotar\" r-\"Draenei\" r-\"Worgen\" r-\"Kul Tiran\" r-\"Dark Iron Dwarf\" r-\"Void Elf\" r-\"Lightforged Draenei\" r-\"Mechagnome\"", + {NotSiegeOfOrgrimmarFilter, AllianceFilter}) +aura_env.queryPending = false +aura_env.lastQuery = nil + aura_env.raceMap = { - ["Orc"] = "Horde", - ["Undead"] = "Horde", - ["Tauren"] = "Horde", - ["Troll"] = "Horde", - ["Blood Elf"] = "Horde", - ["Goblin"] = "Horde", - ["Human"] = "Alliance", - ["Dwarf"] = "Alliance", - ["Night Elf"] = "Alliance", - ["Gnome"] = "Alliance", - ["Draenei"] = "Alliance", - ["Worgen"] = "Alliance", - ["Vulpera"] = "Horde", - ["Nightborne"] = "Horde", - ["Zandalari Troll"] = "Horde", - ["Kul Tiran"] = "Alliance", - ["Dark Iron Dwarf"] = "Alliance", - ["Void Elf"] = "Alliance", - ["Lightforged Draenei"] = "Alliance", - ["Mechagnome"] = "Alliance", - ["Mag'har Orc"] = "Horde", + ["Orc"] = "Horde", + ["Undead"] = "Horde", + ["Tauren"] = "Horde", + ["Troll"] = "Horde", + ["Blood Elf"] = "Horde", + ["Goblin"] = "Horde", + ["Human"] = "Alliance", + ["Dwarf"] = "Alliance", + ["Night Elf"] = "Alliance", + ["Gnome"] = "Alliance", + ["Draenei"] = "Alliance", + ["Worgen"] = "Alliance", + ["Vulpera"] = "Horde", + ["Nightborne"] = "Horde", + ["Zandalari Troll"] = "Horde", + ["Kul Tiran"] = "Alliance", + ["Dark Iron Dwarf"] = "Alliance", + ["Void Elf"] = "Alliance", + ["Lightforged Draenei"] = "Alliance", + ["Mechagnome"] = "Alliance", + ["Mag'har Orc"] = "Horde" } ---@type table -aura_env.alliance = {} +aura_env.stinkies = {} ---@class Player ---@field name string @@ -99,95 +136,92 @@ aura_env.alliance = {} ---@field zone string ---@field lastSeen number Player = { - ---@param name string - ---@param guild string - ---@param race string - ---@param class string - ---@param zone string - ---@return Player - new = function(name, guild, race, class, zone) - local self = setmetatable({}, { - __index = Player - }) - self.name = name - self.guild = guild - self.race = race - self.class = class - self.zone = zone - return self - end, - Touch = function(self) - self.lastSeen = GetTime() - end, - ToString = function(self) - local out = string.format("%s %s %s", padString(self.name, 16, true), padString(self.guild, 26, false), - padString(self.zone, 26, false)) - return string.format("|cFF%s%s|r", aura_env.classColors[self.class], out) - end + ---@param name string + ---@param guild string + ---@param race string + ---@param class string + ---@param zone string + ---@return Player + new = function(name, guild, race, class, zone) + local self = setmetatable({}, {__index = Player}) + self.name = name + self.guild = guild + self.race = race + self.class = class + self.zone = zone + return self + end, + Touch = function(self) self.lastSeen = GetTime() end, + ToString = function(self) + local out = string.format("%s %s %s", padString(self.name, 16, true), + padString(self.guild, 26, false), + padString(self.zone, 26, false)) + return + string.format("|cFF%s%s|r", aura_env.classColors[self.class], out) + end } aura_env.classColors = { - ["Warrior"] = "C69B6D", - ["Paladin"] = "F48CBA", - ["Hunter"] = "AAD372", - ["Rogue"] = "FFF468", - ["Priest"] = "FFFFFF", - ["Death Knight"] = "C41E3A", - ["Shaman"] = "0070DD", - ["Mage"] = "3FC7EB", - ["Warlock"] = "8788EE", - ["Monk"] = "00FF98", - ["Druid"] = "FF7C0A", - ["Demon Hunter"] = "A330C9", + ["Warrior"] = "C69B6D", + ["Paladin"] = "F48CBA", + ["Hunter"] = "AAD372", + ["Rogue"] = "FFF468", + ["Priest"] = "FFFFFF", + ["Death Knight"] = "C41E3A", + ["Shaman"] = "0070DD", + ["Mage"] = "3FC7EB", + ["Warlock"] = "8788EE", + ["Monk"] = "00FF98", + ["Druid"] = "FF7C0A", + ["Demon Hunter"] = "A330C9" } aura_env.UpdateMacro = function() - local body = {} - for k, v in pairs(aura_env.alliance) do - table.insert(body, string.format("/tar %s", v.name)) - end - EditMacro("tar", nil, nil, string.join("\n", body)) + local body = {} + for k, v in pairs(aura_env.stinkies) do + table.insert(body, string.format("/tar %s", v.name)) + end + EditMacro("tar", nil, nil, string.join("\n", body)) end ---@param input string ---@param deliminer string ---@return string[], string|nil local function StrSplit(input, deliminer) - if not deliminer then return {}, "deliminer is nil" end - if not input then return {}, "input is nil" end - local parts = {} - for part in string.gmatch(input, "([^" .. deliminer .. "]+)") do - table.insert(parts, strtrim(part)) - end - return parts, nil + if not deliminer then return {}, "deliminer is nil" end + if not input then return {}, "input is nil" end + local parts = {} + for part in string.gmatch(input, "([^" .. deliminer .. "]+)") do + table.insert(parts, strtrim(part)) + end + return parts, nil end ---@type string[] local toNotify = StrSplit(aura_env.config.notify, ",") -for i, part in ipairs(toNotify) do - toNotify[i] = strtrim(part) -end +for i, part in ipairs(toNotify) do toNotify[i] = strtrim(part) end ---@type table local notifyFor = {} local notifyForD = StrSplit(aura_env.config.notifyFor, ",") -for i, part in ipairs(notifyForD) do - notifyFor[part] = true -end +for i, part in ipairs(notifyForD) do notifyFor[part] = true end ---@param player Player aura_env.Notify = function(player) - if not notifyFor[player.zone] then return end - local msg = string.format("%s of class %s and guild %s in %s", player.name, player.class, player.guild, player.zone) - for _, rec in ipairs(toNotify) do - table.insert(aura_env.messageQueue, {to = rec, message = msg}) - end + if not notifyFor[player.zone] then return end + local msg = string.format("%s of class %s and guild %s in %s", player.name, + player.class, player.guild, player.zone) + for _, rec in ipairs(toNotify) do + table.insert(aura_env.messageQueue, {to = rec, message = msg}) + end end ---@param player Player aura_env.NotifyGone = function(player) - if not notifyFor[player.zone] then return end - local msg = string.format("%s of class %s and guild %s left %s", player.name, player.class, player.guild, player.zone) - for _, rec in ipairs(toNotify) do - table.insert(aura_env.messageQueue, {to = rec, message = msg}) - end + if not notifyFor[player.zone] then return end + local msg = string.format("%s of class %s and guild %s left %s", + player.name, player.class, player.guild, + player.zone) + for _, rec in ipairs(toNotify) do + table.insert(aura_env.messageQueue, {to = rec, message = msg}) + end end