From 165c9332449a8d610768a33da1f00f4b536d3291 Mon Sep 17 00:00:00 2001
From: Nicolas Werner <nicolas.werner@hotmail.de>
Date: Sun, 3 Apr 2022 06:03:28 +0200
Subject: [PATCH] Add support for setting and resolving aliases

---
 include/mtxclient/http/client.hpp |  7 +++++++
 lib/http/client.cpp               | 25 +++++++++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/include/mtxclient/http/client.hpp b/include/mtxclient/http/client.hpp
index 7dbd280f6..7f693889b 100644
--- a/include/mtxclient/http/client.hpp
+++ b/include/mtxclient/http/client.hpp
@@ -592,6 +592,13 @@ public:
       const std::map<mtx::identifiers::User, std::map<std::string, EventContent>> &messages,
       ErrCallback callback);
 
+    //! Resolve the specified roomalias to a roomid.
+    void resolve_room_alias(const std::string &alias, Callback<mtx::responses::RoomId> cb);
+    //! Add an alias to a room.
+    void add_room_alias(const std::string &alias, const std::string &roomid, ErrCallback cb);
+    //! Delete an alias from a room.
+    void delete_room_alias(const std::string &alias, ErrCallback cb);
+
     //! Gets the visibility of a given room on the server's public room directory.
     void get_room_visibility(const std::string &room_id,
                              Callback<mtx::responses::PublicRoomVisibility> cb);
diff --git a/lib/http/client.cpp b/lib/http/client.cpp
index 293ff8000..cd8a29457 100644
--- a/lib/http/client.cpp
+++ b/lib/http/client.cpp
@@ -1103,6 +1103,31 @@ Client::send_to_device(const std::string &event_type,
     put<nlohmann::json>(api_path, body, std::move(callback));
 }
 
+void
+Client::resolve_room_alias(const std::string &alias, Callback<mtx::responses::RoomId> cb)
+{
+    const auto api_path = "/client/r0/directory/room/" + mtx::client::utils::url_encode(alias);
+
+    get<mtx::responses::RoomId>(api_path,
+                                [cb = std::move(cb)](const mtx::responses::RoomId &res,
+                                                     HeaderFields,
+                                                     RequestErr err) { cb(res, err); });
+}
+void
+Client::add_room_alias(const std::string &alias, const std::string &roomid, ErrCallback cb)
+{
+    const auto api_path = "/client/r0/directory/room/" + mtx::client::utils::url_encode(alias);
+    auto body           = nlohmann::json::object();
+    body["room_id"]     = roomid;
+    put<nlohmann::json>(api_path, body, std::move(cb));
+}
+
+void
+Client::delete_room_alias(const std::string &alias, ErrCallback cb)
+{
+    delete_("/client/r0/directory/room/" + mtx::client::utils::url_encode(alias), std::move(cb));
+}
+
 void
 Client::get_room_visibility(const std::string &room_id,
                             Callback<mtx::responses::PublicRoomVisibility> cb)
-- 
GitLab