void Server_Game::getInfo(ServerInfo_Game &result) const { QMutexLocker locker(&gameMutex); result.set_room_id(room->getId()); result.set_game_id(gameId); if (gameClosed) result.set_closed(true); else { for (int i = 0; i < gameTypes.size(); ++i) result.add_game_types(gameTypes[i]); result.set_max_players(getMaxPlayers()); result.set_description(getDescription().toStdString()); result.set_with_password(!getPassword().isEmpty()); result.set_player_count(getPlayerCount()); result.set_started(gameStarted); result.mutable_creator_info()->CopyFrom(*getCreatorInfo()); result.set_only_buddies(onlyBuddies); result.set_only_registered(onlyRegistered); result.set_spectators_allowed(getSpectatorsAllowed()); result.set_spectators_need_password(getSpectatorsNeedPassword()); result.set_spectators_can_chat(spectatorsCanTalk); result.set_spectators_omniscient(spectatorsSeeEverything); result.set_spectators_count(getSpectatorCount()); result.set_start_time(startTime.toTime_t()); } }
static void setAdmin(PlayerID player, bool flag) { if ( player < getMaxPlayers() ) { player_lists[player].setAdmin(flag); } }
Response::ResponseCode Server_Game::checkJoin(ServerInfo_User *user, const QString &_password, bool spectator, bool overrideRestrictions) { Server_DatabaseInterface *databaseInterface = room->getServer()->getDatabaseInterface(); { QMapIterator<int, Server_Player *> playerIterator(players); while (playerIterator.hasNext()) if (playerIterator.next().value()->getUserInfo()->name() == user->name()) return Response::RespContextError; } if (!(overrideRestrictions && (user->user_level() & ServerInfo_User::IsModerator))) { if ((_password != password) && !(spectator && !spectatorsNeedPassword)) return Response::RespWrongPassword; if (!(user->user_level() & ServerInfo_User::IsRegistered) && onlyRegistered) return Response::RespUserLevelTooLow; if (onlyBuddies) if (!databaseInterface->isInBuddyList(QString::fromStdString(creatorInfo->name()), QString::fromStdString(user->name()))) return Response::RespOnlyBuddies; if (databaseInterface->isInIgnoreList(QString::fromStdString(creatorInfo->name()), QString::fromStdString(user->name()))) return Response::RespInIgnoreList; if (spectator) { if (!spectatorsAllowed) return Response::RespSpectatorsNotAllowed; } } if (!spectator && (gameStarted || (getPlayerCount() >= getMaxPlayers()))) return Response::RespGameFull; return Response::RespOk; }
static void resetPlayerUnitConfig( PlayerID player_id ) { if ( player_id < getMaxPlayers() ) { player_lists[player_id].unit_config.initialize(); } }
static bool isAdmin(PlayerID player) { return (player < getMaxPlayers()) && player_lists[player].isAdmin(); }
static bool isValidPlayerID(const PlayerID player) { return player < getMaxPlayers() && player != INVALID_PLAYER_ID; }
static bool isPlayerActive(PlayerID player) { return (player < getMaxPlayers()) && player_lists[player].isActive(); }
bool CTable::checkLogin(u_int32_t ipaddr, const char* username) { if (shutdown_) return false; // shutting down! // XXX zombie if (findZombie(username)) return true; // ok, will reanimate zombie! // Check that the same ip address is not logged in already! if (ipaddr != 0 && FindIPAddress(ipaddr)) { char s[200]; sprintf(s, "Rejecting login: ip address %ld (%s) already logged in.\n", ipaddr, username); Sys_LogError(s); return false; } // Does the table have room? // Note: must take soon-to-log-in player into account here! // Otherwise logins could end up rejected later. bool rc = true; if (!CTournament::Inst()->isTournament()) rc = (countPlayersRaw() + loginEntries_.size() < getMaxPlayers()); if (!rc) { char s[200]; sprintf(s, "Rejecting login for (%s): table is full.\n", username); Sys_LogError(s); } // Check name uniqueness if (rc) { // Check the player's name against existing players for (int i = 0; i < CTable::MaxPlayers; i++) { CPlayer* player = getPlayerRawSlot(i); if (player->getConnfd() != -1) { #ifdef _WIN32 if (strcmpi(username, player->getUsername()) == 0) #else if (strcasecmp(username, player->getUsername()) == 0) #endif { // Found the same name! char s[100]; sprintf(s, "checkLogin: Player %s already logged in\n", username); Sys_LogError(s); rc = false; break; } } } } return rc; }