Bot de Discord - GameQ + PHP + Plugin
#1
Bueno, este "bot" más que nada solo muestra la cantidad de jugadores/maximo y el mapa actual con la ip.
Necesitamos:
- Pagina con PHP
- GameQ PHP https://github.com/Austinb/GameQ
- VPS para montar el .js

Lo primero que necesitamos es un token para el bot, para eso nos vamos a https://discord.com/developers/applications
Creamos una aplicación, después seleccionamos la app y nos vamos a Bot para copiar el token
[Imagen: wPOzwwQ.png]

Después necesitaremos creare 2 php, uno que se dedicará a tomar todos los datos del servidor de GameQ y otro que servirá para reducir esos datos y tomarlos con variables que definiremos.

Primer PHP:
Este php recolectará toda la información del servidor con los datos del GameQ
Código PHP:
<?php
require_once 'GameQ/Autoloader.php';
ini_set('display_errors'1);
ini_set('display_startup_errors'1);
error_reporting(E_ALL);

$servers = [ 'type' => 'cs16''host' => 'IP:PUERTO', ];
$GameQ = new \GameQ\GameQ(); // or $GameQ = \GameQ\GameQ::factory();
$GameQ->addServer($servers);
$GameQ->setOption('timeout'5000); // seconds

$info $GameQ->process();

$myObj NULL;
if(!
is_object($myObj))
{
    $myObj = new stdClass;
}

$myJSON json_encode($info);
echo 
$myJSON

Segundo PHP:
Este php tomará los datos de json para que se puedan mostrar con las variables que definiremos.
Código PHP:
<?php
/********************
by: Mukaaxz;
*********************/
//Archivo JSON:
$eljson file_get_contents('LINK DEL PRIMER PHP DONDE ESTAN TODAS LAS VARIABLES DE GAMEQ');

//Convertir JSON en Array:
$data json_decode($eljsonTRUE);

