summaryrefslogtreecommitdiff
path: root/api.c
diff options
context:
space:
mode:
Diffstat (limited to 'api.c')
-rw-r--r--api.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/api.c b/api.c
new file mode 100644
index 0000000..e5b802f
--- /dev/null
+++ b/api.c
@@ -0,0 +1,130 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <curl/curl.h>
+#include <json-c/json.h>
+#include "session.h"
+#include "util.h"
+
+/* logout: return 1 if success, 0 if failed */
+int matrix_logout(matrix_session *sess)
+{
+ char requrl[1000]; /* FIXME */
+ sprintf(requrl, "%s/_matrix/client/r0/logout?access_token=%s", sess->url, sess->token);
+ CURLcode res = _curl_post(sess->curl, requrl, "", NULL);
+ if (res == CURLE_OK)
+ return 1;
+ else
+ return 0;
+}
+
+json_object * matrix_joined_rooms(matrix_session *sess)
+{
+ char requrl[1000];
+ json_object *resp;
+ sprintf(requrl, "%s/_matrix/client/r0/joined_rooms?access_token=%s",
+ sess->url, sess->token);
+ _curl_get(sess->curl, requrl, &resp);
+ return resp;
+}
+
+const char * matrix_create_room(matrix_session *sess)
+{
+ char requrl[1000];
+ json_object *resp;
+
+ sprintf(requrl, "%s/_matrix/client/r0/createRoom?access_token=%s",
+ sess->url, sess->token);
+ _curl_post(sess->curl, requrl, "{\"preset\": \"private_chat\"}", &resp);
+ if (resp != NULL) {
+ const char *roomid = json_gets(resp, "room_id");
+ if (roomid) {
+ const char *r = copy_str(roomid);
+ json_object_put(resp);
+ return r;
+ }
+ }
+ json_object_put(resp);
+ return NULL;
+}
+
+const char * matrix_resolv_alias(matrix_session *sess, const char *alias)
+{
+ char requrl[1000];
+ json_object *resp;
+ const char *_alias = alias;
+ if (alias[0] == '#')
+ _alias = curl_easy_escape(sess->curl, alias, strlen(alias));
+
+ sprintf(requrl, "%s/_matrix/client/r0/directory/room/%s", sess->url, _alias);
+ if (_alias != alias)
+ curl_free(_alias);
+
+ _curl_get(sess->curl, requrl, &resp);
+ if (resp) {
+ const char *roomid = json_gets(resp, "room_id");
+ if (roomid) {
+ const char *r = copy_str(roomid);
+ json_object_put(resp);
+ return r;
+ }
+ }
+ json_object_put(resp);
+ return NULL;
+}
+
+int main()
+{
+ curl_global_init(CURL_GLOBAL_ALL);
+ char url[1000], user[1000], passwd[1000], token[1000];
+ scanf("%s%s%s", url, user, passwd);
+ matrix_session *sess = matrix_login_pass(url, user, passwd, "Matrix C Client");
+
+ if (sess) {
+ printf("hs: %s, mxid: %s, dev: %s, token: %s\n", sess->servername,
+ sess->mxid, sess->dev_id, sess->token);
+
+ /* store access token */
+ FILE *fp = fopen("credential.txt", "w");
+ fprintf(fp, "%s %s\n", url, sess->token);
+ fclose(fp);
+ } else {
+ puts("login error!\n");
+ }
+
+ strcpy(token, sess->token);
+ matrix_session_free(sess);
+
+ // scanf("%s%s", url, token);
+ sess = matrix_access_token(url, token);
+ if (sess) {
+ printf("I'm %s\n", sess->mxid);
+ } else {
+ puts("login error!\n");
+ }
+
+ json_object *joined_rooms = matrix_joined_rooms(sess);
+ printf("%s\n", json_object_to_json_string(joined_rooms));
+
+ const char *roomid = matrix_resolv_alias(sess, "#hello:my.domain.name");
+ if (roomid == NULL)
+ puts("fail to resolv #hello:my.domain.name");
+
+ free(roomid);
+
+ /* create a room */
+ roomid = matrix_create_room(sess);
+ if (roomid == NULL)
+ puts("fail to create room!");
+ else
+ printf("create room %s\n", roomid);
+
+ free(roomid);
+
+ if (matrix_logout(sess))
+ puts("logout!");
+
+ if (matrix_whoami(sess)) {
+ puts("error: not logged out!");
+ }
+}