summaryrefslogtreecommitdiff
path: root/room.c
diff options
context:
space:
mode:
Diffstat (limited to 'room.c')
-rw-r--r--room.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/room.c b/room.c
new file mode 100644
index 0000000..a759b2d
--- /dev/null
+++ b/room.c
@@ -0,0 +1,81 @@
+#include "room.h"
+#include "util.h"
+#include "curl_util.h"
+#include <curl/curl.h>
+
+json_object * get_room_messages(matrix_session *sess, const char *roomid, query_param *param)
+{
+ json_object *resp;
+ const char *req[100];
+ char dirs[] = "dir=b&";
+ char limit[40];
+ char *esc_roomid = NULL;
+ char *esc_filter = NULL;
+ int rn;
+
+ req[0] = sess->url;
+ req[1] = "/_matrix/client/r0/rooms/";
+ if (roomid[0] != '%') {
+ esc_roomid = curl_easy_escape(sess->curl, roomid, strlen(roomid));
+ req[2] = esc_roomid;
+ } else {
+ req[2] = roomid;
+ }
+ req[3] = "/messages?";
+ rn = 4;
+ if (param != NULL) {
+ if (param->from) {
+ req[rn] = "from=";
+ req[rn+1] = param->from;
+ req[rn+2] = "&";
+ rn += 3;
+ }
+ if (param->to) {
+ req[rn] = "to=";
+ req[rn+1] = param->to;
+ req[rn+2] = "&";
+ rn += 3;
+ }
+ switch (param->dir) {
+ case 'f':
+ case 'b':
+ dirs[4] = param->dir;
+ req[rn] = dirs;
+ rn++;
+ break;
+ default:
+ break;
+ }
+ if (param->limit > 0) {
+ sprintf(limit, "limit=%d&", param->limit);
+ req[rn] = limit;
+ rn++;
+ }
+ if (param->filter) {
+ if (param->filter[0] != '%') {
+ esc_filter = curl_easy_escape(sess->curl, param->filter, strlen(param->filter));
+ req[rn] = esc_filter;
+ } else {
+ req[rn] = param->filter;
+ }
+ req[rn+1] = "&";
+ rn += 2;
+ }
+ }
+ req[rn] = "access_token=";
+ req[rn+1] = sess->token;
+ req[rn+2] = NULL;
+
+ char *requrl = alloc_build_string(req);
+ _curl_get(sess->curl, requrl, &resp);
+
+ if (esc_roomid)
+ curl_free(esc_roomid);
+
+ if (esc_filter)
+ curl_free(esc_filter);
+
+ free(requrl);
+
+ return resp;
+}