5 void MX_Nick_(entity fh, entity pass, int status);
6 void MX_Nick(string name)
8 if (!matrix_access_token) { return; }
9 entity pass = new_pure(mx);
12 sprintf("%s/_matrix/client/r0/profile/%s/displayname?access_token=%s", autocvar_matrix_server, matrix_user, matrix_access_token),
18 void MX_Nick_(entity fh, entity pass, int status)
21 case URL_READY_CANWRITE:
24 fh.url_content_type = "application/json";
25 url_fputs(fh, sprintf("{\"displayname\": \"%s\"}", pass.message));
34 void MX_Messages_(entity fh, entity pass, int status);
35 void MX_Messages(string from)
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);
46 void MX_Messages_(entity fh, entity pass, int status)
51 LOG_WARNF("status: %d", status);
54 case URL_READY_CLOSED: break;
55 case URL_READY_CANREAD:
58 for (string s; (s = url_fgets(fh)); ) {
59 json = strcat(json, s, "\n");
62 int buf = json_parse(json, _json_parse_object);
64 for (int i = 0, n = stof(json_get(buf, "chunk.length")); i < n; ++i) {
65 MX_Handle(buf, sprintf("chunk.%d", i));
67 MX_Messages(json_get(buf, "end"));
74 void MX_Sync_(entity fh, entity pass, int status);
75 void MX_Sync(string since)
77 if (!matrix_access_token) { return; }
78 string s = strcat(autocvar_matrix_server, "/_matrix/client/r0/sync?");
83 sprintf("filter={\"account_data\":{\"types\":[]},\"presence\":{\"types\":[]},\"room\":{\"rooms\":[\"%s\"]}}&", matrix_room)
88 "filter={\"account_data\":{\"types\":[]},\"presence\":{\"types\":[]},\"room\":{\"rooms\":[]}}&"
91 s = strcat(s, "access_token=", matrix_access_token);
92 url_single_fopen(s, FILE_READ, MX_Sync_, NULL);
94 void MX_Sync_(entity fh, entity pass, int status)
99 LOG_WARNF("status: %d", status);
102 case URL_READY_CLOSED: break;
103 case URL_READY_CANREAD:
106 for (string s; (s = url_fgets(fh)); ) {
107 json = strcat(json, s, "\n");
110 int buf = json_parse(json, _json_parse_object);
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));
116 MX_Sync(json_get(buf, "next_batch"));
123 void MX_JLF_(entity fh, entity pass, int status);
124 void MX_Join(string room)
126 if (!matrix_access_token) { return; }
128 sprintf("%s/_matrix/client/r0/rooms/%s/join?access_token=%s", autocvar_matrix_server, matrix_room, matrix_access_token),
134 void MX_Leave(string room)
136 if (!matrix_access_token) { return; }
138 sprintf("%s/_matrix/client/r0/rooms/%s/leave?access_token=%s", autocvar_matrix_server, matrix_room, matrix_access_token),
144 void MX_Forget(string room)
146 if (!matrix_access_token) { return; }
148 sprintf("%s/_matrix/client/r0/rooms/%s/forget?access_token=%s", autocvar_matrix_server, matrix_room, matrix_access_token),
154 void MX_JLF_(entity fh, entity pass, int status)
157 case URL_READY_CANWRITE:
159 fh.url_content_type = "application/json";
160 url_fputs(fh, sprintf("{}", pass.message));
168 void MX_Typing_(entity fh, entity pass, int status);
169 void MX_Typing(bool state)
171 if (!matrix_access_token) { return; }
172 entity pass = new_pure(mx);
173 pass.message = state ? "true" : "false";
175 sprintf("%s/_matrix/client/r0/rooms/%s/typing/%s?access_token=%s", autocvar_matrix_server, matrix_room, matrix_user, matrix_access_token),
181 void MX_Typing_(entity fh, entity pass, int status)
184 case URL_READY_CANWRITE:
187 fh.url_content_type = "application/json";
188 url_fputs(fh, sprintf("{\"typing\": %s, \"timeout\": 30000}", pass.message));
197 void MX_Say_(entity fh, entity pass, int status);
198 void MX_Say(string body)
200 if (!matrix_access_token) { return; }
202 entity pass = new_pure(mx);
203 pass.message = strzone(body);
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),
211 void MX_Say_(entity fh, entity pass, int status)
214 case URL_READY_CANWRITE:
217 fh.url_content_type = "application/json";
218 url_fputs(fh, sprintf("{\"msgtype\": \"m.text\", \"body\": \"%s\"}", pass.message));
219 strunzone(pass.message);