]> gitweb.ps.run Git - matrix_esp_thesis/blob - src/matrix.c
7cc4de9fe11d25a054d6e62a44563d3f97682b82
[matrix_esp_thesis] / src / matrix.c
1 #include "matrix.h"\r
2 \r
3 #include <time.h>\r
4 #include <stdio.h>\r
5 #include <mjson.h>\r
6 \r
7 \r
8 #define LOGIN_REQUEST_SIZE 1024\r
9 #define LOGIN_RESPONSE_SIZE 1024\r
10 #define LOGIN_URL "/_matrix/client/v3/login"\r
11 \r
12 #define ROOMEVENT_REQUEST_SIZE 1024\r
13 #define ROOMEVENT_RESPONSE_SIZE 1024\r
14 #define ROOMEVENT_URL "/_matrix/client/v3/rooms/%s/send/%s/%d"\r
15 \r
16 \r
17 bool\r
18 MatrixClientInit(\r
19     MatrixClient * client,\r
20     const char * server)\r
21 {\r
22     strcpy_s(\r
23         client->server,\r
24         SERVER_SIZE,\r
25         server\r
26     );\r
27 \r
28     return true;\r
29 }\r
30 \r
31 bool\r
32 MatrixClientSetAccessToken(\r
33     MatrixClient * client,\r
34     const char * accessToken)\r
35 {\r
36     int accessTokenLen = strlen(accessToken);\r
37 \r
38     if (accessTokenLen < ACCESS_TOKEN_SIZE - 1)\r
39         return false;\r
40 \r
41     for (int i = 0; i < accessTokenLen; i++)\r
42         client->accessTokenBuffer[i] = accessToken[i];\r
43 \r
44     return true;\r
45 }\r
46 \r
47 // https://spec.matrix.org/v1.6/client-server-api/#post_matrixclientv3login\r
48 bool\r
49 MatrixClientLoginPassword(\r
50     MatrixClient * client,\r
51     const char * username,\r
52     const char * password,\r
53     const char * displayName)\r
54 {\r
55     static char requestBuffer[LOGIN_REQUEST_SIZE];\r
56 \r
57     mjson_snprintf(requestBuffer, LOGIN_REQUEST_SIZE,\r
58         "{"\r
59             "\"type\": \"m.login.password\","\r
60             "\"identifier\": {"\r
61                 "\"type\": \"m.id.user\","\r
62                 "\"user\": \"%s\""\r
63             "},"\r
64             "\"password\": \"%s\","\r
65             "\"initial_device_display_name\": \"%s\""\r
66         "}",\r
67         username,\r
68         password,\r
69         displayName);\r
70     \r
71     static char responseBuffer[LOGIN_RESPONSE_SIZE];\r
72     bool result =\r
73         MatrixHttpPost(client,\r
74             LOGIN_URL,\r
75             requestBuffer,\r
76             responseBuffer, LOGIN_RESPONSE_SIZE,\r
77             false);\r
78     \r
79     int responseLen = strlen(responseBuffer);\r
80     \r
81     if (!result)\r
82         return false;\r
83 \r
84     mjson_get_string(responseBuffer, responseLen,\r
85         "$.access_token",\r
86         client->accessTokenBuffer, ACCESS_TOKEN_SIZE);\r
87     mjson_get_string(responseBuffer, responseLen,\r
88         "$.device_id",\r
89         client->deviceIdBuffer, DEVICE_ID_SIZE);\r
90     mjson_get_string(responseBuffer, responseLen,\r
91         "$.expires_in_ms",\r
92         client->expireMsBuffer, EXPIRE_MS_SIZE);\r
93     mjson_get_string(responseBuffer, responseLen,\r
94         "$.refresh_token",\r
95         client->refreshTokenBuffer, REFRESH_TOKEN_SIZE);\r
96 \r
97     return true;\r
98 }\r
99     \r
100 bool\r
101 MatrixClientSendEvent(\r
102     MatrixClient * client,\r
103     const char * roomId,\r
104     const char * msgType,\r
105     const char * msgBody)\r
106 {    \r
107     static char requestUrl[MAX_URL_LEN];\r
108     sprintf_s(requestUrl, MAX_URL_LEN,\r
109         ROOMEVENT_URL, roomId, msgType, time(NULL));\r
110 \r
111     static char responseBuffer[ROOMEVENT_RESPONSE_SIZE];\r
112     bool result =\r
113         MatrixHttpPut(client,\r
114             requestUrl,\r
115             msgBody,\r
116             responseBuffer, ROOMEVENT_RESPONSE_SIZE,\r
117             true);\r
118     \r
119     return result;\r
120 }\r
121 \r