check names on player connect

This commit is contained in:
Isaac0-dev 2025-02-21 11:33:49 +10:00
parent 215056b1d2
commit 6ff4424f08
4 changed files with 29 additions and 26 deletions

View file

@ -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");
}

View file

@ -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());

View file

@ -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') {

View file

@ -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);