diff options
author | Iru Cai <mytbk920423@gmail.com> | 2018-06-27 22:56:25 +0800 |
---|---|---|
committer | Iru Cai <mytbk920423@gmail.com> | 2018-06-27 22:56:25 +0800 |
commit | e6d9edc048efb5b19d79bbe7871b2ff779d72311 (patch) | |
tree | 8d9eedd599f09d7aa9b64ab6251b9b9a092fce91 /api.c | |
download | matrix-curl-e6d9edc048efb5b19d79bbe7871b2ff779d72311.tar.xz |
initial code
Diffstat (limited to 'api.c')
-rw-r--r-- | api.c | 130 |
1 files changed, 130 insertions, 0 deletions
@@ -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!"); + } +} |