aboutsummaryrefslogtreecommitdiff
path: root/plugins/Matrix.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Matrix.hpp')
-rw-r--r--plugins/Matrix.hpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/plugins/Matrix.hpp b/plugins/Matrix.hpp
new file mode 100644
index 0000000..c498ec8
--- /dev/null
+++ b/plugins/Matrix.hpp
@@ -0,0 +1,68 @@
+#pragma once
+
+#include "Plugin.hpp"
+#include <unordered_map>
+#include <json/value.h>
+
+namespace QuickMedia {
+ struct UserInfo {
+ std::string display_name;
+ std::string avatar_url;
+ };
+
+ struct Message {
+ // Index into |RoomData.user_info|
+ size_t user_id;
+ std::string msg;
+ };
+
+ struct RoomData {
+ // Each room has its own list of user data, even if multiple rooms has the same user
+ // because users can have different display names and avatars in different rooms.
+ // The value is an index to |user_info|.
+ std::unordered_map<std::string, size_t> user_info_by_user_id;
+ std::vector<UserInfo> user_info;
+ std::vector<Message> messages;
+ std::string prev_batch;
+ bool initial_fetch_finished = false;
+ };
+
+ enum class MessageDirection {
+ BEFORE,
+ AFTER
+ };
+
+ class Matrix : public Plugin {
+ public:
+ Matrix();
+ bool search_is_filter() override { return true; }
+ bool search_suggestions_has_thumbnails() const override { return true; }
+ bool search_results_has_thumbnails() const override { return false; }
+ int get_search_delay() const override { return 0; }
+ bool search_suggestion_is_search() const override { return true; }
+ Page get_page_after_search() const override { return Page::EXIT; }
+ PluginResult get_cached_sync(BodyItems &result_items);
+ PluginResult sync();
+ PluginResult get_joined_rooms(BodyItems &result_items);
+ // Note: the number of items returned in |result_items| may not be the number of new messages because many messages can be combined
+ // into one if one user sends multiple messages. The number of messages is returned in |num_new_messages|.
+ PluginResult get_room_messages(const std::string &room_id, size_t start_index, BodyItems &result_items, size_t &num_new_messages);
+ SearchResult search(const std::string &text, BodyItems &result_items) override;
+
+ PluginResult post_message(const std::string &room_id, const std::string &text);
+ PluginResult login(const std::string &username, const std::string &password, const std::string &homeserver, std::string &err_msg);
+
+ PluginResult load_and_verify_cached_session();
+ private:
+ PluginResult sync_response_to_body_items(const Json::Value &root);
+ PluginResult load_initial_room_data(const std::string &room_id, RoomData *room_data);
+ void events_add_user_info(const Json::Value &events_json, RoomData *room_data);
+ void events_add_messages(const Json::Value &events_json, RoomData *room_data, MessageDirection message_dir);
+ private:
+ std::unordered_map<std::string, std::unique_ptr<RoomData>> room_data_by_id;
+ std::string user_id;
+ std::string access_token;
+ std::string homeserver;
+ std::string next_batch;
+ };
+} \ No newline at end of file