cmake: avoid de-duplication of user's CXXFLAGS
[quassel.git] / src / core / coresession.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 #pragma once
22
23 #include <utility>
24 #include <vector>
25
26 #include <QHash>
27 #include <QSet>
28 #include <QString>
29 #include <QVariant>
30
31 #include "corealiasmanager.h"
32 #include "corehighlightrulemanager.h"
33 #include "coreignorelistmanager.h"
34 #include "coreinfo.h"
35 #include "message.h"
36 #include "metricsserver.h"
37 #include "peer.h"
38 #include "protocol.h"
39 #include "storage.h"
40
41 class CoreBacklogManager;
42 class CoreBufferSyncer;
43 class CoreBufferViewManager;
44 class CoreDccConfig;
45 class CoreIdentity;
46 class CoreIrcListHelper;
47 class CoreNetwork;
48 class CoreNetworkConfig;
49 class CoreSessionEventProcessor;
50 class CoreTransferManager;
51 class CtcpParser;
52 class EventManager;
53 class EventStringifier;
54 class InternalPeer;
55 class IrcParser;
56 class MessageEvent;
57 class RemotePeer;
58 class SignalProxy;
59
60 struct NetworkInfo;
61
62 class CoreSession : public QObject
63 {
64     Q_OBJECT
65
66 public:
67     CoreSession(UserId, bool restoreState, bool strictIdentEnabled, QObject* parent = nullptr);
68
69     std::vector<BufferInfo> buffers() const;
70     inline UserId user() const { return _user; }
71     CoreNetwork* network(NetworkId) const;
72     CoreIdentity* identity(IdentityId) const;
73
74     /**
75      * Returns the optionally strict-compliant ident for the given user identity
76      *
77      * If strict mode is enabled, this will return the user's Quassel username for any identity,
78      * otherwise this will return the given identity's ident, whatever it may be.
79      *
80      * @return The user's ident, compliant with strict mode (when enabled)
81      */
82     const QString strictCompliantIdent(const CoreIdentity* identity);
83
84     inline CoreNetworkConfig* networkConfig() const { return _networkConfig; }
85
86     Protocol::SessionState sessionState() const;
87
88     inline SignalProxy* signalProxy() const { return _signalProxy; }
89
90     const AliasManager& aliasManager() const { return _aliasManager; }
91     AliasManager& aliasManager() { return _aliasManager; }
92
93     inline EventManager* eventManager() const { return _eventManager; }
94     inline EventStringifier* eventStringifier() const { return _eventStringifier; }
95     inline CoreSessionEventProcessor* sessionEventProcessor() const { return _sessionEventProcessor; }
96     inline CtcpParser* ctcpParser() const { return _ctcpParser; }
97     inline IrcParser* ircParser() const { return _ircParser; }
98
99     inline CoreIrcListHelper* ircListHelper() const { return _ircListHelper; }
100
101     inline CoreIgnoreListManager* ignoreListManager() { return &_ignoreListManager; }
102     inline HighlightRuleManager* highlightRuleManager() { return &_highlightRuleManager; }
103     inline CoreTransferManager* transferManager() const { return _transferManager; }
104     inline CoreDccConfig* dccConfig() const { return _dccConfig; }
105
106     //   void attachNetworkConnection(NetworkConnection *conn);
107
108     //! Return necessary data for restoring the session after restarting the core
109     void restoreSessionState();
110
111 public slots:
112     void addClient(RemotePeer* peer);
113     void addClient(InternalPeer* peer);
114
115     /**
116      * Shuts down the session and deletes itself afterwards.
117      */
118     void shutdown();
119
120     void msgFromClient(BufferInfo, QString message);
121
122     //! Create an identity and propagate the changes to the clients.
123     /** \param identity The identity to be created.
124      */
125     void createIdentity(const Identity& identity, const QVariantMap& additional);
126     void createIdentity(const CoreIdentity& identity);
127
128     //! Remove identity and propagate that fact to the clients.
129     /** \param identity The identity to be removed.
130      */
131     void removeIdentity(IdentityId identity);
132
133     //! Create a network and propagate the changes to the clients.
134     /** \param info The network's settings.
135      */
136     void createNetwork(const NetworkInfo& info, const QStringList& persistentChannels = QStringList());
137
138     //! Remove network and propagate that fact to the clients.
139     /** \param network The id of the network to be removed.
140      */
141     void removeNetwork(NetworkId network);
142
143     //! Rename a Buffer for a given network
144     /* \param networkId The id of the network the buffer belongs to
145      * \param newName   The new name of the buffer
146      * \param oldName   The old name of the buffer
147      */
148     void renameBuffer(const NetworkId& networkId, const QString& newName, const QString& oldName);
149
150     void changePassword(PeerPtr peer, const QString& userName, const QString& oldPassword, const QString& newPassword);
151
152     void kickClient(int peerId);
153
154     QHash<QString, QString> persistentChannels(NetworkId) const;
155
156     QHash<QString, QByteArray> bufferCiphers(NetworkId id) const;
157     void setBufferCipher(NetworkId id, const QString& bufferName, const QByteArray& cipher) const;
158
159     /**
160      * Marks us away (or unaway) on all networks
161      *
162      * @param[in] msg             Away message, or blank to set unaway
163      * @param[in] skipFormatting  If true, skip timestamp formatting codes (e.g. if already done)
164      */
165     void globalAway(const QString& msg = QString(), bool skipFormatting = false);
166
167 signals:
168     void initialized();
169     void sessionStateReceived(const Protocol::SessionState& sessionState);
170
171     // void msgFromGui(uint netid, QString buf, QString message);
172     void displayMsg(Message message);
173     void displayStatusMsg(QString, QString);
174
175     //! Identity has been created.
176     /** This signal is propagated to the clients to tell them that the given identity has been created.
177      *  \param identity The new identity.
178      */
179     void identityCreated(const Identity& identity);
180
181     //! Identity has been removed.
182     /** This signal is propagated to the clients to inform them about the removal of the given identity.
183      *  \param identity The identity that has been removed.
184      */
185     void identityRemoved(IdentityId identity);
186
187     void networkCreated(NetworkId);
188     void networkRemoved(NetworkId);
189     void networkDisconnected(NetworkId);
190
191     void passwordChanged(PeerPtr peer, bool success);
192
193     void disconnectFromCore();
194
195 protected:
196     void customEvent(QEvent* event) override;
197
198 private slots:
199     void removeClient(Peer* peer);
200
201     void recvStatusMsgFromServer(QString msg);
202     void recvMessageFromServer(RawMessage msg);
203
204     void destroyNetwork(NetworkId);
205
206     void clientsConnected();
207     void clientsDisconnected();
208
209     void updateIdentityBySender();
210
211     void saveSessionState() const;
212
213     void onNetworkDisconnected(NetworkId networkId);
214
215 private:
216     void processMessages();
217
218     void loadSettings();
219
220     /// Hook for converting events to the old displayMsg() handlers
221     Q_INVOKABLE void processMessageEvent(MessageEvent* event);
222
223     UserId _user;
224
225     /// Whether or not strict ident mode is enabled, locking users' idents to Quassel username
226     bool _strictIdentEnabled;
227
228     SignalProxy* _signalProxy;
229     CoreAliasManager _aliasManager;
230
231     QHash<IdentityId, CoreIdentity*> _identities;
232     QHash<NetworkId, CoreNetwork*> _networks;
233     QSet<NetworkId> _networksPendingDisconnect;
234
235     CoreBufferSyncer* _bufferSyncer;
236     CoreBacklogManager* _backlogManager;
237     CoreBufferViewManager* _bufferViewManager;
238     CoreDccConfig* _dccConfig;
239     CoreIrcListHelper* _ircListHelper;
240     CoreNetworkConfig* _networkConfig;
241     CoreInfo* _coreInfo;
242     CoreTransferManager* _transferManager;
243
244     EventManager* _eventManager;
245     EventStringifier* _eventStringifier;  // should eventually move into client
246     CoreSessionEventProcessor* _sessionEventProcessor;
247     CtcpParser* _ctcpParser;
248     IrcParser* _ircParser;
249
250     /**
251      * This method obtains the prefixes of the message's sender within a channel, by looking up their channelmodes, and
252      * processing them to prefixes based on the network's settings.
253      * @param sender The hostmask of the sender
254      * @param bufferInfo The BufferInfo object of the buffer
255      */
256     QString senderPrefixes(const QString& sender, const BufferInfo& bufferInfo) const;
257
258     /**
259      * This method obtains the realname of the message's sender.
260      * @param sender The hostmask of the sender
261      * @param networkId The network the user is on
262      */
263     QString realName(const QString& sender, NetworkId networkId) const;
264
265     /**
266      * This method obtains the avatar of the message's sender.
267      * @param sender The hostmask of the sender
268      * @param networkId The network the user is on
269      */
270     QString avatarUrl(const QString& sender, NetworkId networkId) const;
271     QList<RawMessage> _messageQueue;
272     bool _processMessages;
273     CoreIgnoreListManager _ignoreListManager;
274     CoreHighlightRuleManager _highlightRuleManager;
275     MetricsServer* _metricsServer{nullptr};
276 };
277
278 struct NetworkInternalMessage
279 {
280     Message::Type type;
281     BufferInfo::Type bufferType;
282     QString target;
283     QString text;
284     QString sender;
285     Message::Flags flags;
286     NetworkInternalMessage(Message::Type type,
287                            BufferInfo::Type bufferType,
288                            QString target,
289                            QString text,
290                            QString sender = "",
291                            Message::Flags flags = Message::None)
292         : type(type)
293         , bufferType(bufferType)
294         , target(std::move(target))
295         , text(std::move(text))
296         , sender(std::move(sender))
297         , flags(flags)
298     {}
299 };
300
301 struct RawMessage
302 {
303     QDateTime timestamp;
304     NetworkId networkId;
305     Message::Type type;
306     BufferInfo::Type bufferType;
307     QString target;
308     QString text;
309     QString sender;
310     Message::Flags flags;
311
312     RawMessage(QDateTime timestamp,
313                NetworkId networkId,
314                Message::Type type,
315                BufferInfo::Type bufferType,
316                QString target,
317                QString text,
318                QString sender,
319                Message::Flags flags)
320         : timestamp(std::move(timestamp))
321         , networkId(networkId)
322         , type(type)
323         , bufferType(bufferType)
324         , target(std::move(target))
325         , text(std::move(text))
326         , sender(std::move(sender))
327         , flags(flags)
328     {}
329
330     RawMessage(NetworkId networkId,
331                const NetworkInternalMessage& msg)
332         : timestamp(QDateTime::currentDateTimeUtc())
333         , networkId(networkId)
334         , type(msg.type)
335         , bufferType(msg.bufferType)
336         , target(msg.target)
337         , text(msg.text)
338         , sender(msg.sender)
339         , flags(msg.flags)
340     {}
341 };