commit b77ef13

default  ·  2023-06-07 11:09:19 +0000 UTC
parent ecde1c2
Don't enqueue a request_replies message if it's already there.
3 files changed,  +40, -7
M data.c
M main.c
M snac.h
M data.c
+38, -6
 1@@ -1938,10 +1938,33 @@ void enqueue_close_question(snac *user, const char *id, int end_secs)
 2 void enqueue_request_replies(snac *user, const char *id)
 3 /* enqueues a request for the replies of a message */
 4 {
 5+    /* test first if this precise request is already in the queue */
 6+    xs *queue = user_queue(user);
 7+    xs_list *p = queue;
 8+    xs_str *v;
 9+
10+    while (xs_list_iter(&p, &v)) {
11+        xs *q_item = queue_get(v);
12+
13+        if (q_item != NULL) {
14+            const char *type = xs_dict_get(q_item, "type");
15+            const char *msg  = xs_dict_get(q_item, "message");
16+
17+            if (type && msg && strcmp(type, "request_replies") == 0 && strcmp(msg, id) == 0) {
18+                /* don't requeue */
19+                snac_debug(user, 0, xs_fmt("enqueue_request_replies already here %s", id));
20+                return;
21+            }
22+        }
23+    }
24+
25+    /* not there; enqueue the request with a small delay */
26     xs *qmsg   = _new_qmsg("request_replies", id, 0);
27-    char *ntid = xs_dict_get(qmsg, "ntid");
28+    xs *ntid = tid(10);
29     xs *fn     = xs_fmt("%s/queue/%s.json", user->basedir, ntid);
30 
31+    qmsg = xs_dict_set(qmsg, "ntid", ntid);
32+
33     qmsg = _enqueue_put(fn, qmsg);
34 
35     snac_debug(user, 0, xs_fmt("enqueue_request_replies %s", id));
36@@ -2030,16 +2053,13 @@ xs_list *queue(void)
37 }
38 
39 
40-xs_dict *dequeue(const char *fn)
41-/* dequeues a message */
42+xs_dict *queue_get(const char *fn)
43+/* gets a file from a queue */
44 {
45     FILE *f;
46     xs_dict *obj = NULL;
47 
48     if ((f = fopen(fn, "r")) != NULL) {
49-        /* delete right now */
50-        unlink(fn);
51-
52         xs *j = xs_readall(f);
53         obj = xs_json_loads(j);
54 
55@@ -2050,6 +2070,18 @@ xs_dict *dequeue(const char *fn)
56 }
57 
58 
59+xs_dict *dequeue(const char *fn)
60+/* dequeues a message */
61+{
62+    xs_dict *obj = queue_get(fn);
63+
64+    if (obj != NULL)
65+        unlink(fn);
66+
67+    return obj;
68+}
69+
70+
71 /** the purge **/
72 
73 static int _purge_file(const char *fn, time_t mt)
M main.c
+1, -1
 1@@ -279,8 +279,8 @@ int main(int argc, char *argv[])
 2         status = activitypub_request(&snac, url, &data);
 3 
 4         printf("status: %d\n", status);
 5-        if (valid_status(status)) {
 6 
 7+        if (data != NULL) {
 8             xs *j = xs_json_dumps_pp(data, 4);
 9             printf("%s\n", j);
10         }
M snac.h
+1, -0
1@@ -170,6 +170,7 @@ int was_question_voted(snac *user, const char *id);
2 
3 xs_list *user_queue(snac *snac);
4 xs_list *queue(void);
5+xs_dict *queue_get(const char *fn);
6 xs_dict *dequeue(const char *fn);
7 
8 void purge(snac *snac);