Skip to content

Commit

Permalink
Fix muting API
Browse files Browse the repository at this point in the history
  • Loading branch information
S-S-X authored and BuckarooBanzay committed Jan 6, 2024
1 parent b302def commit c27632d
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 34 deletions.
2 changes: 1 addition & 1 deletion common.lua
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ beerchat.allow_private_message = function(name, target)
end

beerchat.has_player_muted_player = function(name, other_name)
return not beerchat.execute_callbacks("before_check_muted", name, other_name)
return not beerchat.allow_private_message(other_name, name)
end

beerchat.is_player_subscribed_to_channel = function(name, channel)
Expand Down
7 changes: 7 additions & 0 deletions hooks.lua
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,13 @@ beerchat.execute_callbacks = function(trigger, ...)
return true
end

-- Log notification for bad event definition, use before_send_pm if possible

beerchat.register_callback("before_check_muted", function()
minetest.log("warning", "Beerchat 'before_check_muted' event fired: this event has issues and should probably be "
.. "either deprecated or updated. Use 'before_send_pm' or beerchat.has_player_muted_player(a,b) if possible.")
end, -1)

-- TODO: harmonize callbacks

-- called on every channel message
Expand Down
60 changes: 27 additions & 33 deletions plugin/mute.lua
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@

local is_muted = function(name, target)
assert(type(target) == "string", "is_muted(name, target): target should be a string, got "..type(target)..".")
local player = minetest.get_player_by_name(target)
-- Test if message from one player to another would get muted based on recipient ignore list
local is_muted = function(from, to)
assert(type(to) == "string", "is_muted(from, to): 'to' should be a string, got "..type(to)..".")
local player = minetest.get_player_by_name(to)
if player then
local meta = player:get_meta()
return meta:get("beerchat:muted:" .. name) == "true"
return meta:get("beerchat:muted:" .. (from or "")) == "true"
end
return true
end

-- Events
Expand All @@ -17,14 +17,15 @@ beerchat.register_callback("before_send_pm", function(name, _, target)
end
end)

-- Ambiguous arguments for before_check_muted event, TBD if event should be deprecated or reworked.
beerchat.register_callback("before_check_muted", function(name, target)
if is_muted(name, target) then
return false
end
end)

beerchat.register_callback("on_send_on_channel", function(name, _, target)
if is_muted(name, target) then
if is_muted(name, target) ~= false then
return false
end
end)
Expand All @@ -36,21 +37,18 @@ local mute_player = {
description = "Mute a player. After muting a player, you will no longer see chat "
.. "messages of this user, regardless of what channel his user sends messages to.",
func = function(name, param)

if not beerchat.execute_callbacks("before_mute", name, param) then
return false
end

if not param or param == "" then
return false, "ERROR: Invalid number of arguments. Please supply the name "
.. "of the user to mute."
return false, "ERROR: Invalid number of arguments. Please supply the name of the user to mute."
end

if beerchat.has_player_muted_player(name, param) then
minetest.chat_send_player(name, "Player " .. param .. " is already muted.")
else
minetest.get_player_by_name(name):get_meta():set_string(
"beerchat:muted:" .. param, "true")
minetest.get_player_by_name(name):get_meta():set_string("beerchat:muted:" .. param, "true")
minetest.chat_send_player(name, "Muted player " .. param .. ".")
end
return true
Expand All @@ -59,17 +57,14 @@ local mute_player = {

local unmute_player = {
params = "<Player Name>",
description = "Unmute a player. After unmuting a player, you will again see chat "
.. "messages of this user",
description = "Unmute a player. After unmuting a player, you will again see chat messages of this user",
func = function(name, param)
if not param or param == "" then
return false, "ERROR: Invalid number of arguments. Please supply the "
.. "name of the user to mute."
return false, "ERROR: Invalid number of arguments. Please supply the name of the user to mute."
end

if beerchat.has_player_muted_player(name, param) then
minetest.get_player_by_name(name):get_meta():set_string(
"beerchat:muted:" .. param, "")
minetest.get_player_by_name(name):get_meta():set_string("beerchat:muted:" .. param, "")
minetest.chat_send_player(name, "Unmuted player " .. param .. ".")
else
minetest.chat_send_player(name, "Player " .. param .. " was not muted.")
Expand All @@ -82,27 +77,26 @@ local list_muted = {
params = "",
description = "Show list of muted players.",
func = function(name)

local player = minetest.get_player_by_name(name)
local tMeta = player:get_meta():to_table()

if nil == tMeta or nil == tMeta.fields then return false end
local meta = player and player:get_meta():to_table()

if meta and meta.fields then
local muted = {}
for field, _ in pairs(meta.fields) do
if field:sub(1, 15) == "beerchat:muted:" then
table.insert(muted, field:sub(16, -1))
end
end

local sOut = ""
for sKey, _ in pairs(tMeta.fields) do
if "beerchat:muted:" == sKey:sub(1, 15) then
sOut = sOut .. sKey:sub(16, -1) .. ", "
if #muted > 0 then
minetest.chat_send_player(name, table.concat(muted, ", "))
else
minetest.chat_send_player(name, "You have not muted any players.")
end
end

if 0 == #sOut then
sOut = "You have not muted any players."
else
-- remove trailing comma and space
sOut = sOut:sub(1, -3)
return true
end
minetest.chat_send_player(name, sOut)
return true
return false
end
}

Expand Down

0 comments on commit c27632d

Please sign in to comment.