implement message sending to channels

This commit is contained in:
2019-07-12 11:53:32 +02:00
parent 0c9432c269
commit b8fa202ce3
18 changed files with 219 additions and 28 deletions

View File

@@ -90,6 +90,12 @@ bool dc_api_create_channel(dc_api_t api, dc_account_t login,
*/
bool dc_api_get_messages(dc_api_t api, dc_account_t login, dc_channel_t c);
/**
* post a message to the given channel
*/
bool dc_api_post_message(dc_api_t api, dc_account_t login,
dc_channel_t c, dc_message_t m);
/**
* Fetch a list of friends of the login account "login". The friends are stored
* within the login object.

View File

@@ -10,6 +10,7 @@ struct dc_message_;
typedef struct dc_message_ *dc_message_t;
dc_message_t dc_message_new(void);
dc_message_t dc_message_new_content(char const *s, int len);
dc_message_t dc_message_from_json(json_t *j);
json_t *dc_message_to_json(dc_message_t m);

View File

@@ -52,6 +52,12 @@ bool dc_session_has_token(dc_session_t s);
*/
dc_account_t dc_session_me(dc_session_t s);
/**
* Return the API handle in use by the session. Do not unref the reference
* and if you need it for something else, dc_ref() it yourself.
*/
dc_api_t dc_session_api(dc_session_t s);
/**
* access to the internal account cache
*/

View File

@@ -2,6 +2,36 @@
#include "internal.h"
bool dc_api_post_message(dc_api_t api, dc_account_t login,
dc_channel_t c, dc_message_t m)
{
bool ret = false;
char *url = NULL;
json_t *j = NULL, *reply = NULL;
return_if_true(api == NULL || login == NULL || m == NULL, false);
return_if_true(dc_message_content(m) == NULL, false);
asprintf(&url, "channels/%s/messages", dc_channel_id(c));
goto_if_true(url == NULL, cleanup);
j = dc_message_to_json(m);
goto_if_true(j == NULL, cleanup);
reply = dc_api_call_sync(api, "POST", TOKEN(login), url, j);
goto_if_true(reply != NULL, cleanup);
ret = true;
cleanup:
free(url);
json_decref(j);
json_decref(reply);
return ret;
}
bool dc_api_get_messages(dc_api_t api, dc_account_t login, dc_channel_t c)
{
bool ret = false;

View File

@@ -40,6 +40,24 @@ dc_message_t dc_message_new(void)
return dc_ref(m);
}
dc_message_t dc_message_new_content(char const *s, int len)
{
dc_message_t m = dc_message_new();
return_if_true(m == NULL, NULL);
if (len < 0) {
len = strlen(s);
}
m->content = strndup(s, len);
if (m->content == NULL) {
dc_unref(m);
return NULL;
}
return m;
}
dc_message_t dc_message_from_json(json_t *j)
{
dc_message_t m = NULL;

View File

@@ -227,6 +227,12 @@ bool dc_session_has_token(dc_session_t s)
return dc_account_has_token(s->login);
}
dc_api_t dc_session_api(dc_session_t s)
{
return_if_true(s == NULL, NULL);
return s->api;
}
dc_account_t dc_session_me(dc_session_t s)
{
return_if_true(s == NULL, NULL);