From cc9f7c06b39ce840d0dcde36e816cf025bd7ce81 Mon Sep 17 00:00:00 2001 From: x12xx12x <44411062+12xx12@users.noreply.github.com> Date: Wed, 23 Jun 2021 00:09:06 +0200 Subject: Add optional prefix parameter to LOG functions (#5229) Co-authored-by: Tiger Wang --- Server/Plugins/APIDump/APIDesc.lua | 118 +++++++++++++++----------------- Server/Plugins/APIDump/main_APIDump.lua | 4 +- Server/Plugins/DumpInfo/Init.lua | 2 +- src/Bindings/LuaState.cpp | 16 +++++ src/Bindings/LuaState.h | 1 + src/Bindings/ManualBindings.cpp | 81 +++++++++------------- 6 files changed, 109 insertions(+), 113 deletions(-) diff --git a/Server/Plugins/APIDump/APIDesc.lua b/Server/Plugins/APIDump/APIDesc.lua index af6049fba..5d571c799 100644 --- a/Server/Plugins/APIDump/APIDesc.lua +++ b/Server/Plugins/APIDump/APIDesc.lua @@ -10931,14 +10931,26 @@ a_Player:OpenWindow(Window); }, SendMessage = { - Params = { + Params = { - Name = "Message", - Type = "string", + { + Name = "Message", + Type = "string", + }, }, + Notes = "Sends the specified message to the player.", + }, + { + Params = + { + { + Name = "Message", + Type = "cCompositeChat", + }, + }, + Notes = "Sends the {{cCompositeChat}} to the player, using a severity defined by the CompositeChat's MessageType.", }, - Notes = "Sends the specified message to the player.", }, SendMessageRaw = { @@ -14590,8 +14602,13 @@ end Name = "Message", Type = "string", }, + { + Name = "SuppressPluginNamePrefix", + Type = "boolean", + IsOptional = true, + }, }, - Notes = "Logs a text into the server console and logfile using 'normal' severity (gray text)", + Notes = "Logs a text into the server console and logfile using 'normal' severity (gray text).", }, { Params = @@ -14600,101 +14617,78 @@ end Name = "Message", Type = "cCompositeChat", }, + { + Name = "SuppressPluginNamePrefix", + Type = "boolean", + IsOptional = true, + }, }, - Notes = "Logs the {{cCompositeChat}}'s human-readable text into the server console. The severity is converted from the CompositeChat's MessageType.", + Notes = "Logs the {{cCompositeChat}}'s human-readable text into the server console, using a severity defined by the CompositeChat's MessageType.", }, }, LOGERROR = { + Params = { - Params = { - { - Name = "Message", - Type = "string", - }, + Name = "Message", + Type = "string", }, - Notes = "Logs a text into the server console and logfile using 'error' severity (black text on red background)", - }, - { - Params = { - { - Name = "Message", - Type = "cCompositeChat", - }, + Name = "SuppressPluginNamePrefix", + Type = "boolean", + IsOptional = true, }, - Notes = "Logs the {{cCompositeChat}}'s human-readable text into the server console and logfile using 'error' severity (black text on red background)", }, + Notes = "Logs a text into the server console and logfile using 'error' severity (black text on red background).", }, LOGINFO = { + Params = { - Params = { - { - Name = "Message", - Type = "string", - }, + Name = "Message", + Type = "string", }, - Notes = "Logs a text into the server console and logfile using 'info' severity (yellow text)", - }, - { - Params = { - { - Name = "Message", - Type = "cCompositeChat", - }, + Name = "SuppressPluginNamePrefix", + Type = "boolean", + IsOptional = true, }, - Notes = "Logs the {{cCompositeChat}}'s human-readable text into the server console and logfile using 'info' severity (yellow text)", }, + Notes = "Logs a text into the server console and logfile using 'info' severity (yellow text).", }, LOGWARN = { + Params = { - Params = { - { - Name = "Message", - Type = "string", - }, + Name = "Message", + Type = "string", }, - Notes = "Logs a text into the server console and logfile using 'warning' severity (red text); OBSOLETE, use LOGWARNING() instead", - }, - { - Params = { - { - Name = "Message", - Type = "cCompositeChat", - }, + Name = "SuppressPluginNamePrefix", + Type = "boolean", + IsOptional = true, }, - Notes = "Logs the {{cCompositeChat}}'s human-readable text into the server console and logfile using 'warning' severity (red text); OBSOLETE, use LOGWARNING() instead", }, + Notes = "Logs a text into the server console and logfile using 'warning' severity (red text); OBSOLETE, use LOGWARNING() instead.", }, LOGWARNING = { + Params = { - Params = { - { - Name = "Message", - Type = "string", - }, + Name = "Message", + Type = "string", }, - Notes = "Logs a text into the server console and logfile using 'warning' severity (red text)", - }, - { - Params = { - { - Name = "Message", - Type = "cCompositeChat", - }, + Name = "SuppressPluginNamePrefix", + Type = "boolean", + IsOptional = true, }, - Notes = "Logs the {{cCompositeChat}}'s human-readable text into the server console and logfile using 'warning' severity (red text)", }, + Notes = "Logs a text into the server console and logfile using 'warning' severity (red text).", }, md5 = { diff --git a/Server/Plugins/APIDump/main_APIDump.lua b/Server/Plugins/APIDump/main_APIDump.lua index 61dd1e66c..b1277ca0b 100644 --- a/Server/Plugins/APIDump/main_APIDump.lua +++ b/Server/Plugins/APIDump/main_APIDump.lua @@ -36,7 +36,7 @@ local function LoadAPIFiles(a_Folder, a_DstTable) if (a_DstTable[k]) then -- The class is documented in two files, warn and store into a file (so that CIs can mark build as failure): LOGWARNING(string.format( - "APIDump warning: class %s is documented at two places, the documentation in file %s will overwrite the previously loaded one!", + "Warning: class %s is documented at two places, the documentation in file %s will overwrite the previously loaded one!", k, FileName )) local f = io.open("DuplicateDocs.txt", "a") @@ -2115,7 +2115,7 @@ function Initialize(Plugin) g_Plugin = Plugin; g_PluginFolder = Plugin:GetLocalFolder(); - LOG("Initialising " .. Plugin:GetName() .. " v." .. Plugin:GetVersion()) + LOG("Initialising v." .. Plugin:GetVersion()) -- Bind a console command to dump the API: cPluginManager:BindConsoleCommand("api", HandleCmdApi, "Dumps the Lua API docs into the API/ subfolder") diff --git a/Server/Plugins/DumpInfo/Init.lua b/Server/Plugins/DumpInfo/Init.lua index 8b328c862..723ab3d94 100644 --- a/Server/Plugins/DumpInfo/Init.lua +++ b/Server/Plugins/DumpInfo/Init.lua @@ -4,7 +4,7 @@ function Initialize(a_Plugin) -- Check if the infodump file exists. if (not cFile:IsFile("Plugins/InfoDump.lua")) then - LOGWARN("[DumpInfo] InfoDump.lua was not found.") + LOGWARN("InfoDump.lua was not found.") return false end diff --git a/src/Bindings/LuaState.cpp b/src/Bindings/LuaState.cpp index ccd7244fa..3a1379df1 100644 --- a/src/Bindings/LuaState.cpp +++ b/src/Bindings/LuaState.cpp @@ -1489,6 +1489,22 @@ bool cLuaState::GetStackValue(int a_StackPos, cUUID & a_Value) +bool cLuaState::GetStackValue(int a_StackPos, std::string_view & a_Value) +{ + size_t Length = 0; + const char * const Value = lua_tolstring(m_LuaState, a_StackPos, &Length); + if (Value != nullptr) + { + a_Value = { Value, Length }; + return true; + } + return false; +} + + + + + template bool cLuaState::GetStackValue(int a_StackPos, Vector3 & a_ReturnedVal) { diff --git a/src/Bindings/LuaState.h b/src/Bindings/LuaState.h index 6f7a334b6..420fdad69 100644 --- a/src/Bindings/LuaState.h +++ b/src/Bindings/LuaState.h @@ -664,6 +664,7 @@ public: bool GetStackValue(int a_StackPos, eWeather & a_Value); bool GetStackValue(int a_StackPos, float & a_ReturnedVal); bool GetStackValue(int a_StackPos, cUUID & a_Value); + bool GetStackValue(int a_StackPos, std::string_view & a_Value); // template to catch all of the various c++ integral types without overload conflicts template >> diff --git a/src/Bindings/ManualBindings.cpp b/src/Bindings/ManualBindings.cpp index 1d0519708..37fc20d39 100644 --- a/src/Bindings/ManualBindings.cpp +++ b/src/Bindings/ManualBindings.cpp @@ -347,50 +347,59 @@ static int tolua_StringSplitAndTrim(lua_State * tolua_S) -/** Retrieves the log message from the first param on the Lua stack. -Can take either a string or a cCompositeChat. -*/ -static void LogFromLuaStack(lua_State * tolua_S, eLogLevel a_LogLevel) +/** Prints the message to the console, optionally formatting it with a plugin name prefix if the second param on the Lua stack is true. */ +static void LogFromLuaStack(lua_State * tolua_S, const std::string_view a_Message, const eLogLevel a_LogLevel) { - tolua_Error err; - if (tolua_isusertype(tolua_S, 1, "cCompositeChat", false, &err)) + if (lua_isboolean(tolua_S, 2) && (lua_toboolean(tolua_S, 2) == 1)) { - auto Msg = static_cast(tolua_tousertype(tolua_S, 1, nullptr))->ExtractText(); - Logger::LogSimple(Msg, a_LogLevel); - return; + Logger::LogSimple(a_Message, a_LogLevel); + } + else + { + Logger::LogSimple(fmt::format("[{}] {}", cManualBindings::GetLuaPlugin(tolua_S)->GetName(), a_Message), a_LogLevel); } - - size_t len = 0; - const char * str = lua_tolstring(tolua_S, 1, &len); - Logger::LogSimple(fmt::format("[{}] {}", cManualBindings::GetLuaPlugin(tolua_S)->GetName(), std::string_view(str, len)), a_LogLevel); } -static int tolua_LOG(lua_State * tolua_S) +/** Retrieves a string log message from the first param on the Lua stack, optionally prefixes it with plugin name, and prints it to the console. */ +static void LogFromLuaStack(lua_State * tolua_S, const eLogLevel a_LogLevel) { + cLuaState L(tolua_S); + // If there's no param, spit out an error message instead of crashing: - if (lua_isnil(tolua_S, 1)) + if (!L.CheckParamString(1)) { - LOGWARNING("Attempting to LOG a nil value!"); - cLuaState::LogStackTrace(tolua_S); - return 0; + return; } - // If the param is a cCompositeChat, read the log level from it: - eLogLevel LogLevel = eLogLevel::Regular; + std::string_view Message; + L.GetStackValue(1, Message); + LogFromLuaStack(tolua_S, Message, a_LogLevel); +} + + + + + +static int tolua_LOG(lua_State * tolua_S) +{ + // If the param is a cCompositeChat, read the data from it: tolua_Error err; if (tolua_isusertype(tolua_S, 1, "cCompositeChat", false, &err)) { - LogLevel = cCompositeChat::MessageTypeToLogLevel( - static_cast(tolua_tousertype(tolua_S, 1, nullptr))->GetMessageType() - ); + const auto CompositeChat = static_cast(tolua_tousertype(tolua_S, 1, nullptr)); + if (CompositeChat != nullptr) // isusertype returns true for nil values + { + LogFromLuaStack(tolua_S, CompositeChat->ExtractText(), cCompositeChat::MessageTypeToLogLevel(CompositeChat->GetMessageType())); + return 0; + } } // Log the message: - LogFromLuaStack(tolua_S, LogLevel); + LogFromLuaStack(tolua_S, eLogLevel::Regular); return 0; } @@ -400,14 +409,6 @@ static int tolua_LOG(lua_State * tolua_S) static int tolua_LOGINFO(lua_State * tolua_S) { - // If there's no param, spit out an error message instead of crashing: - if (lua_isnil(tolua_S, 1)) - { - LOGWARNING("Attempting to LOGINFO a nil value!"); - cLuaState::LogStackTrace(tolua_S); - return 0; - } - LogFromLuaStack(tolua_S, eLogLevel::Info); return 0; } @@ -418,14 +419,6 @@ static int tolua_LOGINFO(lua_State * tolua_S) static int tolua_LOGWARN(lua_State * tolua_S) { - // If there's no param, spit out an error message instead of crashing: - if (lua_isnil(tolua_S, 1)) - { - LOGWARNING("Attempting to LOGWARN a nil value!"); - cLuaState::LogStackTrace(tolua_S); - return 0; - } - LogFromLuaStack(tolua_S, eLogLevel::Warning); return 0; } @@ -436,14 +429,6 @@ static int tolua_LOGWARN(lua_State * tolua_S) static int tolua_LOGERROR(lua_State * tolua_S) { - // If there's no param, spit out an error message instead of crashing: - if (lua_isnil(tolua_S, 1)) - { - LOGWARNING("Attempting to LOGERROR a nil value!"); - cLuaState::LogStackTrace(tolua_S); - return 0; - } - LogFromLuaStack(tolua_S, eLogLevel::Error); return 0; } -- cgit v1.2.3