summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar default2023-11-08 08:14:34 +0100
committerGravatar default2023-11-08 08:14:34 +0100
commit895cf82a7d2b8704aeeabf002bc26a49336586ff (patch)
tree7266fc1e4609a7b51cdbfeb0ea4a8312afa7c0ec
parentUpdated RELEASE_NOTES. (diff)
downloadsnac2-895cf82a7d2b8704aeeabf002bc26a49336586ff.tar.gz
snac2-895cf82a7d2b8704aeeabf002bc26a49336586ff.tar.xz
snac2-895cf82a7d2b8704aeeabf002bc26a49336586ff.zip
New code for indexing tags.
-rw-r--r--data.c61
-rw-r--r--snac.h2
2 files changed, 63 insertions, 0 deletions
diff --git a/data.c b/data.c
index f06e99c..5026154 100644
--- a/data.c
+++ b/data.c
@@ -1081,6 +1081,8 @@ int timeline_add(snac *snac, const char *id, const xs_dict *o_msg)
1081 int ret = object_add(id, o_msg); 1081 int ret = object_add(id, o_msg);
1082 timeline_update_indexes(snac, id); 1082 timeline_update_indexes(snac, id);
1083 1083
1084 tag_index(id, o_msg);
1085
1084 snac_debug(snac, 1, xs_fmt("timeline_add %s", id)); 1086 snac_debug(snac, 1, xs_fmt("timeline_add %s", id));
1085 1087
1086 return ret; 1088 return ret;
@@ -1565,6 +1567,65 @@ int limited(snac *user, const char *id, int cmd)
1565} 1567}
1566 1568
1567 1569
1570/** tag indexing **/
1571
1572void tag_index(const char *id, const xs_dict *obj)
1573/* update the tag indexes for this object */
1574{
1575 xs_list *tags = xs_dict_get(obj, "tag");
1576
1577 if (is_msg_public(obj) && xs_type(tags) == XSTYPE_LIST && xs_list_len(tags) > 0) {
1578 xs *md5_id = xs_md5_hex(id, strlen(id));
1579 xs *g_tag_dir = xs_fmt("%s/tag", srv_basedir);
1580
1581 mkdirx(g_tag_dir);
1582
1583 xs_dict *v;
1584 while (xs_list_iter(&tags, &v)) {
1585 char *type = xs_dict_get(v, "type");
1586 char *name = xs_dict_get(v, "name");
1587
1588 if (!xs_is_null(type) && !xs_is_null(name) && strcmp(type, "Hashtag") == 0) {
1589 if (*name == '#')
1590 name++;
1591
1592 name = xs_tolower_i(name);
1593
1594 xs *md5_tag = xs_md5_hex(name, strlen(name));
1595 xs *tag_dir = xs_fmt("%s/%c%c", g_tag_dir, md5_tag[0], md5_tag[1]);
1596 mkdirx(tag_dir);
1597
1598 xs *g_tag_idx = xs_fmt("%s/%s.idx", tag_dir, md5_tag);
1599 index_add(g_tag_idx, md5_id);
1600
1601 FILE *f;
1602 xs *g_tag_name = xs_replace(g_tag_idx, ".idx", ".tag");
1603 if ((f = fopen(g_tag_name, "w")) != NULL) {
1604 fprintf(f, "%s\n", name);
1605 fclose(f);
1606 }
1607
1608 srv_debug(0, xs_fmt("tagged %s #%s (%s #%s)", id, name, md5_id, md5_tag));
1609 }
1610 }
1611 }
1612}
1613
1614
1615xs_list *tag_search(char *tag, int skip, int show)
1616/* returns the list of posts tagged with tag */
1617{
1618 if (*tag == '#')
1619 tag++;
1620
1621 xs *lw_tag = xs_tolower_i(xs_dup(tag));
1622 xs *md5 = xs_md5_hex(lw_tag, strlen(lw_tag));
1623 xs *idx = xs_fmt("%s/tag/%c%c/%s.idx", srv_basedir, md5[0], md5[1], md5);
1624
1625 return index_list_desc(idx, skip, show);
1626}
1627
1628
1568/** static data **/ 1629/** static data **/
1569 1630
1570static int _load_raw_file(const char *fn, xs_val **data, int *size, 1631static int _load_raw_file(const char *fn, xs_val **data, int *size,
diff --git a/snac.h b/snac.h
index ed0f94d..582f5f1 100644
--- a/snac.h
+++ b/snac.h
@@ -143,6 +143,8 @@ int limited(snac *user, const char *id, int cmd);
143void hide(snac *snac, const char *id); 143void hide(snac *snac, const char *id);
144int is_hidden(snac *snac, const char *id); 144int is_hidden(snac *snac, const char *id);
145 145
146void tag_index(const char *id, const xs_dict *obj);
147
146int actor_add(const char *actor, xs_dict *msg); 148int actor_add(const char *actor, xs_dict *msg);
147int actor_get(const char *actor, xs_dict **data); 149int actor_get(const char *actor, xs_dict **data);
148 150