From 0b7410d979118b6e0562ffbdabb23ee619f59c92 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Tue, 16 Jan 2024 22:04:35 +0100 Subject: [PATCH] Codechange: compile-time validate the string format of IConsolePrint (#11804) This means we can no longer use runtime picking what string to use. --- src/console_cmds.cpp | 26 ++++++++++++-------------- src/console_func.h | 7 +++---- src/network/network_server.cpp | 14 ++++++++------ 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index eec523eeb3..9c72b8fe3e 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -267,20 +267,18 @@ DEF_CONSOLE_CMD(ConZoomToLevel) case 0: IConsolePrint(CC_HELP, "Set the current zoom level of the main viewport."); IConsolePrint(CC_HELP, "Usage: 'zoomto '."); - IConsolePrint( - CC_HELP, - ZOOM_LVL_MIN < _settings_client.gui.zoom_min ? - "The lowest zoom-in level allowed by current client settings is {}." : - "The lowest supported zoom-in level is {}.", - std::max(ZOOM_LVL_MIN, _settings_client.gui.zoom_min) - ); - IConsolePrint( - CC_HELP, - _settings_client.gui.zoom_max < ZOOM_LVL_MAX ? - "The highest zoom-out level allowed by current client settings is {}." : - "The highest supported zoom-out level is {}.", - std::min(_settings_client.gui.zoom_max, ZOOM_LVL_MAX) - ); + + if (ZOOM_LVL_MIN < _settings_client.gui.zoom_min) { + IConsolePrint(CC_HELP, "The lowest zoom-in level allowed by current client settings is {}.", std::max(ZOOM_LVL_MIN, _settings_client.gui.zoom_min)); + } else { + IConsolePrint(CC_HELP, "The lowest supported zoom-in level is {}.", std::max(ZOOM_LVL_MIN, _settings_client.gui.zoom_min)); + } + + if (_settings_client.gui.zoom_max < ZOOM_LVL_MAX) { + IConsolePrint(CC_HELP, "The highest zoom-out level allowed by current client settings is {}.", std::min(_settings_client.gui.zoom_max, ZOOM_LVL_MAX)); + } else { + IConsolePrint(CC_HELP, "The highest supported zoom-out level is {}.", std::min(_settings_client.gui.zoom_max, ZOOM_LVL_MAX)); + } return true; case 2: { diff --git a/src/console_func.h b/src/console_func.h index d0fc3b3ec7..bf7993b78a 100644 --- a/src/console_func.h +++ b/src/console_func.h @@ -34,16 +34,15 @@ void IConsolePrint(TextColour colour_code, const std::string &string); * @param format_string The formatting string to tell what to do with the remaining arguments. * @param first_arg The first argument to the format. * @param other_args The other arguments to the format. - * @tparam T The type of formatting parameter. * @tparam A The type of the first argument. * @tparam Args The types of the other arguments. */ -template -inline void IConsolePrint(TextColour colour_code, const T &format, A first_arg, Args&&... other_args) +template +inline void IConsolePrint(TextColour colour_code, fmt::format_string format, A first_arg, Args&&... other_args) { /* The separate first_arg argument is added to aid overloading. * Otherwise the calls that do no need formatting will still use this function. */ - IConsolePrint(colour_code, fmt::format(format, first_arg, other_args...)); + IConsolePrint(colour_code, fmt::format(format, std::forward(first_arg), std::forward(other_args)...)); } /* Parser */ diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 8bab091caa..a22d6b2d42 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -1704,12 +1704,14 @@ void NetworkServer_Tick(bool send_frame) case NetworkClientSocket::STATUS_ACTIVE: if (lag > _settings_client.network.max_lag_time) { /* Client did still not report in within the specified limit. */ - IConsolePrint(CC_WARNING, cs->last_packet + std::chrono::milliseconds(lag * MILLISECONDS_PER_TICK) > std::chrono::steady_clock::now() ? - /* A packet was received in the last three game days, so the client is likely lagging behind. */ - "Client #{} (IP: {}) is dropped because the client's game state is more than {} ticks behind." : - /* No packet was received in the last three game days; sounds like a lost connection. */ - "Client #{} (IP: {}) is dropped because the client did not respond for more than {} ticks.", - cs->client_id, cs->GetClientIP(), lag); + + if (cs->last_packet + std::chrono::milliseconds(lag * MILLISECONDS_PER_TICK) > std::chrono::steady_clock::now()) { + /* A packet was received in the last three game days, so the client is likely lagging behind. */ + IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because the client's game state is more than {} ticks behind.", cs->client_id, cs->GetClientIP(), lag); + } else { + /* No packet was received in the last three game days; sounds like a lost connection. */ + IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because the client did not respond for more than {} ticks.", cs->client_id, cs->GetClientIP(), lag); + } cs->SendError(NETWORK_ERROR_TIMEOUT_COMPUTER); continue; }