Lines 90.47% 19 / 21
Methods 75.00% 6 / 8
Classes 0.00% 0 / 1
Name Lines Methods CRAP
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 userRegistered 100.00% 1 / 1 100.00% 1 / 1 1
 statsUploaded 100.00% 7 / 7 100.00% 1 / 1 3
 statsImported 75.00% 3 / 4 0.00% 0 / 1 3.14
 send 80.00% 4 / 5 0.00% 0 / 1 3.07
 reset 100.00% 1 / 1 100.00% 1 / 1 1
 agent 100.00% 1 / 1 100.00% 1 / 1 1
 userUrl 100.00% 1 / 1 100.00% 1 / 1 1
22final class ChatActivity implements ResetInterface
23{
24    /** @var list<ChatText> */
25    private array $messages = [];
26
27    public function __construct(
28        private readonly ChatSender $chatSender,
29        private readonly UrlGeneratorInterface $urlGenerator,
30        private readonly AgentStatRepository $agentStatRepository,
31        private readonly LoggerInterface $logger,
32    ) {
33    }
34
35    public function userRegistered(User $user): void
36    {
37        $this->messages[] = new ChatText('👋 New user ')->link($user->getIdentifier(), $this->userUrl($user));
38    }
39
40    /**
41     * Stats uploaded through the API (the app); imports are reported with statsImported().
42     */
43    public function statsUploaded(AgentStat $agentStat): void
44    {
45        $previous = $this->agentStatRepository->findPrevious($agentStat);
46
47        $this->messages[] = $this->agent(new ChatText('📊 '), $agentStat->owner)->text(\sprintf(
48            ' uploaded stats: %sAP %s%s',
49            null === $agentStat->level ? '' : 'level '.$agentStat->level.', ',
50            \number_format($agentStat->ap),
51            $previous instanceof AgentStat ? \sprintf(' (+%s)', \number_format($agentStat->ap - $previous->ap)) : ' (first upload)',
52        ));
53    }
54
55    public function statsImported(User $owner, int $imported): void
56    {
57        if ($imported < 1) {
58            return;
59        }
60
61        $this->messages[] = $this->agent(new ChatText('📥 '), $owner)
62            ->text(\sprintf(' imported %d stats %s', $imported, 1 === $imported ? 'upload' : 'uploads'));
63    }
64
65    #[AsEventListener(KernelEvents::TERMINATE)]
66    #[AsEventListener(ConsoleEvents::TERMINATE)]
67    public function send(): void
68    {
69        $messages = $this->messages;
70        $this->messages = [];
71
72        foreach ($messages as $message) {
73            foreach ($this->chatSender->send(ChatFeed::Activity, $message) as $transport => $exception) {
74                $this->logger->warning('{transport}: {message} was not sent: {error}', ['transport' => $transport, 'message' => $message->plain(), 'error' => $exception->getMessage()]);
75            }
76        }
77    }
78
79    public function reset(): void
80    {
81        $this->messages = [];
82    }
83
84    /** The agent name, linked to the admins' page of the user. */
85    private function agent(ChatText $text, User $user): ChatText
86    {
87        return $text->link($user->getAgentName() ?? $user->getIdentifier(), $this->userUrl($user));
88    }
89
90    private function userUrl(User $user): string
91    {
92        return $this->urlGenerator->generate('app_user_show', ['id' => $user->id], UrlGeneratorInterface::ABSOLUTE_URL);
93    }
94}