The complete source code of IdealIRC
http://www.idealirc.org/
168 lines
7.2 KiB
168 lines
7.2 KiB
#ifndef IRCBASE_H
|
|
#define IRCBASE_H
|
|
|
|
#include "IRCError.h"
|
|
#include "IRCPrefix.h"
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
#include <memory>
|
|
#include <chrono>
|
|
#include <unordered_map>
|
|
|
|
namespace asio { class io_context; }
|
|
class IRCChannel;
|
|
class IRCMember;
|
|
class DCC;
|
|
|
|
struct IRCBasePriv;
|
|
class IRCBase
|
|
{
|
|
friend struct IRCBasePriv;
|
|
|
|
public:
|
|
IRCBase();
|
|
~IRCBase();
|
|
|
|
IRCBase(IRCBase&& other);
|
|
IRCBase(const IRCBase&) = delete;
|
|
IRCBase& operator=(const IRCBase&) = delete;
|
|
|
|
bool poll();
|
|
|
|
[[nodiscard]] const std::string& getHostname() const;
|
|
IRCError setHostname(const std::string& hostname, bool SSL = false);
|
|
|
|
[[nodiscard]] const std::string& getPort() const;
|
|
IRCError setPort(const std::string& port);
|
|
|
|
[[nodiscard]] const std::string& getRealname() const;
|
|
IRCError setRealname(const std::string& realname);
|
|
|
|
[[nodiscard]] const std::string& getIdent() const;
|
|
IRCError setIdent(const std::string& ident);
|
|
|
|
[[nodiscard]] const std::string& getNickname() const;
|
|
void setNickname(const std::string& nickname);
|
|
|
|
[[nodiscard]] const std::string& getPassword() const;
|
|
void setPassword(const std::string& password);
|
|
|
|
void exceptSSL_SelfSigned(bool except);
|
|
void exceptSSL_CNMismatch(bool except);
|
|
void exceptSSL_Expired(bool except);
|
|
|
|
void command(const std::string& command, const std::vector<std::string>& args, const std::string& msg = "");
|
|
void command(const std::string& command, const std::string& msg);
|
|
void raw(const std::string& data);
|
|
|
|
void ctcp(const std::string& target, const std::string& command, const std::string& message = "");
|
|
|
|
//! Set to >0 to enable, =0 to disable.
|
|
void setManualKeepalive(std::chrono::seconds freq = std::chrono::seconds(30));
|
|
|
|
[[nodiscard]] std::chrono::milliseconds getManualKeepaliveFreq() const;
|
|
|
|
[[nodiscard]] asio::io_context& getIOCTX();
|
|
|
|
/**
|
|
* Takes a string of modes (letters like ohv), in their intended order
|
|
* and converts each letter to its corresponding display prefix (ie. @%+).
|
|
* For mode (letters) that isn't valid, a colon ':' is placed in-stead (since
|
|
* those can't naturally exist with the IRC protocol.)
|
|
*/
|
|
[[nodiscard]] std::string toMemberPrefix(const std::string& modes) const;
|
|
|
|
|
|
/**
|
|
* Which group does this channel mode belong in, as defined for the numeric 005 "isupport".
|
|
* Returns the character A,B,C,D for the groups, or, 'M' if this is a "member privilege" like o/v (op/voice).
|
|
* If no match, return the value 0 (zero, not character '0').
|
|
*
|
|
* A = Mode that adds or removes a nick or address to a list. Always has a parameter.
|
|
* B = Mode that changes a setting and always has a parameter.
|
|
* C = Mode that changes a setting and only has a parameter when set.
|
|
* D = Mode that changes a setting and never has a parameter.
|
|
*
|
|
* Note that group A does not hold the modes for member privileges.
|
|
*/
|
|
[[nodiscard]] char channelModeGroup(char m) const;
|
|
|
|
[[nodiscard]] IRCError tryConnect();
|
|
[[nodiscard]] IRCError disconnectFromServer(const std::string& quitMessage = "");
|
|
[[nodiscard]] IRCError lastErrorCode() const;
|
|
|
|
[[nodiscard]] bool isOnline() const;
|
|
[[nodiscard]] bool isConnected() const;
|
|
[[nodiscard]] bool isSSL() const;
|
|
|
|
[[nodiscard]] static const std::vector<std::string>& clientV3Support();
|
|
[[nodiscard]] const std::vector<std::string>& registeredV3Support() const;
|
|
[[nodiscard]] const std::vector<std::string>& serverV3Support() const;
|
|
[[nodiscard]] const std::unordered_map<std::string,std::string>& isupport() const;
|
|
|
|
[[nodiscard]] const std::vector<std::shared_ptr<IRCChannel>>& channels() const;
|
|
[[nodiscard]] std::shared_ptr<IRCChannel> getChannel(const std::string& name) const;
|
|
[[nodiscard]] std::shared_ptr<IRCMember> getMember(const std::string& nickname) const;
|
|
|
|
std::pair<std::shared_ptr<DCC>, IRCError> initiateDCC(const std::string& port); // Creates a DCC initiator (tcp server)
|
|
IRCError declineDCC(std::shared_ptr<DCC> dcc);
|
|
|
|
protected:
|
|
virtual void onConnected() {}
|
|
virtual void onConnectedWithSSLExceptions(const std::vector<IRCError>& codes) {}
|
|
virtual void onDisconnected() {}
|
|
virtual void onRegistered() {}
|
|
virtual void onConnectionError(IRCError e) {}
|
|
|
|
/*
|
|
* To correctly implement and get all data from a standard IRC server,
|
|
* the following virtuals must be implemented.
|
|
*/
|
|
virtual void onMsgNick(const IRCPrefix& sender, const std::string& newNickname, const std::vector<std::string>& channelsAffected) = 0;
|
|
virtual void onMsgMode(const IRCPrefix& sender, const std::string& target, const std::string& modes, const std::vector<std::string>& args) = 0;
|
|
virtual void onMsgQuit(const IRCPrefix& sender, const std::string& message, const std::vector<std::string>& channelsAffected) = 0;
|
|
virtual void onMsgJoin(const IRCPrefix& sender, const std::string& target) = 0;
|
|
virtual void onMsgPart(const IRCPrefix& sender, const std::string& target, const std::string& message) = 0;
|
|
virtual void onMsgTopic(const IRCPrefix& sender, const std::string& target, const std::string& topic) = 0;
|
|
virtual void onMsgInvite(const IRCPrefix& sender, const std::string& target) = 0;
|
|
virtual void onMsgKick(const IRCPrefix& sender, const std::string& target, const std::string& who, const std::string& reason) = 0;
|
|
virtual void onMsgPrivmsg(const IRCPrefix& sender, const std::string& target, const std::string& message) = 0;
|
|
virtual void onMsgNotice(const IRCPrefix& sender, const std::string& target, const std::string& message) = 0;
|
|
virtual void onMsgKill(const IRCPrefix& sender, const std::string& reason) = 0;
|
|
virtual void onMsgPing(const std::string& message) = 0;
|
|
virtual void onMsgPong(const std::string& message) = 0;
|
|
virtual void onMsgError(const std::string& message) = 0;
|
|
virtual void onMsgWallops(const IRCPrefix& sender, const std::string& message) = 0;
|
|
virtual void onMsgNumeric(const IRCPrefix& sender, const std::string& num, const std::vector<std::string>& args, const std::string& message) = 0;
|
|
|
|
/*
|
|
* CTCP/DCC isn't really a part of the IRC standard so these are optional.
|
|
*/
|
|
virtual void onMsgCTCPRequest(const IRCPrefix& sender, const std::string& target, const std::string& command, const std::string& message) {};
|
|
virtual void onMsgCTCPResponse(const IRCPrefix& sender, const std::string& target, const std::string& command, const std::string& message) {};
|
|
virtual void onMsgDCCRequest(std::shared_ptr<DCC> dcc, const IRCPrefix& sender, const std::string& target, const std::string& type, const std::string& message) {};
|
|
|
|
/*
|
|
* Optional IRCv3 extensions to implement.
|
|
*/
|
|
virtual void v3onMsgAway(const IRCPrefix& sender, const std::string& message, const std::vector<std::string>& channelsAffected) {};
|
|
virtual void v3onMsgAccountLogin(const IRCPrefix& sender, const std::string& useraccount) {}
|
|
virtual void v3onMsgAccountLogout(const IRCPrefix& sender) {}
|
|
|
|
/*
|
|
* Required IRCv3 extensions to implement.
|
|
*/
|
|
virtual void v3onMsgJoin(const IRCPrefix& sender, const std::string& channel, const std::string& useraccount, const std::string& realname) = 0;
|
|
|
|
/*
|
|
* Catch-all handler. If the message parser cannot match for any of the commands, it will turn up here.
|
|
* Optional to implement.
|
|
*/
|
|
virtual void onMsgUnhandled(const IRCPrefix& sender, const std::string& command, const std::vector<std::string>& args, const std::string& message) {}
|
|
|
|
private:
|
|
std::unique_ptr<IRCBasePriv> mp;
|
|
};
|
|
|
|
#endif // IRCBASE_H
|
|
|