#include <matrix.h>\r
\r
#define SERVER "https://matrix.org"\r
-#define ACCESS_TOKEN "syt_cHNjaG8_yBvTjVTquGCikvsAenOJ_49mBMO"\r
-#define DEVICE_ID "MAZNCCZLBR"\r
#define USER_ID "@pscho:matrix.org"\r
#define ROOM_ID "!XKFUjAsGrSSrpDFIxB:matrix.org"\r
\r
printf("Usage: %s %s\n", cmd, args);\r
}\r
\r
-void\r
+bool\r
ExecuteCommand(\r
MatrixClient * client,\r
const char * cmd,\r
int nargs, char ** args\r
) {\r
- /**/ if (CheckCommand(cmd, "devicekey")) {\r
- printf("%s\n", client->deviceKey);\r
+#define CHECK_ARGS(N, ARGS) if (nargs != N) { Usage(cmd, ARGS); return true; }\r
+\r
+ /**/ if (CheckCommand(cmd, "exit")) {\r
+ return false;\r
+ }\r
+ else if (CheckCommand(cmd, "devicekey")) {\r
+ static char key[DEVICE_KEY_SIZE];\r
+ if (MatrixOlmAccountGetDeviceKey(&client->olmAccount, key, DEVICE_KEY_SIZE))\r
+ printf("%s\n", key);\r
+ }\r
+ else if (CheckCommand(cmd, "accesstoken")) {\r
+ printf("%s\n", client->accessToken);\r
}\r
else if (CheckCommand(cmd, "genkeys")) {\r
- if (nargs != 1) {\r
- Usage(cmd, "<number of keys>");\r
- return;\r
- }\r
+ CHECK_ARGS(1, "<number of keys>")\r
+\r
MatrixClientGenerateOnetimeKeys(client, atoi(args[0]));\r
}\r
- else if (CheckCommand(cmd, "uploadkeys")) {\r
+ else if (CheckCommand(cmd, "uploadonetimekeys")) {\r
MatrixClientUploadOnetimeKeys(client);\r
}\r
+ else if (CheckCommand(cmd, "uploaddevicekey")) {\r
+ MatrixClientUploadDeviceKey(client);\r
+ }\r
else if (CheckCommand(cmd, "onetimekeys")) {\r
static char buffer[1024];\r
olm_account_one_time_keys(client->olmAccount.account, buffer, 1024);\r
printf("%s\n", buffer);\r
}\r
+ else if (CheckCommand(cmd, "sendto")) {\r
+ CHECK_ARGS(3, "<device_id> <msgtype> <msg>")\r
+\r
+ MatrixClientSendToDevice(client,\r
+ USER_ID,\r
+ args[0],\r
+ args[2],\r
+ args[1]);\r
+ }\r
+ else if (CheckCommand(cmd, "sendtoe")) {\r
+ CHECK_ARGS(3, "<device_id> <msgtype> <msg>")\r
+\r
+ MatrixClientSendToDeviceEncrypted(client,\r
+ USER_ID,\r
+ args[0],\r
+ args[2],\r
+ args[1]);\r
+ }\r
else if (CheckCommand(cmd, "getkeys")) {\r
MatrixClientRequestDeviceKeys(client);\r
for (int i = 0; i < client->numDevices; i++)\r
" ", mjson_print_fixed_buf, &fb);\r
printf("%.*s\n", fb.len, fb.ptr);\r
}\r
+ else if (CheckCommand(cmd, "login")) {\r
+ CHECK_ARGS(3, "<username> <password> <displayname>")\r
+\r
+ MatrixClientLoginPassword(client,\r
+ args[0],\r
+ args[1],\r
+ args[2]);\r
+ }\r
+ else if (CheckCommand(cmd, "save")) {\r
+ CHECK_ARGS(1, "<filename>")\r
+\r
+ MatrixClientSave(client, args[0]);\r
+ }\r
+ else if (CheckCommand(cmd, "load")) {\r
+ CHECK_ARGS(1, "<filename>")\r
+\r
+ MatrixClientLoad(client, args[0]);\r
+ }\r
+ else if (CheckCommand(cmd, "send")) {\r
+ CHECK_ARGS(2, "<room_id> <message>")\r
+\r
+ static char body[1024];\r
+ snprintf(body, 1024,\r
+ "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",\r
+ args[1]);\r
+\r
+ MatrixClientSendEvent(client,\r
+ args[0],\r
+ "m.room.message",\r
+ body);\r
+ }\r
+ else if (CheckCommand(cmd, "sendencrypted")) {\r
+ CHECK_ARGS(2, "<room_id> <message>")\r
+\r
+ static char body[1024];\r
+ snprintf(body, 1024,\r
+ "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",\r
+ args[1]);\r
+\r
+ MatrixClientSendEventEncrypted(client,\r
+ args[0],\r
+ "m.room.message",\r
+ body);\r
+ }\r
+ else if (CheckCommand(cmd, "setuserid")) {\r
+ CHECK_ARGS(1, "<user_id>")\r
+\r
+ MatrixClientSetUserId(client, args[0]);\r
+ }\r
+ else if (CheckCommand(cmd, "getuserid")) {\r
+ printf("User ID: %s\n", client->userId);\r
+ }\r
+ else if (CheckCommand(cmd, "sendencrypted")) {\r
+ CHECK_ARGS(2, "<room_id> <message>")\r
+\r
+ static char body[1024];\r
+ snprintf(body, 1024,\r
+ "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",\r
+ args[1]);\r
+\r
+ MatrixClientSendEventEncrypted(client,\r
+ args[0],\r
+ "m.room.message",\r
+ body);\r
+ }\r
+ else if (CheckCommand(cmd, "sharesession")) {\r
+ CHECK_ARGS(3, "<session_index> <user_id> <device_id>")\r
+\r
+ int sessionIndex = atoi(args[0]);\r
+\r
+ MatrixClientShareMegolmOutSession(client,\r
+ args[1],\r
+ args[2],\r
+ &client->megolmOutSessions[sessionIndex]);\r
+ }\r
+ else if (CheckCommand(cmd, "savesession")) {\r
+ CHECK_ARGS(3, "<session_index> <filename> <key>")\r
+\r
+ int sessionIndex = atoi(args[0]);\r
+\r
+ MatrixMegolmOutSessionSave(\r
+ &client->megolmOutSessions[sessionIndex],\r
+ args[1],\r
+ args[2]);\r
+ }\r
+ else if (CheckCommand(cmd, "loadsession")) {\r
+ CHECK_ARGS(3, "<session_index> <filename> <key>")\r
+\r
+ int sessionIndex = atoi(args[0]);\r
+\r
+ MatrixMegolmOutSessionLoad(\r
+ &client->megolmOutSessions[sessionIndex],\r
+ args[1],\r
+ args[2]);\r
+ }\r
+ else if (CheckCommand(cmd, "printsessions")) {\r
+ for (int i = 0; i < client->numMegolmOutSessions; i++) {\r
+ printf("%d: %s\t%s\t%s\n", i,\r
+ client->megolmOutSessions[i].roomId,\r
+ client->megolmOutSessions[i].id,\r
+ client->megolmOutSessions[i].key);\r
+ }\r
+ }\r
+ else if (CheckCommand(cmd, "initsession")) {\r
+ CHECK_ARGS(1, "<room_id>")\r
+\r
+ if (! MatrixClientInitMegolmOutSession(client,\r
+ args[0]))\r
+ {\r
+ printf("Maximum number of Megolm sessions reached (%d)\n", NUM_MEGOLM_SESSIONS);\r
+ }\r
+ }\r
+ \r
+ \r
+ else {\r
+ printf("Unknown command\n");\r
+ }\r
+#undef CHECK_ARGS\r
+\r
+ return true;\r
}\r
\r
int\r
\r
MatrixHttpInit(&client);\r
\r
- MatrixClientSetAccessToken(&client,\r
- ACCESS_TOKEN);\r
- MatrixClientSetDeviceId(&client,\r
- DEVICE_ID);\r
- MatrixClientSetUserId(&client,\r
- USER_ID);\r
+\r
+ MatrixClientSetUserId(&client, USER_ID);\r
+ MatrixClientLoginPassword(&client, "@pscho:matrix.org", "Wc23EbmB9G3faMq", "abc");\r
+ MatrixClientGenerateOnetimeKeys(&client, 10);\r
+ MatrixClientUploadDeviceKey(&client);\r
+ MatrixClientUploadOnetimeKeys(&client);\r
+\r
\r
static char cmd[BUFFER_SIZE];\r
- static char args_[BUFFER_SIZE][NUMBER_ARGS];\r
+ static char args_[NUMBER_ARGS][BUFFER_SIZE];\r
char * args[NUMBER_ARGS];\r
for (int i = 0; i < NUMBER_ARGS; i++)\r
args[i] = args_[i];\r
int nargs;\r
- do {\r
+ while (1) {\r
GetCommand(cmd, &nargs, args);\r
\r
- ExecuteCommand(&client, cmd, nargs, args);\r
- \r
- } while (strcmp(cmd, "exit") != 0);\r
+ bool res =\r
+ ExecuteCommand(&client, cmd, nargs, args);\r
\r
+ if (! res)\r
+ break;\r
+ }\r
+ \r
+ MatrixClientDeleteDevice(&client);\r
+\r
MatrixHttpDeinit(&client);\r
\r
return 0;\r