diff options
Diffstat (limited to 'data.c')
| -rw-r--r-- | data.c | 61 |
1 files changed, 61 insertions, 0 deletions
| @@ -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 | |||
| 1572 | void 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 | |||
| 1615 | xs_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 | ||
| 1570 | static int _load_raw_file(const char *fn, xs_val **data, int *size, | 1631 | static int _load_raw_file(const char *fn, xs_val **data, int *size, |