X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=gameserver.c;h=20f4e323c5d1b79a9875b21f3ce92509da75d82f;hb=1d8d9366022c064ef56d80d463c90a79721c6243;hp=840f9d08a40031a2b3e2111d89e552603535b133;hpb=7e1fe6c7931ba4492aa10ac5eebc316b74fb5dac;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/gameserver.c b/gameserver.c index 840f9d0..20f4e32 100644 --- a/gameserver.c +++ b/gameserver.c @@ -456,6 +456,62 @@ static u32 gameserver_get_current_week(void){ return time(NULL) / (7*24*60*60); } +static enum request_status gameserver_cat_table( + vg_msg *msg, + const char *mod, const char *route, u32 week, const char *alias ) +{ + char table_name[ DB_TABLE_UID_MAX ]; + if( !db_get_highscore_table_name( mod, route, week, table_name ) ) + return k_request_status_out_of_memory; + + char buf[512]; + vg_str q; + vg_strnull( &q, buf, 512 ); + vg_strcat( &q, "SELECT * FROM \"" ); + vg_strcat( &q, table_name ); + vg_strcat( &q, "\" ORDER BY time DESC LIMIT 10;" ); + if( !vg_strgood(&q) ) + return k_request_status_out_of_memory; + + sqlite3_stmt *stmt = db_stmt( q.buffer ); + if( !stmt ) + return k_request_status_database_error; + + vg_msg_frame( msg, alias ); + for( u32 i=0; i<10; i ++ ){ + int fc = sqlite3_step( stmt ); + + if( fc == SQLITE_ROW ){ + i32 time = sqlite3_column_int( stmt, 1 ); + i64 steamid_i64 = sqlite3_column_int64( stmt, 0 ); + u64 steamid = *((u64 *)&steamid_i64); + + if( steamid == k_connection_unauthorized ) + continue; + + vg_msg_frame( msg, "" ); + vg_msg_wkvu32( msg, "time", time ); + vg_msg_wkvu64( msg, "steamid", steamid ); + + char username[32]; + if( db_getuserinfo( steamid, username, sizeof(username), NULL ) ) + vg_msg_wkvstr( msg, "username", username ); + vg_msg_end_frame( msg ); + } + else if( fc == SQLITE_DONE ){ + break; + } + else { + log_sqlite3( fc ); + break; + } + } + + sqlite3_finalize( stmt ); + vg_msg_end_frame( msg ); + return k_request_status_ok; +} + static void gameserver_process_user_request( db_request *db_req ){ struct user_request_thread_data *inf = (void *)db_req->data; SteamNetworkingMessage_t *msg = inf->msg; @@ -490,67 +546,17 @@ static void gameserver_process_user_request( db_request *db_req ){ const char *route = vg_msg_getkvstr( &data, "route" ); u32 week = vg_msg_getkvu32( &data, "week", 0 ); - char table_name[ DB_TABLE_UID_MAX ]; - if( !db_get_highscore_table_name( mod, route, week, table_name ) ){ - gameserver_request_respond( k_request_status_out_of_memory, - res, NULL, msg ); - return; - } - - char buf[512]; - vg_str q; - vg_strnull( &q, buf, 512 ); - vg_strcat( &q, "SELECT * FROM \"" ); - vg_strcat( &q, table_name ); - vg_strcat( &q, "\" ORDER BY time DESC LIMIT 10;" ); - if( !vg_strgood(&q) ) { - gameserver_request_respond( k_request_status_out_of_memory, - res, NULL, msg ); - return; + if( week == NETWORK_LEADERBOARD_CURRENT_WEEK ){ + gameserver_cat_table( &body, mod, route, + gameserver_get_current_week(), "rows_weekly" ); } - - sqlite3_stmt *stmt = db_stmt( q.buffer ); - - if( !stmt ){ - gameserver_request_respond( k_request_status_database_error, - res, NULL, msg ); - return; - } - - vg_msg_frame( &body, "rows" ); - for( u32 i=0; i<10; i ++ ){ - int fc = sqlite3_step( stmt ); - - if( fc == SQLITE_ROW ){ - i32 time = sqlite3_column_int( stmt, 1 ); - i64 steamid_i64 = sqlite3_column_int64( stmt, 0 ); - u64 steamid = *((u64 *)&steamid_i64); - - if( steamid == k_connection_unauthorized ) - continue; - - vg_msg_frame( &body, "" ); - vg_msg_wkvu32( &body, "time", time ); - vg_msg_wkvu64( &body, "steamid", steamid ); - - char username[32]; - if( db_getuserinfo( steamid, username, sizeof(username), NULL ) ){ - vg_msg_wkvstr( &body, "username", username ); - } - - vg_msg_end_frame( &body ); - } - else if( fc == SQLITE_DONE ){ - break; - } - else { - log_sqlite3( fc ); - break; - } + else if( week == NETWORK_LEADERBOARD_ALLTIME_AND_CURRENT_WEEK ){ + gameserver_cat_table( &body, mod, route, 0, "rows" ); + gameserver_cat_table( &body, mod, route, + gameserver_get_current_week(), "rows_weekly" ); } - - sqlite3_finalize( stmt ); - vg_msg_end_frame( &body ); + else + gameserver_cat_table( &body, mod, route, week, "rows" ); if( body.error != k_vg_msg_error_OK ){ gameserver_request_respond( k_request_status_out_of_memory,