summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/client.c b/client.c
index 2227a4c..6bc53f4 100644
--- a/client.c
+++ b/client.c
@@ -416,10 +416,15 @@ static void clientSetMarker(
for (size_t i = 0; i < markers.len; ++i) {
marker = &markers.ptr[i];
if (strcasecmp(marker->target, target)) continue;
- if (strcmp(timestamp, marker->timestamp) > 0) {
- set(&marker->timestamp, timestamp);
+ if (strcmp(timestamp, marker->timestamp) < 0) {
+ clientFormat(
+ client, ":%s MARKREAD %s timestamp=%s\r\n",
+ clientOrigin, target, marker->timestamp
+ );
+ return;
}
- goto reply;
+ set(&marker->timestamp, timestamp);
+ goto notify;
}
if (markers.len == markers.cap) {
markers.cap = (markers.cap ? markers.cap * 2 : 8);
@@ -430,11 +435,13 @@ static void clientSetMarker(
*marker = (struct Marker) {0};
set(&marker->target, target);
set(&marker->timestamp, timestamp);
-reply:
- clientFormat(
- client, ":%s MARKREAD %s timestamp=%s\r\n",
- clientOrigin, target, marker->timestamp
+notify:;
+ char buf[512];
+ snprintf(
+ buf, sizeof(buf), ":%s MARKREAD %s timestamp=%s",
+ clientOrigin, marker->target, marker->timestamp
);
+ ringProduce(buf);
}
static regex_t *TimestampRegex(void) {
@@ -677,6 +684,10 @@ static const char *filterMultiPrefix(const char *line) {
}
}
+static const char *filterReadMarker(const char *line) {
+ return (wordcmp(line, 0, "MARKREAD") ? line : NULL);
+}
+
static const char *filterPalaverApp(const char *line) {
return (wordcmp(line, 0, "PALAVER") ? line : NULL);
}
@@ -707,6 +718,7 @@ static Filter *Filters[CapBits] = {
[CapMessageTagsBit] = filterMessageTags,
[CapMultiPrefixBit] = filterMultiPrefix,
[CapPalaverAppBit] = filterPalaverApp,
+ [CapReadMarkerBit] = filterReadMarker,
[CapSetnameBit] = filterSetname,
[CapUserhostInNamesBit] = filterUserhostInNames,
};