quake3 server connector | monitor q3 servers | quakejs | Search

The code imports necessary modules, sets a default value for the DEFAULT_CHANNEL variable, and defines a list of server addresses to monitor. It then iterates over the server list, calls the monitorServer function for each server, and defines a startResponder function to start a command responder with a 1-second interval to respond to user commands.

Run example

npm run import -- "index"

index

var importer = require('../Core')
var respondCommand = importer.import("respond discord commands")
var monitorServer = importer.import("monitor q3 servers")
var spectateServer = importer.import("spectate q3 server")

var DEFAULT_CHANNEL = process.env.DEFAULT_CHANNEL || 'general'

var serverList = [
    // Defrag
    '83.243.73.220:27961',
    '83.243.73.220:27960',
    '83.243.73.220:27965',
    // Eplus
    '45.32.237.139:27960',
    '45.32.237.139:27000',
    '45.32.237.139:6666',
    '45.32.237.139:6000',
    '173.199.75.8:27963',
    '108.61.122.25:27982',
    '212.187.209.123:27965',
    '79.172.212.116:27970',
    // OSP/baseq3
    '193.33.176.30:27960',
    '85.10.201.6:27960',
    '88.198.221.99:27965',
    '88.198.221.99:27960',
    '88.198.221.98:27962',
    '216.86.155.163:27960',
    '216.86.155.161:27960',
    '216.86.155.173:29676',
    '216.86.155.162:27960',
    '69.30.217.148:27960',
    '69.30.217.148:27960',
    '69.30.217.150:27960',
    '69.30.217.149:27960',
    '212.42.38.88:27960',
    '212.42.38.88:27961',
    '212.42.38.88:27962',
    '212.42.38.88:27963',
    '212.42.38.88:27967',
    '79.142.106.99:27960',
    // CPMA
    '82.196.10.31:27960',
    '45.63.78.66:27970',
    // Msk
    'meat.q3msk.ru:7700',
    'q3msk.ru:27961',
    'q3msk.ru:27962',
    'q3msk.ru:27963',
    'q3msk.ru:27964',
    'q3msk.ru:27965',
    'q3msk.ru:27977',
    'q3msk.ru:27978',
    'tdm.q3msk.ru:27960',
    'ca.q3msk.ru:27960',
    'ca.q3msk.ru:27961',
    'ca.q3msk.ru:27963',
    'pl.q3msk.ru:27962',
    'pl.q3msk.ru:27964',
    'ctf.q3msk.ru:27960',
    'ctf.q3msk.ru:27970',
    'n2.q3msk.ru:29000',
    'q3msk.ru:27980',
    'q3msk.ru:27981',
    'q3msk.ru:27985',
    // QooL7
    'quakearea.com:27960',
    'q3.rofl.it:27960',
]
serverList.forEach(async (s) => {
    var address = s.split(':')[0]
    var port = parseInt(s.split(':')[1] || '27960')
    await monitorServer(address, port)
    //await spectateServer(address, port)
})

var stillRunning = false
var commandResponder
async function startResponder() {
    if(stillRunning) {
        console.log('Still running...')
        return
    }
    stillRunning = true
    try {
        await respondCommand(DEFAULT_CHANNEL)
        await respondCommand('@me')
    } catch (e) {
        console.log(e)
    }
    stillRunning = false
    if(!commandResponder)
        commandResponder = setInterval(startResponder, 5000)
}

module.exports = startResponder
index

The code imports necessary modules, sets a default value for the DEFAULT_CHANNEL variable, and defines a list of server addresses to monitor. It then iterates over the server list, calls the monitorServer function for each server, and defines a startResponder function to start a command responder with a 1-second interval to respond to user commands.

What the code could have been:

const { importer } = require('../Core');
const { respondDiscordCommands } = importer.import('respond discord commands');
const { monitorQ3Servers } = importer.import('monitor q3 servers');
const { spectateQ3Server } = importer.import('spectate q3 server');

const DEFAULT_CHANNEL = process.env.DEFAULT_CHANNEL || 'general';
const SERVER_LIST = [
  // Defrag
  '83.243.73.220:27961',
  '83.243.73.220:27960',
  '83.243.73.220:27965',
  // Eplus
  '45.32.237.139:27960',
  '45.32.237.139:27000',
  '45.32.237.139:6666',
  '45.32.237.139:6000',
  '173.199.75.8:27963',
  '108.61.122.25:27982',
  '212.187.209.123:27965',
  '79.172.212.116:27970',
  // OSP/baseq3
  '193.33.176.30:27960',
  '85.10.201.6:27960',
  '88.198.221.99:27965',
  '88.198.221.99:27960',
  '88.198.221.98:27962',
  '216.86.155.163:27960',
  '216.86.155.161:27960',
  '216.86.155.173:29676',
  '216.86.155.162:27960',
  '69.30.217.148:27960',
  '69.30.217.148:27960',
  '69.30.217.150:27960',
  '69.30.217.149:27960',
  '212.42.38.88:27960',
  '212.42.38.88:27961',
  '212.42.38.88:27962',
  '212.42.38.88:27963',
  '212.42.38.88:27967',
  '79.142.106.99:27960',
  // CPMA
  '82.196.10.31:27960',
  '45.63.78.66:27970',
  // Msk
 'meat.q3msk.ru:7700',
  'q3msk.ru:27961',
  'q3msk.ru:27962',
  'q3msk.ru:27963',
  'q3msk.ru:27964',
  'q3msk.ru:27965',
  'q3msk.ru:27977',
  'q3msk.ru:27978',
  'tdm.q3msk.ru:27960',
  'ca.q3msk.ru:27960',
  'ca.q3msk.ru:27961',
  'ca.q3msk.ru:27963',
  'pl.q3msk.ru:27962',
  'pl.q3msk.ru:27964',
  'ctf.q3msk.ru:27960',
  'ctf.q3msk.ru:27970',
  'n2.q3msk.ru:29000',
  'q3msk.ru:27980',
  'q3msk.ru:27981',
  'q3msk.ru:27985',
  // QooL7
  'quakearea.com:27960',
  'q3.rofl.it:27960',
];

async function startMonitorServers() {
  try {
    await Promise.all(
      SERVER_LIST.map(async (server) => {
        const [address, port] = server.split(':');
        await monitorQ3Servers(address, parseInt(port) || 27960);
      })
    );
  } catch (error) {
    console.error(error);
  }
}

async function startResponder() {
  if (this.stillRunning) {
    console.log('Still running...');
    return;
  }
  this.stillRunning = true;
  try {
    await respondDiscordCommands(DEFAULT_CHANNEL);
    await respondDiscordCommands('@me');
  } catch (error) {
    console.error(error);
  }
  this.stillRunning = false;
  if (!this.commandResponder) {
    this.commandResponder = setInterval(startResponder, 5000);
  }
}

module.exports = {
  startMonitorServers,
  startResponder,
};

// Usage:
// const { startMonitorServers, startResponder } = require('./your-module');
// startMonitorServers();
// startResponder();

Code Breakdown

Importing Modules

The code starts by importing modules from a Core file using the require function. The imported modules are:

These modules are imported using the import function from the respond discord commands, monitor q3 servers, and spectate q3 server functions, respectively.

Environment Variable

The code sets a default value for the DEFAULT_CHANNEL variable using the process.env object. If the DEFAULT_CHANNEL environment variable is not set, it defaults to the string 'general'.

Server List

The code defines an array of server addresses, serverList, which contains a list of server IP addresses and ports. The array is then iterated over using the forEach method.

Server Monitoring

For each server address in the serverList, the code:

  1. Splits the address into an IP address and port using the split method.
  2. Extracts the IP address and port as separate variables.
  3. Calls the monitorServer function, passing the IP address and port as arguments.
  4. The monitorServer function is called asynchronously, using the await keyword.

Start Responder Function

The startResponder function is defined to start a command responder, which will be used to respond to user commands.

async function startResponder() {
    stillRunning = true
    commandResponder = setInterval(async () => {
        // code to respond to user commands
    }, 1000) // 1 second interval
}

This function sets the stillRunning variable to true and starts an interval using the setInterval function. The interval will call an asynchronous function every 1 second to respond to user commands.

ssh remote wget

This code is a Node.js script that establishes an SSH connection to a remote server, downloads a URL using wget, and modifies a file on the server by appending a specific format to the end of the file. The script also includes error handling and exports the remoteGet function for use in other modules.

dns lookup

The lookupDNS function, a JavaScript module, performs a DNS lookup on a given IP address and caches the result for subsequent lookups. It uses the dns module to asynchronously retrieve the DNS information, and returns the cached or newly looked-up result as a promise.

remove ctrl characters

The removeCtrlChars function removes control characters and trims whitespace from a given string, returning the processed string. It uses regular expressions to match and remove control characters in specific formats, and is exported as a module for use in other parts of the application.

quake3 server status

The code is a Quake 3 server management tool that queries server status, captures all stats, and logs chat messages. It uses various modules and functions to interact with the server, including the gamedig module for querying server status and the sendRcon function for sending RCON commands to the server.

spectate q3 server

The spectateServer function is an asynchronous function that establishes a connection with a Quake 3 server, retrieves game state and team information, and sets up a chat listener to forward messages to Discord. The function uses various imported modules to interact with the Quake 3 server, Discord API, and Discord gateway.