plane/infolan.sp

267 lines
7.7 KiB
SourcePawn
Raw Permalink Normal View History

#include <sourcemod>
#include <sdktools>
#include <cstrike>
#include "socket.inc"
#define MY_SOCKET_IP "localhost"
2021-05-20 00:53:06 +02:00
//#define MY_SOCKET_IP "127.0.0.1"
2021-05-20 15:19:34 +02:00
#define MY_SOCKET_PORT 3000
2021-05-16 12:39:31 +02:00
#define STEAMID_LENGTH 128
char teamCT[10][128];
char teamT[10][128];
int nbJoueursCT = 0;
int nbJoueursT = 0;
/* liste de tous les clients connectés */
int listClients[20];
int nbClients = 0;
2021-05-29 01:16:18 +02:00
2021-05-19 00:30:56 +02:00
int port = -1;
public Plugin myinfo =
{
name = "InfoLan 2021 Bot",
author = "rick@gnous.eu",
description = "Plugin communiquant avec le bot discord \
https://github.com/InfoLAN/cs-picker afin dautomatiser \
lInfoLan 2021",
2021-06-05 18:29:32 +02:00
version = "1.6.2",
url = "https://git.gnous.eu/Rick/infolanBot"
};
2021-05-18 15:43:05 +02:00
public void OnPluginStart()
{
HookEvent("player_connect_full", SetTeamPlayer);
HookEvent("cs_win_panel_round", UpdateScoreBoard);
2021-05-29 03:27:38 +02:00
HookEvent("cs_win_panel_match", FinCarte);
2021-05-18 15:43:05 +02:00
RegServerCmd("!team", SetTeam);
RegServerCmd("!addTeam", AjoutJoueur);
2021-05-18 15:43:05 +02:00
/* juste pour avoir un truc jolie */
PrintToServer("\n _____ __ _ _ _");
PrintToServer("|_ _| / _| | | /\\ | \\ | |");
PrintToServer(" | | _ __ | |_ ___ | | / \\ | \\| |");
PrintToServer(" | | | '_ \\| _/ _ \\| | / /\\ \\ | . ` |");
PrintToServer(" _| |_| | | | || (_) | |____ / ____ \\| |\\ |");
PrintToServer("|_____|_| |_|_| \\___/|______/_/ \\_\\_| \\_|");
PrintToServer("\n Le plugin a démarré avec succès !\n");
PrintToServer("Autheur: rick@gnous.eu");
PrintToServer("Depot git: https://git.gnous.eu/Rick/infolanBot");
PrintToServer("Depot github: https://github.com/InfoLAN/infolanCSGOplugin");
PrintToServer("Licence: GPL3\n");
2021-06-05 18:28:05 +02:00
LogMessage("Le plugin a démarré avec succès !");
2021-05-18 15:43:05 +02:00
}
/**
* Fonction trigger par levent cs_win_panel_matchk
* Envoie linformation que le match est fini.
*/
2021-05-29 03:27:38 +02:00
public void FinCarte(Event event, const char[] name, bool dontBroadcast)
{
ServeurLibre();
}
/**
* Met le numéro de port dans la variable après le chargement de la config
*/
2021-05-19 00:30:56 +02:00
public void OnConfigsExecuted()
{
if (port < 0)
port = GetConVarInt(FindConVar("hostport"));
2021-06-05 18:28:05 +02:00
LogMessage("Port configuré :%d", port);
2021-05-19 00:30:56 +02:00
}
/**
* Lorsquune personne se connecte, vérifie sil peut se connecter.
* Si oui, la met dans la bonne équipe, sinon la kick.
*/
//public void OnClientAuthorized(int client, const char[] auth)
2021-05-20 00:53:06 +02:00
public void SetTeamPlayer(Event event, const char[] name, bool dontBroadcast)
2021-05-16 12:39:31 +02:00
{
char clientId[128];
int client = GetClientOfUserId(event.GetInt("userid"));
GetClientAuthId(client, AuthId_Steam2, clientId, sizeof(clientId));
if (!strcmp(clientId, "BOT", true)) { return; }
if (FindAdminByIdentity("steam", clientId) != INVALID_ADMIN_ID)
2021-05-16 12:39:31 +02:00
{
ChangeClientTeam(client, CS_TEAM_SPECTATOR);
listClients[nbClients] = client;
nbClients++;
}
else
{
bool allGood = GetClientAuthId(client, AuthId_SteamID64, clientId, sizeof(clientId));
if (allGood)
2021-05-16 12:39:31 +02:00
{
allGood = false;
2021-05-20 00:53:06 +02:00
int i = 0;
while (!allGood && i < sizeof(teamCT))
{
if (!strcmp(teamCT[i], clientId, false))
{
ChangeClientTeam(client, CS_TEAM_CT);
allGood = true;
listClients[nbClients] = client;
nbClients++;
}
else if (!strcmp(teamT[i], clientId, false))
{
ChangeClientTeam(client, CS_TEAM_T);
allGood = true;
listClients[nbClients] = client;
nbClients++;
}
i++;
}
if (!allGood)
{
KickClient(client, "Vous nêtes pas autorisé à suivre / jouer \
sur ce serveur");
}
2021-05-16 12:39:31 +02:00
}
}
}
/**
* Commande pour enregistrer les équipes:
* !team ct NomEquipe id1 id2 id3 id4 id5
2021-05-16 12:39:31 +02:00
*/
public Action SetTeam(int args)
{
char tmp[2058];
GetCmdArgString(tmp, 2058);
LogMessage("Commande !team reçu: %s", tmp);
if (args != 7)
LogMessage("!team: pas assez ou trop darguments données.");
char arg[128];
2021-05-16 12:39:31 +02:00
GetCmdArg(1, arg, sizeof(arg));
int team = (!strcmp(arg, "ct", false) ? 1 : 2);
GetCmdArg(2, arg, sizeof(arg));
if (team == 1)
ServerCommand("mp_teamname_1 %s", arg)
else
ServerCommand("mp_teamname_2 %s", arg)
2021-05-20 00:53:06 +02:00
/* on garde 7 pour éviter de mettre + de 5 personnes / équipe */
for(int i = 3; i <= 7 && i <= args; i++)
{
GetCmdArg(i, arg, sizeof(arg));
if (team == 1)
{
teamCT[nbJoueursCT] = arg;
nbJoueursCT++;
}
else
{
teamT[nbJoueursT] = arg;
nbJoueursT++;
}
}
return Plugin_Handled;
}
2021-06-05 17:43:26 +02:00
/**
* Commande pour ajouter un joueur dans une équipe
* !addTeam ct id1
*/
public Action AjoutJoueur(int args)
{
2021-06-05 18:28:05 +02:00
char tmp[2058];
GetCmdArgString(tmp, 2058);
LogMessage("Commande !team reçu: %s", tmp);
char arg[128];
GetCmdArg(1, arg, sizeof(arg));
int team = (!strcmp(arg, "ct", false) ? 1 : 2);
GetCmdArg(2, arg, sizeof(arg));
if (team == 1)
{
2021-06-05 18:28:05 +02:00
teamCT[nbJoueursCT] = arg;
nbJoueursCT++;
}
else
{
2021-06-05 18:28:05 +02:00
teamT[nbJoueursT] = arg;
nbJoueursT++;
}
}
/**
* Envoie une requete POST au bot pour lui indiquer que la partie est finie
* et que le serveur est libre.
*/
public void ServeurLibre()
2021-05-18 15:43:05 +02:00
{
2021-06-05 18:28:05 +02:00
LogMessage("Envoi socket pour serveur libre.");
2021-05-18 15:43:05 +02:00
Handle socket = SocketCreate(SOCKET_TCP, OnSocketError);
2021-05-19 00:30:56 +02:00
SocketConnect(socket, SocketEnvoieVictoire, OnSocketReceive, OnSocketDisconnected, MY_SOCKET_IP, MY_SOCKET_PORT);
2021-05-18 15:43:05 +02:00
}
/**
* Envoie une requete POST au bot avec les nouveaux scores
*/
2021-05-20 00:53:06 +02:00
public void UpdateScoreBoard(Event event, const char[] name, bool dontBroadcast)
2021-05-19 00:30:56 +02:00
{
2021-06-05 18:28:05 +02:00
LogMessage("Envoi socket pour maj les scores.");
2021-05-20 00:53:06 +02:00
Handle socket = SocketCreate(SOCKET_TCP, OnSocketError);
SocketConnect(socket, SocketUpdateScore, OnSocketReceive, OnSocketDisconnected, MY_SOCKET_IP, MY_SOCKET_PORT);
}
/**
* Socket envoyant le score à la fin du round
*/
2021-05-20 00:53:06 +02:00
public void SocketUpdateScore(Handle socket, any arg)
{
char requestStr[1024];
char json[64];
2021-05-29 03:15:03 +02:00
FormatEx(json, sizeof(json), "{\"port\": %d, \"ct\": %d, \"t\": %d}",
port, CS_GetTeamScore(CS_TEAM_CT), CS_GetTeamScore(CS_TEAM_T));
2021-05-19 00:30:56 +02:00
FormatEx(
requestStr,
sizeof(requestStr),
2021-05-20 00:53:06 +02:00
"POST /api/csgo/updatescore HTTP/1.1\r\n\
Content-Type: application/json\r\n\
Content-Length: %d\r\n\r\n%s", strlen(json), json
2021-05-19 00:30:56 +02:00
);
SocketSend(socket, requestStr, sizeof(requestStr));
2021-05-20 00:53:06 +02:00
SocketDisconnect(socket);
CloseHandle(socket);
2021-05-19 00:30:56 +02:00
}
2021-05-18 15:43:05 +02:00
/**
* Socket envoyant la requete indiquant la fin du match
*/
2021-05-19 00:30:56 +02:00
public void SocketEnvoieVictoire(Handle socket, any arg)
2021-05-18 15:43:05 +02:00
{
char requestStr[1024];
char json[64];
FormatEx(json, sizeof(json), "{\"serverport\": %d, \"available\": true}", port);
2021-05-18 15:43:05 +02:00
FormatEx(
requestStr,
sizeof(requestStr),
"POST /api/csgo/matchend HTTP/1.1\r\n\
Content-Type: application/json\r\n\
Content-Length: %d\r\n\r\n%s", strlen(json), json
2021-05-19 00:30:56 +02:00
);
SocketSend(socket, requestStr, sizeof(requestStr));
2021-05-20 00:53:06 +02:00
SocketDisconnect(socket);
CloseHandle(socket);
2021-05-18 15:43:05 +02:00
}
/* Méthodes sockets */
2021-05-20 01:35:58 +02:00
public void OnSocketReceive(Handle socket, const char[] datas, const int data, any arg) {}
public void OnSocketDisconnected(Handle socket, any arg)
{
CloseHandle(socket);
}
2021-06-05 18:28:05 +02:00
public void OnSocketError(Socket socket, const int errorType, const int errorNum, any hFile)
{
LogMessage("Socket error %d (errno %d)", errorType, errorNum);
CloseHandle(socket);
2021-05-20 00:53:06 +02:00
}