#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