7 #define SERVER "https://matrix.org"
\r
8 #define USER_ID "@example:matrix.org"
\r
11 #define DEVICE_NAME ""
\r
13 #define BUFFER_SIZE 1024
\r
14 #define NUMBER_ARGS 10
\r
28 while ((c = getchar()), c != ' ' && c != '\n')
\r
37 char * arg = args[0];
\r
38 while ((c = getchar()), c != '\n') {
\r
41 arg = args[(*nargs)++];
\r
55 if (strlen(cmd) != strlen(str))
\r
58 for (size_t i = 0; i < strlen(cmd); i++) {
\r
59 if (cmd[i] != str[i])
\r
70 printf("Usage: %s %s\n", cmd, args);
\r
75 MatrixClient * client,
\r
77 int nargs, char ** args
\r
79 #define CHECK_ARGS(N, ARGS) if (nargs != N) { Usage(cmd, ARGS); return true; }
\r
81 /**/ if (CheckCommand(cmd, "exit")) {
\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
89 else if (CheckCommand(cmd, "accesstoken")) {
\r
90 printf("%s\n", client->accessToken);
\r
92 else if (CheckCommand(cmd, "genkeys")) {
\r
93 CHECK_ARGS(1, "<number of keys>")
\r
95 MatrixClientGenerateOnetimeKeys(client, atoi(args[0]));
\r
97 else if (CheckCommand(cmd, "uploadonetimekeys")) {
\r
98 MatrixClientUploadOnetimeKeys(client);
\r
100 else if (CheckCommand(cmd, "uploaddevicekey")) {
\r
101 MatrixClientUploadDeviceKeys(client);
\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
108 else if (CheckCommand(cmd, "sendto")) {
\r
109 CHECK_ARGS(3, "<device_id> <msgtype> <msg>")
\r
111 MatrixClientSendToDevice(client,
\r
117 else if (CheckCommand(cmd, "sendtoe")) {
\r
118 CHECK_ARGS(3, "<device_id> <msgtype> <msg>")
\r
120 MatrixClientSendToDeviceEncrypted(client,
\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
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
140 mjson_find(buffer, 30000,
\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
149 else if (CheckCommand(cmd, "login")) {
\r
150 CHECK_ARGS(3, "<username> <password> <displayname>")
\r
152 MatrixClientLoginPassword(client,
\r
157 else if (CheckCommand(cmd, "send")) {
\r
158 CHECK_ARGS(2, "<room_id> <message>")
\r
160 static char body[1024];
\r
161 snprintf(body, 1024,
\r
162 "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",
\r
165 MatrixClientSendEvent(client,
\r
170 else if (CheckCommand(cmd, "sendencrypted")) {
\r
171 CHECK_ARGS(2, "<room_id> <message>")
\r
173 static char body[1024];
\r
174 snprintf(body, 1024,
\r
175 "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",
\r
178 MatrixClientSendEventEncrypted(client,
\r
183 else if (CheckCommand(cmd, "setuserid")) {
\r
184 CHECK_ARGS(1, "<user_id>")
\r
186 MatrixClientSetUserId(client, args[0]);
\r
188 else if (CheckCommand(cmd, "getuserid")) {
\r
189 printf("User ID: %s\n", client->userId);
\r
191 else if (CheckCommand(cmd, "sendencrypted")) {
\r
192 CHECK_ARGS(2, "<room_id> <message>")
\r
194 static char body[1024];
\r
195 snprintf(body, 1024,
\r
196 "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",
\r
199 MatrixClientSendEventEncrypted(client,
\r
204 else if (CheckCommand(cmd, "sharesession")) {
\r
205 CHECK_ARGS(3, "<session_index> <user_id> <device_id>")
\r
207 int sessionIndex = atoi(args[0]);
\r
209 MatrixClientShareMegolmOutSession(client,
\r
212 &client->megolmOutSessions[sessionIndex]);
\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
222 else if (CheckCommand(cmd, "initsession")) {
\r
223 CHECK_ARGS(1, "<room_id>")
\r
225 MatrixMegolmOutSession * megolmOutSession;
\r
226 if (! MatrixClientNewMegolmOutSession(client,
\r
228 &megolmOutSession))
\r
230 printf("Maximum number of Megolm sessions reached (%d)\n", NUM_MEGOLM_SESSIONS);
\r
236 printf("Unknown command\n");
\r
246 MatrixClient client;
\r
247 MatrixClientInit(&client);
\r
249 MatrixHttpInit(&client.hc, SERVER);
\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
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
266 GetCommand(cmd, &nargs, args);
\r
269 ExecuteCommand(&client, cmd, nargs, args);
\r
275 MatrixClientDeleteDevice(&client);
\r
277 MatrixHttpDeinit(&client.hc);
\r