$Jugadores 0;
$Maximo 0;
$Nombre "";
$IP "";
//Obtenemos lo que necesitamos del Array:
foreach ($data as $valor
{
$IP $valor['gq_address'];
$Jugadores $valor['gq_numplayers'];
$Maximo $valor['gq_maxplayers'];
$Nombre $valor['gq_name'];
$Name  $valor['gq_hostname'];
$Puerto $valor['gq_port_client'];
$Mapa $valor['gq_mapname'];
}
$myObj NULL;
if(!
is_object($myObj))
{
    $myObj = new stdClass;
}
$myObj->IP=$IP;
$myObj->Jugadores=$Jugadores;
$myObj->Maximo=$Maximo;
$myObj->Nombre=$Nombre;
$myObj->Name=$Name;
$myObj->Puerto=$Puerto;
$myObj->Mapa=$Mapa;

$myJSON=json_encode($myObj);
echo 
$myJSON;
?>
En este caso definimos:
IP
Jugadores
Maximo
Nombre
Name
Puerto
Mapa


Creamos el .js que se debe subir a la VPS
Recuerda cambiar el Token del bot
Yo lo guardé como 1.js
Para instalar las dependencias ejecutamos
npm install discord.js y npm install request

Código PHP:
const request = require('request');
const 
Discord = require('discord.js');
const 
bot = new Discord.Client();
var 
prefix '!';
var 
currentPlayers;
var 
maxPlayers;
var 
mapa;
var 
name;
var 
ip;
var 
puerto;

bot.login('Token de bot');

console.log(`[AlliedModders] Script Iniciado Correctamente`)
bot.on('ready', () => {
    setInterval(function() 
    {
            request('AQUI VA EL LINK DEL 2DO PHP, DONDE DEFINIMOS LAS VARIABLES PROPIAS', function (errorresponsebody) {
            console.error('error:'error); // Print the error if one occurred
            console.log('statusCode:'response && response.statusCode); // Print the response status code if a response was received

            body JSON.parse(body)

            currentPlayers body.Jugadores;
            maxPlayers body.Maximo;
            mapa body.Mapa;
            name body.Nombre;
            ip body.IP;
            puerto body.Puerto;
            console.log(`Se han actualizado los datos query - php`)
            bot.user.setActivity(`${currentPlayers} / ${maxPlayers} (${ip}:${puerto}) (${mapa}`, ({type"WATCHING"}))
        });
    },60000)
})
bot.on("message"message => 
{
    const args message.content.slice(prefix.length).split(/ +/);
    const command args.shift().toLowerCase();

if (
command === 'datos1'
{
message.channel.send(`
Información de: 
${name}
IP: 
${ip}
Conectados: 
${currentPlayers}/${maxPlayers}
Mapa actual: 
${mapa}`);
}
}); 

El comando que yo usaba era datos1, pero en este caso le pueden poner lo que quieran
Está definido para que se use el ! y luego el comando
Ejemplo: !datos1

Creditos a Mukaaxz que me ayudó con el json.

También pueden usarlo para mostrar los datos en su servidor con el modulo gRIP:

Código PHP:
#include <amxmisc>
#include <grip>

public plugin_init()
{
 
register_plugin("Datos de 1 servidor""1.0""AlliedModders")
 
register_clcmd("say /datos1""Datos1")
}
public 
Datos1(id)
{
 new 
szURL[256]
 
formatex(szURLcharsmax(szURL), "LINK DEL SEGUNDO PHP DONDE TENEMOS LAS VARIABLES DEFINIDAS")
 
grip_request(szURLEmpty_GripBodyGripRequestTypeGet"CheckDatos1"Empty_GripRequestOptions,id)
 
print_EasyChat(id,"\g[AlliedModders] \nCargando informacion del Servidor...")
}
public 
CheckDatos1(id)
{
 new 
GripResponseState:iState grip_get_response_state()
 if(
iState == GripResponseStateError)
 {
 
print_EasyChat(id,"\g[AlliedModders] \nHubo un error al consultar los datos")
 return
 }
 new 
XD[512]
 
grip_get_response_body_string(XDcharsmax(XD))

 new 
GripJSONValue:szData grip_json_parse_response_body(XDcharsmax(XD))

 if(
szData == Invalid_GripJSONValue)
 {
 
print_EasyChat(id,"\g[AlliedModders] \nLos datos ingresados fueron rechazados")
 
server_print("JSON Invalido: [ %d ]"Invalid_GripJSONValue)
 return
 }

 new 
jugadores grip_json_get_number(grip_json_object_get_value(szData"Jugadores"))
 new 
Maximo grip_json_get_number(grip_json_object_get_value(szData"Maximo"))

 new 
len[2000], menu
 formatex
(lencharsmax(len), "\r[AlliedModders]\w Informacion Servidor 1")
 
menu menu_create(len"handler_menu_datos1")

 
menu_addtext2menufmt"\wNOMBRE DEL SERVIDOR"));
 
menu_addtext2menufmt"\wConectados: \y%d/%d",jugadores,Maximo));
 
 
menu_setprop(menuMPROP_EXITNAME"\w[\rSALIR\w]")
 
menu_display(idmenu0)

 
grip_destroy_json_value(szData)
}
public 
handler_menu_datos1(idmenuitem
{
 if(
item==MENU_EXIT)
 return

 return

Creditos a Hypnotize por su guía del gRIP y a metita por algunas cosas que le pedí en el pasado


Foto del Bot en Discord:
[Imagen: g2TKMba.png]
Foto del Plugin [usé un servidor de TS3]
[Imagen: Swqcs6e.jpg]
Responder
#2
No deberias usar file_get_contents para invocar una funcion en otro archivo, si estan en el mismo servidor, en el mismo virtualhost simplemente podes meterlo en una función, hacer un include reemplazando el file_get_contents y luego llamar a la función.
[Imagen: paypalqr.png]
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)