mirror of
https://forge.fsky.io/lda/Parsee.git
synced 2026-03-13 21:15:11 +00:00
[ADD/WIP] Two-way replies
Call me Seija Kijin the way I apply my Reverse Ideology.
This commit is contained in:
parent
8472ada953
commit
c5df636bdb
5 changed files with 44 additions and 1 deletions
11
src/Events.c
11
src/Events.c
|
|
@ -192,3 +192,14 @@ MatrixCreateReact(char *event, char *body)
|
|||
return map;
|
||||
|
||||
}
|
||||
void
|
||||
MatrixSetReply(HashMap *map, char *event)
|
||||
{
|
||||
if (!map || !event)
|
||||
{
|
||||
return;
|
||||
}
|
||||
JsonValueFree(JsonSet(map, JsonValueString(event),
|
||||
3, "m.relates_to", "m.in_reply_to", "event_id"
|
||||
));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -268,3 +268,14 @@ XMPPGetReplacedID(XMLElement *stanza)
|
|||
);
|
||||
return replace ? HashMapGet(replace->attrs, "id") : NULL;
|
||||
}
|
||||
char *
|
||||
XMPPGetReply(XMLElement *elem)
|
||||
{
|
||||
XMLElement *rep = XMLookForTKV(elem, "reply", "xmlns", "urn:xmpp:reply:0");
|
||||
if (!rep)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return HashMapGet(rep->attrs, "id");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -90,6 +90,7 @@ MessageStanza(ParseeData *args, XMLElement *stanza)
|
|||
char *id_str = HashMapGet(stanza->attrs, "id");
|
||||
char *event_id = NULL;
|
||||
char *replaced = XMPPGetReplacedID(stanza);
|
||||
char *reply_to = XMPPGetReply(stanza);
|
||||
|
||||
if (ParseeVerifyStanza(args, chat_id, s_id_str) && !replaced)
|
||||
{
|
||||
|
|
@ -145,9 +146,23 @@ MessageStanza(ParseeData *args, XMLElement *stanza)
|
|||
}
|
||||
else
|
||||
{
|
||||
/* TODO: Use HTML-formatted bodies, and respect the fallback
|
||||
* trims the stanza provides us if possible. Element does
|
||||
* not like raw bodies on replies. Go figure. */
|
||||
size_t off =
|
||||
reply_to ? ParseeFindDatastart(data->data) : 0;
|
||||
HashMap *ev = MatrixCreateMessage(data->data + off);
|
||||
if (reply_to)
|
||||
{
|
||||
char *reply_id = ParseeEventFromSID(
|
||||
args, chat_id, reply_to
|
||||
);
|
||||
MatrixSetReply(ev, reply_id);
|
||||
Free(reply_id);
|
||||
}
|
||||
event_id = ASSend(
|
||||
args->config, mroom_id, encoded,
|
||||
"m.room.message", MatrixCreateMessage(data->data)
|
||||
"m.room.message", ev
|
||||
);
|
||||
}
|
||||
ParseePushStanza(args, chat_id, s_id_str, id_str, event_id, from);
|
||||
|
|
|
|||
|
|
@ -26,6 +26,9 @@ extern HashMap * MatrixCreateNameState(char *name);
|
|||
/* Creates a join membership with a specific nickname */
|
||||
extern HashMap * MatrixCreateNickChange(char *nick);
|
||||
|
||||
/* Modifies a hashmap to create a reply event */
|
||||
extern void MatrixSetReply(HashMap *e, char *event);
|
||||
|
||||
/* Get the event ID of the reply if existent */
|
||||
extern char * MatrixGetReply(HashMap *event);
|
||||
extern char * MatrixGetEdit(HashMap *event);
|
||||
|
|
|
|||
|
|
@ -70,4 +70,7 @@ extern char * XMPPGetOriginID(XMLElement *);
|
|||
* is a replacement notice */
|
||||
extern char * XMPPGetReplacedID(XMLElement *);
|
||||
|
||||
/* Get the replied-to stanza ID, if existent. */
|
||||
extern char * XMPPGetReply(XMLElement *elem);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue