#include #include #include #include #include #include "session.h" #include "curl_util.h" #include "util.h" #include "device.h" #include "room.h" /* logout: return 1 if success, 0 if failed */ int matrix_logout(matrix_session *sess, int logout_all) { char * requrl = alloc_build_string((const char *[]){ sess->url, "/_matrix/client/r0/logout", logout_all?"/all":"", "?access_token=", sess->token, NULL }); CURLcode res = _curl_post(sess->curl, requrl, "", NULL); free(requrl); 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; } void matrix_sync(matrix_session *sess) { const char *_req[] = { sess->url, "/_matrix/client/r0/sync?access_token=", sess->token , NULL }; char *requrl = alloc_build_string(_req); json_object *resp; _curl_get(sess->curl, requrl, &resp); if (resp) { printf("%s\n", json_object_to_json_string(resp)); } json_object_put(resp); } 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)); matrix_sync(sess); puts("Diveces:"); int ndev; matrix_device *devs = get_devices(sess, &ndev); for (int i = 0; i < ndev; i++) { printf("%s %s\n", devs[i].device_id, devs[i].display_name); } json_object *msg = get_room_messages(sess, "!DxdsutHRWpSeicUCKs:matrixim.cc", NULL); printf("%s\n", json_object_to_json_string(msg)); #if 0 const char *roomid = matrix_resolv_alias(sess, "#hello:my.domain.name"); if (roomid == NULL) puts("fail to resolv #hello:my.domain.name"); if (roomid) 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); if (roomid) free(roomid); #endif if (matrix_logout(sess, 1)) puts("logout!"); if (matrix_whoami(sess)) { puts("error: not logged out!"); } }