diff --git a/common/server.h b/common/server.h index 8137c716..ec01de6c 100644 --- a/common/server.h +++ b/common/server.h @@ -31,6 +31,9 @@ public: void closeOldSession(const QString &playerName); virtual QString getLoginMessage() const = 0; 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: QMap games; QList clients; diff --git a/common/server_game.cpp b/common/server_game.cpp index 307a7663..851d9226 100644 --- a/common/server_game.cpp +++ b/common/server_game.cpp @@ -28,7 +28,7 @@ #include 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); @@ -55,12 +55,25 @@ void Server_Game::pingClockTimeout() QDateTime now = QDateTime::currentDateTime(); QList pingList; QMapIterator playerIterator(players); + bool allPlayersInactive = true; while (playerIterator.hasNext()) { 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)); } sendGameEvent(new Event_Ping(-1, pingList)); + + const int maxTime = static_cast(parent())->getMaxGameInactivityTime(); + if (allPlayersInactive) { + if ((++inactivityCounter >= maxTime) && (maxTime > 0)) + deleteLater(); + } else + inactivityCounter = 0; } int Server_Game::getPlayerCount() const diff --git a/common/server_game.h b/common/server_game.h index f4efb350..9a59258a 100644 --- a/common/server_game.h +++ b/common/server_game.h @@ -40,6 +40,7 @@ private: int maxPlayers; int activePlayer, activePhase; bool spectatorsAllowed; + int inactivityCounter; QTimer *pingClock; signals: void gameClosing(); diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 31e11513..2181bb79 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -149,7 +149,7 @@ void Server_ProtocolHandler::processCommand(Command *command) void Server_ProtocolHandler::pingClockTimeout() { - if (lastCommandTime.secsTo(QDateTime::currentDateTime()) > 10) + if (lastCommandTime.secsTo(QDateTime::currentDateTime()) > server->getMaxPlayerInactivityTime()) deleteLater(); } diff --git a/servatrice/servatrice.ini.example b/servatrice/servatrice.ini.example index 1c172527..4f742995 100644 --- a/servatrice/servatrice.ini.example +++ b/servatrice/servatrice.ini.example @@ -21,3 +21,6 @@ size=1 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." +[game] +max_game_inactivity_time=300 +max_player_inactivity_time=15 diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index 00f01042..f2776449 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -52,6 +52,9 @@ Servatrice::Servatrice(QObject *parent) settings->endArray(); 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() diff --git a/servatrice/src/servatrice.h b/servatrice/src/servatrice.h index 411f32f4..fd1bb782 100644 --- a/servatrice/src/servatrice.h +++ b/servatrice/src/servatrice.h @@ -41,10 +41,14 @@ public: bool execSqlQuery(QSqlQuery &query); AuthenticationResult checkUserPassword(const QString &user, const QString &password); QString getLoginMessage() const { return loginMessage; } + int getMaxGameInactivityTime() const { return maxGameInactivityTime; } + int getMaxPlayerInactivityTime() const { return maxPlayerInactivityTime; } private: QTcpServer *tcpServer; QString loginMessage; QSettings *settings; + int maxGameInactivityTime; + int maxPlayerInactivityTime; }; #endif