Lines
41.37%
12 / 29
Methods
0.00%
0 / 3
Classes
0.00%
0 / 1
| Name | Lines | Methods | CRAP | ||||
|---|---|---|---|---|---|---|---|
| enter | 0.00% | 0 / 13 | 0.00% | 0 / 1 | 12 | ||
| enterOn | 81.81% | 9 / 11 | 0.00% | 0 / 1 | 4.10 | ||
| leave | 60.00% | 3 / 5 | 0.00% | 0 / 1 | 2.26 | ||
| 25 | final readonly class Login | |
| 26 | { | |
| 27 | public static function enter( | |
| 28 | Credentials $credentials, | |
| 29 | CancellationTokenInterface $stop = new NullCancellationToken(), | |
| 30 | LoginClient $logins = new LoginClient(), | |
| 31 | ClientVersion $version = new ClientVersion('5.1'), | |
| 32 | ): Client|Ending { | |
| 33 | try { | |
| 34 | $login = $logins->login($credentials->player, $credentials->password); | |
| 35 | ||
| 36 | $server = ServerChoice::pick($login->servers, $credentials->server); | |
| 37 | if ($server->isNone()) { | |
| 38 | return new Ending(EndingStatus::Failed, 'no open server'); | |
| 39 | } | |
| 40 | ||
| 41 | return self::enterOn( | |
| 42 | Connection::open($server->unwrap()), | |
| 43 | $credentials->player, | |
| 44 | $login->token, | |
| 45 | $stop, | |
| 46 | $version, | |
| 47 | ); | |
| 48 | } catch (Throwable $failure) { | |
| 49 | return new Ending(EndingStatus::Failed, $failure->getMessage()); | |
| 50 | } | |
| 51 | } | |
| 52 | ||
| 53 | public static function enterOn( | |
| 54 | Connection $connection, | |
| 55 | PlayerName $player, | |
| 56 | #[SensitiveParameter] | |
| 57 | string $token, | |
| 58 | CancellationTokenInterface $stop = new NullCancellationToken(), | |
| 59 | ClientVersion $version = new ClientVersion('5.1'), | |
| 60 | ): Client|Ending { | |
| 61 | $client = new Client($connection, new Character($player)); | |
| 62 | ||
| 63 | $entered = $client->run(new EnterGameScript(new GameLogin($player, $token, $version)), $stop); | |
| 64 | if ($entered instanceof Disconnected) { | |
| 65 | return new Ending(EndingStatus::Disconnected, $entered->reason); | |
| 66 | } | |
| 67 | ||
| 68 | if (!$entered instanceof InGame) { | |
| 69 | $client->close(); | |
| 70 | ||
| 71 | return $entered instanceof Stopped | |
| 72 | ? new Ending(EndingStatus::Stopped) | |
| 73 | : new Ending(EndingStatus::Failed, Outcome::of($entered)->summary); | |
| 74 | } | |
| 75 | ||
| 76 | $client->character()->entered($entered); | |
| 77 | ||
| 78 | return $client; | |
| 79 | } | |
| 80 | ||
| 81 | public static function leave(Client $client): bool | |
| 82 | { | |
| 83 | try { | |
| 84 | $client->send(new LogoutCommand()); | |
| 85 | ||
| 86 | return true; | |
| 87 | } catch (PeerClosedException) { | |
| 88 | return false; | |
| 89 | } finally { | |
| 90 | $client->close(); | |
| 91 | } | |
| 92 | } | |
| 93 | } |