X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=gameserver.c;h=840f9d08a40031a2b3e2111d89e552603535b133;hb=f6bc1299d5b30e1aba87e6ce084bcd7eed22975f;hp=1d67536e314d408f24738a66714128b4d32a45a0;hpb=6b036c10d38e7d691eb0bc06c29235b450c3ff10;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/gameserver.c b/gameserver.c index 1d67536..840f9d0 100644 --- a/gameserver.c +++ b/gameserver.c @@ -321,6 +321,24 @@ static int packet_minsize( SteamNetworkingMessage_t *msg, u32 size ){ } } +struct db_set_username_thread_data { + u64 steamid; + char username[ NETWORK_USERNAME_MAX ]; +}; + +static void gameserver_update_db_username( db_request *db_req ){ + struct db_set_username_thread_data *inf = (void *)db_req->data; + + if( inf->steamid == k_connection_unauthorized ) + return; + + int admin = 0; + if( inf->steamid == 76561198072130043 ) + admin = 2; + + db_updateuser( inf->steamid, inf->username, admin ); +} + static void gameserver_rx_200_300( SteamNetworkingMessage_t *msg ){ netmsg_blank *tmp = msg->m_pData; @@ -353,6 +371,16 @@ static void gameserver_rx_200_300( SteamNetworkingMessage_t *msg ){ u32 propsize = sizeof(netmsg_playerusername) + chs + 1; gameserver_send_to_all( client_id, prop, propsize, k_nSteamNetworkingSend_Reliable ); + + /* update database about this */ + db_request *call = db_alloc_request( + sizeof(struct db_set_username_thread_data) ); + struct db_set_username_thread_data *inf = (void *)call->data; + inf->steamid = get_connection_authsteamid( msg ); + vg_strncpy( client->username, inf->username, + sizeof(inf->username), k_strncpy_always_add_null ); + call->handler = gameserver_update_db_username; + db_send_request( call ); } else if( tmp->inetmsg_id == k_inetmsg_playerframe ){ /* propogate */ @@ -405,14 +433,11 @@ static void gameserver_request_respond( enum request_status status, SteamNetworkingMessage_t *msg ){ int client_id = gameserver_client_index( msg->m_conn ); u32 len = 0; - if( status == k_request_status_ok ){ + if( body ){ len = body->cur.co; - vg_success( "[%d#%d] Response: %d\n", client_id, (i32)res->id, status ); + vg_low( "[%d#%d] Response: %d\n", client_id, (i32)res->id, status ); vg_msg_print( body, len ); } - else{ - vg_warn( "[%d#%d] Response: %d\n", client_id, (i32)res->id, status ); - } res->status = status; @@ -427,6 +452,10 @@ struct user_request_thread_data { SteamNetworkingMessage_t *msg; }; +static u32 gameserver_get_current_week(void){ + return time(NULL) / (7*24*60*60); +} + 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; @@ -497,6 +526,9 @@ static void gameserver_process_user_request( db_request *db_req ){ 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 ); @@ -528,6 +560,45 @@ static void gameserver_process_user_request( db_request *db_req ){ gameserver_request_respond( k_request_status_ok, res, &body, msg ); } + else if( !strcmp( endpoint, "setlap" ) ){ + /* TODO: we can change userdata to be the client ID and store that in + * the client structure. it also would save us scanning the + * client array over and over..? + */ + u64 steamid = get_connection_authsteamid( msg ); + if( steamid == k_connection_unauthorized ){ + gameserver_request_respond( k_request_status_unauthorized, + res, NULL, msg ); + return; + } + + const char *mod = vg_msg_getkvstr( &data, "mod" ); + const char *route = vg_msg_getkvstr( &data, "route" ); + + char weekly_table[ DB_TABLE_UID_MAX ], + alltime_table[ DB_TABLE_UID_MAX ]; + + u32 week = gameserver_get_current_week(); + + if( !db_get_highscore_table_name( mod, route, 0, alltime_table ) || + !db_get_highscore_table_name( mod, route, week, weekly_table ) ){ + gameserver_request_respond( k_request_status_out_of_memory, + res, NULL, msg ); + return; + } + + i32 centiseconds = vg_msg_getkvi32( &data, "time", -1 ); + if( centiseconds < 5*100 ){ + gameserver_request_respond( k_request_status_client_error, + res, NULL, msg ); + return; + } + + db_writeusertime( alltime_table, steamid, centiseconds, 1 ); + db_writeusertime( weekly_table, steamid, centiseconds, 1 ); + + gameserver_request_respond( k_request_status_ok, res, NULL, msg ); + } else{ gameserver_request_respond( k_request_status_invalid_endpoint, res, NULL, msg );