Passed
Push — master ( 5e8abe...818453 )
by Jeroen
02:12 queued 13s
created

IrcMessageParser::parseSingle()   B

Complexity

Conditions 8
Paths 8

Size

Total Lines 34
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

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