Chat-O-Matic/protocols/irc/IrcProtocol.h

162 lines
4.1 KiB
C
Raw Permalink Normal View History

2021-06-20 22:17:24 -05:00
/*
* Copyright 2021-2022, Jaidyn Levesque <jadedctrl@teknik.io>
2021-08-16 21:52:28 -05:00
* Copyright 2017, Akshay Agarwal <agarwal.akshay.akshay8@gmail.com>
2021-06-20 22:17:24 -05:00
* All rights reserved. Distributed under the terms of the MIT license.
*/
#ifndef _IRC_PROTOCOL_H
#define _IRC_PROTOCOL_H
#include <String.h>
#include <StringList.h>
2021-06-20 22:17:24 -05:00
2021-08-10 00:03:28 -05:00
#include <libsupport/KeyMap.h>
2021-06-20 22:17:24 -05:00
#include <ChatProtocol.h>
2021-08-16 16:11:37 -05:00
#include "IrcConstants.h"
2021-08-10 00:03:28 -05:00
typedef KeyMap<BString, BString> StringMap;
class BSocket;
class BDataIO;
2021-08-10 00:03:28 -05:00
2021-06-20 22:17:24 -05:00
class IrcProtocol : public ChatProtocol {
public:
IrcProtocol();
~IrcProtocol();
2021-06-20 22:17:24 -05:00
// ChatProtocol inheritance
virtual status_t Init(ChatProtocolMessengerInterface* interface);
virtual status_t Shutdown();
virtual status_t UpdateSettings(BMessage* settings);
2021-06-20 22:17:24 -05:00
virtual status_t Process(BMessage* msg);
virtual BMessage SettingsTemplate(const char* name);
virtual BObjectList<BMessage>
Commands();
2021-06-20 22:17:24 -05:00
virtual const char* Signature() const { return "irc"; }
virtual const char* FriendlySignature() const { return "IRC"; }
2021-06-20 22:17:24 -05:00
virtual BBitmap* Icon() const;
virtual void SetAccountCachepath(BPath path) { fCachePath = path; }
virtual void SetAddOnPath(BPath path) { fAddOnPath = path; }
virtual BPath AddOnPath() { return fAddOnPath; }
2021-06-20 22:17:24 -05:00
virtual const char* GetName() { return fName; }
virtual void SetName(const char* name) { fName = name; }
2021-06-20 22:17:24 -05:00
virtual ChatProtocolMessengerInterface*
MessengerInterface() const { return fMessenger; }
// IRC
status_t Connect();
status_t Loop();
BMessage* fSettings;
2021-06-20 22:17:24 -05:00
private:
void _ProcessLine(BString line);
void _ProcessNumeric(int32 numeric, BString sender,
2021-08-12 10:14:46 -05:00
BStringList params, BString line);
2021-08-09 19:03:37 -05:00
void _ProcessNumericError(int32 numeric, BString sender,
2021-08-12 10:14:46 -05:00
BStringList params, BString line);
void _ProcessCommand(BString command, BString sender,
2021-08-12 10:14:46 -05:00
BStringList params, BString line);
2021-08-10 10:00:26 -05:00
void _MakeReady(BString nick, BString ident);
BString _LineSender(BStringList words);
BString _LineCode(BStringList words);
2021-08-09 19:03:37 -05:00
BStringList _LineParameters(BStringList words, BString line);
void _SendMsg(BMessage* msg);
void _SendIrc(BString cmd);
// Used with "nick!ident"-formatted strings
BString _SenderNick(BString sender);
BString _SenderIdent(BString sender);
2021-08-10 00:03:28 -05:00
BString _IdentNick(BString ident);
2021-08-16 00:42:39 -05:00
BString _NickIdent(BString nick);
2021-08-10 00:03:28 -05:00
bool _IsChannelName(BString name);
void _AddFormatted(BMessage* msg, const char* name,
BString text);
2021-08-16 21:52:28 -05:00
void _FormatToggleFace(BMessage* msg, uint16 face,
int32* start, int32 current);
2021-08-16 00:42:39 -05:00
void _UpdateContact(BString nick, BString ident, bool online);
void _AddContact(BString nick);
void _RemoveContact(BString user_id);
void _RenameContact(BString user_id, BString newNick);
void _LoadContacts();
void _SaveContacts();
2021-08-16 16:11:37 -05:00
int32 _RolePerms(UserRole role);
const char* _RoleTitle(UserRole role);
2021-08-16 00:42:39 -05:00
const char* _ContactsCache();
2021-08-18 23:05:57 -05:00
void _JoinDefaultRooms();
2021-08-16 00:42:39 -05:00
// Read a data stream until newline found; if data found past
// newline, append to given buffer for later use
BString _ReadUntilNewline(BDataIO* data, BString* extraBuffer);
// Trim given string until newline hit, return trimmed part
BString _TrimStringToNewline(BString* str);
2021-08-16 21:52:28 -05:00
// Borrowed from Calendar's ColorConverter
rgb_color _IntToRgb(int rgb);
// GUI templates
BMessage _AccountTemplate();
BMessage _RoomTemplate();
2021-08-16 00:42:39 -05:00
BMessage _RosterTemplate();
BSocket* fSocket;
BString fRemainingBuf;
thread_id fRecvThread;
// Settings
BString fNick;
BString fUser;
2021-08-09 19:03:37 -05:00
BString fIdent;
BString fPartText;
BString fRealName;
BString fPassword;
BString fServer;
int32 fPort;
bool fSsl;
2021-06-20 22:17:24 -05:00
// WHOREPLY is requested by the add-on to populate the user-list, but the
// user might also use the /who command― if the user does, this is true
bool fWhoRequested;
bool fWhoIsRequested;
bool fListRequested;
BString fWhoIm;
bool fWriteLocked;
2021-08-10 00:03:28 -05:00
StringMap fIdentNicks; // User ident → nick
2021-08-11 18:51:41 -05:00
BStringList fChannels;
2021-08-16 00:42:39 -05:00
BStringList fContacts;
BStringList fOfflineContacts;
2021-06-20 22:17:24 -05:00
BPath fAddOnPath;
BPath fCachePath;
BString fName;
ChatProtocolMessengerInterface* fMessenger;
2021-08-09 19:03:37 -05:00
bool fReady;
2021-06-20 22:17:24 -05:00
};
#endif // _IRC_PROTOCOL_H