diff options
Diffstat (limited to 'data.c')
| -rw-r--r-- | data.c | 44 |
1 files changed, 38 insertions, 6 deletions
| @@ -1938,10 +1938,33 @@ void enqueue_close_question(snac *user, const char *id, int end_secs) | |||
| 1938 | void enqueue_request_replies(snac *user, const char *id) | 1938 | void enqueue_request_replies(snac *user, const char *id) |
| 1939 | /* enqueues a request for the replies of a message */ | 1939 | /* enqueues a request for the replies of a message */ |
| 1940 | { | 1940 | { |
| 1941 | /* test first if this precise request is already in the queue */ | ||
| 1942 | xs *queue = user_queue(user); | ||
| 1943 | xs_list *p = queue; | ||
| 1944 | xs_str *v; | ||
| 1945 | |||
| 1946 | while (xs_list_iter(&p, &v)) { | ||
| 1947 | xs *q_item = queue_get(v); | ||
| 1948 | |||
| 1949 | if (q_item != NULL) { | ||
| 1950 | const char *type = xs_dict_get(q_item, "type"); | ||
| 1951 | const char *msg = xs_dict_get(q_item, "message"); | ||
| 1952 | |||
| 1953 | if (type && msg && strcmp(type, "request_replies") == 0 && strcmp(msg, id) == 0) { | ||
| 1954 | /* don't requeue */ | ||
| 1955 | snac_debug(user, 0, xs_fmt("enqueue_request_replies already here %s", id)); | ||
| 1956 | return; | ||
| 1957 | } | ||
| 1958 | } | ||
| 1959 | } | ||
| 1960 | |||
| 1961 | /* not there; enqueue the request with a small delay */ | ||
| 1941 | xs *qmsg = _new_qmsg("request_replies", id, 0); | 1962 | xs *qmsg = _new_qmsg("request_replies", id, 0); |
| 1942 | char *ntid = xs_dict_get(qmsg, "ntid"); | 1963 | xs *ntid = tid(10); |
| 1943 | xs *fn = xs_fmt("%s/queue/%s.json", user->basedir, ntid); | 1964 | xs *fn = xs_fmt("%s/queue/%s.json", user->basedir, ntid); |
| 1944 | 1965 | ||
| 1966 | qmsg = xs_dict_set(qmsg, "ntid", ntid); | ||
| 1967 | |||
| 1945 | qmsg = _enqueue_put(fn, qmsg); | 1968 | qmsg = _enqueue_put(fn, qmsg); |
| 1946 | 1969 | ||
| 1947 | snac_debug(user, 0, xs_fmt("enqueue_request_replies %s", id)); | 1970 | snac_debug(user, 0, xs_fmt("enqueue_request_replies %s", id)); |
| @@ -2030,16 +2053,13 @@ xs_list *queue(void) | |||
| 2030 | } | 2053 | } |
| 2031 | 2054 | ||
| 2032 | 2055 | ||
| 2033 | xs_dict *dequeue(const char *fn) | 2056 | xs_dict *queue_get(const char *fn) |
| 2034 | /* dequeues a message */ | 2057 | /* gets a file from a queue */ |
| 2035 | { | 2058 | { |
| 2036 | FILE *f; | 2059 | FILE *f; |
| 2037 | xs_dict *obj = NULL; | 2060 | xs_dict *obj = NULL; |
| 2038 | 2061 | ||
| 2039 | if ((f = fopen(fn, "r")) != NULL) { | 2062 | if ((f = fopen(fn, "r")) != NULL) { |
| 2040 | /* delete right now */ | ||
| 2041 | unlink(fn); | ||
| 2042 | |||
| 2043 | xs *j = xs_readall(f); | 2063 | xs *j = xs_readall(f); |
| 2044 | obj = xs_json_loads(j); | 2064 | obj = xs_json_loads(j); |
| 2045 | 2065 | ||
| @@ -2050,6 +2070,18 @@ xs_dict *dequeue(const char *fn) | |||
| 2050 | } | 2070 | } |
| 2051 | 2071 | ||
| 2052 | 2072 | ||
| 2073 | xs_dict *dequeue(const char *fn) | ||
| 2074 | /* dequeues a message */ | ||
| 2075 | { | ||
| 2076 | xs_dict *obj = queue_get(fn); | ||
| 2077 | |||
| 2078 | if (obj != NULL) | ||
| 2079 | unlink(fn); | ||
| 2080 | |||
| 2081 | return obj; | ||
| 2082 | } | ||
| 2083 | |||
| 2084 | |||
| 2053 | /** the purge **/ | 2085 | /** the purge **/ |
| 2054 | 2086 | ||
| 2055 | static int _purge_file(const char *fn, time_t mt) | 2087 | static int _purge_file(const char *fn, time_t mt) |