Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
matrix.qc
Go to the documentation of this file.
1#include "matrix.qh"
2
3.string message;
4
5void MX_Nick_(entity fh, entity pass, int status);
6void MX_Nick(string name)
7{
9 return;
10 entity pass = new_pure(mx);
11 pass.message = name;
13 sprintf("%s/_matrix/client/r0/profile/%s/displayname?access_token=%s", autocvar_matrix_server, matrix_user, matrix_access_token),
16 pass
17 );
18}
19void MX_Nick_(entity fh, entity pass, int status)
20{
21 switch (status)
22 {
24 {
25 fh.url_verb = "PUT";
26 fh.url_content_type = "application/json";
27 url_fputs(fh, sprintf("{\"displayname\": \"%s\"}", pass.message));
28 delete(pass);
29 url_fclose(fh);
30 break;
31 }
32 }
33}
34
35
36void MX_Messages_(entity fh, entity pass, int status);
37void MX_Messages(string from)
38{
40 return;
41 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);
43 s,
46 NULL
47 );
48}
49void MX_Messages_(entity fh, entity pass, int status)
50{
51 switch (status)
52 {
53 default:
54 {
55 LOG_WARNF("status: %d", status);
56 break;
57 }
59 break;
61 {
62 string json = "";
63 for (string s; (s = url_fgets(fh)); )
64 json = strcat(json, s, "\n");
65 url_fclose(fh);
66 int buf = json_parse(json, _json_parse_object);
67 EXPECT_NE(-1, buf);
68 for (int i = 0, n = stof(json_get(buf, "chunk.length")); i < n; ++i)
69 MX_Handle(buf, sprintf("chunk.%d", i));
70 MX_Messages(json_get(buf, "end"));
71 break;
72 }
73 }
74}
75
76
77void MX_Sync_(entity fh, entity pass, int status);
78void MX_Sync(string since)
79{
81 return;
82 string s = strcat(autocvar_matrix_server, "/_matrix/client/r0/sync?");
83 if (since)
84 s = strcat(s,
85 "since=", since, "&",
86 "timeout=30000&",
87 sprintf("filter={\"account_data\":{\"types\":[]},\"presence\":{\"types\":[]},\"room\":{\"rooms\":[\"%s\"]}}&", matrix_room)
88 );
89 else
90 s = strcat(s,
91 "timeout=0&",
92 "filter={\"account_data\":{\"types\":[]},\"presence\":{\"types\":[]},\"room\":{\"rooms\":[]}}&"
93 );
94 s = strcat(s, "access_token=", matrix_access_token);
96}
97void MX_Sync_(entity fh, entity pass, int status)
98{
99 switch (status)
100 {
101 default:
102 {
103 LOG_WARNF("status: %d", status);
104 break;
105 }
106 case URL_READY_CLOSED:
107 break;
109 {
110 string json = "";
111 for (string s; (s = url_fgets(fh)); )
112 json = strcat(json, s, "\n");
113 url_fclose(fh);
114 int buf = json_parse(json, _json_parse_object);
115 EXPECT_NE(-1, buf);
116 string arr = sprintf("rooms.join.%s.timeline.events", matrix_room);
117 for (int i = 0, n = stof(json_get(buf, sprintf("%s.length", arr))); i < n; ++i)
118 MX_Handle(buf, sprintf("%s.%d", arr, i));
119 MX_Sync(json_get(buf, "next_batch"));
120 break;
121 }
122 }
123}
124
125
126void MX_JLF_(entity fh, entity pass, int status);
127void MX_Join(string room)
128{
130 return;
132 sprintf("%s/_matrix/client/r0/rooms/%s/join?access_token=%s", autocvar_matrix_server, matrix_room, matrix_access_token),
134 MX_JLF_,
135 NULL
136 );
137}
138void MX_Leave(string room)
139{
141 return;
143 sprintf("%s/_matrix/client/r0/rooms/%s/leave?access_token=%s", autocvar_matrix_server, matrix_room, matrix_access_token),
145 MX_JLF_,
146 NULL
147 );
148}
149void MX_Forget(string room)
150{
152 return;
154 sprintf("%s/_matrix/client/r0/rooms/%s/forget?access_token=%s", autocvar_matrix_server, matrix_room, matrix_access_token),
156 MX_JLF_,
157 NULL
158 );
159}
160void MX_JLF_(entity fh, entity pass, int status)
161{
162 switch (status)
163 {
165 {
166 fh.url_content_type = "application/json";
167 url_fputs(fh, sprintf("{%s}", pass.message));
168 url_fclose(fh);
169 break;
170 }
171 }
172}
173
174
175void MX_Typing_(entity fh, entity pass, int status);
176void MX_Typing(bool state)
177{
179 return;
180 entity pass = new_pure(mx);
181 pass.message = state ? "true" : "false";
183 sprintf("%s/_matrix/client/r0/rooms/%s/typing/%s?access_token=%s", autocvar_matrix_server, matrix_room, matrix_user, matrix_access_token),
186 pass
187 );
188}
189void MX_Typing_(entity fh, entity pass, int status)
190{
191 switch (status)
192 {
194 {
195 fh.url_verb = "PUT";
196 fh.url_content_type = "application/json";
197 url_fputs(fh, sprintf("{\"typing\": %s, \"timeout\": 30000}", pass.message));
198 delete(pass);
199 url_fclose(fh);
200 break;
201 }
202 }
203}
204
205
206void MX_Say_(entity fh, entity pass, int status);
207void MX_Say(string body)
208{
210 return;
211 static int txnid;
212 entity pass = new_pure(mx);
213 pass.message = strzone(body);
215 sprintf("%s/_matrix/client/r0/rooms/%s/send/m.room.message/%d?access_token=%s", autocvar_matrix_server, matrix_room, ++txnid, matrix_access_token),
217 MX_Say_,
218 pass
219 );
220}
221void MX_Say_(entity fh, entity pass, int status)
222{
223 switch (status)
224 {
226 {
227 fh.url_verb = "PUT";
228 fh.url_content_type = "application/json";
229 url_fputs(fh, sprintf("{\"msgtype\": \"m.text\", \"body\": \"%s\"}", pass.message));
230 strfree(pass.message);
231 delete(pass);
232 url_fclose(fh);
233 break;
234 }
235 }
236}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
string message
Definition powerups.qc:19
const float FILE_READ
const float FILE_WRITE
int state
#define pass(name, colormin, colormax)
ERASEABLE int json_parse(string in, bool() func)
Definition json.qc:266
ERASEABLE string json_get(int buf, string key)
Definition json.qc:323
ERASEABLE bool _json_parse_object()
Parse a json object.
Definition json.qc:21
void MX_JLF_(entity fh, entity pass, int status)
Definition matrix.qc:160
void MX_Typing_(entity fh, entity pass, int status)
Definition matrix.qc:189
void MX_Nick(string name)
Definition matrix.qc:6
void MX_Messages_(entity fh, entity pass, int status)
Definition matrix.qc:49
void MX_Say_(entity fh, entity pass, int status)
Definition matrix.qc:221
void MX_Say(string body)
Definition matrix.qc:207
void MX_Nick_(entity fh, entity pass, int status)
Definition matrix.qc:19
void MX_Leave(string room)
Definition matrix.qc:138
void MX_Messages(string from)
Definition matrix.qc:37
void MX_Sync_(entity fh, entity pass, int status)
Definition matrix.qc:97
void MX_Sync(string since)
Definition matrix.qc:78
void MX_Forget(string room)
Definition matrix.qc:149
void MX_Typing(bool state)
Definition matrix.qc:176
void MX_Join(string room)
Definition matrix.qc:127
string matrix_access_token
Definition matrix.qh:5
string matrix_room
Definition matrix.qh:6
string autocvar_matrix_server
Definition matrix.qh:3
string matrix_user
Definition matrix.qh:4
#define LOG_WARNF(...)
Definition log.qh:59
var void MX_Handle(int buf, string ancestor)
Definition matrix.qc:3
string name
Definition menu.qh:30
float stof(string val,...)
string strzone(string s)
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
#define new_pure(class)
purely logical entities (not linked to the area grid)
Definition oo.qh:66
#define NULL
Definition post.qh:14
#define strfree(this)
Definition string.qh:57
#define EXPECT_NE(val1, val2)
Definition test.qh:53
ERASEABLE string url_fgets(entity e)
Definition urllib.qc:291
ERASEABLE void url_fputs(entity e, string s)
Definition urllib.qc:312
ERASEABLE void url_single_fopen(string url, int mode, url_ready_func rdy, entity pass)
Definition urllib.qc:90
ERASEABLE void url_fclose(entity e)
Definition urllib.qc:209
const float URL_READY_CLOSED
Definition urllib.qh:15
const float URL_READY_CANREAD
Definition urllib.qh:17
const float URL_READY_CANWRITE
Definition urllib.qh:16