mirror of
https://forge.fsky.io/lda/Parsee.git
synced 2026-03-13 21:05:10 +00:00
[ADD/WIP] Start unifying DMs and MUCs
I really need to dispatch XMPP stanza management.
This commit is contained in:
parent
6b0f08c49e
commit
5f2c3a9cb8
10 changed files with 570 additions and 87 deletions
|
|
@ -23,7 +23,7 @@ ParseeMemberHandler(ParseeData *data, HashMap *event)
|
|||
|
||||
if (StrEquals(membership, "invite") && ParseeIsPuppet(conf, state_key))
|
||||
{
|
||||
DbRef *ref;
|
||||
DbRef *ref = NULL;
|
||||
HashMap *json;
|
||||
char *jid;
|
||||
bool direct = GrabBoolean(event, 2, "content", "is_direct");
|
||||
|
|
@ -125,18 +125,24 @@ static void
|
|||
ParseeMessageHandler(ParseeData *data, HashMap *event)
|
||||
{
|
||||
XMPPComponent *jabber = data->jabber;
|
||||
DbRef *ref;
|
||||
DbRef *ref = NULL;
|
||||
HashMap *json;
|
||||
|
||||
char *msgtype = GrabString(event, 2, "content", "msgtype");
|
||||
char *body = GrabString(event, 2, "content", "body");
|
||||
char *id = GrabString(event, 1, "room_id");
|
||||
char *ev_id = GrabString(event, 1, "event_id");
|
||||
char *sender = GrabString(event, 1, "sender");
|
||||
char *m_sender = GrabString(event, 1, "sender");
|
||||
char *chat_id, *muc_id, *jid;
|
||||
char *reply_id = MatrixGetReply(event);
|
||||
char *xepd = ParseeXMPPify(event);
|
||||
char *cmd_lp = data->config->sender_localpart;
|
||||
char *type, *user, *xmppified_user = NULL, *to;
|
||||
char *unauth = NULL;
|
||||
char *origin_id = NULL, *stanza = NULL;
|
||||
char *sender = NULL;
|
||||
char *unedited_id = MatrixGetEdit(event);
|
||||
char *url = GrabString(event, 2, "content", "url");
|
||||
|
||||
bool direct = false;
|
||||
|
||||
|
|
@ -146,13 +152,14 @@ ParseeMessageHandler(ParseeData *data, HashMap *event)
|
|||
json = DbJson(ref);
|
||||
direct = JsonValueAsBoolean(HashMapGet(json, "is_direct"));
|
||||
|
||||
if (ParseeIsPuppet(data->config, sender) ||
|
||||
ParseeManageBan(data, sender, id))
|
||||
if (ParseeIsPuppet(data->config, m_sender) ||
|
||||
ParseeManageBan(data, m_sender, id))
|
||||
{
|
||||
DbUnlock(data->db, ref);
|
||||
Free(chat_id);
|
||||
Free(reply_id);
|
||||
Free(xepd);
|
||||
Free(unedited_id);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -164,74 +171,99 @@ ParseeMessageHandler(ParseeData *data, HashMap *event)
|
|||
Free(chat_id);
|
||||
Free(reply_id);
|
||||
Free(xepd);
|
||||
Free(unedited_id);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/* TODO: Reunite DM/MUC code to bring feature parity. */
|
||||
type = direct ? "chat" : "groupchat";
|
||||
user = GrabString(json, 1, "xmpp_user");
|
||||
unauth = ParseeToUnauth(data, url);
|
||||
if (direct)
|
||||
{
|
||||
char *user = GrabString(json, 1, "xmpp_user");
|
||||
char *local = ParseeEncodeMXID(sender);
|
||||
xmppified_user = ParseeEncodeMXID(m_sender);
|
||||
to = StrDuplicate(user);
|
||||
|
||||
Log(LOG_INFO," Sending to %s as %s", user, local);
|
||||
|
||||
XMPPSendPlain(jabber, local, user, body, "chat", NULL, NULL, ev_id, NULL, NULL);
|
||||
|
||||
DbUnlock(data->db, ref);
|
||||
Free(chat_id);
|
||||
Free(local);
|
||||
Free(reply_id);
|
||||
Free(xepd);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
char *name, *rev, *stanza;
|
||||
/* Try to find the chat ID */
|
||||
muc_id = ParseeGetMUCID(data, chat_id);
|
||||
if (!chat_id)
|
||||
{
|
||||
goto end;
|
||||
}
|
||||
xmppified_user = ParseeEncodeMXID(m_sender);
|
||||
|
||||
DbUnlock(data->db, ref);
|
||||
/* Try to find the chat ID */
|
||||
muc_id = ParseeGetMUCID(data, chat_id);
|
||||
if (!chat_id)
|
||||
{
|
||||
Free(reply_id);
|
||||
Free(xepd);
|
||||
return;
|
||||
}
|
||||
jid = ParseeEncodeMXID(sender);
|
||||
{
|
||||
/* TODO: Check the name's validity */
|
||||
char *name = ASGetName(data->config, id, sender);
|
||||
char *rev = StrConcat(4, muc_id, "/", name, "[p]");
|
||||
char *stanza = NULL, *sender = NULL;
|
||||
char *url = GrabString(event, 2, "content", "url");
|
||||
char *unauth = ParseeToUnauth(data, url);
|
||||
name = ASGetName(data->config, id, m_sender);
|
||||
rev = StrConcat(4, muc_id, "/", name, "[p]");
|
||||
|
||||
XMPPJoinMUC(jabber, xmppified_user, rev);
|
||||
|
||||
to = muc_id;
|
||||
|
||||
char *unedited_id = MatrixGetEdit(event);
|
||||
char *origin_id = NULL;
|
||||
if (reply_id)
|
||||
{
|
||||
ParseeGetStanzaInfo(data, chat_id, reply_id, &stanza, &sender);
|
||||
}
|
||||
else if (unedited_id)
|
||||
{
|
||||
ParseeGetOrigin(data, chat_id, unedited_id, &origin_id);
|
||||
}
|
||||
XMPPJoinMUC(jabber, jid, rev);
|
||||
XMPPSendPlain(
|
||||
jabber, jid, muc_id,
|
||||
xepd ? xepd : body, "groupchat",
|
||||
stanza, sender, ev_id, unauth, origin_id
|
||||
);
|
||||
Free(rev);
|
||||
Free(name);
|
||||
Free(stanza);
|
||||
Free(sender);
|
||||
Free(unauth);
|
||||
Free(origin_id);
|
||||
Free(unedited_id);
|
||||
Free(rev);
|
||||
}
|
||||
if (reply_id)
|
||||
{
|
||||
/* TODO: Monocles chat DM users HATE this trick!
|
||||
* Replies don't work there. Go figure why. */
|
||||
if (!ParseeGetStanzaInfo(data, chat_id, reply_id, &stanza, &sender))
|
||||
{
|
||||
ParseeGetDMStanzaInfo(data, id, reply_id, &stanza, &sender);
|
||||
}
|
||||
}
|
||||
else if (unedited_id)
|
||||
{
|
||||
if (!ParseeGetOrigin(data, chat_id, unedited_id, &origin_id))
|
||||
{
|
||||
ParseeGetDMOrigin(data, id, unedited_id, &origin_id);
|
||||
}
|
||||
}
|
||||
|
||||
if (direct && sender)
|
||||
{
|
||||
char *sndr_tmp = sender;
|
||||
sender = ParseeTrimJID(sender);
|
||||
Free(sndr_tmp);
|
||||
}
|
||||
{
|
||||
char *xmpp_ident = StrRandom(32);
|
||||
XMPPSendPlainID(
|
||||
jabber, xmppified_user, to,
|
||||
xepd ? xepd : body, type,
|
||||
stanza, sender, ev_id, unauth, origin_id,
|
||||
xmpp_ident
|
||||
);
|
||||
/* Culprit */
|
||||
if (direct)
|
||||
{
|
||||
ParseePushDMStanza(
|
||||
data, id, NULL,
|
||||
xmpp_ident, ev_id,
|
||||
xmppified_user
|
||||
);
|
||||
}
|
||||
Free(xmpp_ident);
|
||||
}
|
||||
end:
|
||||
Free(origin_id);
|
||||
Free(xmppified_user);
|
||||
Free(chat_id);
|
||||
Free(muc_id);
|
||||
Free(jid);
|
||||
Free(to);
|
||||
Free(reply_id);
|
||||
Free(xepd);
|
||||
Free(stanza);
|
||||
Free(sender);
|
||||
Free(unauth);
|
||||
Free(unedited_id);
|
||||
|
||||
DbUnlock(data->db, ref);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue