basic start of text sending functions

This commit is contained in:
Sorunome 2019-10-16 22:57:55 +02:00
parent 7489df7e48
commit 8d6f8fda05
No known key found for this signature in database
GPG key ID: 63E31F7B5993A9C4
2 changed files with 57 additions and 10 deletions

View file

@ -9,9 +9,13 @@ class MatrixClient {
private: private:
std::string hsUrl; std::string hsUrl;
std::string token; std::string token;
int requestId;
public: public:
MatrixClient(std::string homeserverUrl, std::string matrixToken); MatrixClient(std::string homeserverUrl, std::string matrixToken);
Result doRequest(json_t* content, const char* method, std::string path, json_t* body = NULL); std::string sendTextMessage(std::string roomId, std::string text);
std::string sendMessage(std::string roomId, json_t* content);
std::string sendEvent(std::string roomId, std::string eventType, json_t* content);
json_t* doRequest(const char* method, std::string path, json_t* body = NULL);
}; };
#endif // _matrixclient_h_ #endif // _matrixclient_h_

View file

@ -7,6 +7,7 @@
#include <curl/curl.h> #include <curl/curl.h>
#include <string.h> #include <string.h>
#include <sys/socket.h> #include <sys/socket.h>
#define SOC_ALIGN 0x1000 #define SOC_ALIGN 0x1000
@ -17,6 +18,38 @@ static u32 *SOC_buffer = NULL;
MatrixClient::MatrixClient(std::string homeserverUrl, std::string matrixToken) { MatrixClient::MatrixClient(std::string homeserverUrl, std::string matrixToken) {
hsUrl = homeserverUrl; hsUrl = homeserverUrl;
token = matrixToken; token = matrixToken;
requestId = 0;
}
std::string MatrixClient::sendTextMessage(std::string roomId, std::string text) {
json_t* request = json_object();
json_object_set_new(request, "msgtype", json_string("m.text"));
json_object_set_new(request, "body", json_string(text.c_str()));
std::string eventId = sendMessage(roomId, request);
json_decref(request);
return eventId;
}
std::string MatrixClient::sendMessage(std::string roomId, json_t* content) {
return sendEvent(roomId, "m.room.message", content);
}
std::string MatrixClient::sendEvent(std::string roomId, std::string eventType, json_t* content) {
std::string txid = std::to_string(time(NULL)) + "_REQ_" + std::to_string(requestId);
std::string path = "/_matrix/client/r0/rooms/" + roomId + "/send/" + eventType + "/" + txid;
json_t* ret = doRequest("PUT", path, content);
if (!ret) {
return "";
}
json_t* eventId = json_object_get(ret, "event_id");
free(ret);
if (!eventId) {
json_decref(ret);
return "";
}
const char* eventIdStr = json_string_value(eventId);
json_decref(ret);
return eventIdStr;
} }
size_t DoRequestWriteCallback(char *contents, size_t size, size_t nmemb, void *userp) { size_t DoRequestWriteCallback(char *contents, size_t size, size_t nmemb, void *userp) {
@ -24,8 +57,9 @@ size_t DoRequestWriteCallback(char *contents, size_t size, size_t nmemb, void *u
return size * nmemb; return size * nmemb;
} }
Result MatrixClient::doRequest(json_t* content, const char* method, std::string path, json_t* body) { json_t* MatrixClient::doRequest(const char* method, std::string path, json_t* body) {
std::string url = hsUrl + path; std::string url = hsUrl + path;
requestId++;
printf("Opening Request\n"); printf("Opening Request\n");
printf(url.c_str()); printf(url.c_str());
@ -34,10 +68,10 @@ Result MatrixClient::doRequest(json_t* content, const char* method, std::string
if (!SOC_buffer) { if (!SOC_buffer) {
SOC_buffer = (u32*)memalign(0x1000, 0x100000); SOC_buffer = (u32*)memalign(0x1000, 0x100000);
if (!SOC_buffer) { if (!SOC_buffer) {
return -1; return NULL;
} }
if (socInit(SOC_buffer, 0x100000) != 0) { if (socInit(SOC_buffer, 0x100000) != 0) {
return -1; return NULL;
} }
} }
@ -45,9 +79,16 @@ Result MatrixClient::doRequest(json_t* content, const char* method, std::string
CURLcode res; CURLcode res;
if (!curl) { if (!curl) {
printf("curl init failed\n"); printf("curl init failed\n");
return -1; return NULL;
} }
std::string readBuffer; std::string readBuffer;
struct curl_slist* headers = NULL;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
if (body) {
headers = curl_slist_append(headers, "Content-Type: application/json");
const char* bodyStr = json_dumps(body, JSON_ENSURE_ASCII | JSON_ESCAPE_SLASH);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, bodyStr);
}
curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 102400L); curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L); curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
@ -55,6 +96,7 @@ Result MatrixClient::doRequest(json_t* content, const char* method, std::string
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L); curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L);
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_2TLS); curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_2TLS);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, method); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, method);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, DoRequestWriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, DoRequestWriteCallback);
@ -65,16 +107,17 @@ Result MatrixClient::doRequest(json_t* content, const char* method, std::string
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
if (res != CURLE_OK) { if (res != CURLE_OK) {
printf("curl res not ok %" PRId32 "\n", res); printf("curl res not ok %" PRId32 "\n", res);
return res; return NULL;
} }
printf("Result successful!\n");
curl_easy_cleanup(curl); curl_easy_cleanup(curl);
printf(readBuffer.c_str()); printf(readBuffer.c_str());
printf("\n");
json_error_t error; json_error_t error;
content = json_loads(readBuffer.c_str(), 0, &error); json_t* content = json_loads(readBuffer.c_str(), 0, &error);
if (!content) { if (!content) {
return -3; printf("Failed to parse json\n");
return NULL;
} }
return 0; return content;
} }