Emoji reaction

FossilOrigin-Name: 3024cb51e152637daaad2d91294f81ad3a91a5b1b7df2105735d13e02a309d30
This commit is contained in:
me@ow.nekobit.net 2022-05-08 06:11:41 +00:00
parent 238b2bcd19
commit 9412c33062
7 changed files with 60 additions and 10 deletions

17
dist/treebird20.css vendored
View file

@ -323,6 +323,13 @@ table.present th, table.present td
cursor: pointer;
}
.btn.active
{
background: initial;
background-color: #eeaaaa;
border-color: #cc0000;
}
.btn-disabled
{
color: #cacaca !important;
@ -1172,14 +1179,22 @@ svg.in-reply-to-icon
display: inline-block;
list-style-type: none;
padding: 3px 7px;
margin: 2px 4px;
margin: 1px 2px;
vertical-align: middle;
}
.emoji
{
vertical-align: middle;
font-family: Emoji;
}
.emoji-num
{
vertical-align: middle;
}
/*************************************************
* LISTS *
*************************************************/

View file

@ -16,6 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "../config.h"
#include "string_helpers.h"
#include "emoji_reaction.h"
#include <stdlib.h>
@ -25,25 +26,36 @@
#include "../static/emoji_reaction.chtml"
#include "../static/emoji_reactions.chtml"
char* construct_emoji_reaction(struct mstdnt_emoji_reaction* emo, int* str_size)
struct construct_emoji_reactions_args
{
struct mstdnt_emoji_reaction* emojis;
char* id;
};
char* construct_emoji_reaction(char* id, struct mstdnt_emoji_reaction* emo, int* str_size)
{
char* emo_html;
size_t s = easprintf(&emo_html, data_emoji_reaction_html,
emo->name, emo->count);
config_url_prefix, id, emo->name, emo->me ? "active" : "", emo->name, emo->count);
if (str_size) *str_size = s;
return emo_html;
}
static char* construct_emoji_reactions_voidwrap(void* passed, size_t index, int* res)
{
return construct_emoji_reaction((struct mstdnt_emoji_reaction*)passed + index, res);
struct construct_emoji_reactions_args* args = passed;
return construct_emoji_reaction(args->id, args->emojis + index, res);
}
char* construct_emoji_reactions(struct mstdnt_emoji_reaction* emos, size_t emos_len, size_t* str_size)
char* construct_emoji_reactions(char* id, struct mstdnt_emoji_reaction* emos, size_t emos_len, size_t* str_size)
{
size_t elements_size;
char* elements = construct_func_strings(construct_emoji_reactions_voidwrap, emos, emos_len, &elements_size);
struct construct_emoji_reactions_args args = {
.emojis = emos,
.id = id
};
char* elements = construct_func_strings(construct_emoji_reactions_voidwrap, &args, emos_len, &elements_size);
char* emos_view;
size_t s = easprintf(&emos_view, data_emoji_reactions_html, elements);

View file

@ -20,7 +20,7 @@
#define EMOJI_REACTION_H
#include <mastodont.h>
char* construct_emoji_reaction(struct mstdnt_emoji_reaction* emo, int* str_len);
char* construct_emoji_reactions(struct mstdnt_emoji_reaction* emos, size_t emos_len, size_t* str_len);
char* construct_emoji_reaction(char* id, struct mstdnt_emoji_reaction* emo, int* str_len);
char* construct_emoji_reactions(char* id, struct mstdnt_emoji_reaction* emos, size_t emos_len, size_t* str_len);
#endif // EMOJI_REACTION_H

View file

@ -90,6 +90,7 @@ int main(void)
{ "/@:/pinned", content_account_pinned },
{ "/@:/media", content_account_media },
{ "/@:", content_account_statuses },
{ "/status/:/react/:", content_status_react },
{ "/status/create", content_status_create },
{ "/status/:/interact", status_interact },
{ "/status/:/reply", status_reply },

View file

@ -96,6 +96,18 @@ int try_post_status(struct session* ssn, mastodont_t* api)
return 0;
}
int try_react_status(struct session* ssn, mastodont_t* api, char* id, char* emoji)
{
struct mstdnt_storage storage = { 0 };
struct mstdnt_status status = { 0 };
mastodont_status_emoji_react(api, id, emoji, &storage, &status);
mstdnt_cleanup_status(&status);
mastodont_storage_cleanup(&storage);
return 1;
}
void content_status_create(struct session* ssn, mastodont_t* api, char** data)
{
char* referer = getenv("HTTP_REFERER");
@ -105,6 +117,15 @@ void content_status_create(struct session* ssn, mastodont_t* api, char** data)
redirect(REDIRECT_303, referer);
}
void content_status_react(struct session* ssn, mastodont_t* api, char** data)
{
char* referer = getenv("HTTP_REFERER");
try_react_status(ssn, api, data[0], data[1]);
redirect(REDIRECT_303, referer);
}
int try_interact_status(struct session* ssn, mastodont_t* api, char* id)
{
struct mstdnt_storage storage = { 0 };
@ -439,7 +460,7 @@ char* construct_status(mastodont_t* api,
if (status->media_attachments_len)
attachments = construct_attachments(status->sensitive, status->media_attachments, status->media_attachments_len, NULL);
if (status->pleroma.emoji_reactions_len)
emoji_reactions = construct_emoji_reactions(status->pleroma.emoji_reactions, status->pleroma.emoji_reactions_len, NULL);
emoji_reactions = construct_emoji_reactions(status->id, status->pleroma.emoji_reactions, status->pleroma.emoji_reactions_len, NULL);
if (notif && notif->type != MSTDNT_NOTIFICATION_MENTION)
easprintf(&notif_info, data_notification_html,
notif->account->avatar,

View file

@ -43,6 +43,7 @@ struct interact_profile_args
int try_post_status(struct session* ssn, mastodont_t* api);
int try_interact_status(struct session* ssn, mastodont_t* api, char* id);
void content_status_create(struct session* ssn, mastodont_t* api, char** data);
void content_status_react(struct session* ssn, mastodont_t* api, char** data);
// HTML Builders
char* construct_post_box(char* reply_id,

View file

@ -1 +1 @@
<li class="emoji-react-box btn"><span class="emoji">%s</span> %u</li>
<a href="%s/status/%s/react/%s" class="emoji-react-box btn %s"><span class="emoji">%s</span> <span class="emoji-num">%u<span></a>