You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

235 lines
7.1 KiB

#include <sourcemod>
#include <ripext>
#include <tf2_stocks>
#include <tf2>
#define PLUGIN_VERSION "1.0"
public Plugin myinfo = {
name = "Facti13 Backend Integration",
author = "gsd",
description = "Update server info directly without RCON",
version = PLUGIN_VERSION,
url = "https://tf2.pblr-nyk.pro"
}
/* CONVAR */
Handle g_server_id_convar = INVALID_HANDLE;
Handle g_api_secret_key_convar = INVALID_HANDLE;
Handle g_api_gateway_convar = INVALID_HANDLE;
char g_server_id[32];
char g_secretkey[64];
char g_gateway[128];
char g_cookie[128];
char g_url[128];
Handle g_timer = INVALID_HANDLE;
int g_lastupdate = 0;
bool g_warned = true;
bool g_setuped = false;
bool g_updating = false;
stock SetupConVar() {
g_server_id_convar = CreateConVar("sm_fbi_server_id", "srv8", "fbi server id", FCVAR_PROTECTED);
g_api_secret_key_convar = CreateConVar("sm_fbi_secretkey", "123456789", "fbi secret key", FCVAR_PROTECTED);
g_api_gateway_convar = CreateConVar("sm_fbi_gateway", "http://192.168.3.50:8080/api/server/%s", "fbi gateway", FCVAR_PROTECTED);
//
HookConVarChange(g_server_id_convar, OnServerIdChanged);
HookConVarChange(g_api_secret_key_convar, OnSecretKeyChanged);
HookConVarChange(g_api_gateway_convar, OnGatewayChanged);
//
GetConVarString(g_server_id_convar, g_server_id, sizeof(g_server_id));
GetConVarString(g_api_secret_key_convar, g_secretkey, sizeof(g_secretkey));
GetConVarString(g_api_gateway_convar, g_gateway, sizeof(g_gateway));
//
UpdateUrlData();
}
stock UnSetupConvar() {
UnhookConVarChange(g_server_id_convar, OnServerIdChanged);
UnhookConVarChange(g_api_secret_key_convar, OnSecretKeyChanged);
UnhookConVarChange(g_api_gateway_convar, OnGatewayChanged);
}
public OnServerIdChanged(Handle:cvar, const String:oldVal[], const String:newVal[]) {
strcopy(g_server_id, sizeof(g_server_id), newVal);
LogMessage("[FBI] Server id now: %s", g_server_id);
UpdateUrlData();
}
public OnSecretKeyChanged(Handle:cvar, const String:oldVal[], const String:newVal[]) {
strcopy(g_secretkey, sizeof(g_secretkey), newVal);
LogMessage("[FBI] Secret key now lenght: %d", strlen(g_secretkey));
UpdateUrlData();
}
public OnGatewayChanged(Handle:cvar, const String:oldVal[], const String:newVal[]) {
strcopy(g_gateway, sizeof(g_gateway), newVal);
LogMessage("[FBI] Gateway now: %s", g_gateway);
UpdateUrlData();
}
stock UpdateUrlData(){
g_setuped = false;
if (strlen(g_server_id)>0 && strlen(g_secretkey)>0){
Format(g_url, sizeof(g_url), g_gateway, g_server_id);
Format(g_cookie, sizeof(g_cookie), "secretkey=%s", g_secretkey);
g_setuped = true;
LogMessage("[FBI] Successful set URL and SecretKey");
} else
LogError("[FBI] Failed URL and SecretKey");
}
stock HTTPRequest createRequest() {
HTTPRequest client = INVALID_HANDLE;
if (strlen(g_url)>0) {
client = new HTTPRequest(g_url);
client.SetHeader("Cookie", g_cookie);
client.Timeout = 3;
} else {
LogMessage("[FBI] Client not builded");
}
return client;
}
stock JSONObject createPayload() {
JSONObject payload = new JSONObject();
payload.SetBool("status", true);
payload.SetInt("player_count", GetClientCount(true));
payload.SetInt("max_players", MaxClients);
char map_name[128];
GetCurrentMap(map_name, sizeof(map_name));
payload.SetString("map_name", map_name);
JSONArray players = new JSONArray();
for(int client = 0; client <= MAXPLAYERS; client++) {
if (IsValidClient(client)) {
JSONObject player = new JSONObject();
/* Name */
char name[64];
GetClientName(client, name, sizeof(name));
player.SetString("name", name);
/* Score */
player.SetInt("score", GetClientFrags(client))
/* Duration */
char duration[16];
int ct = RoundFloat(GetClientTime(client));
int h = ct / 3600;
int m = ct % 3600 / 60;
int s = ct % 60;
Format(duration, sizeof(duration), "%02d:%02d:%02d", h, m, s);
player.SetString("duration", duration);
/* Id */
player.SetInt("id", GetClientUserId(client));
/* Ip */
char ip[32];
GetClientIP(client, ip, sizeof(ip), false);
player.SetString("ip", ip);
/* Loss */
player.SetInt("loss",RoundFloat(GetClientAvgLoss(client, NetFlow_Both)*1000.0));
/* Ping */
player.SetInt("ping",RoundFloat(GetClientLatency(client, NetFlow_Both)*1000.0));
/* State */
player.SetString("state", "active")
/* Steam 2 так надо, не надо спрашивать почему*/
char steam2[32];
GetClientAuthId(client, AuthId_Steam3, steam2, sizeof(steam2));
player.SetString("steam2", steam2);
/* Position on map */
float pos[3];
GetClientAbsOrigin(client, pos);
player.SetFloat("pos_x", pos[0]);
player.SetFloat("pos_y", pos[1]);
player.SetFloat("pos_z", pos[2]);
/* Player class */
player.SetInt("clz", TF2_GetPlayerClass(client));
/* Player team */
player.SetInt("team", TF2_GetClientTeam(client));
/* push */
players.Push(player);
}
}
payload.Set("players", players);
return payload;
}
stock UpdateStatus(){
if (!g_setuped) return;
if (g_updating) return;
if (GetTime() - g_lastupdate < 5) return;
g_updating = true;
JSONObject payload = createPayload();
createRequest().Post(payload, Request_Callback);
g_lastupdate = GetTime();
}
static void Request_Callback(HTTPResponse response, any value){
g_updating = false;
if (response.Status == HTTPStatus_OK){
if(!g_warned) {
LogMessage("Success send payload, after error");
g_warned = true;
}
return;
}
else{
if(g_warned) {
LogMessage("Failed response! Code: %i", response.Status);
g_warned = false;
}
return;
}
}
stock IsValidClient(int client){
if(client > 4096){
client = EntRefToEntIndex(client);
}
if(client < 1 || client > MaxClients) return false;
if(!IsClientInGame(client)) return false;
if(IsFakeClient(client)) return false;
return true;
}
public OnPluginStart() {
SetupConVar();
RegAdminCmd("fbi_test", TestUpdate, ADMFLAG_ROOT);
g_timer = CreateTimer(15, timerCall, 0, TIMER_REPEAT);
}
public Action timerCall(Handle:t, any:d) {
UpdateStatus();
return Plugin_Continue;
}
public OnPluginEnd() {
UnSetupConvar();
if (g_timer != INVALID_HANDLE) {
KillTimer(g_timer);
}
}
public Action TestUpdate(int client, int args){
UpdateStatus();
ReplyToCommand(client, "OK! Last update: %d", g_lastupdate)
return Plugin_Handled;
}
public OnClientDisconnect(int client) {
UpdateStatus();
}
public OnClientAuthorized(int client) {
UpdateStatus();
}
public OnMapStart() {
UpdateStatus();
}
public OnMapEnd() {
UpdateStatus();
}