]> gitweb.ps.run Git - matrix_esp_thesis/blob - examples/Cli.c
share, save, load, init, print megolm out sessions
[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 ACCESS_TOKEN "syt_cHNjaG8_yBvTjVTquGCikvsAenOJ_49mBMO"\r
9 #define DEVICE_ID    "MAZNCCZLBR"\r
10 #define USER_ID      "@pscho:matrix.org"\r
11 #define ROOM_ID      "!XKFUjAsGrSSrpDFIxB:matrix.org"\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 void\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; }\r
80     /**/ if (CheckCommand(cmd, "devicekey")) {\r
81         printf("%s\n", client->deviceKey);\r
82     }\r
83     else if (CheckCommand(cmd, "genkeys")) {\r
84         CHECK_ARGS(1, "<number of keys>")\r
85 \r
86         MatrixClientGenerateOnetimeKeys(client, atoi(args[0]));\r
87     }\r
88     else if (CheckCommand(cmd, "uploadkeys")) {\r
89         MatrixClientUploadOnetimeKeys(client);\r
90     }\r
91     else if (CheckCommand(cmd, "onetimekeys")) {\r
92         static char buffer[1024];\r
93         olm_account_one_time_keys(client->olmAccount.account, buffer, 1024);\r
94         printf("%s\n", buffer);\r
95     }\r
96     else if (CheckCommand(cmd, "getkeys")) {\r
97         MatrixClientRequestDeviceKeys(client);\r
98         for (int i = 0; i < client->numDevices; i++)\r
99             printf("id: %s  key: %s\n",\r
100                 client->devices[i].deviceId,\r
101                 client->devices[i].deviceKey);\r
102     }\r
103     else if (CheckCommand(cmd, "todevice")) {\r
104         static char buffer[30000];\r
105         MatrixClientSync(client,\r
106             buffer, 30000);\r
107         const char * todevice;\r
108         int todeviceLen;\r
109         mjson_find(buffer, 30000,\r
110             "$.to_device",\r
111             &todevice, &todeviceLen);\r
112         static char prettyBuffer[10000];\r
113         struct mjson_fixedbuf fb = { prettyBuffer, 10000, 0 };\r
114         mjson_pretty(todevice, todeviceLen,\r
115             "  ", mjson_print_fixed_buf, &fb);\r
116         printf("%.*s\n", fb.len, fb.ptr);\r
117     }\r
118     else if (CheckCommand(cmd, "save")) {\r
119         CHECK_ARGS(1, "<filename>")\r
120 \r
121         MatrixClientSave(client, args[0]);\r
122     }\r
123     else if (CheckCommand(cmd, "load")) {\r
124         CHECK_ARGS(1, "<filename>")\r
125 \r
126         MatrixClientLoad(client, args[0]);\r
127     }\r
128     else if (CheckCommand(cmd, "send")) {\r
129         CHECK_ARGS(2, "<room_id> <message>")\r
130 \r
131         static char body[1024];\r
132         snprintf(body, 1024,\r
133             "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",\r
134             args[1]);\r
135 \r
136         MatrixClientSendEvent(client,\r
137             args[0],\r
138             "m.room.message",\r
139             body);\r
140     }\r
141     else if (CheckCommand(cmd, "setuserid")) {\r
142         CHECK_ARGS(1, "<user_id>")\r
143 \r
144         MatrixClientSetUserId(client, args[0]);\r
145     }\r
146     else if (CheckCommand(cmd, "getuserid")) {\r
147         printf("User ID: %s\n", client->userId);\r
148     }\r
149     else if (CheckCommand(cmd, "sendencrypted")) {\r
150         CHECK_ARGS(2, "<room_id> <message>")\r
151 \r
152         static char body[1024];\r
153         snprintf(body, 1024,\r
154             "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",\r
155             args[1]);\r
156 \r
157         MatrixClientSendEventEncrypted(client,\r
158             args[0],\r
159             "m.room.message",\r
160             body);\r
161     }\r
162     else if (CheckCommand(cmd, "sharesession")) {\r
163         CHECK_ARGS(3, "<session_index> <user_id> <device_id>")\r
164 \r
165         int sessionIndex = atoi(args[0]);\r
166 \r
167         MatrixClientShareMegolmOutSession(client,\r
168             args[1],\r
169             args[2],\r
170             &client->megolmOutSessions[sessionIndex]);\r
171     }\r
172     else if (CheckCommand(cmd, "savesession")) {\r
173         CHECK_ARGS(3, "<session_index> <filename> <key>")\r
174 \r
175         int sessionIndex = atoi(args[0]);\r
176 \r
177         MatrixMegolmOutSessionSave(\r
178             &client->megolmOutSessions[sessionIndex],\r
179             args[1],\r
180             args[2]);\r
181     }\r
182     else if (CheckCommand(cmd, "loadsession")) {\r
183         CHECK_ARGS(3, "<session_index> <filename> <key>")\r
184 \r
185         int sessionIndex = atoi(args[0]);\r
186 \r
187         MatrixMegolmOutSessionLoad(\r
188             &client->megolmOutSessions[sessionIndex],\r
189             args[1],\r
190             args[2]);\r
191     }\r
192     else if (CheckCommand(cmd, "printsessions")) {\r
193         for (int i = 0; i < client->numMegolmOutSessions; i++) {\r
194             printf("%d: %s\t%s\t%s\n", i,\r
195                 client->megolmOutSessions[i].roomId,\r
196                 client->megolmOutSessions[i].id,\r
197                 client->megolmOutSessions[i].key);\r
198         }\r
199     }\r
200     else if (CheckCommand(cmd, "initsession")) {\r
201         CHECK_ARGS(1, "<room_id>")\r
202 \r
203         if (! MatrixClientInitMegolmOutSession(client,\r
204             args[0]))\r
205         {\r
206             printf("Maximum number of Megolm sessions reached (%d)\n", NUM_MEGOLM_SESSIONS);\r
207         }\r
208     }\r
209     \r
210     \r
211     else {\r
212         printf("Unknown command\n");\r
213     }\r
214 #undef CHECK_ARGS\r
215 }\r
216 \r
217 int\r
218 main(void)\r
219 {\r
220     MatrixClient client;\r
221     MatrixClientInit(&client,\r
222         SERVER);\r
223     \r
224     MatrixHttpInit(&client);\r
225 \r
226     MatrixClientSetAccessToken(&client,\r
227         ACCESS_TOKEN);\r
228     MatrixClientSetDeviceId(&client,\r
229         DEVICE_ID);\r
230     MatrixClientSetUserId(&client,\r
231         USER_ID);\r
232 \r
233     static char cmd[BUFFER_SIZE];\r
234     static char args_[NUMBER_ARGS][BUFFER_SIZE];\r
235     char * args[NUMBER_ARGS];\r
236     for (int i = 0; i < NUMBER_ARGS; i++)\r
237         args[i] = args_[i];\r
238     int nargs;\r
239     do {\r
240         GetCommand(cmd, &nargs, args);\r
241 \r
242         ExecuteCommand(&client, cmd, nargs, args);\r
243         \r
244     } while (strcmp(cmd, "exit") != 0);\r
245         \r
246     MatrixHttpDeinit(&client);\r
247 \r
248     return 0;\r
249 }\r