Lines 100.00% 11 / 11
Functions and Methods 100.00% 3 / 3
Classes and Traits 100.00% 1 / 1
Name Lines Functions and Methods CRAP Classes and Traits
QuestAcceptedEvent 100.00% 11 / 11 100.00% 3 / 3 7 100.00% 1 / 1
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 from 100.00% 9 / 9 100.00% 1 / 1 5
 summary 100.00% 1 / 1 100.00% 1 / 1 1
1<?php
2
3declare(strict_types=1);
4
5namespace Lorekeeper\Server\Event\Quest;
6
7use Lorekeeper\Core\World\Quest\QuestId;
8use Lorekeeper\Server\Event\Event;
9use Lorekeeper\Server\Event\NamedAfterClass;
10use Lorekeeper\Server\Exception\MalformedEventException;
11use Lorekeeper\Server\Message\JsonMessage;
12use Lorekeeper\Server\Message\Message;
13use Override;
14use Psl\Option;
15use Psl\Type;
16use Psl\Type\Exception\CoercionException;
17
18final readonly class QuestAcceptedEvent implements Event
19{
20    use NamedAfterClass;
21
22    public function __construct(
23        public QuestId $quest,
24    ) {}
25
26    /** @return Option\Option<static> */
27    #[Override]
28    public static function from(Message $message): Option\Option
29    {
30        if (!$message instanceof JsonMessage || ($message->data['cmd'] ?? null) !== 'acceptQuest') {
31            return Option\none();
32        }
33
34        try {
35            $answer = Type\shape([
36                'QuestID' => Type\positive_int(),
37                'bSuccess' => Type\int(),
38            ], allowUnknownFields: true)->coerce($message->data);
39        } catch (CoercionException $exception) {
40            throw new MalformedEventException(static::class, 'accepted quest is invalid', $exception);
41        }
42
43        return $answer['bSuccess'] === 1 ? Option\some(new static(new QuestId($answer['QuestID']))) : Option\none();
44    }
45
46    #[Override]
47    public function summary(): string
48    {
49        return "Accepted quest {$this->quest->value}";
50    }
51}