]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/lib/matrix/matrix.qc
take3: format 903 files
[xonotic/xonotic-data.pk3dir.git] / qcsrc / lib / matrix / matrix.qc
1 #include "matrix.qh"
2
3 .string message;
4
5 void MX_Nick_(entity fh, entity pass, int status);
6 void MX_Nick(string name)
7 {
8         if (!matrix_access_token) { return; }
9         entity pass = new_pure(mx);
10         pass.message = name;
11         url_single_fopen(
12                 sprintf("%s/_matrix/client/r0/profile/%s/displayname?access_token=%s", autocvar_matrix_server, matrix_user, matrix_access_token),
13                 FILE_WRITE,
14                 MX_Nick_,
15                 pass
16         );
17 }
18 void MX_Nick_(entity fh, entity pass, int status)
19 {
20         switch (status) {
21                 case URL_READY_CANWRITE:
22                 {
23                         fh.url_verb = "PUT";
24                         fh.url_content_type = "application/json";
25                         url_fputs(fh, sprintf("{\"displayname\": \"%s\"}", pass.message));
26                         delete(pass);
27                         url_fclose(fh);
28                         break;
29                 }
30         }
31 }
32
33
34 void MX_Messages_(entity fh, entity pass, int status);
35 void MX_Messages(string from)
36 {
37         if (!matrix_access_token) { return; }
38         string s = sprintf("%s/_matrix/client/r0/events?room_id=%s&limit=50&timeout=30000&from=%s&access_token=%s", autocvar_matrix_server, matrix_room, from, matrix_access_token);
39         url_single_fopen(
40                 s,
41                 FILE_READ,
42                 MX_Messages_,
43                 NULL
44         );
45 }
46 void MX_Messages_(entity fh, entity pass, int status)
47 {
48         switch (status) {
49                 default:
50                 {
51                         LOG_WARNF("status: %d", status);
52                         break;
53                 }
54                 case URL_READY_CLOSED: break;
55                 case URL_READY_CANREAD:
56                 {
57                         string json = "";
58                         for (string s; (s = url_fgets(fh)); ) {
59                                 json = strcat(json, s, "\n");
60                         }
61                         url_fclose(fh);
62                         int buf = json_parse(json, _json_parse_object);
63                         EXPECT_NE(-1, buf);
64                         for (int i = 0, n = stof(json_get(buf, "chunk.length")); i < n; ++i) {
65                                 MX_Handle(buf, sprintf("chunk.%d", i));
66                         }
67                         MX_Messages(json_get(buf, "end"));
68                         break;
69                 }
70         }
71 }
72
73
74 void MX_Sync_(entity fh, entity pass, int status);
75 void MX_Sync(string since)
76 {
77         if (!matrix_access_token) { return; }
78         string s = strcat(autocvar_matrix_server, "/_matrix/client/r0/sync?");
79         if (since) {
80                 s = strcat(s,
81                         "since=", since, "&",
82                         "timeout=30000&",
83                         sprintf("filter={\"account_data\":{\"types\":[]},\"presence\":{\"types\":[]},\"room\":{\"rooms\":[\"%s\"]}}&", matrix_room)
84                         );
85         } else {
86                 s = strcat(s,
87                         "timeout=0&",
88                         "filter={\"account_data\":{\"types\":[]},\"presence\":{\"types\":[]},\"room\":{\"rooms\":[]}}&"
89                         );
90         }
91         s = strcat(s, "access_token=", matrix_access_token);
92         url_single_fopen(s, FILE_READ, MX_Sync_, NULL);
93 }
94 void MX_Sync_(entity fh, entity pass, int status)
95 {
96         switch (status) {
97                 default:
98                 {
99                         LOG_WARNF("status: %d", status);
100                         break;
101                 }
102                 case URL_READY_CLOSED: break;
103                 case URL_READY_CANREAD:
104                 {
105                         string json = "";
106                         for (string s; (s = url_fgets(fh)); ) {
107                                 json = strcat(json, s, "\n");
108                         }
109                         url_fclose(fh);
110                         int buf = json_parse(json, _json_parse_object);
111                         EXPECT_NE(-1, buf);
112                         string arr = sprintf("rooms.join.%s.timeline.events", matrix_room);
113                         for (int i = 0, n = stof(json_get(buf, sprintf("%s.length", arr))); i < n; ++i) {
114                                 MX_Handle(buf, sprintf("%s.%d", arr, i));
115                         }
116                         MX_Sync(json_get(buf, "next_batch"));
117                         break;
118                 }
119         }
120 }
121
122
123 void MX_JLF_(entity fh, entity pass, int status);
124 void MX_Join(string room)
125 {
126         if (!matrix_access_token) { return; }
127         url_single_fopen(
128                 sprintf("%s/_matrix/client/r0/rooms/%s/join?access_token=%s", autocvar_matrix_server, matrix_room, matrix_access_token),
129                 FILE_WRITE,
130                 MX_JLF_,
131                 NULL
132         );
133 }
134 void MX_Leave(string room)
135 {
136         if (!matrix_access_token) { return; }
137         url_single_fopen(
138                 sprintf("%s/_matrix/client/r0/rooms/%s/leave?access_token=%s", autocvar_matrix_server, matrix_room, matrix_access_token),
139                 FILE_WRITE,
140                 MX_JLF_,
141                 NULL
142         );
143 }
144 void MX_Forget(string room)
145 {
146         if (!matrix_access_token) { return; }
147         url_single_fopen(
148                 sprintf("%s/_matrix/client/r0/rooms/%s/forget?access_token=%s", autocvar_matrix_server, matrix_room, matrix_access_token),
149                 FILE_WRITE,
150                 MX_JLF_,
151                 NULL
152         );
153 }
154 void MX_JLF_(entity fh, entity pass, int status)
155 {
156         switch (status) {
157                 case URL_READY_CANWRITE:
158                 {
159                         fh.url_content_type = "application/json";
160                         url_fputs(fh, sprintf("{}", pass.message));
161                         url_fclose(fh);
162                         break;
163                 }
164         }
165 }
166
167
168 void MX_Typing_(entity fh, entity pass, int status);
169 void MX_Typing(bool state)
170 {
171         if (!matrix_access_token) { return; }
172         entity pass = new_pure(mx);
173         pass.message = state ? "true" : "false";
174         url_single_fopen(
175                 sprintf("%s/_matrix/client/r0/rooms/%s/typing/%s?access_token=%s", autocvar_matrix_server, matrix_room, matrix_user, matrix_access_token),
176                 FILE_WRITE,
177                 MX_Typing_,
178                 pass
179         );
180 }
181 void MX_Typing_(entity fh, entity pass, int status)
182 {
183         switch (status) {
184                 case URL_READY_CANWRITE:
185                 {
186                         fh.url_verb = "PUT";
187                         fh.url_content_type = "application/json";
188                         url_fputs(fh, sprintf("{\"typing\": %s, \"timeout\": 30000}", pass.message));
189                         delete(pass);
190                         url_fclose(fh);
191                         break;
192                 }
193         }
194 }
195
196
197 void MX_Say_(entity fh, entity pass, int status);
198 void MX_Say(string body)
199 {
200         if (!matrix_access_token) { return; }
201         static int txnid;
202         entity pass = new_pure(mx);
203         pass.message = strzone(body);
204         url_single_fopen(
205                 sprintf("%s/_matrix/client/r0/rooms/%s/send/m.room.message/%d?access_token=%s", autocvar_matrix_server, matrix_room, ++txnid, matrix_access_token),
206                 FILE_WRITE,
207                 MX_Say_,
208                 pass
209         );
210 }
211 void MX_Say_(entity fh, entity pass, int status)
212 {
213         switch (status) {
214                 case URL_READY_CANWRITE:
215                 {
216                         fh.url_verb = "PUT";
217                         fh.url_content_type = "application/json";
218                         url_fputs(fh, sprintf("{\"msgtype\": \"m.text\", \"body\": \"%s\"}", pass.message));
219                         strunzone(pass.message);
220                         delete(pass);
221                         url_fclose(fh);
222                         break;
223                 }
224         }
225 }