commit 895cf82

default  ·  2023-11-08 07:14:34 +0000 UTC
parent d8db262
New code for indexing tags.
2 files changed,  +63, -0
M data.c
M snac.h
M data.c
+61, -0
 1@@ -1081,6 +1081,8 @@ int timeline_add(snac *snac, const char *id, const xs_dict *o_msg)
 2     int ret = object_add(id, o_msg);
 3     timeline_update_indexes(snac, id);
 4 
 5+    tag_index(id, o_msg);
 6+
 7     snac_debug(snac, 1, xs_fmt("timeline_add %s", id));
 8 
 9     return ret;
10@@ -1565,6 +1567,65 @@ int limited(snac *user, const char *id, int cmd)
11 }
12 
13 
14+/** tag indexing **/
15+
16+void tag_index(const char *id, const xs_dict *obj)
17+/* update the tag indexes for this object */
18+{
19+    xs_list *tags = xs_dict_get(obj, "tag");
20+
21+    if (is_msg_public(obj) && xs_type(tags) == XSTYPE_LIST && xs_list_len(tags) > 0) {
22+        xs *md5_id    = xs_md5_hex(id, strlen(id));
23+        xs *g_tag_dir = xs_fmt("%s/tag", srv_basedir);
24+
25+        mkdirx(g_tag_dir);
26+
27+        xs_dict *v;
28+        while (xs_list_iter(&tags, &v)) {
29+            char *type = xs_dict_get(v, "type");
30+            char *name = xs_dict_get(v, "name");
31+
32+            if (!xs_is_null(type) && !xs_is_null(name) && strcmp(type, "Hashtag") == 0) {
33+                if (*name == '#')
34+                    name++;
35+
36+                name = xs_tolower_i(name);
37+
38+                xs *md5_tag   = xs_md5_hex(name, strlen(name));
39+                xs *tag_dir   = xs_fmt("%s/%c%c", g_tag_dir, md5_tag[0], md5_tag[1]);
40+                mkdirx(tag_dir);
41+
42+                xs *g_tag_idx = xs_fmt("%s/%s.idx", tag_dir, md5_tag);
43+                index_add(g_tag_idx, md5_id);
44+
45+                FILE *f;
46+                xs *g_tag_name = xs_replace(g_tag_idx, ".idx", ".tag");
47+                if ((f = fopen(g_tag_name, "w")) != NULL) {
48+                    fprintf(f, "%s\n", name);
49+                    fclose(f);
50+                }
51+
52+                srv_debug(0, xs_fmt("tagged %s #%s (%s #%s)", id, name, md5_id, md5_tag));
53+            }
54+        }
55+    }
56+}
57+
58+
59+xs_list *tag_search(char *tag, int skip, int show)
60+/* returns the list of posts tagged with tag */
61+{
62+    if (*tag == '#')
63+        tag++;
64+
65+    xs *lw_tag = xs_tolower_i(xs_dup(tag));
66+    xs *md5    = xs_md5_hex(lw_tag, strlen(lw_tag));
67+    xs *idx    = xs_fmt("%s/tag/%c%c/%s.idx", srv_basedir, md5[0], md5[1], md5);
68+
69+    return index_list_desc(idx, skip, show);
70+}
71+
72+
73 /** static data **/
74 
75 static int _load_raw_file(const char *fn, xs_val **data, int *size,
M snac.h
+2, -0
1@@ -143,6 +143,8 @@ int limited(snac *user, const char *id, int cmd);
2 void hide(snac *snac, const char *id);
3 int is_hidden(snac *snac, const char *id);
4 
5+void tag_index(const char *id, const xs_dict *obj);
6+
7 int actor_add(const char *actor, xs_dict *msg);
8 int actor_get(const char *actor, xs_dict **data);
9