Chatterino
AbstractIrcServer.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <IrcMessage>
4 #include <functional>
5 #include <mutex>
6 #include <pajlada/signals/signal.hpp>
7 #include <pajlada/signals/signalholder.hpp>
8 
9 #include "common/Common.hpp"
11 #include "util/RatelimitBucket.hpp"
12 
13 namespace chatterino {
14 
15 class Channel;
16 using ChannelPtr = std::shared_ptr<Channel>;
17 
18 class AbstractIrcServer : public QObject
19 {
20 public:
21  enum ConnectionType { Read = 1, Write = 2, Both = 3 };
22 
23  virtual ~AbstractIrcServer() = default;
24 
25  // initializeIrc must be called from the derived class
26  // this allows us to initialize the abstract IRC server based on the derived class's parameters
27  void initializeIrc();
28 
29  // connection
30  void connect();
31  void disconnect();
32 
33  void sendMessage(const QString &channelName, const QString &message);
34  void sendRawMessage(const QString &rawMessage);
35 
36  // channels
37  ChannelPtr getOrAddChannel(const QString &dirtyChannelName);
38  ChannelPtr getChannelOrEmpty(const QString &dirtyChannelName);
39  std::vector<std::weak_ptr<Channel>> getChannels();
40 
41  // signals
42  pajlada::Signals::NoArgSignal connected;
43  pajlada::Signals::NoArgSignal disconnected;
44 
45  void addFakeMessage(const QString &data);
46 
47  void addGlobalSystemMessage(const QString &messageText);
48 
49  // iteration
50  void forEachChannel(std::function<void(ChannelPtr)> func);
51 
52 protected:
54 
55  // initializeConnectionSignals is called on a connection once in its lifetime.
56  // it can be used to connect signals to your class
57  virtual void initializeConnectionSignals(IrcConnection *connection,
58  ConnectionType type){};
59 
60  // initializeConnection is called every time before we try to connect to the IRC server
61  virtual void initializeConnection(IrcConnection *connection,
62  ConnectionType type) = 0;
63 
64  virtual std::shared_ptr<Channel> createChannel(
65  const QString &channelName) = 0;
66 
67  virtual void privateMessageReceived(Communi::IrcPrivateMessage *message);
68  virtual void readConnectionMessageReceived(Communi::IrcMessage *message);
69  virtual void writeConnectionMessageReceived(Communi::IrcMessage *message);
70 
71  virtual void onReadConnected(IrcConnection *connection);
72  virtual void onWriteConnected(IrcConnection *connection);
73  virtual void onDisconnected();
74 
75  virtual std::shared_ptr<Channel> getCustomChannel(
76  const QString &channelName);
77 
78  virtual bool hasSeparateWriteConnection() const = 0;
79  virtual QString cleanChannelName(const QString &dirtyChannelName);
80 
81  void open(ConnectionType type);
82 
83  QMap<QString, std::weak_ptr<Channel>> channels;
84  std::mutex channelMutex;
85 
86 private:
87  void initConnection();
88 
89  QObjectPtr<IrcConnection> writeConnection_ = nullptr;
90  QObjectPtr<IrcConnection> readConnection_ = nullptr;
91 
92  // Our rate limiting bucket for the Twitch join rate limits
93  // https://dev.twitch.tv/docs/irc/guide#rate-limits
94  QObjectPtr<RatelimitBucket> joinBucket_;
95 
96  QTimer reconnectTimer_;
97  int falloffCounter_ = 1;
98 
99  std::mutex connectionMutex_;
100 
101  // bool autoReconnect_ = false;
102  pajlada::Signals::SignalHolder connections_;
103 
104  bool initialized_{false};
105 };
106 
107 } // namespace chatterino
void addGlobalSystemMessage(const QString &messageText)
Definition: AbstractIrcServer.cpp:145
void open(ConnectionType type)
Definition: AbstractIrcServer.cpp:131
Definition: AbstractIrcServer.hpp:21
void addFakeMessage(const QString &data)
Definition: AbstractIrcServer.cpp:380
virtual void readConnectionMessageReceived(Communi::IrcMessage *message)
Definition: AbstractIrcServer.cpp:402
void sendRawMessage(const QString &rawMessage)
Definition: AbstractIrcServer.cpp:181
Definition: AbstractIrcServer.hpp:18
ConnectionType
Definition: AbstractIrcServer.hpp:21
void disconnect()
Definition: AbstractIrcServer.cpp:164
virtual void initializeConnectionSignals(IrcConnection *connection, ConnectionType type)
Definition: AbstractIrcServer.hpp:57
virtual void onWriteConnected(IrcConnection *connection)
Definition: AbstractIrcServer.cpp:342
virtual void onDisconnected()
Definition: AbstractIrcServer.cpp:347
virtual void onReadConnected(IrcConnection *connection)
Definition: AbstractIrcServer.cpp:292
Definition: Application.cpp:48
virtual void initializeConnection(IrcConnection *connection, ConnectionType type)=0
void sendMessage(const QString &channelName, const QString &message)
Definition: AbstractIrcServer.cpp:175
QMap< QString, std::weak_ptr< Channel > > channels
Definition: AbstractIrcServer.hpp:83
pajlada::Signals::NoArgSignal disconnected
Definition: AbstractIrcServer.hpp:43
virtual QString cleanChannelName(const QString &dirtyChannelName)
Definition: AbstractIrcServer.cpp:374
void connect()
Definition: AbstractIrcServer.cpp:114
virtual void writeConnectionMessageReceived(Communi::IrcMessage *message)
Definition: AbstractIrcServer.cpp:195
virtual bool hasSeparateWriteConnection() const =0
virtual std::shared_ptr< Channel > createChannel(const QString &channelName)=0
virtual std::shared_ptr< Channel > getCustomChannel(const QString &channelName)
Definition: AbstractIrcServer.cpp:367
ChannelPtr getChannelOrEmpty(const QString &dirtyChannelName)
Definition: AbstractIrcServer.cpp:251
Definition: AbstractIrcServer.hpp:21
Definition: IrcConnection2.hpp:12
virtual ~AbstractIrcServer()=default
ChannelPtr getOrAddChannel(const QString &dirtyChannelName)
Definition: AbstractIrcServer.cpp:201
void forEachChannel(std::function< void(ChannelPtr)> func)
Definition: AbstractIrcServer.cpp:407
virtual void privateMessageReceived(Communi::IrcPrivateMessage *message)
Definition: AbstractIrcServer.cpp:396
void initializeIrc()
Definition: AbstractIrcServer.cpp:94
std::unique_ptr< T, DeleteLater > QObjectPtr
Definition: Common.hpp:66
std::shared_ptr< Channel > ChannelPtr
Definition: Channel.hpp:125
std::mutex channelMutex
Definition: AbstractIrcServer.hpp:84
AbstractIrcServer()
Definition: AbstractIrcServer.cpp:22
pajlada::Signals::NoArgSignal connected
Definition: AbstractIrcServer.hpp:42
std::vector< std::weak_ptr< Channel > > getChannels()
Definition: AbstractIrcServer.cpp:279
Definition: AbstractIrcServer.hpp:21