summaryrefslogtreecommitdiff
path: root/room.c
blob: a759b2d247db6bbbb44dc042509e89fd5d5d6fe8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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;
}