blob: 43590e52b5d7daa1ab04c281ff29c51b501b7c0b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
#include "message.hpp"
#include <optional>
#include <string>
#include <vector>
namespace bot::irc {
std::optional<MessageType> define_message_type(const std::string &msg) {
std::vector<std::string> parts = utils::string::split_text(msg, ' ');
int i;
if (msg[0] == '@') {
i = 2;
} else if (msg[0] == ':') {
i = 1;
} else {
return std::nullopt;
}
if (parts[i] == "NOTICE") {
return MessageType::Notice;
} else if (parts[i] == "PRIVMSG") {
return MessageType::Privmsg;
} else if (parts[i] == "PING") {
return MessageType::Ping;
}
return std::nullopt;
}
std::optional<IRCMessage> IRCMessage::from_string(std::string msg) {
IRCMessage m;
if (msg[0] == '@') {
int end = msg.find(' ');
std::string raw_tags = msg.substr(1, end);
for (const std::string tag : utils::string::split_text(raw_tags, ';')) {
auto splitted_tag = utils::string::split_text_n(tag, "=", 1);
m.tags.insert_or_assign(splitted_tag[0], splitted_tag[1]);
}
msg = msg.substr(end + 1);
}
if (msg[0] == ':') {
int end = msg.find(' ');
m.prefix = msg.substr(1, end);
int bang = msg.find('!');
if (bang != std::string::npos) {
m.nick = m.prefix.substr(0, bang - 1);
}
msg = msg.substr(end + 1);
}
std::vector<std::string> parts = utils::string::split_text(msg, ' ');
m.command = parts.front();
parts.erase(parts.begin());
for (int i = 0; i < parts.size(); i++) {
if (parts[i][0] == ':') {
parts = std::vector<std::string>(parts.begin() + i, parts.end());
m.params.push_back(utils::string::join_vector(parts, ' ').substr(1));
break;
}
if (!parts[i].empty()) {
m.params.push_back(parts[i]);
}
}
return m;
}
}
|