]> gitweb.ps.run Git - matrix_esp_thesis/blob - examples/Cli.c
d4d8d226cf2661af8c530dbb7f3f01c9ffe4f791
[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         MatrixClientUploadDeviceKeys(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         MatrixMegolmOutSession * megolmOutSession;\r
253         if (! MatrixClientNewMegolmOutSession(client,\r
254             args[0],\r
255             &megolmOutSession))\r
256         {\r
257             printf("Maximum number of Megolm sessions reached (%d)\n", NUM_MEGOLM_SESSIONS);\r
258         }\r
259     }\r
260     \r
261     \r
262     else {\r
263         printf("Unknown command\n");\r
264     }\r
265 #undef CHECK_ARGS\r
266 \r
267     return true;\r
268 }\r
269 \r
270 int\r
271 main(void)\r
272 {\r
273     MatrixClient client;\r
274     MatrixClientInit(&client);\r
275     \r
276     MatrixHttpInit(&client.hc, SERVER);\r
277 \r
278 \r
279     MatrixClientSetUserId(&client, USER_ID);\r
280     MatrixClientLoginPassword(&client, "@pscho:matrix.org", "Wc23EbmB9G3faMq", "abc");\r
281     MatrixClientGenerateOnetimeKeys(&client, 10);\r
282     MatrixClientUploadDeviceKeys(&client);\r
283     MatrixClientUploadOnetimeKeys(&client);\r
284 \r
285 \r
286     static char cmd[BUFFER_SIZE];\r
287     static char args_[NUMBER_ARGS][BUFFER_SIZE];\r
288     char * args[NUMBER_ARGS];\r
289     for (int i = 0; i < NUMBER_ARGS; i++)\r
290         args[i] = args_[i];\r
291     int nargs;\r
292     while (1) {\r
293         GetCommand(cmd, &nargs, args);\r
294 \r
295         bool res =\r
296             ExecuteCommand(&client, cmd, nargs, args);\r
297         \r
298         if (! res)\r
299             break;\r
300     }\r
301     \r
302     MatrixClientDeleteDevice(&client);\r
303 \r
304     MatrixHttpDeinit(&client.hc);\r
305 \r
306     return 0;\r
307 }\r