Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix muting API #116

Merged
merged 2 commits into from
Jan 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
6 changes: 0 additions & 6 deletions spec/hooks_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -97,12 +97,6 @@ describe("Hooks", function()

describe("invalid input", function()

it("throws before_send_pm nil target", function()
assert.has_error(function()
beerchat.execute_callbacks('before_send_pm', "Sam", "test message", nil)
end)
end)

it("handles before_send_pm empty message and recipient", function()
beerchat.execute_callbacks('before_send_pm', "Sam", "", "")
end)
Expand Down
Loading
Loading