summaryrefslogtreecommitdiff
path: root/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils.c')
-rw-r--r--utils.c75
1 files changed, 74 insertions, 1 deletions
diff --git a/utils.c b/utils.c
index 44e4006..9f4e1b7 100644
--- a/utils.c
+++ b/utils.c
@@ -1,5 +1,5 @@
1/* snac - A simple, minimalistic ActivityPub instance */ 1/* snac - A simple, minimalistic ActivityPub instance */
2/* copyright (c) 2022 - 2025 grunfink et al. / MIT license */ 2/* copyright (c) 2022 - 2026 grunfink et al. / MIT license */
3 3
4#include "xs.h" 4#include "xs.h"
5#include "xs_io.h" 5#include "xs_io.h"
@@ -11,6 +11,8 @@
11#include "xs_curl.h" 11#include "xs_curl.h"
12#include "xs_regex.h" 12#include "xs_regex.h"
13#include "xs_http.h" 13#include "xs_http.h"
14#include "xs_list_tools.h"
15#include "xs_set.h"
14 16
15#include "snac.h" 17#include "snac.h"
16 18
@@ -86,6 +88,7 @@ static const char * const default_css =
86 " a { color: #7799dd }\n" 88 " a { color: #7799dd }\n"
87 " a:visited { color: #aa99dd }\n" 89 " a:visited { color: #aa99dd }\n"
88 "}\n" 90 "}\n"
91 "select { max-width: 40%; }\n"
89; 92;
90 93
91const char *snac_blurb = 94const char *snac_blurb =
@@ -1002,6 +1005,76 @@ void import_csv(snac *user)
1002 snac_log(user, xs_fmt("Cannot open file %s", fn)); 1005 snac_log(user, xs_fmt("Cannot open file %s", fn));
1003} 1006}
1004 1007
1008
1009static int top_ten_sort(const void *v1, const void *v2)
1010{
1011 const xs_list *l1 = *(const xs_list **)v1;
1012 const xs_list *l2 = *(const xs_list **)v2;
1013
1014 const char *c1 = xs_list_get(l1, 3);
1015 const char *c2 = xs_list_get(l2, 3);
1016
1017 return xs_cmp(c2, c1);
1018}
1019
1020
1021xs_list *user_top_ten(snac *user, int count)
1022/* returns the top ten more popular posts by a user */
1023{
1024 xs *idx = xs_fmt("%s/private.idx", user->basedir);
1025 xs *list = index_list(idx, XS_ALL);
1026 xs *u_list = xs_list_new();
1027 xs_set u;
1028
1029 xs_set_init(&u);
1030
1031 const char *md5;
1032
1033 xs_list_foreach(list, md5) {
1034 xs *obj = NULL;
1035
1036 if (!valid_status(object_get_by_md5(md5, &obj)))
1037 continue;
1038
1039 const char *id = xs_dict_get_def(obj, "id", "-");
1040
1041 if (!is_msg_mine(user, id))
1042 continue;
1043
1044 if (xs_set_add(&u, id) != 1)
1045 continue;
1046
1047 /* get metrics */
1048 int ls = object_likes_len(id);
1049 int as = object_announces_len(id);
1050
1051 /* build the entry and convert to list */
1052 xs *s = xs_fmt("%s\t%d\t%d\t%010d", id, ls, as, ls + as);
1053 xs *l = xs_split(s, "\t");
1054
1055 u_list = xs_list_append(u_list, l);
1056 }
1057
1058 /* sort by the sum of likes and boosts */
1059 xs *s_list = xs_list_sort(u_list, top_ten_sort);
1060
1061 xs_list *r = xs_list_new();
1062 const xs_list *i;
1063
1064 xs_list_foreach(s_list, i) {
1065 r = xs_list_append(r, i);
1066
1067 if (--count <= 0)
1068 break;
1069 }
1070
1071 xs_set_free(&u);
1072
1073 return r;
1074}
1075
1076
1077
1005static const struct { 1078static const struct {
1006 const char *proto; 1079 const char *proto;
1007 unsigned short default_port; 1080 unsigned short default_port;