Status creationm

FossilOrigin-Name: 57c5ea20e7814f5b335c5f39942c2ed150647d42a3384b949a10f29253466c76
This commit is contained in:
me@ow.nekobit.net 2022-02-16 20:30:06 +00:00
parent 82b6fc7c8e
commit 0b50e18a09
5 changed files with 102 additions and 0 deletions

View file

@ -94,6 +94,22 @@ struct mstdnt_account_statuses_args {
int limit;
};
struct mstdnt_create_status_args
{
char* content_type;
int expires_in;
char* in_reply_to_conversation_id;
char* in_reply_to_id;
char* language;
char** media_ids;
void* poll; /* TODO */
int preview;
char* scheduled_at;
int sensitive;
char* spoiler_text;
char* status;
char* visibility;
};
int mstdnt_load_statuses_from_result(struct mstdnt_status* status[],
struct mstdnt_storage* storage,
@ -108,5 +124,8 @@ int mastodont_account_statuses(mastodont_t* data,
struct mstdnt_status* statuses[],
size_t* size);
int mastodont_create_status(mastodont_t* data,
struct mstdnt_create_status_args* args,
struct mstdnt_storage* storage);
#endif /* MASTODONT_STATUS */

View file

@ -28,6 +28,7 @@ typedef struct mastodont
{
char* url;
CURL* curl;
char* token;
} mastodont_t;
struct mstdnt_storage

View file

@ -43,17 +43,30 @@ void mastodont_fetch_results_cleanup(struct mstdnt_fetch_results* res)
free(res->response);
}
#include <stdio.h>
#define TOKEN_STR_SIZE 512
int mastodont_fetch_curl(mastodont_t* mstdnt,
char* _url,
struct mstdnt_fetch_results* results)
{
int res;
char token[TOKEN_STR_SIZE] = { 0 };
struct curl_slist* list = NULL;
/* Setup URL */
char url[MSTDNT_URLSIZE];
strncpy(url, mstdnt->url, MSTDNT_URLSIZE-1);
strncat(url, _url, MSTDNT_URLSIZE-1);
/* Setup token */
if (mstdnt->token)
{
snprintf(token, TOKEN_STR_SIZE, "Authorization: Bearer %s",
mstdnt->token);
list = curl_slist_append(list, token);
curl_easy_setopt(mstdnt->curl, CURLOPT_HTTPHEADER, list);
}
/* Set options */
curl_easy_setopt(mstdnt->curl, CURLOPT_URL, url);
curl_easy_setopt(mstdnt->curl, CURLOPT_WRITEFUNCTION, write_callback);
@ -61,5 +74,7 @@ int mastodont_fetch_curl(mastodont_t* mstdnt,
res = curl_easy_perform(mstdnt->curl);
if (list) curl_slist_free_all(list);
return res;
}

View file

@ -15,6 +15,7 @@ void mastodont_global_curl_cleanup()
int mastodont_init(mastodont_t* data)
{
data->curl = curl_easy_init();
data->token = NULL;
return data->curl == NULL;
}

View file

@ -18,6 +18,7 @@
#include <mastodont_json_helper.h>
#include <mastodont_status.h>
#include <mastodont_account.h>
#include <mastodont_query.h>
int mstdnt_load_status_from_json(struct mstdnt_status* status, cJSON* js)
{
@ -125,3 +126,68 @@ int mastodont_account_statuses(mastodont_t* data,
return res;
}
int mastodont_create_status(mastodont_t* data,
struct mstdnt_create_status_args* args,
struct mstdnt_storage* storage)
{
int res = 0;
char* post;
struct mstdnt_fetch_results results = { 0 };
/* Default args */
struct mstdnt_create_status_args _args;
if (args == NULL)
{
_args.content_type = "html"; /* TODO */
_args.expires_in = 0;
_args.in_reply_to_conversation_id = NULL;
_args.in_reply_to_id = NULL;
_args.language = NULL;
_args.media_ids = NULL;
_args.poll = NULL;
_args.preview = 0;
_args.scheduled_at = NULL;
_args.sensitive = 0;
_args.spoiler_text = NULL;
_args.status = NULL;
_args.visibility = "public";
args = &_args;
}
storage->needs_cleanup = 0;
union param_value u_content_type, u_expires_in,
u_in_reply_to_conversation_id, u_in_reply_to_id,
u_language, u_media_ids, u_poll, u_preview, u_scheduled_at,
u_sensitive, u_spoiler_text, u_status, u_visibility;
u_content_type.s = args->content_type;
u_expires_in.i = args->expires_in;
u_in_reply_to_conversation_id.s = args->in_reply_to_conversation_id;
u_in_reply_to_id.s = args->in_reply_to_id;
u_language.s = args->language;
/*u_media_ids.s = args->media_ids;*/
/* poll */
u_preview.i = args->preview;
u_scheduled_at.s = args->scheduled_at;
u_sensitive.i = args->sensitive;
u_spoiler_text.s = args->spoiler_text;
u_status.s = args->status;
u_visibility.s = args->visibility;
struct _mstdnt_query_param params[] = {
{ _MSTDNT_QUERY_STRING, "content_type", u_content_type },
{ _MSTDNT_QUERY_STRING, "status", u_status },
{ _MSTDNT_QUERY_STRING, "visibility", u_visibility },
};
post = _mstdnt_query_string(NULL, params, _mstdnt_arr_len(params));
curl_easy_setopt(data->curl, CURLOPT_POSTFIELDS, post);
if (mastodont_fetch_curl(data, "api/v1/statuses", &results) != CURLE_OK)
return 1;
mastodont_fetch_results_cleanup(&results);
return 0;
}