]> gitweb.ps.run Git - matrix_esp_thesis/blob - examples/Cli.c
remove Todo.md
[matrix_esp_thesis] / examples / Cli.c
1 #include <stdio.h>\r
2 #include <stdarg.h>\r
3 \r
4 #include <mjson.h>\r
5 #include <matrix.h>\r
6 \r
7 #define SERVER       "https://matrix.org"\r
8 #define USER_ID      "@pscho:matrix.org"\r
9 #define ROOM_ID      "!XKFUjAsGrSSrpDFIxB:matrix.org"\r
10 \r
11 #define BUFFER_SIZE 1024\r
12 #define NUMBER_ARGS 10\r
13 \r
14 void\r
15 GetCommand(\r
16     char * cmd,\r
17     int * nargs,\r
18     char ** args\r
19 ) {\r
20     int index = 0;\r
21     int c;\r
22 \r
23     *nargs = 0;\r
24 \r
25     printf("> ");\r
26     while ((c = getchar()), c != ' ' && c != '\n')\r
27         cmd[index++] = c;\r
28     cmd[index] = '\0';\r
29 \r
30     if (c == '\n')\r
31         return;\r
32     \r
33     *nargs = 1;\r
34     index = 0;\r
35     char * arg = args[0];\r
36     while ((c = getchar()), c != '\n') {\r
37         if (c == ' ') {\r
38             arg[index] = '\0';\r
39             arg = args[(*nargs)++];\r
40             index = 0;\r
41             continue;\r
42         }\r
43         arg[index++] = c;\r
44     }\r
45     arg[index] = '\0';\r
46 }\r
47 \r
48 bool\r
49 CheckCommand(\r
50     const char * cmd,\r
51     const char * str\r
52 ) {\r
53     if (strlen(cmd) != strlen(str))\r
54         return false;\r
55     \r
56     for (size_t i = 0; i < strlen(cmd); i++) {\r
57         if (cmd[i] != str[i])\r
58             return false;\r
59     }\r
60     return true;\r
61 }\r
62 \r
63 void\r
64 Usage(\r
65     const char * cmd,\r
66     const char * args\r
67 ) {\r
68     printf("Usage: %s %s\n", cmd, args);\r
69 }\r
70 \r
71 bool\r
72 ExecuteCommand(\r
73     MatrixClient * client,\r
74     const char * cmd,\r
75     int nargs, char ** args\r
76 ) {\r
77 #define CHECK_ARGS(N, ARGS) if (nargs != N) { Usage(cmd, ARGS); return true; }\r
78 \r
79     /**/ if (CheckCommand(cmd, "exit")) {\r
80         return false;\r
81     }\r
82     else if (CheckCommand(cmd, "devicekey")) {\r
83         static char key[DEVICE_KEY_SIZE];\r
84         if (MatrixOlmAccountGetDeviceKey(&client->olmAccount, key, DEVICE_KEY_SIZE))\r
85             printf("%s\n", key);\r
86     }\r
87     else if (CheckCommand(cmd, "accesstoken")) {\r
88         printf("%s\n", client->accessToken);\r
89     }\r
90     else if (CheckCommand(cmd, "genkeys")) {\r
91         CHECK_ARGS(1, "<number of keys>")\r
92 \r
93         MatrixClientGenerateOnetimeKeys(client, atoi(args[0]));\r
94     }\r
95     else if (CheckCommand(cmd, "uploadonetimekeys")) {\r
96         MatrixClientUploadOnetimeKeys(client);\r
97     }\r
98     else if (CheckCommand(cmd, "uploaddevicekey")) {\r
99         MatrixClientUploadDeviceKey(client);\r
100     }\r
101     else if (CheckCommand(cmd, "onetimekeys")) {\r
102         static char buffer[1024];\r
103         olm_account_one_time_keys(client->olmAccount.account, buffer, 1024);\r
104         printf("%s\n", buffer);\r
105     }\r
106     else if (CheckCommand(cmd, "sendto")) {\r
107         CHECK_ARGS(3, "<device_id> <msgtype> <msg>")\r
108 \r
109         MatrixClientSendToDevice(client,\r
110             USER_ID,\r
111             args[0],\r
112             args[2],\r
113             args[1]);\r
114     }\r
115     else if (CheckCommand(cmd, "sendtoe")) {\r
116         CHECK_ARGS(3, "<device_id> <msgtype> <msg>")\r
117 \r
118         MatrixClientSendToDeviceEncrypted(client,\r
119             USER_ID,\r
120             args[0],\r
121             args[2],\r
122             args[1]);\r
123     }\r
124     else if (CheckCommand(cmd, "getkeys")) {\r
125         MatrixClientRequestDeviceKeys(client);\r
126         for (int i = 0; i < client->numDevices; i++)\r
127             printf("id: %s  key: %s\n",\r
128                 client->devices[i].deviceId,\r
129                 client->devices[i].deviceKey);\r
130     }\r
131     else if (CheckCommand(cmd, "todevice")) {\r
132         static char buffer[30000];\r
133         MatrixClientSync(client,\r
134             buffer, 30000);\r
135         const char * todevice;\r
136         int todeviceLen;\r
137         mjson_find(buffer, 30000,\r
138             "$.to_device",\r
139             &todevice, &todeviceLen);\r
140         static char prettyBuffer[10000];\r
141         struct mjson_fixedbuf fb = { prettyBuffer, 10000, 0 };\r
142         mjson_pretty(todevice, todeviceLen,\r
143             "  ", mjson_print_fixed_buf, &fb);\r
144         printf("%.*s\n", fb.len, fb.ptr);\r
145     }\r
146     else if (CheckCommand(cmd, "login")) {\r
147         CHECK_ARGS(3, "<username> <password> <displayname>")\r
148 \r
149         MatrixClientLoginPassword(client,\r
150             args[0],\r
151             args[1],\r
152             args[2]);\r
153     }\r
154     else if (CheckCommand(cmd, "save")) {\r
155         CHECK_ARGS(1, "<filename>")\r
156 \r
157         MatrixClientSave(client, args[0]);\r
158     }\r
159     else if (CheckCommand(cmd, "load")) {\r
160         CHECK_ARGS(1, "<filename>")\r
161 \r
162         MatrixClientLoad(client, args[0]);\r
163     }\r
164     else if (CheckCommand(cmd, "send")) {\r
165         CHECK_ARGS(2, "<room_id> <message>")\r
166 \r
167         static char body[1024];\r
168         snprintf(body, 1024,\r
169             "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",\r
170             args[1]);\r
171 \r
172         MatrixClientSendEvent(client,\r
173             args[0],\r
174             "m.room.message",\r
175             body);\r
176     }\r
177     else if (CheckCommand(cmd, "sendencrypted")) {\r
178         CHECK_ARGS(2, "<room_id> <message>")\r
179 \r
180         static char body[1024];\r
181         snprintf(body, 1024,\r
182             "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",\r
183             args[1]);\r
184 \r
185         MatrixClientSendEventEncrypted(client,\r
186             args[0],\r
187             "m.room.message",\r
188             body);\r
189     }\r
190     else if (CheckCommand(cmd, "setuserid")) {\r
191         CHECK_ARGS(1, "<user_id>")\r
192 \r
193         MatrixClientSetUserId(client, args[0]);\r
194     }\r
195     else if (CheckCommand(cmd, "getuserid")) {\r
196         printf("User ID: %s\n", client->userId);\r
197     }\r
198     else if (CheckCommand(cmd, "sendencrypted")) {\r
199         CHECK_ARGS(2, "<room_id> <message>")\r
200 \r
201         static char body[1024];\r
202         snprintf(body, 1024,\r
203             "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",\r
204             args[1]);\r
205 \r
206         MatrixClientSendEventEncrypted(client,\r
207             args[0],\r
208             "m.room.message",\r
209             body);\r
210     }\r
211     else if (CheckCommand(cmd, "sharesession")) {\r
212         CHECK_ARGS(3, "<session_index> <user_id> <device_id>")\r
213 \r
214         int sessionIndex = atoi(args[0]);\r
215 \r
216         MatrixClientShareMegolmOutSession(client,\r
217             args[1],\r
218             args[2],\r
219             &client->megolmOutSessions[sessionIndex]);\r
220     }\r
221     else if (CheckCommand(cmd, "savesession")) {\r
222         CHECK_ARGS(3, "<session_index> <filename> <key>")\r
223 \r
224         int sessionIndex = atoi(args[0]);\r
225 \r
226         MatrixMegolmOutSessionSave(\r
227             &client->megolmOutSessions[sessionIndex],\r
228             args[1],\r
229             args[2]);\r
230     }\r
231     else if (CheckCommand(cmd, "loadsession")) {\r
232         CHECK_ARGS(3, "<session_index> <filename> <key>")\r
233 \r
234         int sessionIndex = atoi(args[0]);\r
235 \r
236         MatrixMegolmOutSessionLoad(\r
237             &client->megolmOutSessions[sessionIndex],\r
238             args[1],\r
239             args[2]);\r
240     }\r
241     else if (CheckCommand(cmd, "printsessions")) {\r
242         for (int i = 0; i < client->numMegolmOutSessions; i++) {\r
243             printf("%d: %s\t%s\t%s\n", i,\r
244                 client->megolmOutSessions[i].roomId,\r
245                 client->megolmOutSessions[i].id,\r
246                 client->megolmOutSessions[i].key);\r
247         }\r
248     }\r
249     else if (CheckCommand(cmd, "initsession")) {\r
250         CHECK_ARGS(1, "<room_id>")\r
251 \r
252         if (! MatrixClientInitMegolmOutSession(client,\r
253             args[0]))\r
254         {\r
255             printf("Maximum number of Megolm sessions reached (%d)\n", NUM_MEGOLM_SESSIONS);\r
256         }\r
257     }\r
258     \r
259     \r
260     else {\r
261         printf("Unknown command\n");\r
262     }\r
263 #undef CHECK_ARGS\r
264 \r
265     return true;\r
266 }\r
267 \r
268 int\r
269 main(void)\r
270 {\r
271     MatrixClient client;\r
272     MatrixClientInit(&client,\r
273         SERVER);\r
274     \r
275     MatrixHttpInit(&client);\r
276 \r
277 \r
278     MatrixClientSetUserId(&client, USER_ID);\r
279     MatrixClientLoginPassword(&client, "@pscho:matrix.org", "Wc23EbmB9G3faMq", "abc");\r
280     MatrixClientGenerateOnetimeKeys(&client, 10);\r
281     MatrixClientUploadDeviceKey(&client);\r
282     MatrixClientUploadOnetimeKeys(&client);\r
283 \r
284 \r
285     static char cmd[BUFFER_SIZE];\r
286     static char args_[NUMBER_ARGS][BUFFER_SIZE];\r
287     char * args[NUMBER_ARGS];\r
288     for (int i = 0; i < NUMBER_ARGS; i++)\r
289         args[i] = args_[i];\r
290     int nargs;\r
291     while (1) {\r
292         GetCommand(cmd, &nargs, args);\r
293 \r
294         bool res =\r
295             ExecuteCommand(&client, cmd, nargs, args);\r
296         \r
297         if (! res)\r
298             break;\r
299     }\r
300     \r
301     MatrixClientDeleteDevice(&client);\r
302 \r
303     MatrixHttpDeinit(&client);\r
304 \r
305     return 0;\r
306 }\r