46071cf1fb3124df0a3216f9c5f07acfbd4d09f2
[quassel.git] / src / common / irccap.h
1 /***************************************************************************
2  *   Copyright (C) 2005-2019 by the Quassel Project                        *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) version 3.                                           *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
19  ***************************************************************************/
20
21 #ifndef IRCCAP_H
22 #define IRCCAP_H
23
24 #include <QString>
25 #include <QStringList>
26
27 // Why a namespace instead of a class?  Seems to be a better fit for C++ than a 'static' class, as
28 // compared to C# or Java.  However, feel free to change if needed.
29 // See https://stackoverflow.com/questions/482745/namespaces-for-enum-types-best-practices
30 /**
31  * IRCv3 capability names and values
32  */
33 namespace IrcCap {
34
35 // NOTE: If you add or modify the constants below, update the knownCaps list.
36
37 /**
38  * Account change notification.
39  *
40  * http://ircv3.net/specs/extensions/account-notify-3.1.html
41  */
42 const QString ACCOUNT_NOTIFY = "account-notify";
43
44 /**
45  * Magic number for WHOX, used to ignore user-requested WHOX replies from servers
46  *
47  * If a user initiates a WHOX, there's no easy way to tell what fields were requested.  It's
48  * simpler to not attempt to parse data from user-requested WHOX replies.
49  */
50 const uint ACCOUNT_NOTIFY_WHOX_NUM = 369;
51
52 /**
53  * Away change notification.
54  *
55  * http://ircv3.net/specs/extensions/away-notify-3.1.html
56  */
57 const QString AWAY_NOTIFY = "away-notify";
58
59 /**
60  * Capability added/removed notification.
61  *
62  * This is implicitly enabled via CAP LS 302, and is here for servers that only partially
63  * support IRCv3.2.
64  *
65  * http://ircv3.net/specs/extensions/cap-notify-3.2.html
66  */
67 const QString CAP_NOTIFY = "cap-notify";
68
69 /**
70  * Hostname/user changed notification.
71  *
72  * http://ircv3.net/specs/extensions/chghost-3.2.html
73  */
74 const QString CHGHOST = "chghost";
75
76 /**
77  * Extended join information.
78  *
79  * http://ircv3.net/specs/extensions/extended-join-3.1.html
80  */
81 const QString EXTENDED_JOIN = "extended-join";
82
83 /**
84  * Multiple mode prefixes in MODE and WHO replies.
85  *
86  * http://ircv3.net/specs/extensions/multi-prefix-3.1.html
87  */
88 const QString MULTI_PREFIX = "multi-prefix";
89
90 /**
91  * SASL authentication.
92  *
93  * http://ircv3.net/specs/extensions/sasl-3.2.html
94  */
95 const QString SASL = "sasl";
96
97 /**
98  * Userhost in names replies.
99  *
100  * http://ircv3.net/specs/extensions/userhost-in-names-3.2.html
101  */
102 const QString USERHOST_IN_NAMES = "userhost-in-names";
103
104 /**
105  * Vendor-specific capabilities
106  */
107 namespace Vendor {
108
109 /**
110  * Twitch.tv membership message support
111  *
112  * User list in a channel can be quite large and often non required for bot users and is then optional.
113  *
114  * From Twitch.tv documentation:
115  * "Adds membership state event data. By default, we do not send this data to clients without this capability."
116  *
117  * https://dev.twitch.tv/docs/v5/guides/irc/#twitch-irc-capability-membership
118  */
119 const QString TWITCH_MEMBERSHIP = "twitch.tv/membership";
120
121 /**
122  * Self message support, as recognized by ZNC.
123  *
124  * Some servers (e.g. Bitlbee) assume self-message support; ZNC requires a capability
125  * instead.  As self-message is already implemented, there's little reason to not do this.
126  *
127  * More information in the IRCv3 commit that removed the 'self-message' capability.
128  *
129  * https://github.com/ircv3/ircv3-specifications/commit/1bfba47843c2526707c902034b3395af934713c8
130  */
131 const QString ZNC_SELF_MESSAGE = "znc.in/self-message";
132 }  // namespace Vendor
133
134 /**
135  * List of capabilities currently implemented and requested during capability negotiation.
136  */
137 const QStringList knownCaps = QStringList{ACCOUNT_NOTIFY,
138                                           AWAY_NOTIFY,
139                                           CAP_NOTIFY,
140                                           CHGHOST,
141                                           EXTENDED_JOIN,
142                                           MULTI_PREFIX,
143                                           SASL,
144                                           USERHOST_IN_NAMES,
145                                           Vendor::TWITCH_MEMBERSHIP,
146                                           Vendor::ZNC_SELF_MESSAGE};
147 // NOTE: If you modify the knownCaps list, update the constants above as needed.
148
149 /**
150  * SASL authentication mechanisms
151  *
152  * http://ircv3.net/specs/extensions/sasl-3.1.html
153  */
154 namespace SaslMech {
155 /**
156  * PLAIN authentication, e.g. hashed password
157  */
158 const QString PLAIN = "PLAIN";
159
160 /**
161  * EXTERNAL authentication, e.g. SSL certificate and keys
162  */
163 const QString EXTERNAL = "EXTERNAL";
164 }  // namespace SaslMech
165 }  // namespace IrcCap
166
167 #endif  // IRCCAP_H