mirror of
https://forge.fsky.io/lda/Parsee.git
synced 2026-03-13 15:15:10 +00:00
[ADD/WIP/AYA] Sending errors, voice reqs, Ayawork.
Ayaya!
This commit is contained in:
parent
aa71c5cfeb
commit
8588a6fb5c
7 changed files with 197 additions and 5 deletions
|
|
@ -48,9 +48,9 @@ THESE I WANT TO SEND THEM A NICE, BRIGHT GIFT:
|
||||||
|
|
||||||
|
|
||||||
Not XEPs, but ideas that _needs_ to be added:
|
Not XEPs, but ideas that _needs_ to be added:
|
||||||
|
~ "also it [Bifrost] doesn't respect voice either" -> Send a form on moderated
|
||||||
|
MUCs (which is standard, so its not too bad!). Currently WIP, and barely tested.
|
||||||
~ "GIVE THE PUPPETS APPROPRIATE PLS/ROLES" - Hydro/t4d
|
~ "GIVE THE PUPPETS APPROPRIATE PLS/ROLES" - Hydro/t4d
|
||||||
- "also it [Bifrost] doesn't respect voice either" -> Send a form on moderated
|
|
||||||
MUCs (which is standard, so its not too bad!)
|
|
||||||
- Standalone/Static Parsee, ideally as small as it can be(if not as APE).
|
- Standalone/Static Parsee, ideally as small as it can be(if not as APE).
|
||||||
- https://www.youtube.com/watch?v=InL414iDZmY
|
- https://www.youtube.com/watch?v=InL414iDZmY
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -106,3 +106,64 @@ XMPPGetMUCName(MUCInfo info)
|
||||||
|
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
void
|
||||||
|
XMPPRequestVoice(XMPPComponent *jabber, char *from, char *muc)
|
||||||
|
{
|
||||||
|
XMLElement *stanza;
|
||||||
|
char *identifier;
|
||||||
|
if (!jabber || !from || !muc)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_mutex_lock(&jabber->write_lock);
|
||||||
|
stanza = XMLCreateTag("message");
|
||||||
|
XMLAddAttr(stanza, "id", (identifier = StrRandom(32)));
|
||||||
|
XMLAddAttr(stanza, "from", from);
|
||||||
|
XMLAddAttr(stanza, "to", muc);
|
||||||
|
{
|
||||||
|
XMLElement *x = XMLCreateTag("x");
|
||||||
|
XMLAddAttr(x, "xmlns", "jabber:x:data");
|
||||||
|
XMLAddAttr(x, "type", "submit");
|
||||||
|
{
|
||||||
|
XMLElement *field;
|
||||||
|
|
||||||
|
field = XMLCreateTag("field");
|
||||||
|
XMLAddAttr(field, "var", "FORM_TYPE");
|
||||||
|
{
|
||||||
|
XMLElement *value = XMLCreateTag("value");
|
||||||
|
{
|
||||||
|
XMLElement *data = XMLCreateText(
|
||||||
|
"http://jabber.org/protocol/muc#request"
|
||||||
|
);
|
||||||
|
XMLAddChild(value, data);
|
||||||
|
}
|
||||||
|
XMLAddChild(field, value);
|
||||||
|
}
|
||||||
|
XMLAddChild(x, field);
|
||||||
|
|
||||||
|
field = XMLCreateTag("field");
|
||||||
|
XMLAddAttr(field, "var", "muc#role");
|
||||||
|
XMLAddAttr(field, "type", "list-single");
|
||||||
|
XMLAddAttr(field, "label", "Requested role");
|
||||||
|
{
|
||||||
|
XMLElement *value = XMLCreateTag("value");
|
||||||
|
{
|
||||||
|
XMLElement *data = XMLCreateText(
|
||||||
|
"participant"
|
||||||
|
);
|
||||||
|
XMLAddChild(value, data);
|
||||||
|
}
|
||||||
|
XMLAddChild(field, value);
|
||||||
|
}
|
||||||
|
XMLAddChild(x, field);
|
||||||
|
}
|
||||||
|
XMLAddChild(stanza, x);
|
||||||
|
}
|
||||||
|
XMLEncode(jabber->stream, stanza);
|
||||||
|
StreamFlush(jabber->stream);
|
||||||
|
pthread_mutex_unlock(&jabber->write_lock);
|
||||||
|
|
||||||
|
XMLFreeElement(stanza);
|
||||||
|
Free(identifier);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -540,3 +540,44 @@ XMPPDiscoAdvertises(XMLElement *disco, char *var)
|
||||||
|
|
||||||
return !!XMLookForTKV(query, "feature", "var", var);
|
return !!XMLookForTKV(query, "feature", "var", var);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
XMPPGetErrtype(XMLElement *stanza)
|
||||||
|
{
|
||||||
|
XMLElement *error = XMLookForUnique(stanza, "error");
|
||||||
|
XMLElement *type = NULL;
|
||||||
|
if (!error)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
type = ArrayGet(error->children, 0);
|
||||||
|
if (!type)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return type->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
XMPPGetErrtext(XMLElement *stanza)
|
||||||
|
{
|
||||||
|
XMLElement *error = XMLookForUnique(stanza, "error");
|
||||||
|
XMLElement *text = NULL, *data;
|
||||||
|
if (!error)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
text = XMLookForUnique(error, "text");
|
||||||
|
if (!text)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = ArrayGet(text->children, 0);
|
||||||
|
|
||||||
|
return data ? data->data : NULL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,8 @@ MessageStanza(ParseeData *args, XMLElement *stanza, XMPPThread *thr)
|
||||||
char *retracted = XMPPGetRetractedID(stanza);
|
char *retracted = XMPPGetRetractedID(stanza);
|
||||||
char *reply_to = XMPPGetReply(stanza);
|
char *reply_to = XMPPGetReply(stanza);
|
||||||
char *moderated = XMPPGetModeration(stanza);
|
char *moderated = XMPPGetModeration(stanza);
|
||||||
bool chat = StrEquals(HashMapGet(stanza->attrs, "type"), "chat");
|
char *type = HashMapGet(stanza->attrs, "type");
|
||||||
|
bool chat = StrEquals(type, "chat");
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
to = NULL;
|
to = NULL;
|
||||||
|
|
@ -39,6 +40,45 @@ MessageStanza(ParseeData *args, XMLElement *stanza, XMPPThread *thr)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (StrEquals(type, "error"))
|
||||||
|
{
|
||||||
|
char *type, *text, *user, *parsee;
|
||||||
|
char *message, *room;
|
||||||
|
|
||||||
|
from = HashMapGet(stanza->attrs, "from");
|
||||||
|
to = HashMapGet(stanza->attrs, "to");
|
||||||
|
|
||||||
|
/* Tiny little trick. */
|
||||||
|
XMLAddAttr(stanza, "type", "groupchat");
|
||||||
|
|
||||||
|
parsee = ParseeMXID(args);
|
||||||
|
type = XMPPGetErrtype(stanza);
|
||||||
|
text = XMPPGetErrtext(stanza);
|
||||||
|
user = ParseeDecodeMXID(to);
|
||||||
|
|
||||||
|
/* Avoid fun hypothetical cases of looping. */
|
||||||
|
if (StrEquals(parsee, user))
|
||||||
|
{
|
||||||
|
goto end_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
message = StrConcat(3, type, ": ", text);
|
||||||
|
room = ParseeGetBridgedRoom(args, stanza);
|
||||||
|
Free(ASSend(
|
||||||
|
args->config, room, parsee,
|
||||||
|
"m.room.message",
|
||||||
|
MatrixCreateNotice(message)
|
||||||
|
));
|
||||||
|
|
||||||
|
end_error:
|
||||||
|
XMLFreeElement(stanza);
|
||||||
|
Free(message);
|
||||||
|
Free(parsee);
|
||||||
|
Free(room);
|
||||||
|
Free(user);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (moderated)
|
if (moderated)
|
||||||
{
|
{
|
||||||
/* TODO: Parsee MUST check if it is a valid MUC */
|
/* TODO: Parsee MUST check if it is a valid MUC */
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,7 @@ PresenceStanza(ParseeData *args, XMLElement *stanza)
|
||||||
char *decode_from, *real_matrix;
|
char *decode_from, *real_matrix;
|
||||||
char *matrix_user_pl = ParseeEncodeJID(args->config, trim, false);
|
char *matrix_user_pl = ParseeEncodeJID(args->config, trim, false);
|
||||||
char *affiliation = HashMapGet(item->attrs, "affiliation");
|
char *affiliation = HashMapGet(item->attrs, "affiliation");
|
||||||
|
char *role = HashMapGet(item->attrs, "role");
|
||||||
int power_level = 0;
|
int power_level = 0;
|
||||||
char *parsee = ParseeMXID(args);
|
char *parsee = ParseeMXID(args);
|
||||||
|
|
||||||
|
|
@ -117,6 +118,24 @@ PresenceStanza(ParseeData *args, XMLElement *stanza)
|
||||||
power_level = -1;
|
power_level = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (StrEquals(role, "visitor"))
|
||||||
|
{
|
||||||
|
char *parsee = ParseeJID(args);
|
||||||
|
if (!StrEquals(HashMapGet(stanza->attrs, "to"), parsee) &&
|
||||||
|
IsStatus(110))
|
||||||
|
{
|
||||||
|
char *muc = ParseeTrimJID(HashMapGet(stanza->attrs, "from"));
|
||||||
|
char *usr = HashMapGet(stanza->attrs, "to");
|
||||||
|
|
||||||
|
/* Ask for voice */
|
||||||
|
XMPPRequestVoice(args->jabber, usr, muc);
|
||||||
|
|
||||||
|
Free(muc);
|
||||||
|
}
|
||||||
|
|
||||||
|
Free(parsee);
|
||||||
|
}
|
||||||
|
|
||||||
/* Set the user's PL
|
/* Set the user's PL
|
||||||
* TODO: Do NOT change the PL of *real* people nilly-willy.
|
* TODO: Do NOT change the PL of *real* people nilly-willy.
|
||||||
* In some scenarios, this is really bad behaviour. */
|
* In some scenarios, this is really bad behaviour. */
|
||||||
|
|
|
||||||
|
|
@ -72,10 +72,19 @@ extern HashMap *ASGetPL(const ParseeConfig *conf, char *id);
|
||||||
* See-Also: ASGetPL */
|
* See-Also: ASGetPL */
|
||||||
extern void ASSetPL(const ParseeConfig *conf, char *id, HashMap *m);
|
extern void ASSetPL(const ParseeConfig *conf, char *id, HashMap *m);
|
||||||
|
|
||||||
/* Creates a room, with a masquerade user as its creator. This function
|
/** Creates a room, with a masquerade user ({by}) as its creator and an
|
||||||
* returns it's ID if it exists. */
|
* optional {alias}.
|
||||||
|
* --------
|
||||||
|
* Returns: a valid room ID[HEAP] | NULL
|
||||||
|
* Modifies: NOTHING
|
||||||
|
* See-Also: ASCreateDM */
|
||||||
extern char * ASCreateRoom(const ParseeConfig *c, char *by, char *alias);
|
extern char * ASCreateRoom(const ParseeConfig *c, char *by, char *alias);
|
||||||
|
|
||||||
|
/** Creates a new DM {with} a Matrix user, from a puppet {by}
|
||||||
|
* --------
|
||||||
|
* Returns: a valid room ID[HEAP] | NULL
|
||||||
|
* Modifies: NOTHING
|
||||||
|
* See-Also: ASCreateRoom */
|
||||||
extern char * ASCreateDM(const ParseeConfig *c, char *by, char *with);
|
extern char * ASCreateDM(const ParseeConfig *c, char *by, char *with);
|
||||||
|
|
||||||
/** Sets the user's global display{name}
|
/** Sets the user's global display{name}
|
||||||
|
|
|
||||||
|
|
@ -107,4 +107,26 @@ extern bool XMPPHasError(XMLElement *stanza, char *type);
|
||||||
extern XMLElement * XMPPSendDisco(XMPPComponent *jabber, char *from, char *to);
|
extern XMLElement * XMPPSendDisco(XMPPComponent *jabber, char *from, char *to);
|
||||||
|
|
||||||
extern bool XMPPDiscoAdvertises(XMLElement *disco, char *var);
|
extern bool XMPPDiscoAdvertises(XMLElement *disco, char *var);
|
||||||
|
|
||||||
|
/** Requests for 'voice' in a moderated MUC as a user by sending a specific
|
||||||
|
* form.
|
||||||
|
* -----------
|
||||||
|
* Returns: NOTHING
|
||||||
|
* Modifies: the XMPP MUCs state
|
||||||
|
* See-Also: https://xmpp.org/extensions/xep-0045.html#requestvoice */
|
||||||
|
extern void XMPPRequestVoice(XMPPComponent *jabber, char *from, char *muc);
|
||||||
|
|
||||||
|
/** Retrieves the error type in a stanza if existent.
|
||||||
|
* -----------------
|
||||||
|
* Returns: a valid string error type[stanza] | NULL
|
||||||
|
* Modifies: NOTHING
|
||||||
|
* See-Also: XMPPGetErrtext */
|
||||||
|
extern char * XMPPGetErrtype(XMLElement *stanza);
|
||||||
|
|
||||||
|
/** Retrieves the error text in a stanza if existent.
|
||||||
|
* -----------------
|
||||||
|
* Returns: a valid string error text[stanza] | NULL
|
||||||
|
* Modifies: NOTHING
|
||||||
|
* See-Also: XMPPGetErrtype */
|
||||||
|
extern char * XMPPGetErrtext(XMLElement *stanza);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue