UNPKG

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
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 };