Lines 90.00% 9 / 10
Functions and Methods 66.66% 2 / 3
Classes and Traits 0.00% 0 / 1
Name Lines Functions and Methods CRAP Classes and Traits
LoginSucceededEvent 90.00% 9 / 10 66.66% 2 / 3 7.05 0.00% 0 / 1
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 from 100.00% 8 / 8 100.00% 1 / 1 5
 summary 0.00% 0 / 1 0.00% 0 / 1 2
1<?php
2
3declare(strict_types=1);
4
5namespace Lorekeeper\Server\Event\Session;
6
7use Lorekeeper\Server\Event\Event;
8use Lorekeeper\Server\Event\NamedAfterClass;
9use Lorekeeper\Server\Exception\MalformedEventException;
10use Lorekeeper\Server\Message\DelimitedMessage;
11use Lorekeeper\Server\Message\Message;
12use Lorekeeper\Server\SocketId;
13use Override;
14use Psl\Option;
15use Psl\Type;
16use Psl\Type\Exception\CoercionException;
17
18final readonly class LoginSucceededEvent implements Event
19{
20    use NamedAfterClass;
21
22    public function __construct(
23        public SocketId $socketId,
24    ) {}
25
26    /** @return Option\Option<static> */
27    #[Override]
28    public static function from(Message $message): Option\Option
29    {
30        if (!$message instanceof DelimitedMessage || ($message->data[1] ?? null) !== 'loginResponse') {
31            return Option\none();
32        }
33
34        if (($message->data[3] ?? null) !== 'true') {
35            return Option\none();
36        }
37
38        try {
39            $socketId = Type\positive_int()->coerce($message->data[4] ?? null);
40        } catch (CoercionException $exception) {
41            throw new MalformedEventException(static::class, 'socket id is missing or invalid', $exception);
42        }
43
44        return Option\some(new static(new SocketId($socketId)));
45    }
46
47    #[Override]
48    public function summary(): string
49    {
50        return "Logged in as socket {$this->socketId->value}";
51    }
52}