homegaming-cs16rcon
Version:
Node.js ile HLDS CS 1.6 RCON komutları göndermek için basit bir kütüphane.
80 lines (69 loc) • 2.62 kB
JavaScript
const dgram = require('dgram');
/**
* HLDS RCON komutu gönderir.
* @param {string} host Sunucu IP adresi
* @param {number} port Sunucu portu
* @param {string} password RCON şifresi
* @param {string} command Gönderilecek komut
* @param {object} [options]
* @param {number} [options.timeout=8000] Kaç ms sonra zaman aşımı olacak
* @returns {Promise<string>} Sunucu cevabını döner
*/
function sendCommand(host, port, password, command, options = {}) {
const timeout = options.timeout || 8000;
return new Promise((resolve, reject) => {
const socket = dgram.createSocket('udp4');
let gotResponse = false;
function sendChallengeRequest() {
const packet = Buffer.concat([
Buffer.from([0xff, 0xff, 0xff, 0xff]),
Buffer.from('challenge rcon', 'ascii'),
]);
socket.send(packet, 0, packet.length, port, host, (err) => {
if (err) {
socket.close();
reject(new Error('Challenge isteği gönderilemedi: ' + err.message));
}
});
}
function sendRconCommand(challenge) {
const bodyStr = `rcon ${challenge} ${password} ${command}`;
const bodyBuf = Buffer.from(bodyStr + '\x00', 'ascii');
const packet = Buffer.concat([Buffer.from([0xff, 0xff, 0xff, 0xff]), bodyBuf]);
socket.send(packet, 0, packet.length, port, host, (err) => {
if (err) {
socket.close();
reject(new Error('RCON komutu gönderilemedi: ' + err.message));
}
});
}
socket.on('message', (msg) => {
gotResponse = true;
if (msg.length < 5) return;
const header = msg.slice(0, 4);
if (!header.equals(Buffer.from([0xff, 0xff, 0xff, 0xff]))) return;
const responseStr = msg.slice(4).toString('ascii').trim();
if (responseStr.startsWith('challenge rcon')) {
let parts = responseStr.split(' ');
let challenge = parts[2];
challenge = challenge.replace(/\0/g, '').replace(/(\r\n|\n|\r)/g, '').trim();
sendRconCommand(challenge);
} else if (responseStr.includes('Bad rcon_password')) {
socket.close();
reject(new Error('Hatalı RCON şifresi.'));
} else {
socket.close();
resolve(responseStr);
}
});
// Timeout kontrolü
setTimeout(() => {
if (!gotResponse) {
try { socket.close(); } catch (e) {}
reject(new Error('Zaman aşımı: sunucudan cevap gelmedi.'));
}
}, timeout);
sendChallengeRequest();
});
}
module.exports = { sendCommand };