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:
|
||||
std::string hsUrl;
|
||||
std::string token;
|
||||
int requestId;
|
||||
public:
|
||||
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_
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <curl/curl.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#include <sys/socket.h>
|
||||
|
||||
#define SOC_ALIGN 0x1000
|
||||
|
@ -17,6 +18,38 @@ static u32 *SOC_buffer = NULL;
|
|||
MatrixClient::MatrixClient(std::string homeserverUrl, std::string matrixToken) {
|
||||
hsUrl = homeserverUrl;
|
||||
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) {
|
||||
|
@ -24,8 +57,9 @@ size_t DoRequestWriteCallback(char *contents, size_t size, size_t nmemb, void *u
|
|||
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;
|
||||
requestId++;
|
||||
|
||||
printf("Opening Request\n");
|
||||
printf(url.c_str());
|
||||
|
@ -34,10 +68,10 @@ Result MatrixClient::doRequest(json_t* content, const char* method, std::string
|
|||
if (!SOC_buffer) {
|
||||
SOC_buffer = (u32*)memalign(0x1000, 0x100000);
|
||||
if (!SOC_buffer) {
|
||||
return -1;
|
||||
return NULL;
|
||||
}
|
||||
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;
|
||||
if (!curl) {
|
||||
printf("curl init failed\n");
|
||||
return -1;
|
||||
return NULL;
|
||||
}
|
||||
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_URL, url.c_str());
|
||||
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_MAXREDIRS, 50L);
|
||||
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_CUSTOMREQUEST, method);
|
||||
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);
|
||||
if (res != CURLE_OK) {
|
||||
printf("curl res not ok %" PRId32 "\n", res);
|
||||
return res;
|
||||
return NULL;
|
||||
}
|
||||
printf("Result successful!\n");
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
printf(readBuffer.c_str());
|
||||
printf("\n");
|
||||
json_error_t error;
|
||||
content = json_loads(readBuffer.c_str(), 0, &error);
|
||||
json_t* content = json_loads(readBuffer.c_str(), 0, &error);
|
||||
if (!content) {
|
||||
return -3;
|
||||
printf("Failed to parse json\n");
|
||||
return NULL;
|
||||
}
|
||||
return 0;
|
||||
return content;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue