]> gitweb.ps.run Git - matrix_esp_thesis/blobdiff - src/matrix.c
send example, http PUT
[matrix_esp_thesis] / src / matrix.c
index 082806a73c55ef1518d8bd8300ba51bb1e38b2bd..7cc4de9fe11d25a054d6e62a44563d3f97682b82 100644 (file)
 #include "matrix.h"\r
 \r
+#include <time.h>\r
+#include <stdio.h>\r
+#include <mjson.h>\r
+\r
+\r
+#define LOGIN_REQUEST_SIZE 1024\r
+#define LOGIN_RESPONSE_SIZE 1024\r
+#define LOGIN_URL "/_matrix/client/v3/login"\r
+\r
+#define ROOMEVENT_REQUEST_SIZE 1024\r
+#define ROOMEVENT_RESPONSE_SIZE 1024\r
+#define ROOMEVENT_URL "/_matrix/client/v3/rooms/%s/send/%s/%d"\r
+\r
 \r
 bool\r
 MatrixClientInit(\r
     MatrixClient * client,\r
-    FixedBuffer server\r
-) {\r
+    const char * server)\r
+{\r
+    strcpy_s(\r
+        client->server,\r
+        SERVER_SIZE,\r
+        server\r
+    );\r
 \r
+    return true;\r
 }\r
 \r
 bool\r
-MatrixClientLoginPassword(\r
+MatrixClientSetAccessToken(\r
     MatrixClient * client,\r
-    FixedBuffer username,\r
-    FixedBuffer password\r
-) {\r
+    const char * accessToken)\r
+{\r
+    int accessTokenLen = strlen(accessToken);\r
+\r
+    if (accessTokenLen < ACCESS_TOKEN_SIZE - 1)\r
+        return false;\r
 \r
+    for (int i = 0; i < accessTokenLen; i++)\r
+        client->accessTokenBuffer[i] = accessToken[i];\r
+\r
+    return true;\r
 }\r
 \r
+// https://spec.matrix.org/v1.6/client-server-api/#post_matrixclientv3login\r
 bool\r
-MatrixClientGetAccessToken(\r
+MatrixClientLoginPassword(\r
     MatrixClient * client,\r
-    FixedBuffer * outBuffer\r
-) {\r
+    const char * username,\r
+    const char * password,\r
+    const char * displayName)\r
+{\r
+    static char requestBuffer[LOGIN_REQUEST_SIZE];\r
 \r
+    mjson_snprintf(requestBuffer, LOGIN_REQUEST_SIZE,\r
+        "{"\r
+            "\"type\": \"m.login.password\","\r
+            "\"identifier\": {"\r
+                "\"type\": \"m.id.user\","\r
+                "\"user\": \"%s\""\r
+            "},"\r
+            "\"password\": \"%s\","\r
+            "\"initial_device_display_name\": \"%s\""\r
+        "}",\r
+        username,\r
+        password,\r
+        displayName);\r
+    \r
+    static char responseBuffer[LOGIN_RESPONSE_SIZE];\r
+    bool result =\r
+        MatrixHttpPost(client,\r
+            LOGIN_URL,\r
+            requestBuffer,\r
+            responseBuffer, LOGIN_RESPONSE_SIZE,\r
+            false);\r
+    \r
+    int responseLen = strlen(responseBuffer);\r
+    \r
+    if (!result)\r
+        return false;\r
+\r
+    mjson_get_string(responseBuffer, responseLen,\r
+        "$.access_token",\r
+        client->accessTokenBuffer, ACCESS_TOKEN_SIZE);\r
+    mjson_get_string(responseBuffer, responseLen,\r
+        "$.device_id",\r
+        client->deviceIdBuffer, DEVICE_ID_SIZE);\r
+    mjson_get_string(responseBuffer, responseLen,\r
+        "$.expires_in_ms",\r
+        client->expireMsBuffer, EXPIRE_MS_SIZE);\r
+    mjson_get_string(responseBuffer, responseLen,\r
+        "$.refresh_token",\r
+        client->refreshTokenBuffer, REFRESH_TOKEN_SIZE);\r
+\r
+    return true;\r
 }\r
+    \r
+bool\r
+MatrixClientSendEvent(\r
+    MatrixClient * client,\r
+    const char * roomId,\r
+    const char * msgType,\r
+    const char * msgBody)\r
+{    \r
+    static char requestUrl[MAX_URL_LEN];\r
+    sprintf_s(requestUrl, MAX_URL_LEN,\r
+        ROOMEVENT_URL, roomId, msgType, time(NULL));\r
+\r
+    static char responseBuffer[ROOMEVENT_RESPONSE_SIZE];\r
+    bool result =\r
+        MatrixHttpPut(client,\r
+            requestUrl,\r
+            msgBody,\r
+            responseBuffer, ROOMEVENT_RESPONSE_SIZE,\r
+            true);\r
+    \r
+    return result;\r
+}\r
+\r