summaryrefslogtreecommitdiff
path: root/bot/src/irc/message.cpp
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;
  }
}