Lines 93.33% 14 / 15
Functions and Methods 66.66% 2 / 3
Classes and Traits 0.00% 0 / 1
Name Lines Functions and Methods CRAP Classes and Traits
PlayerUpdatedEvent 93.33% 14 / 15 66.66% 2 / 3 10.03 0.00% 0 / 1
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 from 100.00% 13 / 13 100.00% 1 / 1 8
 summary 0.00% 0 / 1 0.00% 0 / 1 2
1<?php
2
3declare(strict_types=1);
4
5namespace Lorekeeper\Server\Event\Player;
6
7use Lorekeeper\Core\Player\PlayerName;
8use Lorekeeper\Server\Event\Event;
9use Lorekeeper\Server\Event\NamedAfterClass;
10use Lorekeeper\Server\Exception\MalformedEventException;
11use Lorekeeper\Server\Message\DelimitedMessage;
12use Lorekeeper\Server\Message\JsonMessage;
13use Lorekeeper\Server\Message\Message;
14use Override;
15use Psl\Option;
16use Psl\Type;
17use Psl\Type\Exception\CoercionException;
18
19final readonly class PlayerUpdatedEvent implements Event
20{
21    use NamedAfterClass;
22
23    public function __construct(
24        public PlayerName $name,
25    ) {}
26
27    /** @return Option\Option<static> */
28    #[Override]
29    public static function from(Message $message): Option\Option
30    {
31        $name = match (true) {
32            $message instanceof JsonMessage && ($message->data['cmd'] ?? null) === 'uotls' => Option\some(
33                $message->data['unm'] ?? null,
34            ),
35            $message instanceof DelimitedMessage && ($message->data[1] ?? null) === 'uotls' => Option\some(
36                $message->data[3] ?? null,
37            ),
38            default => Option\none(),
39        };
40
41        if ($name->isNone()) {
42            return Option\none();
43        }
44
45        try {
46            $name = Type\non_empty_string()->coerce($name->unwrap());
47        } catch (CoercionException $exception) {
48            throw new MalformedEventException(static::class, 'player name is missing or invalid', $exception);
49        }
50
51        return Option\some(new static(new PlayerName($name)));
52    }
53
54    #[Override]
55    public function summary(): string
56    {
57        return "{$this->name->value} updated";
58    }
59}