commit 3559a0f1f2dd7fc3cb8c430e53a197ac94e6a51a
parent 15684721c36d36b2dfd57a2dabbf19a8e53850b7
Author: default <nobody@localhost>
Date: Wed, 28 Jun 2023 20:26:59 +0200
New pinning in data storage.
Diffstat:
M | data.c | | | 50 | ++++++++++++++++++++++++++++++++++++++++++++++++++ |
M | snac.h | | | 5 | +++++ |
2 files changed, 55 insertions(+), 0 deletions(-)
diff --git a/data.c b/data.c
@@ -1347,6 +1347,56 @@ int is_muted(snac *snac, const char *actor)
}
+/** pinning **/
+
+xs_str *_pinned_fn(snac *user, const char *id)
+{
+ xs *md5 = xs_md5_hex(id, strlen(id));
+ return xs_fmt("%s/pinned/%s", user->basedir, md5);
+}
+
+
+int is_pinned(snac *user, const char *id)
+/* returns true if this note is pinned */
+{
+ xs *fn = _pinned_fn(user, id);
+ return !!(mtime(fn) != 0.0);
+}
+
+
+int pin(snac *user, const char *id)
+/* pins a message */
+{
+ int ret = 0;
+
+ if (xs_startswith(id, user->actor)) {
+ /* create the subfolder, if it does not exist */
+ xs *fn = xs_fmt("%s/pinned/", user->basedir);
+ mkdirx(fn);
+
+ object_user_cache_add(user, id, "pinned");
+
+ ret = 1;
+ }
+
+ return ret;
+}
+
+
+void unpin(snac *user, const char *id)
+/* unpin a message */
+{
+ object_user_cache_del(user, id, "pinned");
+}
+
+
+xs_list *pinned_list(snac *user)
+/* return the lists of pinned posts */
+{
+ return object_user_cache_list(user, "pinned", XS_ALL);
+}
+
+
xs_str *_hidden_fn(snac *snac, const char *id)
{
xs *md5 = xs_md5_hex(id, strlen(id));
diff --git a/snac.h b/snac.h
@@ -126,6 +126,11 @@ void mute(snac *snac, const char *actor);
void unmute(snac *snac, const char *actor);
int is_muted(snac *snac, const char *actor);
+int pin(snac *user, const char *id);
+void unpin(snac *user, const char *id);
+int is_pinned(snac *user, const char *id);
+xs_list *pinned_list(snac *user);
+
void hide(snac *snac, const char *id);
int is_hidden(snac *snac, const char *id);