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