Chat-O-Matic/application/Conversation.h
Jaidyn Ann dc3fdd65c8 Store chatlogs in binary and text formats
If chat logs are stored in an endless plain-text file, they're going to be a
pain to parse. If they're stored in a binary file, they're a pain for
the user to `grep` or go through manually, but they're easier to parse.

Why not both?

Logs are now stored with a BMessage (with BStringLists) in the 'logs'
attribute, and the plain-text logs in the file itself.

The attribute will only store 20 messages, but the file itself will be
appended to forever.

The logs directory also changed, from ~/config/settings/Caya/Cache/Logs
to ~/config/settings/Caya/Logs.

Useful functions for reading/writing messages to and from an attribute were
borrowed from BePodder's libfunky. :-)
2021-06-06 12:02:26 -05:00

98 lines
2.0 KiB
C++

/*
* Copyright 2021, Jaidyn Levesque <jadedctrl@teknik.io>
* All rights reserved. Distributed under the terms of the MIT license.
*/
#ifndef CONVERSATION_H
#define CONVERSATION_H
#include <DateTimeFormat.h>
#include <Messenger.h>
#include <Path.h>
#include <libsupport/KeyMap.h>
#include "Observer.h"
#include "Role.h"
#include "Server.h"
#include "User.h"
class BBitmap;
class ConversationItem;
class ConversationView;
class ProtocolLooper;
class Server;
typedef KeyMap<BString, User*> UserMap;
typedef KeyMap<BString, Role*> RoleMap;
class Conversation : public Notifier, public Observer {
public:
Conversation(BString id, BMessenger msgn);
BString GetId() const;
void ImMessage(BMessage* msg);
// Tell the ConversationView to invalidate user list
void ObserveString(int32 what, BString str);
void ObserveInteger(int32 what, int32 value);
void ObservePointer(int32 what, void* ptr);
void SetNotifySubject(const char* subject);
BMessenger Messenger() const;
void SetMessenger(BMessenger messenger);
ProtocolLooper* GetProtocolLooper() const;
void SetProtocolLooper(ProtocolLooper* looper);
BBitmap* ProtocolBitmap() const;
BBitmap* IconBitmap() const;
BString GetName() const;
ConversationView* GetView();
void ShowView(bool typing, bool userAction);
ConversationItem* GetListItem();
UserMap Users();
User* UserById(BString id);
BString OwnUserId();
void AddUser(User* user);
void RemoveUser(User* user);
void SetRole(BString id, Role* role);
Role* GetRole(BString id);
private:
void _LogChatMessage(BMessage* msg);
status_t _GetChatLogs(BMessage* msg);
void _EnsureLogPath();
User* _EnsureUser(BMessage* msg);
Server* _GetServer();
BMessenger fMessenger;
ProtocolLooper* fLooper;
ConversationView* fChatView;
ConversationItem* fConversationItem;
BString fID;
BString fName;
BString fSubject;
BBitmap* fIcon;
BPath fLogPath;
BDateTimeFormat fDateFormatter;
UserMap fUsers;
RoleMap fRoles;
};
#endif // CONVERSATION_H