1 #pragma once
2 
3 #include <rapidjson/document.h>
4 #include <QColor>
5 #include <QString>
6 
7 #include <chrono>
8 #include <cinttypes>
9 
10 namespace chatterino {
11 
12 struct ActionUser {
13     QString id;
14     QString login;
15     // displayName should be in format "login(localizedName)" for non-ascii usernames
16     QString displayName;
17     QColor color;
18 };
19 
20 struct PubSubAction {
21     PubSubAction(const rapidjson::Value &data, const QString &_roomID);
22     ActionUser source;
23 
24     std::chrono::steady_clock::time_point timestamp;
25     QString roomID;
26 };
27 
28 // Used when a chat mode (i.e. slowmode, subscribers only mode) is enabled or
29 // disabled
30 struct ModeChangedAction : PubSubAction {
31     using PubSubAction::PubSubAction;
32 
33     enum Mode {
34         Unknown,
35         Slow,
36         R9K,
37         SubscribersOnly,
38         EmoteOnly,
39     } mode;
40 
41     // Whether the mode was turned on or off
42     enum State {
43         Off,
44         On,
45     } state;
46 
47     uint32_t duration = 0;
48 
getModeNamechatterino::ModeChangedAction49     const char *getModeName() const
50     {
51         switch (this->mode)
52         {
53             case Mode::Slow:
54                 return "slow";
55             case Mode::R9K:
56                 return "r9k";
57             case Mode::SubscribersOnly:
58                 return "subscribers-only";
59             case Mode::EmoteOnly:
60                 return "emote-only";
61             default:
62                 return "unknown";
63         }
64     }
65 };
66 
67 struct BanAction : PubSubAction {
68     using PubSubAction::PubSubAction;
69 
70     ActionUser target;
71 
72     QString reason;
73 
74     uint32_t duration = 0;
75 
isBanchatterino::BanAction76     bool isBan() const
77     {
78         return this->duration == 0;
79     }
80 };
81 
82 struct DeleteAction : PubSubAction {
83     using PubSubAction::PubSubAction;
84 
85     ActionUser target;
86 
87     QString messageId;
88     QString messageText;
89 };
90 
91 struct UnbanAction : PubSubAction {
92     using PubSubAction::PubSubAction;
93 
94     ActionUser target;
95 
96     enum {
97         Banned,
98         TimedOut,
99     } previousState;
100 
wasBanchatterino::UnbanAction101     bool wasBan() const
102     {
103         return this->previousState == Banned;
104     }
105 };
106 
107 struct ClearChatAction : PubSubAction {
108     using PubSubAction::PubSubAction;
109 };
110 
111 struct ModerationStateAction : PubSubAction {
112     using PubSubAction::PubSubAction;
113 
114     ActionUser target;
115 
116     // true = modded
117     // false = unmodded
118     bool modded;
119 };
120 
121 struct AutomodAction : PubSubAction {
122     using PubSubAction::PubSubAction;
123 
124     ActionUser target;
125 
126     QString message;
127 
128     QString reason;
129 
130     QString msgID;
131 };
132 
133 struct AutomodUserAction : PubSubAction {
134     using PubSubAction::PubSubAction;
135 
136     ActionUser target;
137 
138     enum {
139         AddPermitted,
140         RemovePermitted,
141         AddBlocked,
142         RemoveBlocked,
143         Properties,
144     } type;
145 
146     QString message;
147 };
148 
149 struct AutomodInfoAction : PubSubAction {
150     using PubSubAction::PubSubAction;
151     enum {
152         OnHold,
153         Denied,
154         Approved,
155     } type;
156 };
157 
158 }  // namespace chatterino
159