From 389870c5d361597023b324e0c71a49541e7f9509 Mon Sep 17 00:00:00 2001 From: lda Date: Sat, 25 Jan 2025 12:20:47 +0000 Subject: [PATCH] [FIX] Ignore unavailable statuses They aren't that useful, especially in MUCs. --- etc/man/man7/.parsee-bridge-guidebook.7.swp | Bin 0 -> 12288 bytes etc/man/man7/.parsee-cmd-syntax.7.swp | Bin 0 -> 12288 bytes etc/man/man7/parsee-bridge-guidebook.7 | 70 ++++++++++++++++++++ src/MatrixEventHandler.c | 18 +++-- src/Parsee/Utils/Formatting.c | 4 +- src/Unistr.c | 10 +++ src/XMPPThread/Stanzas/IQ.c | 5 +- src/XMPPThread/Stanzas/Presence.c | 4 +- src/include/Unistring.h | 6 ++ 9 files changed, 108 insertions(+), 9 deletions(-) create mode 100644 etc/man/man7/.parsee-bridge-guidebook.7.swp create mode 100644 etc/man/man7/.parsee-cmd-syntax.7.swp create mode 100644 etc/man/man7/parsee-bridge-guidebook.7 diff --git a/etc/man/man7/.parsee-bridge-guidebook.7.swp b/etc/man/man7/.parsee-bridge-guidebook.7.swp new file mode 100644 index 0000000000000000000000000000000000000000..50976eabdb0b742fe8fbb5be8a1dc7c97357d1b7 GIT binary patch literal 12288 zcmeHN&5ImG6fYIOjf$T1ATKMJ1a^88KZwS!Y<9?+_o|nz z(ZNT0YjjU^P~dgF5O?17+T>Mnv-oCsgUAxeS1Acif2}jBbTUz$Nv#t#GUiNl_@7t}V*&$#feSKFyK(34J)3vje#n>ltqXhU#v3*- zI4uka3NJ|NZ~@bwa!aJOMloYy#H; zdw}1r72;RmLm&li0nY6a;wRue;0@pv;6>mC;A!AE@Br}hH9~v^dfc_{f7^TXyXKJbi1^Ca${YHVX7@9Ca!Z; zIKub3NK{2-J<4>98#n@2ERv~cW#u60F%`y<%rY}o35{lynOJ6&$!X;6p6so3`x{*$ zw4;eCRE424(#4j^wv?sZZ0TY`E|rePI#c8f%}iZUYI0>oW@G}hx;XE$s&eAYzp(a`S7XCk5jtrr;PQq^9Kp0b$k0|9Z3@nn%B@)l|f6Jp!jsb*&t z0)!{9J||rzk?48qWrmQBWYDcYsNYph!@Gyc9De%lWcUCJ@Jq(SbyFatw~quvp(5~(e$OM=sAa@=Kj7?UALWa)+iR5^x+!j#JiBS~Y1OLY8fUP7H^Gd7%5Jsg6@$*cQXN zesYztgRLM?32gx!X#Hv^K+t3zmdRPnT=rO16>&8yol5q$l1=p_MHHwplcR%h`TFW^ zJ>f#~o-&8fZ(f>$`;2cJoEe|ZUh_MJAdein{f;}gOtJA;IE8xnXvsut&Z=M{uotO0}h z+=;jrEJDoCSA1c&{<2uK+h@tvqjnSr%MNer9r~<%363FPnDs8R+OP)qkW_9Vns$*L zpS*NICHFD(V9gE9PuR=4h|vxvjVogqg`MjBz7f$NQ)mF37fzPJ*BI`OYhNnR2c~g_ zkVxWRI_ZHbjMR#VIdm959V!dKS&k97OP-gWUDN!y3VeGSiL zmgKt7C{u|o&PD_>nFZeBd;Q_*_0`Q4PKFTWUmrxL4lT3S=sG+0Q6yE})Qg;_qdCFu z4fmJVu)#;e6Z6N5Kb~%YVfTY@=jDCbM$I7 M2BeIpau$i-0os$Jhx%iV+&`&e|jG4|iwX z)UC>o8$EC-f*XSWg1>_^;*7+F0~|PT;5+MesMzP5W0g2|HfKd! z&5whcT_m}>3E5CdXB z42Xf}+(15Cqt7sh7s`1w%KO@5_wrG0Vn7Ut0Wly3#DEwO17bi7hygJm2E@Q~Xg~!- zS6?A|=^T>B|NmEi|NrzV(RV)0QbQs-~@aCZi4He1ulS> z0fE2I6a5AL1b=|v!EfLf@HKb{z5-u@&%sUb9=HbH20tUu@4>g=A$S1pfx939Z-Fb| zP2lGAB9KcAhygJm2E>3E5CdXB42Xfp40wCIJcheoze?Wl1`pe9ZXOH|iH@ema*+D- zSSLB-_dE%7#>8TEQyx=JHRm71x^@_L$omRUy zY!hYL&a|JK+d5j{)gF)5Gg~2*1gnQC^s-~o4=y?*n0 zd&ut}4!GYO6gzX!=HuRe8x6;M*iyWI*ll)tm`{b>T8fm-IW#&7iVaXK#6Tx1)^NEf KR_3X~w)+SCjabber, jid, rev, hash, -1, true) && nonce < 32) { char *nonce_str = StrInt(nonce); char *input = StrConcat(3, sender, name, nonce_str); char *hex = ParseeHMACS(data->id, input); + Unistr *filterASCII = UnistrFilter(uninick, UnistrIsASCII); if (strlen(hex) >= 8) { @@ -45,6 +48,7 @@ JoinMUC(ParseeData *data, HashMap *event, char *jid, char *muc, char *name, char Free(nick); Free(rev); + Free(revscii); nick = StrConcat(4, name, "[", hex, "]"); rev = StrConcat(3, muc, "/", nick); @@ -364,13 +368,13 @@ ParseeMessageHandler(ParseeData *data, HashMap *event) StanzaBuilder *builder = NULL; DbRef *ref = NULL; HashMap *json = NULL; - - char *unedited_id = MatrixGetEdit(event); + + char *m_sender = GrabString(event, 1, "sender"); + char *unedited_id = NULL; char *body = GrabString(event, 2, "content", "body"); char *id = GrabString(event, 1, "room_id"); char *ev_id = GrabString(event, 1, "event_id"); - char *m_sender = GrabString(event, 1, "sender"); - char *chat_id, *muc_id; + char *chat_id = NULL, *muc_id = NULL; char *reply_id = MatrixGetReply(event); char *xepd = ParseeXMPPify(event); char *type, *user, *xmppified_user = NULL, *to = NULL; @@ -381,6 +385,7 @@ ParseeMessageHandler(ParseeData *data, HashMap *event) char *encoded_from = NULL; bool direct = false; + unedited_id = MatrixGetEdit(event); if (unedited_id) { @@ -455,6 +460,7 @@ ParseeMessageHandler(ParseeData *data, HashMap *event) Free(name); Free(avatar); } + if (reply_id) { /* TODO: Monocles chat DM users HATE this trick! @@ -511,8 +517,8 @@ end: Free(stanza); Free(sender); Free(unauth); - Free(unedited_id); Free(encoded_from); + Free(unedited_id); DbUnlock(data->db, ref); ref = NULL; diff --git a/src/Parsee/Utils/Formatting.c b/src/Parsee/Utils/Formatting.c index 2abf3b5..8f41a56 100644 --- a/src/Parsee/Utils/Formatting.c +++ b/src/Parsee/Utils/Formatting.c @@ -210,9 +210,11 @@ XMPPifyElement(HashMap *event, XMLElement *elem, XMPPFlags flags) static char * GetRawBody(HashMap *event) { - if (MatrixGetEdit(event)) + void *id; + if ((id = MatrixGetEdit(event))) { char *new = GrabString(event, 3, "content", "m.new_content", "body"); + Free(id); if (new) { return new; diff --git a/src/Unistr.c b/src/Unistr.c index 5eaae43..a1eb1e4 100644 --- a/src/Unistr.c +++ b/src/Unistr.c @@ -192,6 +192,16 @@ UnistrGetch(Unistr *unistr, size_t i) return i < unistr->length ? unistr->codepoints[i] : 0; } bool +UnistrIsASCII(uint32_t u) +{ + if (u == 0) + { + return NULL; + } + + return u < 0x7F; +} +bool UnistrIsBMP(uint32_t u) { if (u == 0) diff --git a/src/XMPPThread/Stanzas/IQ.c b/src/XMPPThread/Stanzas/IQ.c index 17092b0..af71cca 100644 --- a/src/XMPPThread/Stanzas/IQ.c +++ b/src/XMPPThread/Stanzas/IQ.c @@ -572,7 +572,7 @@ IQGet(ParseeData *args, XMLElement *stanza, XMPPThread *thr) else if (XMLookForTKV(stanza, "query", "xmlns", "jabber:iq:version")) { XMLElement *iq_reply, *query; - XMLElement *name, *version; + XMLElement *name, *version, *os; iq_reply = XMLCreateTag("iq"); XMLAddAttr(iq_reply, "to", from); @@ -585,12 +585,15 @@ IQGet(ParseeData *args, XMLElement *stanza, XMPPThread *thr) { name = XMLCreateTag("name"); version = XMLCreateTag("version"); + os = XMLCreateTag("os"); XMLAddChild(name, XMLCreateText(NAME)); XMLAddChild(version, XMLCreateText(VERSION "[" CODE "]")); + XMLAddChild(os, XMLCreateText(VERSION "POSIX-like")); } XMLAddChild(query, name); XMLAddChild(query, version); + XMLAddChild(query, os); XMLAddChild(iq_reply, query); XMPPSendStanza(jabber, iq_reply, args->config->max_stanza_size); diff --git a/src/XMPPThread/Stanzas/Presence.c b/src/XMPPThread/Stanzas/Presence.c index 65c2082..947fc4b 100644 --- a/src/XMPPThread/Stanzas/Presence.c +++ b/src/XMPPThread/Stanzas/Presence.c @@ -298,7 +298,7 @@ end_item: Free(room); FreeStatuses(statuses); } - if (status) + if (status && !StrEquals(type, "unavailable")) { XMLElement *status_data = ArrayGet(status->children, 0); char *decode_from = ParseeLookupJID(oid); @@ -309,6 +309,8 @@ end_item: status_str = status_data->data; } + + /* TODO: "The server will automatically set a user's presence to * unavailable if their last active time was over a threshold value * (e.g. 5 minutes)." diff --git a/src/include/Unistring.h b/src/include/Unistring.h index 6fbc296..d90d61c 100644 --- a/src/include/Unistring.h +++ b/src/include/Unistring.h @@ -64,6 +64,12 @@ extern void UnistrFree(Unistr *unistr); * Returns: whenever the character is within the BMP */ extern bool UnistrIsBMP(uint32_t u); +/** Returns true IFF the character is within the 7-bit ASCII range + * not 0x0000 + * ------------------------------------------------------------ + * Returns: whenever the character is within ASCII */ +extern bool UnistrIsASCII(uint32_t u); + typedef bool (*UnistrFilterFunc)(uint32_t u); /** "Filters" characters in a Unistring by codepoint, removing * those with callbacks which return false into a new unistring.