gameserver patches
authorhgn <hgodden00@gmail.com>
Tue, 28 Nov 2023 17:24:21 +0000 (17:24 +0000)
committerhgn <hgodden00@gmail.com>
Tue, 28 Nov 2023 17:24:21 +0000 (17:24 +0000)
gameserver.c
gameserver_sideload.h [new file with mode: 0644]

index 11721e7a4dc8abef2f45db49765d58ea1246dc1b..e36e60f704c345030c9189fab49d27ab42046353 100644 (file)
@@ -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 (file)
index 0000000..3d754f2
--- /dev/null
@@ -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 );
+
+   }
+}