#pragma once #include #include #include #include "channel.hpp" namespace chatterino { namespace providers { namespace irc { class AbstractIrcServer { public: // connection Communi::IrcConnection *getReadConnection() const; void connect(); void disconnect(); void sendMessage(const QString &channelName, const QString &message); // channels std::shared_ptr addChannel(const QString &channelName); std::shared_ptr getChannel(const QString &channelName); // signals pajlada::Signals::NoArgSignal connected; pajlada::Signals::NoArgSignal disconnected; pajlada::Signals::Signal onPrivateMessage; void addFakeMessage(const QString &data); protected: AbstractIrcServer(); virtual void initializeConnection(Communi::IrcConnection *connection, bool isRead, bool isWrite) = 0; virtual std::shared_ptr createChannel(const QString &channelName) = 0; virtual void privateMessageReceived(Communi::IrcPrivateMessage *message); virtual void messageReceived(Communi::IrcMessage *message); virtual void writeConnectionMessageReceived(Communi::IrcMessage *message); virtual void onConnected(); virtual void onDisconnected(); virtual std::shared_ptr getCustomChannel(const QString &channelName); private: void initConnection(); QMap> channels; std::unique_ptr writeConnection = nullptr; std::unique_ptr readConnection = nullptr; std::mutex connectionMutex; std::mutex channelMutex; }; } // namespace irc } // namespace providers } // namespace chatterino