Azerothcore tiene 4 formas de interactuar con el servidor mundial.
Los men煤s del juego y la consola son bastante autoexplicativos, sin embargo no siempre se puede administrar el servidor localmente ni las dos primeras opciones ofrecen muchas oportunidades de automatizaci贸n. Si quieres proporcionar una manera de acceder a tu servidor de forma remota, o dejar que el software lo administre entonces tienes dos opciones.
El acceso remoto es b谩sicamente una conexi贸n telnet y tiene todas las desventajas que trae una conexi贸n telnet. Estos ser铆an:
Sin embargo, tambi茅n tiene aspectos positivos, a saber:
El acceso remoto es bueno para ejecutar en un servidor local, y acceder a 茅l de forma segura a trav茅s de SSH para enviarle comandos. Su simplicidad es su fuerza. Adem谩s, est谩 integrado en la mayor铆a de las m谩quinas sin necesidad de configuraci贸n.
Son las siglas de Simple Object Access Protocol y es un formato para compartir datos estructurados entre m谩quinas. Es un an谩logo com煤n de xml a ReST y json, y permite que dos piezas de software interact煤en entre s铆 a pesar de ejecutarse en diferentes bases de c贸digo, lenguajes y sistemas operativos. Pasemos a los puntos d茅biles.
Y sus puntos fuertes.
En un formato m谩s simplificado: SOAP para los sitios web, telnet para la l铆nea de comandos.
account_access
en la base de datos de autenticaci贸n y asegurarse de que el realmID de su usuario es -1 (es decir, todos los reinos).Debido a su ubicuidad, telnet es f谩cil de usar desde casi cualquier lugar.
telnet localhost 3443
.Soap funciona con el est谩ndar HTTP POST. Toda la carga 煤til del mensaje es XML.
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns:ns1="urn:AC">
<SOAP-ENV:Body>
<ns1:executeCommand>
<command>server status</command>
</ns1:executeCommand>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
La respuesta ser谩 as铆:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns:ns1="urn:AC">
<SOAP-ENV:Body>
<ns1:executeCommandResponse>
<result>
AzerothCore rev. 6f4f0043c2ab+ 2021-05-18 02:16:59 +0200 (master branch) (Win64, RelWithDebInfo)
Connected players: 0. Characters in world: 0.
Connection peak: 0.
Server uptime: 5 second(s).
Update time diff: 10ms, average: 10ms.
</result>
</ns1:executeCommandResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
La respuesta al error es la siguiente
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns:ns1="urn:AC">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>Error 401: HTTP 401 Unauthorized</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Tienes que autentificarte poniendo el nombre de usuario y la contrase帽a en el URI de la siguiente manera http://soapuser:abcd1234@localhost:7878/
(esto tambi茅n se conoce como "basic auth"). No es necesario establecer la cabecera de la solicitud Content-Type: application/xml
. Por ahora.
Utilizando [SoapClient] incorporado(https://www.php.net/manual/en/class.soapclient.php)
$connection = new SoapClient(NULL, [
'location' => "http://:/",
'uri' => 'urn:AC',
'style' => SOAP_RPC,
'login' => 'soapuser',
'password' => 'abcd1234'
]);
echo $connection->executeCommand(new SoapParam('server info', 'command'));
Utilizando xml2js para analizar la respuesta. Por favor, aseg煤rese de sanear las entradas.
function AzerothCore_Soap(command) {
return new Promise((resolve, reject) => {
const req = http.request({
port: 7878,
method: "POST",
hostname: "localhost",
auth: "soapuser:abcd1234",
headers: { 'Content-Type': 'application/xml' }
}, res => {
res.on('data', async d => {
const xml = await xml2js.parseStringPromise(d.toString());
const body = xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"][0];
const fault = body["SOAP-ENV:Fault"];
if(fault) {
resolve({
faultCode: fault[0]["faultcode"][0],
faultString: fault[0]["faultstring"][0],
});
return;
}
const response = body["ns1:executeCommandResponse"];
if(response) {
resolve({
result: response[0]["result"][0]
});
return;
}
console.log(d.toString());
})
});
req.write(
'<SOAP-ENV:Envelope' +
' xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"' +
' xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"' +
' xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"' +
' xmlns:xsd="http://www.w3.org/1999/XMLSchema"' +
' xmlns:ns1="urn:AC">' +
'<SOAP-ENV:Body>' +
'<ns1:executeCommand>' +
'<command>'+command+'</command>' +
'</ns1:executeCommand>' +
'</SOAP-ENV:Body>' +
'</SOAP-ENV:Envelope>'
);
req.end();
});
}