mirror of
https://forge.fsky.io/lda/Parsee.git
synced 2026-03-13 21:25:11 +00:00
[MOD] Basic work to get XMPP avatars through PEP
Attaboy!
This commit is contained in:
parent
f31a9c37b6
commit
e54332e376
13 changed files with 428 additions and 25 deletions
|
|
@ -4,6 +4,7 @@
|
|||
#include <Cytoplasm/Str.h>
|
||||
#include <Cytoplasm/Log.h>
|
||||
#include <Cytoplasm/Uri.h>
|
||||
#include <Cytoplasm/Sha.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
|
@ -127,3 +128,95 @@ ASReupload(const ParseeConfig *c, char *from, char **mime)
|
|||
return ret;
|
||||
}
|
||||
|
||||
bool
|
||||
ASGetMIMESHA(const ParseeConfig *c, char *mxc, char **mime, char **sha)
|
||||
{
|
||||
HttpClientContext *cctx;
|
||||
Stream *stream;
|
||||
Stream *fake;
|
||||
Uri *uri;
|
||||
char *path, *buf = NULL;
|
||||
unsigned char *sha1;
|
||||
size_t len;
|
||||
bool ret;
|
||||
if (!c || !mxc || !mime || !sha)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
*mime = NULL;
|
||||
*sha = NULL;
|
||||
|
||||
if (!(uri = UriParse(mxc)) || !StrEquals(uri->proto, "mxc"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
path = StrConcat(3, "/_matrix/media/v3/download/", uri->host, uri->path);
|
||||
cctx = ParseeCreateRequest(c, HTTP_GET, path);
|
||||
ASAuthenticateRequest(c, cctx);
|
||||
HttpRequestSendHeaders(cctx);
|
||||
HttpRequestSend(cctx);
|
||||
|
||||
*mime = StrDuplicate(
|
||||
HashMapGet(HttpResponseHeaders(cctx), "content-type")
|
||||
);
|
||||
stream = HttpClientStream(cctx);
|
||||
fake = StreamFile(open_memstream(&buf, &len));
|
||||
StreamCopy(stream, fake);
|
||||
StreamClose(fake);
|
||||
|
||||
sha1 = Sha1Raw(buf, len);
|
||||
free(buf);
|
||||
*sha = ShaToHex(sha1, HASH_SHA1);
|
||||
Free(sha1);
|
||||
|
||||
HttpClientContextFree(cctx);
|
||||
UriFree(uri);
|
||||
Free(path);
|
||||
return true;
|
||||
}
|
||||
bool
|
||||
ASGrab(const ParseeConfig *c, char *mxc, char **mime, char **out, size_t *len)
|
||||
{
|
||||
HttpClientContext *cctx;
|
||||
Stream *stream;
|
||||
Stream *fake;
|
||||
Uri *uri;
|
||||
char *path, *buf = NULL;
|
||||
bool ret;
|
||||
if (!c || !mxc || !mime || !out || !len)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
*mime = NULL;
|
||||
*out = NULL;
|
||||
*len = 0;
|
||||
|
||||
if (!(uri = UriParse(mxc)) || !StrEquals(uri->proto, "mxc"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
path = StrConcat(3, "/_matrix/media/v3/download/", uri->host, uri->path);
|
||||
cctx = ParseeCreateRequest(c, HTTP_GET, path);
|
||||
ASAuthenticateRequest(c, cctx);
|
||||
HttpRequestSendHeaders(cctx);
|
||||
HttpRequestSend(cctx);
|
||||
|
||||
*mime = StrDuplicate(
|
||||
HashMapGet(HttpResponseHeaders(cctx), "content-type")
|
||||
);
|
||||
stream = HttpClientStream(cctx);
|
||||
fake = StreamFile(open_memstream(&buf, len));
|
||||
StreamCopy(stream, fake);
|
||||
StreamClose(fake);
|
||||
|
||||
*out = Malloc(*len);
|
||||
memcpy(*out, buf, *len);
|
||||
free(buf);
|
||||
|
||||
HttpClientContextFree(cctx);
|
||||
UriFree(uri);
|
||||
Free(path);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -136,3 +136,72 @@ ASGetName(const ParseeConfig *c, char *room, char *user)
|
|||
}
|
||||
return ret;
|
||||
}
|
||||
char *
|
||||
ASGetAvatar(const ParseeConfig *c, char *room, char *user)
|
||||
{
|
||||
HttpClientContext *ctx;
|
||||
HashMap *reply;
|
||||
char *path = NULL, *ret = NULL;
|
||||
char *u2 = user;
|
||||
if (!c || !user)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (room)
|
||||
{
|
||||
user = HttpUrlEncode(user);
|
||||
room = HttpUrlEncode(room);
|
||||
path = StrConcat(4,
|
||||
"/_matrix/client/v3/rooms/", room,
|
||||
"/state/m.room.member/", user
|
||||
);
|
||||
ctx = ParseeCreateRequest(c, HTTP_GET, path);
|
||||
Free(user);
|
||||
Free(room);
|
||||
ASAuthenticateRequest(c, ctx);
|
||||
HttpRequestSendHeaders(ctx);
|
||||
HttpRequestSend(ctx);
|
||||
|
||||
reply = JsonDecode(HttpClientStream(ctx));
|
||||
|
||||
ret = StrDuplicate(
|
||||
JsonValueAsString(HashMapGet(reply, "avatar_url"))
|
||||
);
|
||||
HttpClientContextFree(ctx);
|
||||
JsonFree(reply);
|
||||
Free(path);
|
||||
|
||||
user = u2;
|
||||
|
||||
Log(LOG_DEBUG, "ASGetAvatar: trying to grab avatar from room, got %s", ret);
|
||||
}
|
||||
|
||||
if (!ret)
|
||||
{
|
||||
user = HttpUrlEncode(user);
|
||||
path = StrConcat(3,
|
||||
"/_matrix/client/v3/profile/", user, "/avatar_url"
|
||||
);
|
||||
ctx = ParseeCreateRequest(c, HTTP_GET, path);
|
||||
Free(user);
|
||||
user = u2;
|
||||
ASAuthenticateRequest(c, ctx);
|
||||
HttpRequestSendHeaders(ctx);
|
||||
HttpRequestSend(ctx);
|
||||
|
||||
reply = JsonDecode(HttpClientStream(ctx));
|
||||
|
||||
ret = StrDuplicate(
|
||||
JsonValueAsString(HashMapGet(reply, "avatar_url"))
|
||||
);
|
||||
StreamFlush(StreamStderr());
|
||||
HttpClientContextFree(ctx);
|
||||
JsonFree(reply);
|
||||
Free(path);
|
||||
|
||||
Log(LOG_DEBUG, "ASGetAvatar: trying to grab avatar from profile, got %s", ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue