basic start of text sending functions
This commit is contained in:
parent
7489df7e48
commit
8d6f8fda05
2 changed files with 57 additions and 10 deletions
|
@ -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_
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue