From be12a0b3a9342959b9eb1dfd79d42957f7587411 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 2 Jul 2011 14:36:10 +0200 Subject: [PATCH] preliminary showGamesOfUser support --- cockatrice/src/userlist.cpp | 7 +- common/protocol.cpp | 7 ++ common/protocol.h | 24 +++-- common/protocol_datastructures.cpp | 3 +- common/protocol_datastructures.h | 2 +- common/protocol_item_ids.h | 161 +++++++++++++++-------------- common/protocol_items.cpp | 6 ++ common/protocol_items.dat | 1 + common/protocol_items.h | 8 ++ common/server_game.cpp | 14 ++- common/server_game.h | 1 + common/server_protocolhandler.cpp | 23 +++++ common/server_protocolhandler.h | 1 + common/server_room.cpp | 14 +++ common/server_room.h | 2 + 15 files changed, 183 insertions(+), 91 deletions(-) diff --git a/cockatrice/src/userlist.cpp b/cockatrice/src/userlist.cpp index 02a04a6e..419d8b78 100644 --- a/cockatrice/src/userlist.cpp +++ b/cockatrice/src/userlist.cpp @@ -219,6 +219,7 @@ void UserList::showContextMenu(const QPoint &pos, const QModelIndex &index) aUserName->setEnabled(false); QAction *aDetails = new QAction(tr("User &details"), this); QAction *aChat = new QAction(tr("Direct &chat"), this); + QAction *aShowGames = new QAction(tr("Show this user's &games"), this); QAction *aAddToBuddyList = new QAction(tr("Add to &buddy list"), this); QAction *aRemoveFromBuddyList = new QAction(tr("Remove from &buddy list"), this); QAction *aAddToIgnoreList = new QAction(tr("Add to &ignore list"), this); @@ -257,7 +258,11 @@ void UserList::showContextMenu(const QPoint &pos, const QModelIndex &index) client->sendCommand(new Command_AddToList("buddy", userName)); else if (actionClicked == aRemoveFromBuddyList) client->sendCommand(new Command_RemoveFromList("buddy", userName)); - else if (actionClicked == aAddToIgnoreList) + else if (actionClicked == aShowGames) { + Command *cmd = new Command_GetGamesOfUser(userName); + connect(cmd, SIGNAL(responseReceived(ProtocolResponse *)), this, SLOT(gamesOfUserReceived(ProtocolResponse *))); + client->sendCommand(cmd); + } else if (actionClicked == aAddToIgnoreList) client->sendCommand(new Command_AddToList("ignore", userName)); else if (actionClicked == aRemoveFromIgnoreList) client->sendCommand(new Command_RemoveFromList("ignore", userName)); diff --git a/common/protocol.cpp b/common/protocol.cpp index 1129116e..205f2b2a 100644 --- a/common/protocol.cpp +++ b/common/protocol.cpp @@ -44,6 +44,7 @@ void ProtocolItem::initializeHash() ProtocolResponse::initializeHash(); registerSerializableItem("respjoin_room", Response_JoinRoom::newItem); registerSerializableItem("resplist_users", Response_ListUsers::newItem); + registerSerializableItem("respget_games_of_user", Response_GetGamesOfUser::newItem); registerSerializableItem("respget_user_info", Response_GetUserInfo::newItem); registerSerializableItem("respdeck_list", Response_DeckList::newItem); registerSerializableItem("respdeck_download", Response_DeckDownload::newItem); @@ -296,6 +297,12 @@ Response_DeckList::Response_DeckList(int _cmdId, ResponseCode _responseCode, Dec insertItem(_root); } +Response_GetGamesOfUser::Response_GetGamesOfUser(int _cmdId, ResponseCode _responseCode, const QList &_gameList) +{ + for (int i = 0; i < _gameList.size(); ++i) + itemList.append(_gameList[i]); +} + Response_GetUserInfo::Response_GetUserInfo(int _cmdId, ResponseCode _responseCode, ServerInfo_User *_user) : ProtocolResponse(_cmdId, _responseCode, "get_user_info") { diff --git a/common/protocol.h b/common/protocol.h index 0cb067ee..1feda02f 100644 --- a/common/protocol.h +++ b/common/protocol.h @@ -42,13 +42,14 @@ enum ItemId { ItemId_Event_Ping = ItemId_Other + 212, ItemId_Event_AddToList = ItemId_Other + 213, ItemId_Response_ListUsers = ItemId_Other + 300, - ItemId_Response_GetUserInfo = ItemId_Other + 301, - ItemId_Response_DeckList = ItemId_Other + 302, - ItemId_Response_DeckDownload = ItemId_Other + 303, - ItemId_Response_DeckUpload = ItemId_Other + 304, - ItemId_Response_DumpZone = ItemId_Other + 305, - ItemId_Response_JoinRoom = ItemId_Other + 306, - ItemId_Response_Login = ItemId_Other + 307, + ItemId_Response_GetGamesOfUser = ItemId_Other + 301, + ItemId_Response_GetUserInfo = ItemId_Other + 302, + ItemId_Response_DeckList = ItemId_Other + 303, + ItemId_Response_DeckDownload = ItemId_Other + 304, + ItemId_Response_DeckUpload = ItemId_Other + 305, + ItemId_Response_DumpZone = ItemId_Other + 306, + ItemId_Response_JoinRoom = ItemId_Other + 307, + ItemId_Response_Login = ItemId_Other + 308, ItemId_Invalid = ItemId_Other + 1000 }; @@ -282,6 +283,15 @@ public: QList getUserList() const { return typecastItemList(); } }; +class Response_GetGamesOfUser : public ProtocolResponse { + Q_OBJECT +public: + Response_GetGamesOfUser(int _cmdId = -1, ResponseCode _responseCode = RespOk, const QList &_gameList = QList()); + int getItemId() const { return ItemId_Response_GetGamesOfUser; } + static SerializableItem *newItem() { return new Response_GetGamesOfUser; } + QList getGameList() const { return typecastItemList(); } +}; + class Response_GetUserInfo : public ProtocolResponse { Q_OBJECT public: diff --git a/common/protocol_datastructures.cpp b/common/protocol_datastructures.cpp index aaf16467..3e4564c8 100644 --- a/common/protocol_datastructures.cpp +++ b/common/protocol_datastructures.cpp @@ -40,9 +40,10 @@ ServerInfo_UserList::ServerInfo_UserList(const QString &_itemType, const QList &_gameTypes, ServerInfo_User *_creatorInfo, bool _onlyBuddies, bool _onlyRegistered, bool _spectatorsAllowed, bool _spectatorsNeedPassword, int _spectatorCount) +ServerInfo_Game::ServerInfo_Game(int _roomId, int _gameId, const QString &_description, bool _hasPassword, int _playerCount, int _maxPlayers, const QList &_gameTypes, ServerInfo_User *_creatorInfo, bool _onlyBuddies, bool _onlyRegistered, bool _spectatorsAllowed, bool _spectatorsNeedPassword, int _spectatorCount) : SerializableItem_Map("game") { + insertItem(new SerializableItem_Int("room_id", _roomId)); insertItem(new SerializableItem_Int("game_id", _gameId)); insertItem(new SerializableItem_String("description", _description)); insertItem(new SerializableItem_Bool("has_password", _hasPassword)); diff --git a/common/protocol_datastructures.h b/common/protocol_datastructures.h index 02f5336c..40ab6751 100644 --- a/common/protocol_datastructures.h +++ b/common/protocol_datastructures.h @@ -69,7 +69,7 @@ public: class ServerInfo_Game : public SerializableItem_Map { public: - ServerInfo_Game(int _gameId = -1, const QString &_description = QString(), bool _hasPassword = false, int _playerCount = -1, int _maxPlayers = -1, const QList &_gameTypes = QList(), ServerInfo_User *creatorInfo = 0, bool _onlyBuddies = false, bool _onlyRegistered = false, bool _spectatorsAllowed = false, bool _spectatorsNeedPassword = false, int _spectatorCount = -1); + ServerInfo_Game(int _roomId = -1, int _gameId = -1, const QString &_description = QString(), bool _hasPassword = false, int _playerCount = -1, int _maxPlayers = -1, const QList &_gameTypes = QList(), ServerInfo_User *creatorInfo = 0, bool _onlyBuddies = false, bool _onlyRegistered = false, bool _spectatorsAllowed = false, bool _spectatorsNeedPassword = false, int _spectatorCount = -1); static SerializableItem *newItem() { return new ServerInfo_Game; } int getGameId() const { return static_cast(itemMap.value("game_id"))->getData(); } QString getDescription() const { return static_cast(itemMap.value("description"))->getData(); } diff --git a/common/protocol_item_ids.h b/common/protocol_item_ids.h index cbec3eb0..6d6cb37b 100644 --- a/common/protocol_item_ids.h +++ b/common/protocol_item_ids.h @@ -3,84 +3,85 @@ ItemId_Command_Ping = 1001, ItemId_Command_Login = 1002, ItemId_Command_Message = 1003, ItemId_Command_ListUsers = 1004, -ItemId_Command_GetUserInfo = 1005, -ItemId_Command_AddToList = 1006, -ItemId_Command_RemoveFromList = 1007, -ItemId_Command_DeckList = 1008, -ItemId_Command_DeckNewDir = 1009, -ItemId_Command_DeckDelDir = 1010, -ItemId_Command_DeckDel = 1011, -ItemId_Command_DeckDownload = 1012, -ItemId_Command_ListRooms = 1013, -ItemId_Command_JoinRoom = 1014, -ItemId_Command_LeaveRoom = 1015, -ItemId_Command_RoomSay = 1016, -ItemId_Command_JoinGame = 1017, -ItemId_Command_KickFromGame = 1018, -ItemId_Command_LeaveGame = 1019, -ItemId_Command_Say = 1020, -ItemId_Command_Shuffle = 1021, -ItemId_Command_Mulligan = 1022, -ItemId_Command_RollDie = 1023, -ItemId_Command_DrawCards = 1024, -ItemId_Command_UndoDraw = 1025, -ItemId_Command_FlipCard = 1026, -ItemId_Command_AttachCard = 1027, -ItemId_Command_CreateToken = 1028, -ItemId_Command_CreateArrow = 1029, -ItemId_Command_DeleteArrow = 1030, -ItemId_Command_SetCardAttr = 1031, -ItemId_Command_SetCardCounter = 1032, -ItemId_Command_IncCardCounter = 1033, -ItemId_Command_ReadyStart = 1034, -ItemId_Command_Concede = 1035, -ItemId_Command_IncCounter = 1036, -ItemId_Command_CreateCounter = 1037, -ItemId_Command_SetCounter = 1038, -ItemId_Command_DelCounter = 1039, -ItemId_Command_NextTurn = 1040, -ItemId_Command_SetActivePhase = 1041, -ItemId_Command_DumpZone = 1042, -ItemId_Command_StopDumpZone = 1043, -ItemId_Command_RevealCards = 1044, -ItemId_Event_ConnectionStateChanged = 1045, -ItemId_Event_Say = 1046, -ItemId_Event_Leave = 1047, -ItemId_Event_GameClosed = 1048, -ItemId_Event_Kicked = 1049, -ItemId_Event_Shuffle = 1050, -ItemId_Event_RollDie = 1051, -ItemId_Event_MoveCard = 1052, -ItemId_Event_FlipCard = 1053, -ItemId_Event_DestroyCard = 1054, -ItemId_Event_AttachCard = 1055, -ItemId_Event_CreateToken = 1056, -ItemId_Event_DeleteArrow = 1057, -ItemId_Event_SetCardAttr = 1058, -ItemId_Event_SetCardCounter = 1059, -ItemId_Event_SetCounter = 1060, -ItemId_Event_DelCounter = 1061, -ItemId_Event_SetActivePlayer = 1062, -ItemId_Event_SetActivePhase = 1063, -ItemId_Event_DumpZone = 1064, -ItemId_Event_StopDumpZone = 1065, -ItemId_Event_RemoveFromList = 1066, -ItemId_Event_ServerMessage = 1067, -ItemId_Event_ServerShutdown = 1068, -ItemId_Event_ConnectionClosed = 1069, -ItemId_Event_Message = 1070, -ItemId_Event_GameJoined = 1071, -ItemId_Event_UserLeft = 1072, -ItemId_Event_LeaveRoom = 1073, -ItemId_Event_RoomSay = 1074, -ItemId_Context_ReadyStart = 1075, -ItemId_Context_Concede = 1076, -ItemId_Context_DeckSelect = 1077, -ItemId_Context_UndoDraw = 1078, -ItemId_Context_MoveCard = 1079, -ItemId_Context_Mulligan = 1080, -ItemId_Command_UpdateServerMessage = 1081, -ItemId_Command_ShutdownServer = 1082, -ItemId_Command_BanFromServer = 1083, -ItemId_Other = 1084 +ItemId_Command_GetGamesOfUser = 1005, +ItemId_Command_GetUserInfo = 1006, +ItemId_Command_AddToList = 1007, +ItemId_Command_RemoveFromList = 1008, +ItemId_Command_DeckList = 1009, +ItemId_Command_DeckNewDir = 1010, +ItemId_Command_DeckDelDir = 1011, +ItemId_Command_DeckDel = 1012, +ItemId_Command_DeckDownload = 1013, +ItemId_Command_ListRooms = 1014, +ItemId_Command_JoinRoom = 1015, +ItemId_Command_LeaveRoom = 1016, +ItemId_Command_RoomSay = 1017, +ItemId_Command_JoinGame = 1018, +ItemId_Command_KickFromGame = 1019, +ItemId_Command_LeaveGame = 1020, +ItemId_Command_Say = 1021, +ItemId_Command_Shuffle = 1022, +ItemId_Command_Mulligan = 1023, +ItemId_Command_RollDie = 1024, +ItemId_Command_DrawCards = 1025, +ItemId_Command_UndoDraw = 1026, +ItemId_Command_FlipCard = 1027, +ItemId_Command_AttachCard = 1028, +ItemId_Command_CreateToken = 1029, +ItemId_Command_CreateArrow = 1030, +ItemId_Command_DeleteArrow = 1031, +ItemId_Command_SetCardAttr = 1032, +ItemId_Command_SetCardCounter = 1033, +ItemId_Command_IncCardCounter = 1034, +ItemId_Command_ReadyStart = 1035, +ItemId_Command_Concede = 1036, +ItemId_Command_IncCounter = 1037, +ItemId_Command_CreateCounter = 1038, +ItemId_Command_SetCounter = 1039, +ItemId_Command_DelCounter = 1040, +ItemId_Command_NextTurn = 1041, +ItemId_Command_SetActivePhase = 1042, +ItemId_Command_DumpZone = 1043, +ItemId_Command_StopDumpZone = 1044, +ItemId_Command_RevealCards = 1045, +ItemId_Event_ConnectionStateChanged = 1046, +ItemId_Event_Say = 1047, +ItemId_Event_Leave = 1048, +ItemId_Event_GameClosed = 1049, +ItemId_Event_Kicked = 1050, +ItemId_Event_Shuffle = 1051, +ItemId_Event_RollDie = 1052, +ItemId_Event_MoveCard = 1053, +ItemId_Event_FlipCard = 1054, +ItemId_Event_DestroyCard = 1055, +ItemId_Event_AttachCard = 1056, +ItemId_Event_CreateToken = 1057, +ItemId_Event_DeleteArrow = 1058, +ItemId_Event_SetCardAttr = 1059, +ItemId_Event_SetCardCounter = 1060, +ItemId_Event_SetCounter = 1061, +ItemId_Event_DelCounter = 1062, +ItemId_Event_SetActivePlayer = 1063, +ItemId_Event_SetActivePhase = 1064, +ItemId_Event_DumpZone = 1065, +ItemId_Event_StopDumpZone = 1066, +ItemId_Event_RemoveFromList = 1067, +ItemId_Event_ServerMessage = 1068, +ItemId_Event_ServerShutdown = 1069, +ItemId_Event_ConnectionClosed = 1070, +ItemId_Event_Message = 1071, +ItemId_Event_GameJoined = 1072, +ItemId_Event_UserLeft = 1073, +ItemId_Event_LeaveRoom = 1074, +ItemId_Event_RoomSay = 1075, +ItemId_Context_ReadyStart = 1076, +ItemId_Context_Concede = 1077, +ItemId_Context_DeckSelect = 1078, +ItemId_Context_UndoDraw = 1079, +ItemId_Context_MoveCard = 1080, +ItemId_Context_Mulligan = 1081, +ItemId_Command_UpdateServerMessage = 1082, +ItemId_Command_ShutdownServer = 1083, +ItemId_Command_BanFromServer = 1084, +ItemId_Other = 1085 }; diff --git a/common/protocol_items.cpp b/common/protocol_items.cpp index 33670ef4..db7ffc1a 100644 --- a/common/protocol_items.cpp +++ b/common/protocol_items.cpp @@ -21,6 +21,11 @@ Command_ListUsers::Command_ListUsers() : Command("list_users") { } +Command_GetGamesOfUser::Command_GetGamesOfUser(const QString &_userName) + : Command("get_games_of_user") +{ + insertItem(new SerializableItem_String("user_name", _userName)); +} Command_GetUserInfo::Command_GetUserInfo(const QString &_userName) : Command("get_user_info") { @@ -497,6 +502,7 @@ void ProtocolItem::initializeHashAuto() itemNameHash.insert("cmdlogin", Command_Login::newItem); itemNameHash.insert("cmdmessage", Command_Message::newItem); itemNameHash.insert("cmdlist_users", Command_ListUsers::newItem); + itemNameHash.insert("cmdget_games_of_user", Command_GetGamesOfUser::newItem); itemNameHash.insert("cmdget_user_info", Command_GetUserInfo::newItem); itemNameHash.insert("cmdadd_to_list", Command_AddToList::newItem); itemNameHash.insert("cmdremove_from_list", Command_RemoveFromList::newItem); diff --git a/common/protocol_items.dat b/common/protocol_items.dat index 2e0f8603..71695932 100644 --- a/common/protocol_items.dat +++ b/common/protocol_items.dat @@ -2,6 +2,7 @@ 0:login:s,username:s,password 0:message:s,user_name:s,text 0:list_users +0:get_games_of_user:s,user_name 0:get_user_info:s,user_name 0:add_to_list:s,list:s,user_name 0:remove_from_list:s,list:s,user_name diff --git a/common/protocol_items.h b/common/protocol_items.h index efeb7f93..48401ee3 100644 --- a/common/protocol_items.h +++ b/common/protocol_items.h @@ -35,6 +35,14 @@ public: static SerializableItem *newItem() { return new Command_ListUsers; } int getItemId() const { return ItemId_Command_ListUsers; } }; +class Command_GetGamesOfUser : public Command { + Q_OBJECT +public: + Command_GetGamesOfUser(const QString &_userName = QString()); + QString getUserName() const { return static_cast(itemMap.value("user_name"))->getData(); }; + static SerializableItem *newItem() { return new Command_GetGamesOfUser; } + int getItemId() const { return ItemId_Command_GetGamesOfUser; } +}; class Command_GetUserInfo : public Command { Q_OBJECT public: diff --git a/common/server_game.cpp b/common/server_game.cpp index 85b3a151..bc14c7e9 100644 --- a/common/server_game.cpp +++ b/common/server_game.cpp @@ -214,6 +214,17 @@ ResponseCode Server_Game::checkJoin(ServerInfo_User *user, const QString &_passw return RespOk; } +bool Server_Game::containsUser(const QString &userName) const +{ + QMutexLocker locker(&gameMutex); + + QMapIterator playerIterator(players); + while (playerIterator.hasNext()) + if (playerIterator.next().value()->getUserInfo()->getName() == userName) + return true; + return false; +} + Server_Player *Server_Game::addPlayer(Server_ProtocolHandler *handler, bool spectator, bool broadcastUpdate) { QMutexLocker locker(&gameMutex); @@ -479,7 +490,7 @@ ServerInfo_Game *Server_Game::getInfo() const if (players.isEmpty()) // Game is closing - return new ServerInfo_Game(getGameId(), QString(), false, 0, getMaxPlayers(), QList(), 0, false, 0); + return new ServerInfo_Game(room->getId(), getGameId(), QString(), false, 0, getMaxPlayers(), QList(), 0, false, 0); else { // Game is open @@ -488,6 +499,7 @@ ServerInfo_Game *Server_Game::getInfo() const gameTypeList.append(new GameTypeId(gameTypes[i])); return new ServerInfo_Game( + room->getId(), getGameId(), getDescription(), !getPassword().isEmpty(), diff --git a/common/server_game.h b/common/server_game.h index b34301d4..f3d761f3 100644 --- a/common/server_game.h +++ b/common/server_game.h @@ -77,6 +77,7 @@ public: bool getSpectatorsCanTalk() const { return spectatorsCanTalk; } bool getSpectatorsSeeEverything() const { return spectatorsSeeEverything; } ResponseCode checkJoin(ServerInfo_User *user, const QString &_password, bool spectator); + bool containsUser(const QString &userName) const; Server_Player *addPlayer(Server_ProtocolHandler *handler, bool spectator, bool broadcastUpdate = true); void removePlayer(Server_Player *player); void removeArrowsToPlayer(Server_Player *player); diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index d1df0177..8236cf6e 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -179,6 +179,7 @@ ResponseCode Server_ProtocolHandler::processCommandHelper(Command *command, Comm case ItemId_Command_DeckDel: return cmdDeckDel(static_cast(command), cont); case ItemId_Command_DeckUpload: return cmdDeckUpload(static_cast(command), cont); case ItemId_Command_DeckDownload: return cmdDeckDownload(static_cast(command), cont); + case ItemId_Command_GetGamesOfUser: return cmdGetGamesOfUser(static_cast(command), cont); case ItemId_Command_GetUserInfo: return cmdGetUserInfo(static_cast(command), cont); case ItemId_Command_ListRooms: return cmdListRooms(static_cast(command), cont); case ItemId_Command_JoinRoom: return cmdJoinRoom(static_cast(command), cont); @@ -330,6 +331,28 @@ ResponseCode Server_ProtocolHandler::cmdMessage(Command_Message *cmd, CommandCon return RespOk; } +ResponseCode Server_ProtocolHandler::cmdGetGamesOfUser(Command_GetGamesOfUser *cmd, CommandContainer *cont) +{ + if (authState == PasswordWrong) + return RespLoginNeeded; + + server->serverMutex.lock(); + if (!server->getUsers().contains(cmd->getUserName())) + return RespNameNotFound; + + QList gameList; + QMapIterator roomIterator(server->getRooms()); + while (roomIterator.hasNext()) + gameList.append(roomIterator.next().value()->getGamesOfUser(cmd->getUserName())); + server->serverMutex.unlock(); + + ProtocolResponse *resp = new Response_GetGamesOfUser(cont->getCmdId(), RespOk, gameList); + if (getCompressionSupport()) + resp->setCompressed(true); + cont->setResponse(resp); + return RespNothing; +} + ResponseCode Server_ProtocolHandler::cmdGetUserInfo(Command_GetUserInfo *cmd, CommandContainer *cont) { if (authState == PasswordWrong) diff --git a/common/server_protocolhandler.h b/common/server_protocolhandler.h index a73c3008..1902f1d8 100644 --- a/common/server_protocolhandler.h +++ b/common/server_protocolhandler.h @@ -50,6 +50,7 @@ private: virtual ResponseCode cmdDeckDel(Command_DeckDel *cmd, CommandContainer *cont) = 0; virtual ResponseCode cmdDeckUpload(Command_DeckUpload *cmd, CommandContainer *cont) = 0; virtual ResponseCode cmdDeckDownload(Command_DeckDownload *cmd, CommandContainer *cont) = 0; + ResponseCode cmdGetGamesOfUser(Command_GetGamesOfUser *cmd, CommandContainer *cont); ResponseCode cmdGetUserInfo(Command_GetUserInfo *cmd, CommandContainer *cont); ResponseCode cmdListRooms(Command_ListRooms *cmd, CommandContainer *cont); ResponseCode cmdJoinRoom(Command_JoinRoom *cmd, CommandContainer *cont); diff --git a/common/server_room.cpp b/common/server_room.cpp index b954fa81..77030bff 100644 --- a/common/server_room.cpp +++ b/common/server_room.cpp @@ -130,3 +130,17 @@ int Server_Room::getGamesCreatedByUser(const QString &userName) const ++result; return result; } + +QList Server_Room::getGamesOfUser(const QString &userName) const +{ + QMutexLocker locker(&roomMutex); + + QList result; + QMapIterator gamesIterator(games); + while (gamesIterator.hasNext()) { + Server_Game *game = gamesIterator.next().value(); + if (game->containsUser(userName)) + result.append(game->getInfo()); + } + return result; +} diff --git a/common/server_room.h b/common/server_room.h index b99b626f..96712ac6 100644 --- a/common/server_room.h +++ b/common/server_room.h @@ -11,6 +11,7 @@ class Server_ProtocolHandler; class RoomEvent; class ServerInfo_User; class ServerInfo_Room; +class ServerInfo_Game; class Server_Game; class Server; @@ -39,6 +40,7 @@ public: Server *getServer() const; ServerInfo_Room *getInfo(bool complete) const; int getGamesCreatedByUser(const QString &name) const; + QList getGamesOfUser(const QString &name) const; void addClient(Server_ProtocolHandler *client); void removeClient(Server_ProtocolHandler *client);