[ADD/WIP] Push all the Janet changes

This is still unstable(and I still need to design/document the exposed
API)! Do(n't) go and use it!
This commit is contained in:
LDA 2024-11-16 14:11:32 +01:00
commit ca87972b3a
50 changed files with 3550 additions and 92 deletions

View file

@ -0,0 +1,98 @@
#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