From: hgn Date: Tue, 28 Nov 2023 17:24:21 +0000 (+0000) Subject: gameserver patches X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=3abfa7589349a860ecb5cc4f18f400c9963f4ab9;p=carveJwlIkooP6JGAAIwe30JlM.git gameserver patches --- diff --git a/gameserver.c b/gameserver.c index 11721e7..e36e60f 100644 --- a/gameserver.c +++ b/gameserver.c @@ -707,7 +707,7 @@ static enum request_status gameserver_cat_table( vg_strnull( &q, buf, 512 ); vg_strcat( &q, "SELECT * FROM \"" ); vg_strcat( &q, table_name ); - vg_strcat( &q, "\" ORDER BY time DESC LIMIT 10;" ); + vg_strcat( &q, "\" ORDER BY time ASC LIMIT 10;" ); if( !vg_strgood(&q) ) return k_request_status_out_of_memory; @@ -924,6 +924,7 @@ static u64 seconds_to_server_ticks( double s ){ } static void test_runner( db_request *req ){ +#if 0 vg_warn( "RUNNER\n" ); char table[DB_TABLE_UID_MAX]; if( db_get_highscore_table_name( "sr002-local-mp_mtzero", @@ -934,8 +935,16 @@ static void test_runner( db_request *req ){ vg_success( "Returned time: %u\n", v ); } } +#endif } +#define SIDELOAD +#ifdef SIDELOAD +#include "gameserver_sideload.h" +static int bsideload = 0; +const char *sideload_path = NULL; +#endif + int main( int argc, char *argv[] ){ signal( SIGINT, inthandler ); signal( SIGQUIT, inthandler ); @@ -946,7 +955,12 @@ int main( int argc, char *argv[] ){ if( vg_long_opt( "noauth" ) ) gameserver.auth_mode = eServerModeNoAuthentication; - /* TODO: Options to override, ammend, remove etc */ +#ifdef SIDELOAD + if( (arg = vg_long_opt_arg( "sideload" )) ){ + sideload_path = arg; + bsideload = 1; + } +#endif } vg_set_mem_quota( 80*1024*1024 ); @@ -959,6 +973,15 @@ int main( int argc, char *argv[] ){ db_send_request(req); } +#ifdef SIDELOAD + if( bsideload ){ + sideload( sideload_path ); + db_kill(); + db_free(); + return 0; + } +#endif + monitor_start_server(); /* UNIX socket monitor */ /* steamworks init diff --git a/gameserver_sideload.h b/gameserver_sideload.h new file mode 100644 index 0000000..3d754f2 --- /dev/null +++ b/gameserver_sideload.h @@ -0,0 +1,135 @@ +#include "gameserver.h" + +/* read entire binary file */ +static void *sl_file_read( const char *path, u32 *size ){ + FILE *f = fopen( path, "rb" ); + if( f ){ + void *buffer = malloc(0); + u64 current = 0; + + /* read in chunks */ + for( u32 i=0; 1; i++ ){ + buffer = realloc( buffer, current+VG_FILE_IO_CHUNK_SIZE ); + u64 l = fread( buffer + current, 1, VG_FILE_IO_CHUNK_SIZE, f ); + current += l; + if( l != VG_FILE_IO_CHUNK_SIZE ){ + if( feof( f ) ){ + break; + } + else{ + if( ferror( f ) ){ + fclose(f); + vg_fatal_error( "read error" ); + } + else{ + fclose(f); + vg_fatal_error( "unknown error codition" ); + } + } + } + } + + buffer = realloc( buffer, vg_align8(current) ); + fclose( f ); + + *size = (u32)current; + return buffer; + } + else{ + vg_error( "vg_disk_open_read: %s\n", strerror(errno) ); + return NULL; + } +} + +/* read entire file and append a null on the end */ +static char *sl_file_read_text( const char *path, u32 *sz ){ + u32 size; + char *str = sl_file_read( path, &size ); + + if( !str ) + return NULL; + + /* include null terminator */ + str = realloc( str, size+1 ); + str[ size ] = '\0'; + *sz = size+1; + + return str; +} + +static void sideload( const char *folder ){ + char buf[ 4096 ]; + vg_str str; + vg_strnull( &str, buf, 4096 ); + vg_strcat( &str, folder ); + vg_strcat( &str, "/users.csv" ); + + u32 sz; + char *data = sl_file_read_text( buf, &sz ); + char *_c = data, *lstart = NULL; + + while( *_c ){ + char c = *_c; + + if( lstart == NULL ){ + lstart = _c; + } + + if( c == '\n' ){ + *_c = '\0'; + u64 steamid; + char uname[48]; + sscanf( lstart, "%lu,%s", &steamid, uname ); + for( int i=0; i<48; i ++ ){ + if( uname[i] == '\0' ) break; + if( uname[i] < ' ' || uname[i] > '~' ) uname[i] = '?'; + } + lstart = NULL; + db_updateuser( steamid, uname, 1 ); + } + + _c ++; + } + + free( data ); + + char *names[] = { + "sr002-local-mp_mtzero:Megapark Green", + "sr002-local-mp_mtzero:Megapark Blue", + "sr002-local-mp_mtzero:Megapark Yellow", + "sr002-local-mp_mtzero:Megapark Red", + "sr002-local-mp_mtzero:Coastal Run", + "sr002-local-mp_mtzero:Docks Jumps", + }; + + for( int i=0; i<6; i++ ){ + char fn[ 4096 ]; + sprintf( fn, "%s/00%d-track.csv", folder,i ); + + data = sl_file_read_text( fn, &sz ); + _c = data, lstart = NULL; + + while( *_c ){ + char c = *_c; + + if( lstart == NULL ){ + lstart = _c; + } + + if( c == '\n' ){ + *_c = '\0'; + int id, s0, score; + u64 steamid; + + sscanf( lstart, "%d,%d,%d,%lu", &id, &s0, &score, &steamid ); + lstart = NULL; + db_writeusertime( names[i], steamid, score, 1 ); + } + + _c ++; + } + + free( data ); + + } +}