1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
#pragma once
#include "MessageBoard.hpp"
#include "Chatbar.hpp"
#include "User.hpp"
#include "Channel.hpp"
#include "types.hpp"
#include "Suggestions.hpp"
#include "../bridge/DiscordService.hpp"
#include <vector>
#include <unordered_map>
#include <SFML/System/Clock.hpp>
#include <odhtdb/DatabaseNode.hpp>
#include <odhtdb/Signature.hpp>
#include <odhtdb/Group.hpp>
#include <odhtdb/Hash.hpp>
#include <odhtdb/DhtKey.hpp>
#include <odhtdb/Database.hpp>
#include <future>
namespace dchat
{
enum class ChannelDataType : u8
{
ADD_MESSAGE,
EDIT_MESSAGE,
DELETE_MESSAGE,
NICKNAME_CHANGE,
CHANGE_AVATAR,
CHANGE_CHANNEL_NAME,
ADD_DISCORD_MESSAGE
};
class Channel
{
public:
Channel(const std::string &name, const odhtdb::DatabaseNode &databaseNodeInfo = odhtdb::DatabaseNode(), User *localUser = nullptr, odhtdb::Database *database = nullptr);
virtual ~Channel();
Channel(const Channel& other) = delete;
Channel& operator = (const Channel &other) = delete;
User* getLocalUser();
SystemUser* getSystemUser();
MessageBoard& getMessageBoard();
const std::string& getName() const;
const std::vector<User*>& getUsers() const;
OnlineUser* getUserByPublicKey(const odhtdb::Signature::PublicKey &publicKey);
const odhtdb::DatabaseNode& getNodeInfo() const;
Message* getLatestMessage();
// If timestamp is 0, then current time is used
void addLocalMessage(const std::string &msg, User *owner, u64 timestampSeconds = 0);
void addLocalMessage(const std::string &msg, User *owner, u64 timestampSeconds, const odhtdb::Hash &id);
void addLocalDiscordMessage(const std::string &discordUserName, u64 discordUserId, const std::string &msg, User *owner, u64 timestampSeconds, const odhtdb::Hash &id);
void addSystemMessage(const std::string &msg, bool plainText = true);
void addMessage(const std::string &msg);
void addDiscordMessage(const std::string &discordUserName, u64 discordUserId, const std::string &msg);
void deleteLocalMessage(const odhtdb::Hash &id, const odhtdb::Signature::PublicKey &requestedByUser);
void deleteMessage(const odhtdb::Hash &id, const odhtdb::Signature::PublicKey &requestedByUser);
void addUserLocally(User *user);
bool addUser(const odhtdb::Signature::PublicKey &userId, const odhtdb::DataView &groupId);
void replaceLocalUser(OnlineLocalUser *newOnlineLocalUser);
void changeNick(const std::string &newNick);
void setAvatar(const std::string &newAvatarUrl);
void setNameLocally(const std::string &name);
void setName(const std::string &name);
// Returns -1 on failure
int getUserLowestPermissionLevel(OnlineUser *user) const;
void processEvent(const sf::Event &event, Cache &cache);
void draw(sf::RenderWindow &window, Cache &cache);
void update();
// Returns 0 if we are offline
u32 getSyncedTimestampUtcInSec();
const std::vector<BridgeService*>& getBridgeServices() const;
DiscordService* getDiscordService();
static void setCurrent(Channel *channel);
static Channel* getCurrent();
private:
void sendPing(u32 pingTimestampSec);
protected:
odhtdb::Database *database;
odhtdb::DatabaseNode databaseNodeInfo;
std::string name;
MessageBoard messageBoard;
Chatbar chatbar;
Suggestions suggestions;
User *localUser;
SystemUser systemUser;
std::vector<User*> users;
std::unordered_map<u64, OnlineDiscordUser*> discordUserById;
odhtdb::Signature::MapPublicKey<OnlineUser*> publicKeyOnlineUsersMap;
odhtdb::InfoHash pingKey;
sibs::ListenHandle pingListener;
sf::Clock pingTimer;
std::vector<BridgeService*> bridgeServices;
};
}
|