From 6ff4424f081567a6af204ca2e4e7158d9fe542f6 Mon Sep 17 00:00:00 2001 From: Isaac0-dev <62234577+Isaac0-dev@users.noreply.github.com> Date: Fri, 21 Feb 2025 11:33:49 +1000 Subject: [PATCH] check names on player connect --- src/pc/configfile.c | 4 ++-- src/pc/djui/djui_panel_player.c | 26 ++++---------------------- src/pc/network/network_player.c | 23 +++++++++++++++++++++-- src/pc/network/network_player.h | 2 ++ 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/pc/configfile.c b/src/pc/configfile.c index 35f3d763f..77043319b 100644 --- a/src/pc/configfile.c +++ b/src/pc/configfile.c @@ -20,6 +20,7 @@ #include "debuglog.h" #include "djui/djui_hud_utils.h" #include "game/save_file.h" +#include "pc/network/network_player.h" #define ARRAY_LEN(arr) (sizeof(arr) / sizeof(arr[0])) @@ -749,8 +750,7 @@ NEXT_OPTION: if (gCLIOpts.playerName[0]) { snprintf(configPlayerName, MAX_CONFIG_STRING, "%s", gCLIOpts.playerName); } - bool djui_panel_player_name_valid(char* buffer); - if (!djui_panel_player_name_valid(configPlayerName)) { + if (!network_player_name_valid(configPlayerName)) { snprintf(configPlayerName, MAX_CONFIG_STRING, "Player"); } diff --git a/src/pc/djui/djui_panel_player.c b/src/pc/djui/djui_panel_player.c index a4468f2ee..eac2bd5c2 100644 --- a/src/pc/djui/djui_panel_player.c +++ b/src/pc/djui/djui_panel_player.c @@ -327,27 +327,9 @@ static void djui_panel_player_edit_palette_create(struct DjuiBase* caller) { // player panel // ////////////////// -bool djui_panel_player_name_valid(char* buffer) { - if (buffer[0] == '\0') { return false; } - u16 numEscapeChars = 0; - bool isOnlyEscapeChars = true; - bool isInEscapedChar = false; - char* c = buffer; - while (*c != '\0') { - if (*c == ' ') { return false; } - if (!djui_unicode_valid_char(c)) { return false; } - if (*c == '\\') { numEscapeChars++; isInEscapedChar = !isInEscapedChar; } - else if (!isInEscapedChar) { isOnlyEscapeChars = false; } - c = djui_unicode_next_char(c); - } - if (isOnlyEscapeChars) { return false; } - if (numEscapeChars % 2 != 0) { return false; } - return true; -} - static char *djui_panel_player_name_default_get(void) { char *langName = DLANG(PLAYER, PLAYER); - if (djui_panel_player_name_valid(langName)) { + if (network_player_name_valid(langName)) { return langName; } static char *name = "Player"; @@ -356,7 +338,7 @@ static char *djui_panel_player_name_default_get(void) { static void djui_panel_player_name_text_change(struct DjuiBase* caller) { struct DjuiInputbox* inputbox1 = (struct DjuiInputbox*)caller; - if (djui_panel_player_name_valid(inputbox1->buffer)) { + if (network_player_name_valid(inputbox1->buffer)) { djui_inputbox_set_text_color(inputbox1, 0, 0, 0, 255); } else { djui_inputbox_set_text_color(inputbox1, 255, 0, 0, 255); @@ -365,7 +347,7 @@ static void djui_panel_player_name_text_change(struct DjuiBase* caller) { static void djui_panel_player_name_on_focus_end(struct DjuiBase* caller) { struct DjuiInputbox* inputbox1 = (struct DjuiInputbox*)caller; - if (!djui_panel_player_name_valid(inputbox1->buffer)) { + if (!network_player_name_valid(inputbox1->buffer)) { djui_inputbox_set_text(inputbox1, djui_panel_player_name_default_get()); } snprintf(configPlayerName, MAX_CONFIG_STRING, "%s", inputbox1->buffer); @@ -441,7 +423,7 @@ void djui_panel_player_create(struct DjuiBase* caller) { djui_base_set_size_type(&inputbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&inputbox1->base, 0.45f, 32); djui_base_set_alignment(&inputbox1->base, DJUI_HALIGN_RIGHT, DJUI_VALIGN_TOP); - if (djui_panel_player_name_valid(configPlayerName)) { + if (network_player_name_valid(configPlayerName)) { djui_inputbox_set_text(inputbox1, configPlayerName); } else { djui_inputbox_set_text(inputbox1, djui_panel_player_name_default_get()); diff --git a/src/pc/network/network_player.c b/src/pc/network/network_player.c index e06cfd780..ae38fcc1a 100644 --- a/src/pc/network/network_player.c +++ b/src/pc/network/network_player.c @@ -16,6 +16,7 @@ #include "pc/discord/discord.h" #endif #include "game/mario.h" +#include "pc/djui/djui_unicode.h" struct NetworkPlayer gNetworkPlayers[MAX_PLAYERS] = { 0 }; struct NetworkPlayer *gNetworkPlayerLocal = NULL; @@ -23,6 +24,24 @@ struct NetworkPlayer *gNetworkPlayerServer = NULL; static char sDefaultPlayerName[] = "Player"; static char sDefaultDiscordId[] = "0"; +bool network_player_name_valid(const char* buffer) { + if (buffer[0] == '\0') { return false; } + u16 numEscapeChars = 0; + bool isOnlyEscapeChars = true; + bool isInEscapedChar = false; + char* c = buffer; + while (*c != '\0') { + if (*c == ' ') { return false; } + if (!djui_unicode_valid_char(c)) { return false; } + if (*c == '\\') { numEscapeChars++; isInEscapedChar = !isInEscapedChar; } + else if (!isInEscapedChar) { isOnlyEscapeChars = false; } + c = djui_unicode_next_char(c); + } + if (isOnlyEscapeChars) { return false; } + if (numEscapeChars % 2 != 0) { return false; } + return true; +} + void network_player_init(void) { gNetworkPlayers[0].modelIndex = (configPlayerModel < CT_MAX) ? configPlayerModel : CT_MARIO; gNetworkPlayers[0].palette = configPlayerPalette; @@ -252,8 +271,8 @@ u8 network_player_connected(enum NetworkPlayerType type, u8 globalIndex, u8 mode } struct NetworkPlayer *np = &gNetworkPlayers[localIndex]; - // ensure that a name is given - if (name[0] == '\0') { + // ensure that a valid name is given + if (!network_player_name_valid(name)) { name = sDefaultPlayerName; } if (discordId[0] == '\0') { diff --git a/src/pc/network/network_player.h b/src/pc/network/network_player.h index 4b583535c..0a602bdef 100644 --- a/src/pc/network/network_player.h +++ b/src/pc/network/network_player.h @@ -72,6 +72,8 @@ extern struct NetworkPlayer gNetworkPlayers[]; extern struct NetworkPlayer* gNetworkPlayerLocal; extern struct NetworkPlayer* gNetworkPlayerServer; +bool network_player_name_valid(const char* buffer); + void network_player_init(void); void network_player_update_model(u8 localIndex); bool network_player_any_connected(void);