chat_modes/atreply_interceptor.lua

86 lines
2.1 KiB
Lua

local function getnextplayers(messageparts)
local includes = {}
-- Consume until found new player names
while messageparts[1] and messageparts[1]:sub(1,1) ~= '@' do
table.remove(messageparts, 1)
end
-- Get the next set of names
while messageparts[1] and messageparts[1]:sub(1,1) == '@' do
local token = table.remove(messageparts, 1)
includes[#includes+1] = token:sub(2, #token)
end
return {includes=includes, mparts=messageparts}
end
local function playping(playername)
-- TODO - implement sound
return
end
-- Returns the target if it does not exist in the set
-- else returns nil
local function needstarget(targetset, target)
for _,testtarget in pairs(targetset) do
if testtarget == target then
return target
end
end
end
chat_modes.register_interceptor("chat_modes:atreply", function(sender, message, targets)
if minetest.setting_getbool("chat_modes.no_at_replies") == false then
return targets
end
local messageparts = message:split(" ")
local includes = {"triggerone"}
local private = false
local newtargets = {}
-- Players mentioned at start of message
-- Only send to them
while messageparts[1] and messageparts[1]:sub(1,1) == '@' do
local token = table.remove(messageparts, 1)
local tname = token:sub(2, #token)
local targetplayer = needstarget(targets, minetest.get_player_by_name(tname) )
if targetplayer then
newtargets[#newtargets+1] = targetplayer
playping(tname)
end
private = true
end
if private then
return newtargets
end
while includes[1] do -- hence "triggerone" to do it at least once
local nextin = getnextplayers(messageparts)
includes = nextin.includes
messageparts = nextin.mparts
for _,pname in pairs(includes) do
local targetplayer = needstarget(targets, minetest.get_player_by_name(tname) )
if targetplayer then
newtargets[#newtargets+1] = targetplayer
playping(tname)
end
end
end
for _,residualplayer in pairs(targets) do
local targetplayer = needstarget(newtargets, residualplayer )
if targetplayer then
newtargets[#newtargets+1] = targetplayer
end
end
return newtargets
end)