Parsee/src/XMPPThread/PEPs/Avatar.c
2024-10-25 18:03:05 +02:00

83 lines
2.1 KiB
C

#include "XMPPThread/internal.h"
#include <Parsee.h>
#include <XMPP.h>
#include <XML.h>
#include <Cytoplasm/Memory.h>
#include <Cytoplasm/Json.h>
#include <Cytoplasm/Str.h>
#include <Cytoplasm/Log.h>
#include <Cytoplasm/Db.h>
static XMLElement *
CreateAvatarRequest(char *from, char *to, char *avatar_id)
{
XMLElement *iq_req, *pubsub, *items, *item;
char *id;
iq_req = XMLCreateTag("iq");
XMLAddAttr(iq_req, "from", from);
XMLAddAttr(iq_req, "to", to);
XMLAddAttr(iq_req, "id", (id = StrRandom(16)));
XMLAddAttr(iq_req, "type", "get");
pubsub = XMLCreateTag("pubsub");
XMLAddAttr(pubsub, "xmlns", "http://jabber.org/protocol/pubsub");
XMLAddChild(iq_req, pubsub);
items = XMLCreateTag("items");
XMLAddAttr(items, "node", "urn:xmpp:avatar:data");
XMLAddChild(pubsub, items);
item = XMLCreateTag("item");
XMLAddAttr(item, "id", avatar_id);
XMLAddChild(items, item);
Free(id);
return iq_req;
}
void
PEPAvatarEvent(PEPManager *m, XMLElement *stanza, XMLElement *item)
{
XMPPThreadInfo *info = PEPManagerCookie(m);
XMPPComponent *jabber = info->jabber;
ParseeData *args = info->args;
DbRef *avatars;
HashMap *json;
char *publisher = HashMapGet(item->attrs, "publisher");
char *id = HashMapGet(item->attrs, "id");
char *mxid;
avatars = DbLock(args->db, 1, "avatars");
if (!avatars)
{
avatars = DbCreate(args->db, 1, "avatars");
}
json = DbJson(avatars);
mxid = GrabString(json, 1, publisher);
if (mxid && StrEquals(mxid, id))
{
/* We have nothing to do. */
goto end;
}
/* We need to download the media to push it. Let's submit a pubsub request. */
{
char *from = HashMapGet(stanza->attrs, "to");
char *to = HashMapGet(stanza->attrs, "from");
char *url = HashMapGet(item->attrs, "url");
XMLElement *request = CreateAvatarRequest(from, to, id);
XMPPSendStanza(jabber, request, args->config->max_stanza_size);
XMLFreeElement(request);
(void) url; /* TODO */
}
end:
DbUnlock(args->db, avatars);
}