Refactor notifications

FossilOrigin-Name: f004687ef197a3e2e66e47c69de9453eb9c6d60a92d8eb15e7b7bde39816f574
This commit is contained in:
nekobit 2023-04-01 23:47:33 +00:00
parent 5e5274da26
commit 33fcc22d3c
1 changed files with 89 additions and 59 deletions

View File

@ -18,15 +18,49 @@
#include "error.h"
#include "emoji.h"
#include "account.h"
#include "types.h"
#include "../config.h"
// Callback: content_notifications
static int
request_cb_content_notifications(mstdnt_request_cb_data* cb_data,
void* tbargs)
{
struct mstdnt_notifications* notifs = MSTDNT_CB_DATA(cb_data);
DESTRUCT_TB_ARGS(tbargs);
PERL_STACK_INIT;
HV* session_hv = perlify_session(ssn);
mXPUSHs(newRV_inc((SV*)session_hv));
mXPUSHs(newRV_inc((SV*)template_files));
if (notifs)
mXPUSHs(newRV_noinc((SV*)perlify_notifications(notifs->notifs,
notifs->len)));
// ARGS
PERL_STACK_SCALAR_CALL("notifications::content_notifications");
// Duplicate so we can free the TMPs
char* dup = PERL_GET_STACK_EXIT;
struct base_page b = {
.category = BASE_CAT_NOTIFICATIONS,
.content = dup,
.session = session_hv,
.sidebar_left = NULL
};
// Output
render_base_page(&b, req, ssn, api);
tb_free(dup);
finish_free_request(req);
return MSTDNT_REQUEST_DONE;
}
int content_notifications(PATH_ARGS)
{
struct mstdnt_args m_args;
set_mstdnt_args(&m_args, ssn);
struct mstdnt_storage storage = { 0 };
struct mstdnt_notification* notifs = NULL;
size_t notifs_len = 0;
struct mstdnt_notifications_args args = {
.exclude_types = 0,
@ -41,44 +75,49 @@ int content_notifications(PATH_ARGS)
.limit = 20,
};
if (keystr(ssn->cookies.logged_in))
mstdnt_get_notifications(api, &m_args, NULL, NULL, &args, &storage, &notifs, &notifs_len);
struct request_args* cb_args =
request_args_create(req, ssn, api, NULL);
PERL_STACK_INIT;
if (keystr(ssn->cookies.logged_in))
{
mstdnt_get_notifications(api, &m_args, request_cb_content_notifications,
cb_args, args);
return 1;
}
return 0;
}
int
request_cb_content_notifications_compact(mstdnt_request_cb_data* cb_data,
void* tbargs)
{
struct mstdnt_notifications* notifs = MSTDNT_CB_DATA(cb_data);
DESTRUCT_TB_ARGS(tbargs);
char* page;
PERL_STACK_INIT;
HV* session_hv = perlify_session(ssn);
mXPUSHs(newRV_inc((SV*)session_hv));
mXPUSHs(newRV_noinc((SV*)session_hv));
mXPUSHs(newRV_inc((SV*)template_files));
if (notifs)
mXPUSHs(newRV_noinc((SV*)perlify_notifications(notifs, notifs_len)));
// ARGS
PERL_STACK_SCALAR_CALL("notifications::content_notifications");
mXPUSHs(newRV_noinc((SV*)perlify_notifications(notifs->notifs,
notifs->len)));
// Duplicate so we can free the TMPs
char* dup = PERL_GET_STACK_EXIT;
struct base_page b = {
.category = BASE_CAT_NOTIFICATIONS,
.content = dup,
.session = session_hv,
.sidebar_left = NULL
};
PERL_STACK_SCALAR_CALL("notifications::embed_notifications");
// Output
render_base_page(&b, req, ssn, api);
mstdnt_storage_cleanup(&storage);
mstdnt_cleanup_notifications(notifs, notifs_len);
tb_free(dup);
page = PERL_GET_STACK_EXIT;
send_result(req, NULL, NULL, page, 0);
tb_free(page);
finish_free_request(req);
return MSTDNT_REQUEST_DONE;
}
int content_notifications_compact(PATH_ARGS)
{
struct mstdnt_args m_args;
set_mstdnt_args(&m_args, ssn);
char* page;
struct mstdnt_storage storage = { 0 };
struct mstdnt_notification* notifs = NULL;
size_t notifs_len = 0;
if (keystr(ssn->cookies.logged_in))
{
@ -95,25 +134,17 @@ int content_notifications_compact(PATH_ARGS)
.limit = 20,
};
mstdnt_get_notifications(api, &m_args, NULL, NULL, &args, &storage, &notifs, &notifs_len);
struct request_args* cb_args =
request_args_create(req, ssn, api, NULL);
mstdnt_get_notifications(api,
&m_args,
request_cb_content_notifications_compact,
cb_args,
args);
return 1;
}
PERL_STACK_INIT;
HV* session_hv = perlify_session(ssn);
mXPUSHs(newRV_noinc((SV*)session_hv));
mXPUSHs(newRV_inc((SV*)template_files));
if (notifs)
mXPUSHs(newRV_noinc((SV*)perlify_notifications(notifs, notifs_len)));
PERL_STACK_SCALAR_CALL("notifications::embed_notifications");
page = PERL_GET_STACK_EXIT;
send_result(req, NULL, NULL, page, 0);
mstdnt_storage_cleanup(&storage);
mstdnt_cleanup_notifications(notifs, notifs_len);
tb_free(page);
return 0;
}
int content_notifications_clear(PATH_ARGS)
@ -121,18 +152,15 @@ int content_notifications_clear(PATH_ARGS)
char* referer = GET_ENV("HTTP_REFERER", req);
struct mstdnt_args m_args;
set_mstdnt_args(&m_args, ssn);
struct mstdnt_storage storage = { 0 };
// User wants to remove a specific notification
if (data)
{
mstdnt_notification_dismiss(api, &m_args, NULL, NULL, &storage, data[0]);
}
else {
mstdnt_notifications_clear(api, &m_args, NULL, NULL, &storage);
}
mstdnt_notification_dismiss(api, &m_args, NULL, NULL, data[0]);
else
mstdnt_notifications_clear(api, &m_args, NULL, NULL);
mstdnt_storage_cleanup(&storage);
redirect(req, REDIRECT_303, referer);
return 0;
}
int content_notifications_read(PATH_ARGS)
@ -140,20 +168,21 @@ int content_notifications_read(PATH_ARGS)
char* referer = GET_ENV("HTTP_REFERER", req);
struct mstdnt_args m_args;
set_mstdnt_args(&m_args, ssn);
struct mstdnt_storage storage = { 0 };
if (data)
{
struct mstdnt_notifications_args args = { .id = data[0] };
mstdnt_notifications_read(api, &m_args, NULL, NULL, &args, &storage, NULL);
mstdnt_notifications_read(api, &m_args, NULL, NULL,
(struct mstdnt_notifications_args){ 0 });
}
else {
struct mstdnt_notifications_args args = { .max_id = keystr(ssn->post.max_id) };
mstdnt_notifications_read(api, &m_args, NULL, NULL, &args, &storage, NULL);
mstdnt_notifications_read(api, &m_args, NULL, NULL,
(struct mstdnt_notifications_args){ 0 });
}
mstdnt_storage_cleanup(&storage);
redirect(req, REDIRECT_303, referer);
return 0;
}
// Converts it into a perl struct
@ -188,6 +217,7 @@ HV* perlify_notification(const struct mstdnt_notification* const notif)
PERLIFY_MULTI(notification, notifications, mstdnt_notification)
// TODO
int api_notifications(PATH_ARGS)
{
send_result(req, NULL, "application/json", "{\"status\":0}", 0);