#pragma once #include "types.hpp" #include #include namespace dchat { class User { public: enum class Type { OTHER, ONLINE_REMOTE_USER, ONLINE_LOCAL_USER, ONLINE_DISCORD_USER, OFFLINE, SYSTEM }; User(Type type); virtual ~User(){} virtual const std::string& getName() const = 0; virtual bool isOnlineUser() const { return false; } virtual bool isConnected(i64 timestampUtcSec) const { return true; } const Type type; std::string avatarUrl; }; class OnlineUser : public User { public: OnlineUser(const std::string &name, Type type); virtual ~OnlineUser(){} virtual const std::string& getName() const override; virtual const odhtdb::Signature::PublicKey& getPublicKey() const = 0; bool isConnected(i64 timestampUtcSec) const override; bool isOnlineUser() const override { return true; } std::string name; u32 pingTimestampSec; }; class OnlineRemoteUser : public OnlineUser { public: OnlineRemoteUser(const std::string &name, const odhtdb::Signature::PublicKey &publicKey); virtual const odhtdb::Signature::PublicKey& getPublicKey() const override; const odhtdb::Signature::PublicKey publicKey; }; class OnlineLocalUser : public OnlineUser { public: OnlineLocalUser(const std::string &name, const odhtdb::Signature::KeyPair &keyPair); virtual const odhtdb::Signature::PublicKey& getPublicKey() const override; const odhtdb::Signature::KeyPair keyPair; }; class OnlineDiscordUser : public OnlineUser { public: OnlineDiscordUser(const std::string &discordUserName, u64 discordUserId, User *bridgeOwner); virtual const odhtdb::Signature::PublicKey& getPublicKey() const override; u64 discordUserId; User *bridgeOwner; }; class OfflineUser : public User { public: OfflineUser(const std::string &name); virtual const std::string& getName() const override; const std::string name; }; class SystemUser : public User { public: SystemUser(); virtual const std::string& getName() const override; }; }