mirror of
https://github.com/Lacustat/Freewood-OctoWoW-Core.git
synced 2026-11-04 07:56:55 +00:00
0.1.236: Kanaele: Mitglieder = Serverliste plus Schreibende der letzten 30 Min, offener Kanal alle 45 s neu abgefragt [ungeprueft]
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016onJCSHLwhs9udhC9ZLzk9
This commit is contained in:
co-authored by
Claude Sonnet 5.5
parent
6c4bcb3e83
commit
7b53e1b963
+57
-14
@@ -77,10 +77,16 @@ function Ch.Rescan()
|
||||
local prev = old[e.num]
|
||||
if prev and prev.name == e.name then
|
||||
e.members = prev.members
|
||||
e.listed = prev.listed
|
||||
e.spk = prev.spk
|
||||
e.extra = prev.extra
|
||||
e.count = prev.count
|
||||
e.stamp = prev.stamp
|
||||
else
|
||||
e.members = {}
|
||||
e.listed = {}
|
||||
e.spk = {}
|
||||
e.extra = {}
|
||||
e.count = 0
|
||||
end
|
||||
Ch.byNum[e.num] = e
|
||||
@@ -154,6 +160,42 @@ function Ch.ParseNames(text)
|
||||
return out
|
||||
end
|
||||
|
||||
-- Mitglieder = Liste vom Server + wer zuletzt geschrieben hat (Listen sind nur Momentaufnahmen)
|
||||
local SPEAK_KEEP = 1800
|
||||
function Ch.Merge(e)
|
||||
local now = (G.GetTime and G.GetTime()) or 0
|
||||
local out, seen, extra = {}, {}, {}
|
||||
local k = 1
|
||||
while k <= table.getn(e.listed) do
|
||||
out[table.getn(out) + 1] = e.listed[k]
|
||||
seen[e.listed[k]] = true
|
||||
k = k + 1
|
||||
end
|
||||
for name, t in pairs(e.spk) do
|
||||
if now - t > SPEAK_KEEP then
|
||||
e.spk[name] = nil
|
||||
elseif not seen[name] then
|
||||
out[table.getn(out) + 1] = name
|
||||
extra[name] = true
|
||||
end
|
||||
end
|
||||
e.members = out
|
||||
e.extra = extra
|
||||
e.count = table.getn(out)
|
||||
Bump()
|
||||
end
|
||||
|
||||
function Ch.NoteSpeaker(num, name)
|
||||
local e = tonumber(num) and Ch.byNum[tonumber(num)]
|
||||
if not e or type(name) ~= "string" or name == "" then return end
|
||||
if e.spk[name] == nil then
|
||||
e.spk[name] = (G.GetTime and G.GetTime()) or 0
|
||||
Ch.Merge(e)
|
||||
else
|
||||
e.spk[name] = (G.GetTime and G.GetTime()) or 0
|
||||
end
|
||||
end
|
||||
|
||||
local function OnList(a1, a2, a3, a4, a5, a6, a7, a8, a9)
|
||||
if Ch.probe then
|
||||
P("CHAT_MSG_CHANNEL_LIST arg1=" .. Short(a1) .. " | arg2=" .. tostring(a2) .. " arg4=" .. tostring(a4) ..
|
||||
@@ -170,11 +212,10 @@ local function OnList(a1, a2, a3, a4, a5, a6, a7, a8, a9)
|
||||
end
|
||||
end
|
||||
if not e then return end
|
||||
e.members = Ch.ParseNames(a1)
|
||||
e.count = table.getn(e.members)
|
||||
e.listed = Ch.ParseNames(a1)
|
||||
e.stamp = (G.GetTime and G.GetTime()) or 0
|
||||
if Ch.current == e.num then Ch.current = nil end
|
||||
Bump()
|
||||
Ch.Merge(e)
|
||||
end
|
||||
|
||||
local function OnJoin(a1, a2, a3, a4, a5, a6, a7, a8, a9)
|
||||
@@ -182,13 +223,12 @@ local function OnJoin(a1, a2, a3, a4, a5, a6, a7, a8, a9)
|
||||
local e = tonumber(a8) and Ch.byNum[tonumber(a8)]
|
||||
if e and type(a2) == "string" and a2 ~= "" then
|
||||
local k = 1
|
||||
while k <= table.getn(e.members) do
|
||||
if e.members[k] == a2 then return end
|
||||
while k <= table.getn(e.listed) do
|
||||
if e.listed[k] == a2 then return end
|
||||
k = k + 1
|
||||
end
|
||||
e.members[table.getn(e.members) + 1] = a2
|
||||
e.count = table.getn(e.members)
|
||||
Bump()
|
||||
e.listed[table.getn(e.listed) + 1] = a2
|
||||
Ch.Merge(e)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -196,16 +236,16 @@ local function OnLeave(a1, a2, a3, a4, a5, a6, a7, a8, a9)
|
||||
if Ch.probe then P("CHANNEL_LEAVE arg2=" .. tostring(a2) .. " arg8=" .. tostring(a8) .. " arg9=" .. tostring(a9)) end
|
||||
local e = tonumber(a8) and Ch.byNum[tonumber(a8)]
|
||||
if e and type(a2) == "string" then
|
||||
e.spk[a2] = nil
|
||||
local k = 1
|
||||
while k <= table.getn(e.members) do
|
||||
if e.members[k] == a2 then
|
||||
RemoveAt(e.members, k)
|
||||
e.count = table.getn(e.members)
|
||||
Bump()
|
||||
return
|
||||
while k <= table.getn(e.listed) do
|
||||
if e.listed[k] == a2 then
|
||||
RemoveAt(e.listed, k)
|
||||
break
|
||||
end
|
||||
k = k + 1
|
||||
end
|
||||
Ch.Merge(e)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -217,6 +257,9 @@ local function OnNotice(a1, a2, a3, a4, a5, a6, a7, a8, a9)
|
||||
end
|
||||
|
||||
FW:RegisterEvent("CHAT_MSG_CHANNEL_LIST", OnList)
|
||||
FW:RegisterEvent("CHAT_MSG_CHANNEL", function(text, sender, lang, chanStr, target, flags, zone, num)
|
||||
Ch.NoteSpeaker(num, sender)
|
||||
end)
|
||||
FW:RegisterEvent("CHAT_MSG_CHANNEL_JOIN", OnJoin)
|
||||
FW:RegisterEvent("CHAT_MSG_CHANNEL_LEAVE", OnLeave)
|
||||
FW:RegisterEvent("CHAT_MSG_CHANNEL_NOTICE", OnNotice)
|
||||
|
||||
Reference in New Issue
Block a user