7 #define SERVER "https://matrix.org"
\r
8 #define USER_ID "@pscho:matrix.org"
\r
9 #define ROOM_ID "!XKFUjAsGrSSrpDFIxB:matrix.org"
\r
11 #define BUFFER_SIZE 1024
\r
12 #define NUMBER_ARGS 10
\r
26 while ((c = getchar()), c != ' ' && c != '\n')
\r
35 char * arg = args[0];
\r
36 while ((c = getchar()), c != '\n') {
\r
39 arg = args[(*nargs)++];
\r
53 if (strlen(cmd) != strlen(str))
\r
56 for (size_t i = 0; i < strlen(cmd); i++) {
\r
57 if (cmd[i] != str[i])
\r
68 printf("Usage: %s %s\n", cmd, args);
\r
73 MatrixClient * client,
\r
75 int nargs, char ** args
\r
77 #define CHECK_ARGS(N, ARGS) if (nargs != N) { Usage(cmd, ARGS); return true; }
\r
79 /**/ if (CheckCommand(cmd, "exit")) {
\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
87 else if (CheckCommand(cmd, "accesstoken")) {
\r
88 printf("%s\n", client->accessToken);
\r
90 else if (CheckCommand(cmd, "genkeys")) {
\r
91 CHECK_ARGS(1, "<number of keys>")
\r
93 MatrixClientGenerateOnetimeKeys(client, atoi(args[0]));
\r
95 else if (CheckCommand(cmd, "uploadonetimekeys")) {
\r
96 MatrixClientUploadOnetimeKeys(client);
\r
98 else if (CheckCommand(cmd, "uploaddevicekey")) {
\r
99 MatrixClientUploadDeviceKey(client);
\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
106 else if (CheckCommand(cmd, "sendto")) {
\r
107 CHECK_ARGS(3, "<device_id> <msgtype> <msg>")
\r
109 MatrixClientSendToDevice(client,
\r
115 else if (CheckCommand(cmd, "sendtoe")) {
\r
116 CHECK_ARGS(3, "<device_id> <msgtype> <msg>")
\r
118 MatrixClientSendToDeviceEncrypted(client,
\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
131 else if (CheckCommand(cmd, "todevice")) {
\r
132 static char buffer[30000];
\r
133 MatrixClientSync(client,
\r
135 const char * todevice;
\r
137 mjson_find(buffer, 30000,
\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
146 else if (CheckCommand(cmd, "login")) {
\r
147 CHECK_ARGS(3, "<username> <password> <displayname>")
\r
149 MatrixClientLoginPassword(client,
\r
154 else if (CheckCommand(cmd, "save")) {
\r
155 CHECK_ARGS(1, "<filename>")
\r
157 MatrixClientSave(client, args[0]);
\r
159 else if (CheckCommand(cmd, "load")) {
\r
160 CHECK_ARGS(1, "<filename>")
\r
162 MatrixClientLoad(client, args[0]);
\r
164 else if (CheckCommand(cmd, "send")) {
\r
165 CHECK_ARGS(2, "<room_id> <message>")
\r
167 static char body[1024];
\r
168 snprintf(body, 1024,
\r
169 "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",
\r
172 MatrixClientSendEvent(client,
\r
177 else if (CheckCommand(cmd, "sendencrypted")) {
\r
178 CHECK_ARGS(2, "<room_id> <message>")
\r
180 static char body[1024];
\r
181 snprintf(body, 1024,
\r
182 "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",
\r
185 MatrixClientSendEventEncrypted(client,
\r
190 else if (CheckCommand(cmd, "setuserid")) {
\r
191 CHECK_ARGS(1, "<user_id>")
\r
193 MatrixClientSetUserId(client, args[0]);
\r
195 else if (CheckCommand(cmd, "getuserid")) {
\r
196 printf("User ID: %s\n", client->userId);
\r
198 else if (CheckCommand(cmd, "sendencrypted")) {
\r
199 CHECK_ARGS(2, "<room_id> <message>")
\r
201 static char body[1024];
\r
202 snprintf(body, 1024,
\r
203 "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",
\r
206 MatrixClientSendEventEncrypted(client,
\r
211 else if (CheckCommand(cmd, "sharesession")) {
\r
212 CHECK_ARGS(3, "<session_index> <user_id> <device_id>")
\r
214 int sessionIndex = atoi(args[0]);
\r
216 MatrixClientShareMegolmOutSession(client,
\r
219 &client->megolmOutSessions[sessionIndex]);
\r
221 else if (CheckCommand(cmd, "savesession")) {
\r
222 CHECK_ARGS(3, "<session_index> <filename> <key>")
\r
224 int sessionIndex = atoi(args[0]);
\r
226 MatrixMegolmOutSessionSave(
\r
227 &client->megolmOutSessions[sessionIndex],
\r
231 else if (CheckCommand(cmd, "loadsession")) {
\r
232 CHECK_ARGS(3, "<session_index> <filename> <key>")
\r
234 int sessionIndex = atoi(args[0]);
\r
236 MatrixMegolmOutSessionLoad(
\r
237 &client->megolmOutSessions[sessionIndex],
\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
249 else if (CheckCommand(cmd, "initsession")) {
\r
250 CHECK_ARGS(1, "<room_id>")
\r
252 if (! MatrixClientInitMegolmOutSession(client,
\r
255 printf("Maximum number of Megolm sessions reached (%d)\n", NUM_MEGOLM_SESSIONS);
\r
261 printf("Unknown command\n");
\r
271 MatrixClient client;
\r
272 MatrixClientInit(&client,
\r
275 MatrixHttpInit(&client);
\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
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
292 GetCommand(cmd, &nargs, args);
\r
295 ExecuteCommand(&client, cmd, nargs, args);
\r
301 MatrixClientDeleteDevice(&client);
\r
303 MatrixHttpDeinit(&client);
\r