]> gitweb.ps.run Git - matrix_esp_thesis/blob - examples/Cli.c
b2fbe451f967bab7c672e04a8f063a2da9b06cea
[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 #define CHECK_ARGS(N, ARGS) if (nargs != N) { Usage(cmd, ARGS); return; }\r
80     /**/ if (CheckCommand(cmd, "devicekey")) {\r
81         printf("%s\n", client->deviceKey);\r
82     }\r
83     else if (CheckCommand(cmd, "genkeys")) {\r
84         CHECK_ARGS(1, "<number of keys>")\r
85 \r
86         MatrixClientGenerateOnetimeKeys(client, atoi(args[0]));\r
87     }\r
88     else if (CheckCommand(cmd, "uploadkeys")) {\r
89         MatrixClientUploadOnetimeKeys(client);\r
90     }\r
91     else if (CheckCommand(cmd, "onetimekeys")) {\r
92         static char buffer[1024];\r
93         olm_account_one_time_keys(client->olmAccount.account, buffer, 1024);\r
94         printf("%s\n", buffer);\r
95     }\r
96     else if (CheckCommand(cmd, "getkeys")) {\r
97         MatrixClientRequestDeviceKeys(client);\r
98         for (int i = 0; i < client->numDevices; i++)\r
99             printf("id: %s  key: %s\n",\r
100                 client->devices[i].deviceId,\r
101                 client->devices[i].deviceKey);\r
102     }\r
103     else if (CheckCommand(cmd, "todevice")) {\r
104         static char buffer[30000];\r
105         MatrixClientSync(client,\r
106             buffer, 30000);\r
107         const char * todevice;\r
108         int todeviceLen;\r
109         mjson_find(buffer, 30000,\r
110             "$.to_device",\r
111             &todevice, &todeviceLen);\r
112         static char prettyBuffer[10000];\r
113         struct mjson_fixedbuf fb = { prettyBuffer, 10000, 0 };\r
114         mjson_pretty(todevice, todeviceLen,\r
115             "  ", mjson_print_fixed_buf, &fb);\r
116         printf("%.*s\n", fb.len, fb.ptr);\r
117     }\r
118     else if (CheckCommand(cmd, "save")) {\r
119         CHECK_ARGS(1, "<filename>")\r
120 \r
121         MatrixClientSave(client, args[0]);\r
122     }\r
123     else if (CheckCommand(cmd, "load")) {\r
124         CHECK_ARGS(1, "<filename>")\r
125 \r
126         MatrixClientLoad(client, args[0]);\r
127     }\r
128     else if (CheckCommand(cmd, "send")) {\r
129         CHECK_ARGS(2, "<room_id> <message>")\r
130 \r
131         static char body[1024];\r
132         snprintf(body, 1024,\r
133             "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",\r
134             args[1]);\r
135 \r
136         printf("Sending %s to %s\n", body, args[0]);\r
137 \r
138         MatrixClientSendEvent(client,\r
139             args[0],\r
140             "m.room.message",\r
141             body);\r
142     }\r
143     else if (CheckCommand(cmd, "setuserid")) {\r
144         CHECK_ARGS(1, "<user_id>")\r
145 \r
146         MatrixClientSetUserId(client, args[0]);\r
147     }\r
148     else if (CheckCommand(cmd, "getuserid")) {\r
149         printf("User ID: %s\n", client->userId);\r
150     }\r
151 #undef CHECK_ARGS\r
152 }\r
153 \r
154 int\r
155 main(void)\r
156 {\r
157     MatrixClient client;\r
158     MatrixClientInit(&client,\r
159         SERVER);\r
160     \r
161     MatrixHttpInit(&client);\r
162 \r
163     MatrixClientSetAccessToken(&client,\r
164         ACCESS_TOKEN);\r
165     MatrixClientSetDeviceId(&client,\r
166         DEVICE_ID);\r
167     MatrixClientSetUserId(&client,\r
168         USER_ID);\r
169 \r
170     static char cmd[BUFFER_SIZE];\r
171     static char args_[NUMBER_ARGS][BUFFER_SIZE];\r
172     char * args[NUMBER_ARGS];\r
173     for (int i = 0; i < NUMBER_ARGS; i++)\r
174         args[i] = args_[i];\r
175     int nargs;\r
176     do {\r
177         GetCommand(cmd, &nargs, args);\r
178 \r
179         ExecuteCommand(&client, cmd, nargs, args);\r
180         \r
181     } while (strcmp(cmd, "exit") != 0);\r
182         \r
183     MatrixHttpDeinit(&client);\r
184 \r
185     return 0;\r
186 }\r