IrcMessageParser::parseSingle()   B
last analyzed

Complexity

Conditions 9
Paths 9

Size

Total Lines 38
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 27
dl 0
loc 38
rs 8.0555
c 0
b 0
f 0
cc 9
nc 9
nop 1
1
<?php
2
3
namespace Jerodev\PhpIrcClient;
4
5
use Generator;
6
use Jerodev\PhpIrcClient\Messages\IrcMessage;
7
use Jerodev\PhpIrcClient\Messages\KickMessage;
8
use Jerodev\PhpIrcClient\Messages\MOTDMessage;
9
use Jerodev\PhpIrcClient\Messages\NameReplyMessage;
10
use Jerodev\PhpIrcClient\Messages\PingMessage;
11
use Jerodev\PhpIrcClient\Messages\PrivmsgMessage;
12
use Jerodev\PhpIrcClient\Messages\TopicChangeMessage;
13
use Jerodev\PhpIrcClient\Messages\WelcomeMessage;
14
15
class IrcMessageParser
16
{
17
    /**
18
     *  Parse one ore more irc messages.
19
     *
20
     *  @param string $message A string received from the irc server
21
     *
22
     *  @return Generator|IrcMessage[]
23
     */
24
    public function parse(string $message)
25
    {
26
        foreach (explode("\n", $message) as $msg) {
27
            if (empty(trim($msg))) {
28
                continue;
29
            }
30
31
            yield $this->parseSingle($msg);
32
        }
33
    }
34
35
    /**
36
     *  Parse a single message to a corresponding object.
37
     *
38
     *  @param string $message
39
     *
40
     *  @return IrcMessage
41
     */
42
    private function parseSingle(string $message): IrcMessage
43
    {
44
        switch ($this->getCommand($message)) {
45
            case 'KICK':
46
                $msg = new KickMessage($message);
47
                break;
48
49
            case 'PING':
50
                $msg = new PingMessage($message);
51
                break;
52
53
            case 'PRIVMSG':
54
                $msg = new PrivmsgMessage($message);
55
                break;
56
57
            case IrcCommand::RPL_WELCOME:
58
                $msg = new WelcomeMessage($message);
59
                break;
60
61
            case 'TOPIC':
62
            case IrcCommand::RPL_TOPIC:
63
                $msg = new TopicChangeMessage($message);
64
                break;
65
66
            case IrcCommand::RPL_NAMREPLY:
67
                $msg = new NameReplyMessage($message);
68
                break;
69
70
            case IrcCommand::RPL_MOTD:
71
                $msg = new MOTDMessage($message);
72
                break;
73
74
            default:
75
                $msg = new IrcMessage($message);
76
                break;
77
        }
78
79
        return $msg;
80
    }
81
82
    /**
83
     *  Get the COMMAND part of an irc message.
84
     *
85
     *  @param string $message a raw irc message
86
     *
87
     *  @return string
88
     */
89
    private function getCommand(string $message): string
90
    {
91
        if ($message[0] === ':') {
92
            $message = trim(strstr($message, ' '));
93
        }
94
95
        return strstr($message, ' ', true);
96
    }
97
}
98