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