public function joinAction(Team $team, Player $me) { $this->requireLogin(); if (!$me->isTeamless()) { throw new ForbiddenException("You are already a member of a team"); } elseif ($team->getStatus() != 'open') { throw new ForbiddenException("This team is not accepting new members without an invitation"); } return $this->showConfirmationForm(function () use($team, $me) { $team->addMember($me->getId()); Service::getDispatcher()->dispatch(Events::TEAM_JOIN, new Event\TeamJoinEvent($team, $me)); return new RedirectResponse($team->getUrl()); }, "Are you sure you want to join {$team->getEscapedName()}?", "You are now a member of {$team->getName()}"); }
public function acceptAction(Invitation $invitation, Player $me) { if (!$me->isTeamless()) { throw new ForbiddenException("You can't join a new team until you leave your current one."); } if ($invitation->getInvitedPlayer()->getId() != $me->getId()) { throw new ForbiddenException("This invitation isn't for you!"); } if ($invitation->getExpiration()->lt(TimeDate::now())) { throw new ForbiddenException("This invitation has expired"); } $inviter = $invitation->getSentBy()->getEscapedUsername(); $team = $invitation->getTeam(); return $this->showConfirmationForm(function () use($invitation, $team, $me) { $team->addMember($me->getId()); $invitation->updateExpiration(); Service::getDispatcher()->dispatch(Events::TEAM_JOIN, new TeamJoinEvent($team, $me)); return new RedirectResponse($team->getUrl()); }, "Are you sure you want to accept the invitation from {$inviter} to join {$team->getEscapedName()}?", "You are now a member of {$team->getName()}"); }
/** * Adds a new member to the team * * @param int $id The id of the player to add to the team * * @return boolean|null True if both the player was added to the team AND the team member count was incremented */ public function addMember($id) { $player = new Player($id); if (!$player->isTeamless()) { throw new Exception("The player already belongs in a team"); } $player->setTeam($this->getId()); $this->update('members', ++$this->members, "i"); }
/** * Queries the database to get the team which a group of players belong to * * @param int[] $players The IDs of players * @return Team The team */ private function getTeam($players) { $team = null; foreach ($players as $id) { $player = new Player($id); if ($player->isTeamless()) { return Team::invalid(); } elseif ($team == null) { $team = $player->getTeam(); } elseif ($team->getId() != $player->getTeam()->getId()) { // This player is on a different team from the previous player! return Team::invalid(); } } return $team; }