refactor: argument (#33)

* refactor(config): remove TOML config loading and replace is_client with host_game

* feat(network): add net_error_message helper and use for error logging
This commit is contained in:
zhenyan121
2026-07-17 09:00:26 +08:00
committed by GitHub
parent d62b310a21
commit d6e1e4a50e
10 changed files with 150 additions and 59 deletions

View File

@@ -38,16 +38,20 @@ void App::cursor_position_callback(GLFWwindow* window, double xpos,
MouseMoveEvent{static_cast<float>(xpos), static_cast<float>(ypos)});
}
void App::init(int argc, char** argv) {
handle_toml();
handle_argument(argc, argv);
auto locate = get_system_locale();
std::string default_value = "en_US";
if (locate.country == "CN") {
default_value = "zh_CN";
if (m_argument.language) {
Localization::instance().load_language(*m_argument.language);
m_game_config.set("language", *m_argument.language);
} else {
auto locate = get_system_locale();
std::string default_value = "en_US";
if (locate.country == "CN") {
default_value = "zh_CN";
}
Localization::instance().load_language(
m_game_config.get("language", default_value));
}
Localization::instance().load_language(
m_game_config.get("language", default_value));
m_window.init();
m_window.imgui_init();
@@ -74,7 +78,9 @@ void App::init(int argc, char** argv) {
m_audio.init();
BlockManager::init();
m_renderer.init(m_argument.debug_on);
if (m_argument.debug_on) {
m_renderer.init(*m_argument.debug_on);
}
Logger::info("Renderer Init Success");
// MapTable::init_map();
m_texture_manager.init_texture();
@@ -101,17 +107,13 @@ void App::handle_argument(int argc, char** argv) {
std::function<void(ArgParser&)>>
HANDLERS{
{"--client", [&](ArgParser&) { m_argument.is_client = true; }},
{"--host", [&](ArgParser&) { m_argument.is_client = false; }},
{"-p",
[&](ArgParser& p) {
auto arg = p.require_next("-p");
auto r = std::from_chars(arg.data(), arg.data() + arg.size(),
m_argument.port);
int port;
auto r =
std::from_chars(arg.data(), arg.data() + arg.size(), port);
m_argument.port = port;
if (r.ec != std::errc{} || r.ptr != arg.data() + arg.size()) {
throw std::runtime_error(
std::format("Invalid port: {}", arg));
@@ -119,7 +121,7 @@ void App::handle_argument(int argc, char** argv) {
if (m_argument.port > 65535) {
throw std::runtime_error(
std::format("Port {} out of range", m_argument.port));
std::format("Port {} out of range", *m_argument.port));
}
}},
@@ -143,7 +145,14 @@ void App::handle_argument(int argc, char** argv) {
[&](ArgParser) {
m_argument.debug_on = false;
Logger::info("Switch off opengl debug out put");
}}
}},
{"--language",
[&](ArgParser& p) {
auto arg = p.require_next("--language");
m_argument.language = arg;
}
}
};
ArgParser parser(argc, argv);
@@ -158,21 +167,6 @@ void App::handle_argument(int argc, char** argv) {
}
}
void App::handle_toml() {
toml::table server;
try {
server = toml::parse_file("server.toml");
} catch (const toml::parse_error& e) {
// Logger::warn("Ip toml parse error {}", e.what());
return;
}
m_argument.ip =
*TOML::safe_get_value(server, "ip", std::string("127.0.01"));
m_argument.port = *TOML::safe_get_value(server, "port", 25530);
m_argument.is_client = *TOML::safe_get_value(server, "client", false);
}
void App::key_callback(GLFWwindow* window, int key, int scancode, int action,
int mods) {
ImGuiIO& io = ImGui::GetIO();
@@ -749,7 +743,7 @@ int App::start_cubed_application(int argc, char** argv) {
try {
app.init(argc, argv);
Logger::info("Game Init Finish Start Run...");
Logger::info("Init Finish Start Run...");
app.run();
return 0;

View File

@@ -434,7 +434,8 @@ void DevPanel::show_world_tab_item() {
if (ImGui::BeginTabItem("world")) {
if (ImGui::BeginTabBar("World Kind")) {
if (!m_app.argument().is_client) {
auto& param = m_world_scene.scene_manager().world_scene_param();
if (param.host_game) {
if (ImGui::BeginTabItem("ServerWorld")) {
show_server_world_table_bar();
ImGui::EndTabItem();

View File

@@ -2,6 +2,7 @@
#include "Cubed/gameplay/client_world.hpp"
#include "Cubed/tools/log.hpp"
#include "Cubed/tools/net_error.hpp"
#include <utility>
@@ -44,8 +45,12 @@ asio::awaitable<void> NetworkClient::connect(std::string ip, int port) {
Logger::info("NetworkClient Read Loop Started");
m_connected = true;
co_return;
} catch (const asio::system_error& e) {
std::string_view error = net_error_message(e.code());
Logger::error("Client Error: {}, code {}", error, e.code().value());
set_error(error);
} catch (const std::exception& e) {
Logger::error("Client Error {}", e.what());
set_error(e.what());
}
@@ -133,21 +138,17 @@ asio::awaitable<void> NetworkClient::read_loop() {
}
}
} catch (const asio::system_error& e) {
auto ec = e.code();
set_error(e.what());
if (ec == asio::error::eof || ec == asio::error::operation_aborted) {
Logger::info("Client disconnected");
} else {
Logger::warn("Asio Error {}", e.what());
}
std::string_view error = net_error_message(e.code());
Logger::error("Client Error: {}, code {}", error, e.code().value());
set_error(error);
close();
} catch (const std::exception& e) {
Logger::error("Session Error {}", e.what());
Logger::error("Client Error {}", e.what());
set_error(e.what());
close();
} catch (...) {
Logger::error("Unknown Error");
set_error("Unhnown Error");
set_error("Unknown Error");
close();
}
co_return;
@@ -179,7 +180,10 @@ void NetworkClient::do_write() {
m_socket, asio::buffer(*packet),
asio::bind_executor(m_strand, [self](std::error_code ec, size_t) {
if (ec) {
Logger::warn("Write Ec {}", ec.message());
std::string_view error = net_error_message(ec);
Logger::error("Cleint Write Error: {}, code {}", error,
ec.value());
self->set_error(error);
self->close();
return;
}

View File

@@ -1,6 +1,7 @@
#include "Cubed/gameplay/network_server.hpp"
#include "Cubed/tools/log.hpp"
#include "Cubed/tools/net_error.hpp"
using asio::ip::tcp;
namespace Cubed {
@@ -61,6 +62,12 @@ asio::awaitable<void> NetworkServer::listen() {
}
s->start();
}
} catch (const asio::system_error& e) {
if (!m_stopped) {
std::string_view error = net_error_message(e.code());
Logger::error("Server Error: {}, code {}", error, e.code().value());
}
} catch (const std::exception& e) {
if (!m_stopped) {
Logger::error("accept error {}", e.what());

View File

@@ -2,6 +2,7 @@
#include "Cubed/gameplay/server_world.hpp"
#include "Cubed/tools/log.hpp"
#include "Cubed/tools/net_error.hpp"
#include "Cubed/tools/uuid.hpp"
using asio::ip::tcp;
using namespace google::protobuf;
@@ -103,10 +104,10 @@ asio::awaitable<void> Session::read_loop() {
auto ec = e.code();
if (ec == asio::error::eof || ec == asio::error::operation_aborted) {
Logger::info("Client disconnected");
} else {
Logger::warn("Asio Error {}", e.what());
std::string_view error = net_error_message(e.code());
Logger::error("Server Error: {}, code {}", error, e.code().value());
}
close();
@@ -128,7 +129,8 @@ void Session::do_write() {
m_socket, asio::buffer(*packet),
asio::bind_executor(m_strand, [self](std::error_code ec, size_t) {
if (ec) {
Logger::warn("Write Ec {}", ec.message());
std::string_view error = net_error_message(ec);
Logger::error("Server Error: {}, code {}", error, ec.value());
self->close();
return;
}

View File

@@ -109,7 +109,9 @@ bool WorldScene::handle_event(const Event& e) {
}
void WorldScene::on_enter() {
auto& param = m_scene_manager.world_scene_param();
m_error_ui.init();
if (param.host_game) {
if (param.seed) {
ChunkGenerator::init(*param.seed);
@@ -124,7 +126,8 @@ void WorldScene::on_enter() {
m_client->start(param.ip, param.port);
// init will send packet
try {
m_client_world.init(m_argument.player, m_client);
m_client_world.init(m_argument.player.value_or("Unknown"), m_client);
Logger::info("World Init Success");
m_camera.camera_init(&m_client_world.get_player());
@@ -143,8 +146,8 @@ void WorldScene::on_leave() {
m_scene_manager.app().window().set_camera(nullptr);
m_scene_manager.app().window().set_game_running(false);
if (!m_argument.is_client) {
auto& param = m_scene_manager.world_scene_param();
if (param.host_game) {
m_server.server_world().stop();
}
m_scene_manager.app().audio().stop_bgm();

View File

@@ -98,7 +98,9 @@ void MainMenuUIManager::init() {
player_name.set_text(
tr("menu.main.player_name",
arg("name", m_scene.scene_manager().app().argument().player)));
arg("name",
m_scene.scene_manager().app().argument().player.value_or(
"Unknown"))));
auto& version = info_layout.add_child<Label>();
version.set_scale(SCALE);