]> gitweb.ps.run Git - matrix_esp_thesis/blob - examples/Cli.c
af1d6b164f1e3aac6db909fb1d8cc30d10519f27
[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     /**/ if (CheckCommand(cmd, "devicekey")) {\r
80         printf("%s\n", client->deviceKey);\r
81     }\r
82     else if (CheckCommand(cmd, "genkeys")) {\r
83         if (nargs != 1) {\r
84             Usage(cmd, "<number of keys>");\r
85             return;\r
86         }\r
87         MatrixClientGenerateOnetimeKeys(client, atoi(args[0]));\r
88     }\r
89     else if (CheckCommand(cmd, "uploadkeys")) {\r
90         MatrixClientUploadOnetimeKeys(client);\r
91     }\r
92     else if (CheckCommand(cmd, "onetimekeys")) {\r
93         static char buffer[1024];\r
94         olm_account_one_time_keys(client->olmAccount.account, buffer, 1024);\r
95         printf("%s\n", buffer);\r
96     }\r
97     else if (CheckCommand(cmd, "getkeys")) {\r
98         MatrixClientRequestDeviceKeys(client);\r
99         for (int i = 0; i < client->numDevices; i++)\r
100             printf("id: %s  key: %s\n",\r
101                 client->devices[i].deviceId,\r
102                 client->devices[i].deviceKey);\r
103     }\r
104     else if (CheckCommand(cmd, "todevice")) {\r
105         static char buffer[30000];\r
106         MatrixClientSync(client,\r
107             buffer, 30000);\r
108         const char * todevice;\r
109         int todeviceLen;\r
110         mjson_find(buffer, 30000,\r
111             "$.to_device",\r
112             &todevice, &todeviceLen);\r
113         static char prettyBuffer[10000];\r
114         struct mjson_fixedbuf fb = { prettyBuffer, 10000, 0 };\r
115         mjson_pretty(todevice, todeviceLen,\r
116             "  ", mjson_print_fixed_buf, &fb);\r
117         printf("%.*s\n", fb.len, fb.ptr);\r
118     }\r
119 }\r
120 \r
121 int\r
122 main(void)\r
123 {\r
124     MatrixClient client;\r
125     MatrixClientInit(&client,\r
126         SERVER);\r
127     \r
128     MatrixHttpInit(&client);\r
129 \r
130     MatrixClientSetAccessToken(&client,\r
131         ACCESS_TOKEN);\r
132     MatrixClientSetDeviceId(&client,\r
133         DEVICE_ID);\r
134     MatrixClientSetUserId(&client,\r
135         USER_ID);\r
136 \r
137     static char cmd[BUFFER_SIZE];\r
138     static char args_[BUFFER_SIZE][NUMBER_ARGS];\r
139     char * args[NUMBER_ARGS];\r
140     for (int i = 0; i < NUMBER_ARGS; i++)\r
141         args[i] = args_[i];\r
142     int nargs;\r
143     do {\r
144         GetCommand(cmd, &nargs, args);\r
145 \r
146         ExecuteCommand(&client, cmd, nargs, args);\r
147         \r
148     } while (strcmp(cmd, "exit") != 0);\r
149         \r
150     MatrixHttpDeinit(&client);\r
151 \r
152     return 0;\r
153 }\r