diff --git a/scripting/EventHandlers.sp b/scripting/EventHandlers.sp index 3ef8211..19c96ab 100644 --- a/scripting/EventHandlers.sp +++ b/scripting/EventHandlers.sp @@ -11,7 +11,7 @@ public Action:Event_RoundStart(Handle:event, const String:name[], bool:dontBroad } public Action:Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast){ - SubmittEventActiveClients(); + SubmittEventActiveClients("round_winner"); new team_id = GetEventInt(event, "winner"); SubmittEventWinnerTeam(team_id); SubmittEventRoundEnd(); @@ -19,11 +19,11 @@ public Action:Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadca } public Action:Event_PlayerDisconnect(Handle:event, const String:name[], bool:dontBroadcast){ - SubmittEventActiveClients(); + SubmittEventActiveClients("disconnect"); return Plugin_Continue; } public Action:Event_PlayerChangedTeam(Handle:event, const String:name[], bool:dontBroadcast){ - SubmittEventActiveClients(); + SubmittEventActiveClients("change_team"); return Plugin_Continue; } diff --git a/scripting/Interfaces.sp b/scripting/Interfaces.sp index 9df90f5..c5ccc95 100644 --- a/scripting/Interfaces.sp +++ b/scripting/Interfaces.sp @@ -13,29 +13,86 @@ #define VAR_SESSION_ID "session_id" public void HttpResponseCallback(bool success, const char[] error, System2HTTPRequest request, System2HTTPResponse response, HTTPRequestMethod method) { + if (success) { + char mimeType[128]; + response.GetHeader("Content-Type", mimeType, sizeof(mimeType)); + if(StrEqual(mimeType, "application/json", false)){ + char[] content = new char[response.ContentLength + 1]; + response.GetContent(content, response.ContentLength + 1); + JSON_Object obj = json_decode(content) + + char action[256]; + obj.GetString("action", action, sizeof(action)); + + if(StrEqual(action, "balance", false)){ + JSON_Array teamA = view_as(obj.GetObject("teamA")); + JSON_Array teamB = view_as(obj.GetObject("teamB")); + + /* strmap for teamA */ + StringMap teamMapA = new StringMap(); + for (new i = 0; i < teamA.Length; i++) { + new teamId = teamA.GetObject(i).GetInt("team"); + char playerId[SNAME_LEN]; + teamA.GetObject(i).GetString("id", playerId, sizeof(playerId)); + teamMapA.setValue(playerId, teamId); + } + + /*strmap for teamB */ + StringMap teamMapB = new StringMap(); + for (new i = 0; i < teamB.Length; i++){ + new teamId = teamB.GetObject(i).GetInt("team"); + new playerId = teamB.GetObject(i).GetString("id"); + teamMapB.setValue(playerId, teamId); + } + + for(new i = 1; i <= MaxClients;i++){ + new String:clientId[DEFAULT_LEN]; + + /* check client auth */ + if(!GetClientAuthId(i, AuthId_SteamID64, clientId, DEFAULT_LEN, true)){ + continue; + } + + /* change team when nessesary */ + int mapTeamId; + if(teamMapAGetValue(clientId, &value)){ + ChangeTeam(clientId, value); + }else if(teamMapAGetValue(clientId, &value)){ + ChangeTeam(clientId, value); + }else{ + ChangeTeam(clientId, 0); + } + } + } + + obj.Cleanup(); + delete obj; + } + } } -public void SubmittViaHTTP(char[] jsonString){ +public void SubmittViaHTTP(char[] jsonString, char[] type){ new String:url[SNAME_LEN]; + # TODO type switch case Format(url, sizeof(url), "http://localhost:%d/single-event?session=%d", GetConVarInt(FindConVar(VAR_TARGET_PORT)), GetConVarInt(FindConVar(VAR_SESSION_ID)) ); - + System2HTTPRequest httpRequest = new System2HTTPRequest(HttpResponseCallback, url); httpRequest.SetHeader("Content-Type", "application/json"); httpRequest.SetData(jsonString); httpRequest.POST(); } -public void SubmittEventActiveClients(){ +public void SubmittEventActiveClients(const char[] type){ /* primary json */ JSON_Object obj = new JSON_Object(); obj.SetString("etype", "active_players"); obj.SetInt("timestamp", GetTime()); - + /* generate players */ JSON_Array players = new JSON_Array(); - + for(new i = 1; i <= MaxClients;i++){ if(!IsClientConnected(i)){ continue; @@ -46,10 +103,10 @@ public void SubmittEventActiveClients(){ new String:clientId[DEFAULT_LEN]; new String:clientName[SNAME_LEN]; if(!GetClientAuthId(i, AuthId_SteamID64, clientId, DEFAULT_LEN, true)){ - continue; - } + continue; + } GetClientName(i, clientName, SNAME_LEN); - + player.SetString("id", clientId); player.SetString("name", clientName); player.SetInt("team", GetClientTeam(i)); @@ -58,10 +115,14 @@ public void SubmittEventActiveClients(){ /* add players array to primary object */ obj.SetObject("players", players); - + obj.SetString("type", type); + char output[2048]; obj.Encode(output, sizeof(output)); - SubmittViaHTTP(output); + SubmittViaHTTP(output, type); + + obj.Cleanup(); + delete obj; } public void SubmittEventMapInformation(){ @@ -79,7 +140,7 @@ public void SubmittEventMapInformation(){ } public void SubmittEventWinnerTeam(int team_id){ - + JSON_Object obj = new JSON_Object(); obj.SetString("etype", "winner"); obj.SetInt("timestamp", GetTime()); @@ -97,5 +158,6 @@ public void SubmittEventRoundEnd(){ char output[2048]; obj.Encode(output, sizeof(output)); + SubmittEventActiveClients("round_end") SubmittViaHTTP(output); }