#pragma once #include #include #include #include #include namespace erebos { class Identity; class DirectMessage { public: const Identity & from() const; const ZonedTime & time() const; const std::string & text() const; private: friend class DirectMessageThread; friend class DirectMessageService; struct Priv; DirectMessage(Priv *); std::shared_ptr p; }; class DirectMessageThread { public: class Iterator { struct Priv; Iterator(Priv *); public: using iterator_category = std::forward_iterator_tag; using value_type = DirectMessage; using difference_type = ssize_t; using pointer = const DirectMessage *; using reference = const DirectMessage &; Iterator(const Iterator &); ~Iterator(); Iterator & operator=(const Iterator &); Iterator & operator++(); value_type operator*() const; bool operator==(const Iterator &) const; bool operator!=(const Iterator &) const; private: friend DirectMessageThread; std::unique_ptr p; }; Iterator begin() const; Iterator end() const; size_t size() const; DirectMessage at(size_t) const; const Identity & peer() const; private: friend class DirectMessageService; struct Priv; DirectMessageThread(Priv *); std::shared_ptr p; }; class DirectMessageService : public Service { public: DirectMessageService(); virtual ~DirectMessageService(); UUID uuid() const override; void handle(Context &) const override; typedef std::function ThreadWatcher; static void onUpdate(ThreadWatcher); static DirectMessageThread thread(const Identity &); static DirectMessage send(const Identity &, const Peer &, const std::string &); private: struct Priv; }; }