Allow customizing chat message format (#8529)

This commit is contained in:
ANAND 2019-08-08 21:34:46 +05:30 committed by rubenwardy
parent cc610c74a7
commit d1c27c7e80
10 changed files with 111 additions and 47 deletions

@ -1,4 +1,29 @@
-- Minetest: builtin/game/chatcommands.lua
-- Minetest: builtin/game/chat.lua
--
-- Chat message formatter
--
-- Implemented in Lua to allow redefinition
function core.format_chat_message(name, message)
local str = core.settings:get("chat_message_format")
local error_str = "Invalid chat message format - missing %s"
local i
str, i = str:gsub("@name", name, 1)
if i == 0 then
error(error_str:format("@name"), 2)
end
str, i = str:gsub("@message", message, 1)
if i == 0 then
error(error_str:format("@message"), 2)
end
str = str:gsub("@timestamp", os.date("%H:%M:%S", os.time()), 1)
return str
end
--
-- Chat command handler

@ -24,7 +24,7 @@ dofile(gamepath.."misc.lua")
dofile(gamepath .. "privileges.lua")
dofile(gamepath .. "auth.lua")
dofile(commonpath .. "chatcommands.lua")
dofile(gamepath.."chatcommands.lua")
dofile(gamepath .. "chat.lua")
dofile(commonpath .. "information_formspecs.lua")
dofile(gamepath .. "static_spawn.lua")
dofile(gamepath .. "detached_inventory.lua")

@ -1058,6 +1058,10 @@ disable_anticheat (Disable anticheat) bool false
# This option is only read when server starts.
enable_rollback_recording (Rollback recording) bool false
# Format of player chat messages. The following strings are valid placeholders:
# @name, @message, @timestamp (optional)
chat_message_format (Chat message format) string <@name> @message
# A message to be displayed to all clients when the server shuts down.
kick_msg_shutdown (Shutdown message) string Server shutting down.

@ -4156,6 +4156,12 @@ Chat
* `minetest.chat_send_all(text)`
* `minetest.chat_send_player(name, text)`
* `minetest.format_chat_message(name, message)`
* Used by the server to format a chat message, based on the setting `chat_message_format`.
Refer to the documentation of the setting for a list of valid placeholders.
* Takes player name and message, and returns the formatted string to be sent to players.
* Can be redefined by mods if required, for things like colored names or messages.
* **Only** the first occurrence of each placeholder will be replaced.
Environment access
------------------

@ -1277,6 +1277,11 @@
# type: bool
# enable_rollback_recording = false
# Format of player chat messages. The following strings are valid placeholders:
# @name, @message, @timestamp (optional)
# type: string
chat_message_format = <@name> @message
# A message to be displayed to all clients when the server shuts down.
# type: string
# kick_msg_shutdown = Server shutting down.

@ -356,6 +356,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("kick_msg_crash", "This server has experienced an internal error. You will now be disconnected.");
settings->setDefault("ask_reconnect_on_crash", "false");
settings->setDefault("chat_message_format", "<@name> @message");
settings->setDefault("profiler_print_interval", "0");
settings->setDefault("active_object_send_range_blocks", "4");
settings->setDefault("active_block_range", "3");

@ -19,7 +19,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#pragma once
#include "irrlichttypes.h"
#include <ctime>
#include <string>

@ -168,3 +168,25 @@ void ScriptApiServer::on_shutdown()
runCallbacks(0, RUN_CALLBACKS_MODE_FIRST);
}
std::string ScriptApiServer::formatChatMessage(const std::string &name,
const std::string &message)
{
SCRIPTAPI_PRECHECKHEADER
// Push function onto stack
lua_getglobal(L, "core");
lua_getfield(L, -1, "format_chat_message");
// Push arguments onto stack
lua_pushstring(L, name.c_str());
lua_pushstring(L, message.c_str());
// Actually call the function
lua_call(L, 2, 1);
// Fetch return value
std::string ret = lua_tostring(L, -1);
lua_pop(L, 1);
return ret;
}

@ -36,6 +36,10 @@ public:
// Calls on_shutdown handlers
void on_shutdown();
// Calls core.format_chat_message
std::string formatChatMessage(const std::string &name,
const std::string &message);
/* auth */
bool getAuth(const std::string &playername,
std::string *dst_password,

@ -2912,10 +2912,8 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna
line += L"-!- You don't have permission to shout.";
broadcast_line = false;
} else {
line += L"<";
line += wname;
line += L"> ";
line += wmessage;
line += narrow_to_wide(m_script->formatChatMessage(name,
wide_to_narrow(wmessage)));
}
/*