game inactivity timeout

This commit is contained in:
Max-Wilhelm Bruker 2010-01-31 17:29:59 +01:00
parent a9f590e905
commit 5efb92e2d6
7 changed files with 30 additions and 3 deletions

View file

@ -31,6 +31,9 @@ public:
void closeOldSession(const QString &playerName); void closeOldSession(const QString &playerName);
virtual QString getLoginMessage() const = 0; virtual QString getLoginMessage() const = 0;
Server_Game *createGame(const QString &description, const QString &password, int maxPlayers, bool spectatorsAllowed, Server_ProtocolHandler *creator); Server_Game *createGame(const QString &description, const QString &password, int maxPlayers, bool spectatorsAllowed, Server_ProtocolHandler *creator);
virtual int getMaxGameInactivityTime() const = 0;
virtual int getMaxPlayerInactivityTime() const = 0;
private: private:
QMap<int, Server_Game *> games; QMap<int, Server_Game *> games;
QList<Server_ProtocolHandler *> clients; QList<Server_ProtocolHandler *> clients;

View file

@ -28,7 +28,7 @@
#include <QTimer> #include <QTimer>
Server_Game::Server_Game(Server_ProtocolHandler *_creator, int _gameId, const QString &_description, const QString &_password, int _maxPlayers, bool _spectatorsAllowed, QObject *parent) Server_Game::Server_Game(Server_ProtocolHandler *_creator, int _gameId, const QString &_description, const QString &_password, int _maxPlayers, bool _spectatorsAllowed, QObject *parent)
: QObject(parent), gameStarted(false), gameId(_gameId), description(_description), password(_password), maxPlayers(_maxPlayers), activePlayer(-1), activePhase(-1), spectatorsAllowed(_spectatorsAllowed) : QObject(parent), gameStarted(false), gameId(_gameId), description(_description), password(_password), maxPlayers(_maxPlayers), activePlayer(-1), activePhase(-1), spectatorsAllowed(_spectatorsAllowed), inactivityCounter(0)
{ {
creator = addPlayer(_creator, false, false); creator = addPlayer(_creator, false, false);
@ -55,12 +55,25 @@ void Server_Game::pingClockTimeout()
QDateTime now = QDateTime::currentDateTime(); QDateTime now = QDateTime::currentDateTime();
QList<ServerInfo_PlayerPing *> pingList; QList<ServerInfo_PlayerPing *> pingList;
QMapIterator<int, Server_Player *> playerIterator(players); QMapIterator<int, Server_Player *> playerIterator(players);
bool allPlayersInactive = true;
while (playerIterator.hasNext()) { while (playerIterator.hasNext()) {
Server_Player *player = playerIterator.next().value(); Server_Player *player = playerIterator.next().value();
int pingTime = player->getProtocolHandler() ? player->getProtocolHandler()->getLastCommandTime().secsTo(now) : -1; int pingTime;
if (player->getProtocolHandler()) {
pingTime = player->getProtocolHandler()->getLastCommandTime().secsTo(now);
allPlayersInactive = false;
} else
pingTime = -1;
pingList.append(new ServerInfo_PlayerPing(player->getPlayerId(), pingTime)); pingList.append(new ServerInfo_PlayerPing(player->getPlayerId(), pingTime));
} }
sendGameEvent(new Event_Ping(-1, pingList)); sendGameEvent(new Event_Ping(-1, pingList));
const int maxTime = static_cast<Server *>(parent())->getMaxGameInactivityTime();
if (allPlayersInactive) {
if ((++inactivityCounter >= maxTime) && (maxTime > 0))
deleteLater();
} else
inactivityCounter = 0;
} }
int Server_Game::getPlayerCount() const int Server_Game::getPlayerCount() const

View file

@ -40,6 +40,7 @@ private:
int maxPlayers; int maxPlayers;
int activePlayer, activePhase; int activePlayer, activePhase;
bool spectatorsAllowed; bool spectatorsAllowed;
int inactivityCounter;
QTimer *pingClock; QTimer *pingClock;
signals: signals:
void gameClosing(); void gameClosing();

View file

@ -149,7 +149,7 @@ void Server_ProtocolHandler::processCommand(Command *command)
void Server_ProtocolHandler::pingClockTimeout() void Server_ProtocolHandler::pingClockTimeout()
{ {
if (lastCommandTime.secsTo(QDateTime::currentDateTime()) > 10) if (lastCommandTime.secsTo(QDateTime::currentDateTime()) > server->getMaxPlayerInactivityTime())
deleteLater(); deleteLater();
} }

View file

@ -21,3 +21,6 @@ size=1
1\autojoin=true 1\autojoin=true
1\joinmessage="This is the general chat channel. This message is only here to show that channels can have a join message." 1\joinmessage="This is the general chat channel. This message is only here to show that channels can have a join message."
[game]
max_game_inactivity_time=300
max_player_inactivity_time=15

View file

@ -52,6 +52,9 @@ Servatrice::Servatrice(QObject *parent)
settings->endArray(); settings->endArray();
loginMessage = settings->value("messages/login").toString(); loginMessage = settings->value("messages/login").toString();
maxGameInactivityTime = settings->value("game/max_game_inactivity_time").toInt();
maxPlayerInactivityTime = settings->value("game/max_player_inactivity_time").toInt();
} }
Servatrice::~Servatrice() Servatrice::~Servatrice()

View file

@ -41,10 +41,14 @@ public:
bool execSqlQuery(QSqlQuery &query); bool execSqlQuery(QSqlQuery &query);
AuthenticationResult checkUserPassword(const QString &user, const QString &password); AuthenticationResult checkUserPassword(const QString &user, const QString &password);
QString getLoginMessage() const { return loginMessage; } QString getLoginMessage() const { return loginMessage; }
int getMaxGameInactivityTime() const { return maxGameInactivityTime; }
int getMaxPlayerInactivityTime() const { return maxPlayerInactivityTime; }
private: private:
QTcpServer *tcpServer; QTcpServer *tcpServer;
QString loginMessage; QString loginMessage;
QSettings *settings; QSettings *settings;
int maxGameInactivityTime;
int maxPlayerInactivityTime;
}; };
#endif #endif