network release 9
[carveJwlIkooP6JGAAIwe30JlM.git] / gameserver_sideload.h
1 #include "gameserver.h"
2
3 /* read entire binary file */
4 static void *sl_file_read( const char *path, u32 *size ){
5 FILE *f = fopen( path, "rb" );
6 if( f ){
7 void *buffer = malloc(0);
8 u64 current = 0;
9
10 /* read in chunks */
11 for( u32 i=0; 1; i++ ){
12 buffer = realloc( buffer, current+VG_FILE_IO_CHUNK_SIZE );
13 u64 l = fread( buffer + current, 1, VG_FILE_IO_CHUNK_SIZE, f );
14 current += l;
15 if( l != VG_FILE_IO_CHUNK_SIZE ){
16 if( feof( f ) ){
17 break;
18 }
19 else{
20 if( ferror( f ) ){
21 fclose(f);
22 vg_fatal_error( "read error" );
23 }
24 else{
25 fclose(f);
26 vg_fatal_error( "unknown error codition" );
27 }
28 }
29 }
30 }
31
32 buffer = realloc( buffer, vg_align8(current) );
33 fclose( f );
34
35 *size = (u32)current;
36 return buffer;
37 }
38 else{
39 vg_error( "vg_disk_open_read: %s\n", strerror(errno) );
40 return NULL;
41 }
42 }
43
44 /* read entire file and append a null on the end */
45 static char *sl_file_read_text( const char *path, u32 *sz ){
46 u32 size;
47 char *str = sl_file_read( path, &size );
48
49 if( !str )
50 return NULL;
51
52 /* include null terminator */
53 str = realloc( str, size+1 );
54 str[ size ] = '\0';
55 *sz = size+1;
56
57 return str;
58 }
59
60 static void sideload( const char *folder ){
61 char buf[ 4096 ];
62 vg_str str;
63 vg_strnull( &str, buf, 4096 );
64 vg_strcat( &str, folder );
65 vg_strcat( &str, "/users.csv" );
66
67 u32 sz;
68 char *data = sl_file_read_text( buf, &sz );
69 char *_c = data, *lstart = NULL;
70
71 while( *_c ){
72 char c = *_c;
73
74 if( lstart == NULL ){
75 lstart = _c;
76 }
77
78 if( c == '\n' ){
79 *_c = '\0';
80 u64 steamid;
81 char uname[48];
82 sscanf( lstart, "%lu,%s", &steamid, uname );
83 for( int i=0; i<48; i ++ ){
84 if( uname[i] == '\0' ) break;
85 if( uname[i] < ' ' || uname[i] > '~' ) uname[i] = '?';
86 }
87 lstart = NULL;
88 db_updateuser( steamid, uname, 1 );
89 }
90
91 _c ++;
92 }
93
94 free( data );
95
96 char *names[] = {
97 "sr002-local-mp_mtzero:Megapark Green",
98 "sr002-local-mp_mtzero:Megapark Blue",
99 "sr002-local-mp_mtzero:Megapark Yellow",
100 "sr002-local-mp_mtzero:Megapark Red",
101 "sr002-local-mp_mtzero:Coastal Run",
102 "sr002-local-mp_mtzero:Docks Jumps",
103 };
104
105 for( int i=0; i<6; i++ ){
106 char fn[ 4096 ];
107 sprintf( fn, "%s/00%d-track.csv", folder,i );
108
109 data = sl_file_read_text( fn, &sz );
110 _c = data, lstart = NULL;
111
112 while( *_c ){
113 char c = *_c;
114
115 if( lstart == NULL ){
116 lstart = _c;
117 }
118
119 if( c == '\n' ){
120 *_c = '\0';
121 int id, s0, score;
122 u64 steamid;
123
124 sscanf( lstart, "%d,%d,%d,%lu", &id, &s0, &score, &steamid );
125 lstart = NULL;
126 db_writeusertime( names[i], steamid, score, 1 );
127 }
128
129 _c ++;
130 }
131
132 free( data );
133
134 }
135 }