mirror of
https://forge.fsky.io/lda/Parsee.git
synced 2026-03-13 16:55:10 +00:00
[MOD] Add x-parsee tag with metadata, global nicks
Still need to grab it on the room-level from the room state if possible, otherwise just rollback to the MXID. I also need to consider profile pictures and bridging media, and check if the nick was present XMPP-side first, as that can and will cause issues, especially around semi-anonymous MUCs.
This commit is contained in:
parent
2b16ccbaf8
commit
b820a441ed
9 changed files with 102 additions and 6 deletions
3
Makefile
3
Makefile
|
|
@ -7,6 +7,7 @@
|
||||||
# =========================== Parsee Flags =============================
|
# =========================== Parsee Flags =============================
|
||||||
NAME=Parsee
|
NAME=Parsee
|
||||||
VERSION=0.0.0
|
VERSION=0.0.0
|
||||||
|
REPOSITORY=$(shell git remote get-url origin)
|
||||||
|
|
||||||
# =========================== Compilation Flags ============================
|
# =========================== Compilation Flags ============================
|
||||||
CYTO_INC=/usr/local/include/ # Where Cytoplasm's include path is
|
CYTO_INC=/usr/local/include/ # Where Cytoplasm's include path is
|
||||||
|
|
@ -18,7 +19,7 @@ SOURCE=src
|
||||||
OBJECT=build
|
OBJECT=build
|
||||||
INCLUDES=src/include
|
INCLUDES=src/include
|
||||||
CC=cc
|
CC=cc
|
||||||
CFLAGS=-I$(INCLUDES) -I$(CYTO_INC) -DNAME="\"$(NAME)\"" -DVERSION="\"$(VERSION)\"" -g -ggdb
|
CFLAGS=-I$(INCLUDES) -I$(CYTO_INC) -DNAME="\"$(NAME)\"" -DVERSION="\"$(VERSION)\"" -DREPOSITORY=\"$(REPOSITORY)\" -g -ggdb
|
||||||
LDFLAGS=-L $(CYTO_LIB) -lCytoplasm -Wl,--export-dynamic
|
LDFLAGS=-L $(CYTO_LIB) -lCytoplasm -Wl,--export-dynamic
|
||||||
BINARY=parsee
|
BINARY=parsee
|
||||||
# ============================ Compilation =================================
|
# ============================ Compilation =================================
|
||||||
|
|
|
||||||
41
src/AS.c
41
src/AS.c
|
|
@ -280,3 +280,44 @@ ASSetName(const ParseeConfig *conf, char *user, char *name)
|
||||||
JsonFree(json);
|
JsonFree(json);
|
||||||
Free(user);
|
Free(user);
|
||||||
}
|
}
|
||||||
|
char *
|
||||||
|
ASGetName(const ParseeConfig *c, char *room, char *user)
|
||||||
|
{
|
||||||
|
HttpClientContext *ctx;
|
||||||
|
HashMap *reply;
|
||||||
|
char *path, *ret;
|
||||||
|
if (!c || !user)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!room)
|
||||||
|
{
|
||||||
|
user = HttpUrlEncode(user);
|
||||||
|
path = StrConcat(3,
|
||||||
|
"/_matrix/client/v3/profile/", user, "/displayname"
|
||||||
|
);
|
||||||
|
ctx = ParseeCreateRequest(c, HTTP_GET, path);
|
||||||
|
Free(user);
|
||||||
|
ASAuthenticateRequest(c, ctx);
|
||||||
|
HttpRequestSendHeaders(ctx);
|
||||||
|
HttpRequestSend(ctx);
|
||||||
|
|
||||||
|
reply = JsonDecode(HttpClientStream(ctx));
|
||||||
|
|
||||||
|
JsonFree(reply);
|
||||||
|
ret = StrDuplicate(
|
||||||
|
JsonValueAsString(HashMapGet(reply, "displayname"))
|
||||||
|
);
|
||||||
|
HttpClientContextFree(ctx);
|
||||||
|
Free(path);
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
{
|
||||||
|
ret = StrDuplicate(user);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,9 @@ SignalHandler(int signal)
|
||||||
{
|
{
|
||||||
case SIGPIPE:
|
case SIGPIPE:
|
||||||
return;
|
return;
|
||||||
|
case SIGUSR1:
|
||||||
|
/* TODO: Soft-restart everything */
|
||||||
|
return;
|
||||||
case SIGTERM:
|
case SIGTERM:
|
||||||
case SIGINT:
|
case SIGINT:
|
||||||
if (!server)
|
if (!server)
|
||||||
|
|
@ -127,7 +130,7 @@ Main(void)
|
||||||
SIGACTION(SIGINT, &sigAction, NULL);
|
SIGACTION(SIGINT, &sigAction, NULL);
|
||||||
SIGACTION(SIGTERM, &sigAction, NULL);
|
SIGACTION(SIGTERM, &sigAction, NULL);
|
||||||
SIGACTION(SIGPIPE, &sigAction, NULL);
|
SIGACTION(SIGPIPE, &sigAction, NULL);
|
||||||
SIGACTION(SIGUSR1, &sigAction, NULL);
|
SIGACTION(SIGUSR1, &sigAction, NULL); /* Make USR1 do a softrestart */
|
||||||
#undef SIGACTION
|
#undef SIGACTION
|
||||||
|
|
||||||
server = HttpServerCreate(&conf);
|
server = HttpServerCreate(&conf);
|
||||||
|
|
|
||||||
|
|
@ -104,10 +104,13 @@ ParseeMessageHandler(ParseeData *data, HashMap *event)
|
||||||
}
|
}
|
||||||
jid = ParseeEncodeMXID(sender);
|
jid = ParseeEncodeMXID(sender);
|
||||||
{
|
{
|
||||||
char *rev = StrConcat(3, muc_id, "/", jid);
|
/* TODO: Check the name's validity */
|
||||||
|
char *name = ASGetName(data->config, NULL, sender);
|
||||||
|
char *rev = StrConcat(3, muc_id, "/", name);
|
||||||
XMPPJoinMUC(jabber, jid, rev);
|
XMPPJoinMUC(jabber, jid, rev);
|
||||||
XMPPSendPlain(jabber, jid, muc_id, body, "groupchat");
|
XMPPSendPlain(jabber, jid, muc_id, body, "groupchat");
|
||||||
Free(rev);
|
Free(rev);
|
||||||
|
Free(name);
|
||||||
}
|
}
|
||||||
Free(chat_id);
|
Free(chat_id);
|
||||||
Free(muc_id);
|
Free(muc_id);
|
||||||
|
|
|
||||||
|
|
@ -613,6 +613,11 @@ XMLDecodeString(char *s)
|
||||||
cs[0] = '\'';
|
cs[0] = '\'';
|
||||||
s += 6;
|
s += 6;
|
||||||
}
|
}
|
||||||
|
else if (!strncmp(s, """, 6))
|
||||||
|
{
|
||||||
|
cs[0] = '"';
|
||||||
|
s += 6;
|
||||||
|
}
|
||||||
else if (!strncmp(s, "<", 4))
|
else if (!strncmp(s, "<", 4))
|
||||||
{
|
{
|
||||||
cs[0] = '<';
|
cs[0] = '<';
|
||||||
|
|
@ -632,6 +637,7 @@ XMLDecodeString(char *s)
|
||||||
{
|
{
|
||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
|
/* TODO: Support hexcodes */
|
||||||
|
|
||||||
tmp = ret;
|
tmp = ret;
|
||||||
ret = StrConcat(2, ret, cs);
|
ret = StrConcat(2, ret, cs);
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
void
|
void
|
||||||
XMPPSendPlain(XMPPComponent *comp, char *fr, char *to, char *msg, char *type)
|
XMPPSendPlain(XMPPComponent *comp, char *fr, char *to, char *msg, char *type)
|
||||||
{
|
{
|
||||||
XMLElement *message, *body, *data;
|
XMLElement *message, *body, *data, *parsee;
|
||||||
char *from;
|
char *from;
|
||||||
if (!comp || !fr || !to || !msg)
|
if (!comp || !fr || !to || !msg)
|
||||||
{
|
{
|
||||||
|
|
@ -24,7 +24,32 @@ XMPPSendPlain(XMPPComponent *comp, char *fr, char *to, char *msg, char *type)
|
||||||
body = XMLCreateTag("body");
|
body = XMLCreateTag("body");
|
||||||
data = XMLCreateText(msg);
|
data = XMLCreateText(msg);
|
||||||
|
|
||||||
|
/* TODO: Add Parsee specific fields here */
|
||||||
|
parsee = XMLCreateTag("x-parsee");
|
||||||
|
{
|
||||||
|
XMLElement *parsee_version, *ver_elem;
|
||||||
|
XMLElement *parsee_link, *link_elem;
|
||||||
|
XMLElement *parsee_text, *text_elem;
|
||||||
|
|
||||||
|
parsee_version = XMLCreateTag("version");
|
||||||
|
ver_elem = XMLCreateText(VERSION);
|
||||||
|
XMLAddChild(parsee_version, ver_elem);
|
||||||
|
XMLAddChild(parsee, parsee_version);
|
||||||
|
|
||||||
|
parsee_link = XMLCreateTag("repository");
|
||||||
|
link_elem = XMLCreateText(REPOSITORY);
|
||||||
|
XMLAddChild(parsee_link, link_elem);
|
||||||
|
XMLAddChild(parsee, parsee_link);
|
||||||
|
|
||||||
|
parsee_text = XMLCreateTag("zayds-note");
|
||||||
|
text_elem = XMLCreateText("\"LDA HANG YOURSELF\" - Zayd");
|
||||||
|
XMLAddChild(parsee_text, text_elem);
|
||||||
|
XMLAddChild(parsee, parsee_text);
|
||||||
|
/* TODO: Add custom fields depending on the caller's wishes */
|
||||||
|
}
|
||||||
|
|
||||||
XMLAddChild(message, body);
|
XMLAddChild(message, body);
|
||||||
|
XMLAddChild(message, parsee);
|
||||||
XMLAddChild(body, data);
|
XMLAddChild(body, data);
|
||||||
|
|
||||||
XMLEncode(comp->stream, message);
|
XMLEncode(comp->stream, message);
|
||||||
|
|
@ -122,3 +147,13 @@ XMPPIsKiller(XMLElement *stanza)
|
||||||
return StrEquals( HashMapGet(stanza->attrs, "from"),
|
return StrEquals( HashMapGet(stanza->attrs, "from"),
|
||||||
HashMapGet(stanza->attrs, "to"));
|
HashMapGet(stanza->attrs, "to"));
|
||||||
}
|
}
|
||||||
|
bool
|
||||||
|
XMPPIsParseeStanza(XMLElement *stanza)
|
||||||
|
{
|
||||||
|
if (!stanza)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !!XMLookForUnique(stanza, "x-parsee");
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -102,7 +102,7 @@ ParseeXMPPThread(void *argp)
|
||||||
{
|
{
|
||||||
ParseeDMHandler(room, from_matrix, data, args->config);
|
ParseeDMHandler(room, from_matrix, data, args->config);
|
||||||
}
|
}
|
||||||
if (mroom_id && !ParseeIsJabberPuppet(args->config, from))
|
if (mroom_id && !XMPPIsParseeStanza(stanza))
|
||||||
{
|
{
|
||||||
char *res = ParseeGetResource(from);
|
char *res = ParseeGetResource(from);
|
||||||
char *encoded = ParseeEncodeJID(args->config, from, false);
|
char *encoded = ParseeEncodeJID(args->config, from, false);
|
||||||
|
|
@ -113,8 +113,8 @@ ParseeXMPPThread(void *argp)
|
||||||
if (ParseeVerifyStanza(args, chat_id, s_id_str))
|
if (ParseeVerifyStanza(args, chat_id, s_id_str))
|
||||||
{
|
{
|
||||||
ASRegisterUser(args->config, encoded);
|
ASRegisterUser(args->config, encoded);
|
||||||
ASJoin(args->config, mroom_id, encoded);
|
|
||||||
ASSetName(args->config, encoded, res);
|
ASSetName(args->config, encoded, res);
|
||||||
|
ASJoin(args->config, mroom_id, encoded);
|
||||||
ASSend(
|
ASSend(
|
||||||
args->config, mroom_id, encoded,
|
args->config, mroom_id, encoded,
|
||||||
"m.room.message", MatrixCreateMessage(data->data)
|
"m.room.message", MatrixCreateMessage(data->data)
|
||||||
|
|
|
||||||
|
|
@ -39,4 +39,8 @@ extern char * ASCreateRoom(const ParseeConfig *c, char *by, char *alias);
|
||||||
|
|
||||||
/* Sets a user's displayname */
|
/* Sets a user's displayname */
|
||||||
extern void ASSetName(const ParseeConfig *c, char *user, char *name);
|
extern void ASSetName(const ParseeConfig *c, char *user, char *name);
|
||||||
|
|
||||||
|
/* Returns the user's name in a room, or a copy of the MXID itself, to be
|
||||||
|
* Free'd. */
|
||||||
|
extern char * ASGetName(const ParseeConfig *c, char *room, char *user);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -52,4 +52,7 @@ extern bool XMPPQueryMUC(XMPPComponent *jabber, char *muc, MUCInfo *out);
|
||||||
extern char * XMPPGetMUCName(MUCInfo info);
|
extern char * XMPPGetMUCName(MUCInfo info);
|
||||||
|
|
||||||
extern void XMPPFreeMUCInfo(MUCInfo info);
|
extern void XMPPFreeMUCInfo(MUCInfo info);
|
||||||
|
|
||||||
|
/* Checks if a stanza has an x-parsee element */
|
||||||
|
extern bool XMPPIsParseeStanza(XMLElement *);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue