mirror of
https://forge.fsky.io/lda/Parsee.git
synced 2026-03-13 13:45:10 +00:00
This is still unstable(and I still need to design/document the exposed API)! Do(n't) go and use it!
98 lines
2.3 KiB
C
98 lines
2.3 KiB
C
#ifdef JANET
|
|
|
|
#include "Extensions/Internal.h"
|
|
|
|
Janet
|
|
JanetStanzaInfo(int32_t argc, Janet *argv)
|
|
{
|
|
ParseeData *data;
|
|
XMLElement *stanza;
|
|
|
|
JanetTable *ret;
|
|
|
|
char *trimmed = NULL;
|
|
char *chat_id = NULL;
|
|
char *from = NULL;
|
|
char *room = NULL;
|
|
char *mxid = NULL;
|
|
|
|
janet_fixarity(argc, 2);
|
|
if (!(data = GetParseeData(argv[0])))
|
|
{
|
|
janet_signalv(JANET_SIGNAL_ERROR, janet_cstringv("CTX is not a ptr"));
|
|
return janet_wrap_nil();
|
|
}
|
|
if (!janet_checktype(argv[1], JANET_TABLE))
|
|
{
|
|
janet_signalv(JANET_SIGNAL_ERROR, janet_cstringv("STANZA is not a table"));
|
|
return janet_wrap_nil();
|
|
}
|
|
|
|
if (!(stanza = ExtensionsToXML(janet_unwrap_table(argv[1]))))
|
|
{
|
|
janet_signalv(JANET_SIGNAL_ERROR, janet_cstringv("STANZA is not XML."));
|
|
return janet_wrap_nil();
|
|
}
|
|
|
|
from = HashMapGet(stanza->attrs, "from");
|
|
trimmed = ParseeTrimJID(from);
|
|
chat_id = ParseeGetFromMUCID(data, trimmed);
|
|
|
|
ret = janet_table(0);
|
|
janet_table_put(ret,
|
|
janet_ckeywordv("in-muc"),
|
|
janet_wrap_boolean(ParseeIsMUC(data, trimmed))
|
|
);
|
|
janet_table_put(ret,
|
|
janet_ckeywordv("in-dm"),
|
|
janet_wrap_boolean(StrEquals(HashMapGet(stanza->attrs, "type"), "chat"))
|
|
);
|
|
if (chat_id && trimmed)
|
|
{
|
|
room = ParseeGetRoomID(data, chat_id);
|
|
janet_table_put(ret,
|
|
janet_ckeywordv("muc-jid"), janet_cstringv(trimmed)
|
|
);
|
|
janet_table_put(ret,
|
|
janet_ckeywordv("id"), janet_cstringv(chat_id)
|
|
);
|
|
}
|
|
else
|
|
{
|
|
char *to = ParseeDecodeMXID(HashMapGet(stanza->attrs, "to"));
|
|
char *dmid = ParseeGetDMID(to, from);
|
|
|
|
room = ParseeFindDMRoom(data, to, from);
|
|
if (dmid)
|
|
{
|
|
janet_table_put(ret,
|
|
janet_ckeywordv("id"), janet_cstringv(dmid)
|
|
);
|
|
}
|
|
|
|
Free(dmid);
|
|
Free(to);
|
|
}
|
|
|
|
if (room)
|
|
{
|
|
janet_table_put(ret,
|
|
janet_ckeywordv("room-id"), janet_cstringv(room)
|
|
);
|
|
}
|
|
|
|
if ((mxid = ParseeGetBridgedUser(data, stanza)))
|
|
{
|
|
janet_table_put(ret,
|
|
janet_ckeywordv("bridged-sender"), janet_cstringv(mxid)
|
|
);
|
|
}
|
|
|
|
Free(trimmed);
|
|
Free(chat_id);
|
|
Free(room);
|
|
Free(mxid);
|
|
XMLFreeElement(stanza);
|
|
return janet_wrap_table(ret);
|
|
}
|
|
#endif
|