aboutsummaryrefslogtreecommitdiff
path: root/src/UdpTasks/StatusChecker/statusticker.cpp
blob: 351a7ee8c6de47053422f82e900fd2423c04a36e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "statuschecker.h"

bool StatusChecker::startTicker()
{

    /* UDP Query Checking
     *
     * Send a \info\ or \status\ query to the remote gameserver. The
     * server will respond with its serverdata, which is processed
     * and stored in the database. Required for display on the website.
     */

    // check type (extended or simple)
    _udpRequest = _coreObject->Settings.CheckerSettings.getExtendedInfo ? "\\status\\" : "\\info\\";

    // set udp datagram handler
    connect(&_udpSocket, &QUdpSocket::readyRead, this, &StatusChecker::onUdpResponseRead);

    // set UDP+1 port for outgoing status checking (avoid querying from random port)
    _udpSocket.bind(QHostAddress::Any, _coreObject->Settings.BeaconServerSettings.beaconPort+1);

    // attach timer function to tick through servers (from db)
    connect(&_tickTicker, &QTimer::timeout, this, &StatusChecker::onTicker);

    // set reset timer and event ("cycle time")
    connect(&_resetTimer, &QTimer::timeout, [this]
    {
        // reset indices and clear udp cache
        _dbIndex = -1;
        _dataBuffer.clear();
        _secureBuffer.clear();
    });
    _resetTimer.setInterval( _coreObject->Settings.CheckerSettings.timeCheckerReset_s * 1000);
    _resetTimer.start();

    // ticker enable (keeps running, also when there are no new servers to be queried-- keeps firing every 1/serversPerSecond)
    _tickTicker.setInterval( _coreObject->Settings.CheckerSettings.timeServerInterval_ms );
    _tickTicker.start();

    // announce servers per second (calculate from interval)
    double serversPerSecond = (1000.0 / _coreObject->Settings.CheckerSettings.timeServerInterval_ms);
    _coreObject->Log.logEvent("info", QStringLiteral("server status every %1 seconds (%2 servers/s)")
                            .arg( QString::number(_coreObject->Settings.CheckerSettings.timeCheckerReset_s),
                                  QString::number(serversPerSecond, 'f', 1) ) );

    return true;
}