+#include <mjson.h>\r
#include <matrix.h>\r
#include <stdio.h>\r
\r
-#define SERVER "https://matrix.org"\r
-#define ACCESS_TOKEN "syt_cHNjaG8_yBvTjVTquGCikvsAenOJ_49mBMO"\r
+#define SERVER "https://matrix.org"\r
+#define USER_ID "@pscho:matrix.org"\r
+#define USERNAME "pscho"\r
+#define PASSWORD "Wc23EbmB9G3faMq"\r
+#define DISPLAYNAME "SyncClient"\r
+\r
+#define ROOM_ID "!XKFUjAsGrSSrpDFIxB:matrix.org"\r
+#define EVENT_ID "$_-y42DkC3OmJ_s40gYko7jMwrUQhoXfEut2pMV3E2J8"\r
+#define SESSION_ID "tzdnJbDrm82D/RpgkZKpILTifQ5Rads+tVzp3ax8+Ls"\r
\r
int\r
main(void)\r
\r
MatrixHttpInit(&client);\r
\r
- MatrixClientSetAccessToken(&client,\r
- ACCESS_TOKEN);\r
+ MatrixClientSetUserId(&client, USER_ID);\r
+\r
+ MatrixClientLoginPassword(&client,\r
+ USERNAME,\r
+ PASSWORD,\r
+ DISPLAYNAME);\r
+ \r
+ MatrixClientGenerateOnetimeKeys(&client, 10);\r
+ MatrixClientUploadOnetimeKeys(&client);\r
+ MatrixClientUploadDeviceKey(&client);\r
+ \r
+\r
+ static char eventBuffer[1024];\r
+ MatrixClientGetRoomEvent(&client,\r
+ ROOM_ID,\r
+ EVENT_ID,\r
+ eventBuffer, 1024);\r
+ \r
+ printf("event: %s\n", eventBuffer);\r
+\r
+\r
+ while (getchar() != 'q') {\r
+ static char nextBatch[1024];\r
+\r
+ static char syncBuffer[1024*50];\r
+ MatrixClientSync(&client, syncBuffer, 1024*50, nextBatch);\r
+ \r
+ int res;\r
+\r
+ const char * s = syncBuffer;\r
+ int slen = strlen(syncBuffer);\r
+ \r
+ {\r
+ int koff, klen, voff, vlen, vtype, off = 0;\r
+ for (off = 0; (off = mjson_next(s, slen, off, &koff, &klen,\r
+ &voff, &vlen, &vtype)) != 0; ) {\r
+ const char * key = s + koff;\r
+ const char * val = s + voff;\r
+\r
+ printf("%.*s: %.100s\n", klen, key, val);\r
+ }\r
+ }\r
+\r
+ mjson_get_string(s, slen, "$.next_batch", nextBatch, 1024);\r
+\r
+ const char * events;\r
+ int eventsLen;\r
+ res =\r
+ mjson_find(s, slen, "$.to_device.events", &events, &eventsLen);\r
+ \r
+ if (res != MJSON_TOK_INVALID) {\r
+ {\r
+ int koff, klen, voff, vlen, vtype, off = 0;\r
+ for (off = 0; (off = mjson_next(events, eventsLen, off, &koff, &klen,\r
+ &voff, &vlen, &vtype)) != 0; ) {\r
+ const char * val = events + voff;\r
+\r
+ printf("%.*s\n", vlen, val);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
\r
- static char syncBuffer[40000];\r
- MatrixClientSync(&client,\r
- syncBuffer, 40000);\r
- printf("%s", syncBuffer);\r
+ MatrixClientDeleteDevice(&client);\r
\r
MatrixHttpDeinit(&client);\r
\r
bool\r
MatrixClientSync(\r
MatrixClient * client,\r
- char * outSyncBuffer, int outSyncCap)\r
+ char * outSyncBuffer, int outSyncCap,\r
+ const char * nextBatch)\r
{\r
+ // filter={\"event_fields\":[\"to_device\"]}\r
+ static char url[MAX_URL_LEN];\r
+ snprintf(url, MAX_URL_LEN,\r
+ "/_matrix/client/v3/sync%s",\r
+ strlen(nextBatch) > 0 ? "?since=" : "");\r
+ \r
+ int index = strlen(url);\r
+\r
+ for (int i = 0; i < strlen(nextBatch); i++) {\r
+ char c = nextBatch[i];\r
+\r
+ if (c == '~') {\r
+ url[index++] = '%';\r
+ url[index++] = '7';\r
+ url[index++] = 'E';\r
+ }\r
+ else {\r
+ url[index++] = c;\r
+ }\r
+ }\r
+ url[index] = '\0';\r
+\r
return\r
MatrixHttpGet(client,\r
- "/_matrix/client/v3/sync",\r
+ url,\r
outSyncBuffer, outSyncCap,\r
true);\r
}\r