mirror of
https://github.com/profanity-im/profanity.git
synced 2024-11-03 19:37:16 -05:00
Split xmpp message handlers by namespace
This commit is contained in:
parent
78e8232b61
commit
d8a92f933b
@ -40,11 +40,15 @@
|
||||
|
||||
#define HANDLE(ns, type, func) xmpp_handler_add(conn, func, ns, STANZA_NAME_MESSAGE, type, ctx)
|
||||
|
||||
static int _groupchat_message_handler(xmpp_conn_t * const conn,
|
||||
static int _groupchat_handler(xmpp_conn_t * const conn,
|
||||
xmpp_stanza_t * const stanza, void * const userdata);
|
||||
static int _chat_message_handler(xmpp_conn_t * const conn,
|
||||
static int _chat_handler(xmpp_conn_t * const conn,
|
||||
xmpp_stanza_t * const stanza, void * const userdata);
|
||||
static int _conference_message_handler(xmpp_conn_t * const conn,
|
||||
static int _muc_user_handler(xmpp_conn_t * const conn,
|
||||
xmpp_stanza_t * const stanza, void * const userdata);
|
||||
static int _conference_handler(xmpp_conn_t * const conn,
|
||||
xmpp_stanza_t * const stanza, void * const userdata);
|
||||
static int _captcha_handler(xmpp_conn_t * const conn,
|
||||
xmpp_stanza_t * const stanza, void * const userdata);
|
||||
|
||||
void
|
||||
@ -53,9 +57,11 @@ message_add_handlers(void)
|
||||
xmpp_conn_t * const conn = connection_get_conn();
|
||||
xmpp_ctx_t * const ctx = connection_get_ctx();
|
||||
|
||||
HANDLE(NULL, STANZA_TYPE_GROUPCHAT, _groupchat_message_handler);
|
||||
HANDLE(NULL, STANZA_TYPE_CHAT, _chat_message_handler);
|
||||
HANDLE(NULL, NULL, _conference_message_handler);
|
||||
HANDLE(NULL, STANZA_TYPE_GROUPCHAT, _groupchat_handler);
|
||||
HANDLE(NULL, STANZA_TYPE_CHAT, _chat_handler);
|
||||
HANDLE(STANZA_NS_MUC_USER, NULL, _muc_user_handler);
|
||||
HANDLE(STANZA_NS_CONFERENCE, NULL, _conference_handler);
|
||||
HANDLE(STANZA_NS_CAPTCHA, NULL, _captcha_handler);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -180,32 +186,23 @@ _message_send_gone(const char * const recipient)
|
||||
}
|
||||
|
||||
static int
|
||||
_conference_message_handler(xmpp_conn_t * const conn,
|
||||
xmpp_stanza_t * const stanza, void * const userdata)
|
||||
_muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
|
||||
void * const userdata)
|
||||
{
|
||||
xmpp_ctx_t *ctx = connection_get_ctx();
|
||||
xmpp_stanza_t *xns_muc_user = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
|
||||
xmpp_stanza_t *xns_conference = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_CONFERENCE);
|
||||
xmpp_stanza_t *xns_captcha = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_CAPTCHA);
|
||||
char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
|
||||
char *room = NULL;
|
||||
char *room = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
|
||||
char *invitor = NULL;
|
||||
char *reason = NULL;
|
||||
|
||||
if (from == NULL) {
|
||||
if (room == NULL) {
|
||||
log_warning("Message received with no from attribute, ignoring");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// XEP-0045
|
||||
if (xns_muc_user != NULL) {
|
||||
room = from;
|
||||
|
||||
xmpp_stanza_t *invite = xmpp_stanza_get_child_by_name(xns_muc_user, STANZA_NAME_INVITE);
|
||||
if (invite == NULL) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
xmpp_stanza_t *invite = xmpp_stanza_get_child_by_name(xns_muc_user, STANZA_NAME_INVITE);
|
||||
if (invite != NULL) {
|
||||
char *invitor_jid = xmpp_stanza_get_attribute(invite, STANZA_ATTR_FROM);
|
||||
if (invitor_jid == NULL) {
|
||||
log_warning("Chat room invite received with no from attribute");
|
||||
@ -228,35 +225,67 @@ _conference_message_handler(xmpp_conn_t * const conn,
|
||||
if (reason != NULL) {
|
||||
xmpp_free(ctx, reason);
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
_conference_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
|
||||
void * const userdata)
|
||||
{
|
||||
xmpp_stanza_t *xns_conference = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_CONFERENCE);
|
||||
char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
|
||||
char *room = NULL;
|
||||
char *invitor = NULL;
|
||||
char *reason = NULL;
|
||||
|
||||
if (from == NULL) {
|
||||
log_warning("Message received with no from attribute, ignoring");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// XEP-0429
|
||||
} else if (xns_conference != NULL) {
|
||||
room = xmpp_stanza_get_attribute(xns_conference, STANZA_ATTR_JID);
|
||||
if (room == NULL) {
|
||||
return 1;
|
||||
}
|
||||
room = xmpp_stanza_get_attribute(xns_conference, STANZA_ATTR_JID);
|
||||
if (room == NULL) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
Jid *jidp = jid_create(from);
|
||||
if (jidp == NULL) {
|
||||
return 1;
|
||||
}
|
||||
invitor = jidp->barejid;
|
||||
Jid *jidp = jid_create(from);
|
||||
if (jidp == NULL) {
|
||||
return 1;
|
||||
}
|
||||
invitor = jidp->barejid;
|
||||
|
||||
reason = xmpp_stanza_get_attribute(xns_conference, STANZA_ATTR_REASON);
|
||||
reason = xmpp_stanza_get_attribute(xns_conference, STANZA_ATTR_REASON);
|
||||
|
||||
handle_room_invite(INVITE_DIRECT, invitor, room, reason);
|
||||
handle_room_invite(INVITE_DIRECT, invitor, room, reason);
|
||||
|
||||
jid_destroy(jidp);
|
||||
jid_destroy(jidp);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
_captcha_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
|
||||
void * const userdata)
|
||||
{
|
||||
xmpp_ctx_t *ctx = connection_get_ctx();
|
||||
char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
|
||||
|
||||
if (from == NULL) {
|
||||
log_warning("Message received with no from attribute, ignoring");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// XEP-0158
|
||||
} else if (xns_captcha != NULL) {
|
||||
xmpp_stanza_t *body = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_BODY);
|
||||
if (body != NULL) {
|
||||
char *message = xmpp_stanza_get_text(body);
|
||||
if (message != NULL) {
|
||||
handle_room_broadcast(from, message);
|
||||
xmpp_free(ctx, message);
|
||||
}
|
||||
xmpp_stanza_t *body = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_BODY);
|
||||
if (body != NULL) {
|
||||
char *message = xmpp_stanza_get_text(body);
|
||||
if (message != NULL) {
|
||||
handle_room_broadcast(from, message);
|
||||
xmpp_free(ctx, message);
|
||||
}
|
||||
}
|
||||
|
||||
@ -264,7 +293,7 @@ _conference_message_handler(xmpp_conn_t * const conn,
|
||||
}
|
||||
|
||||
static int
|
||||
_groupchat_message_handler(xmpp_conn_t * const conn,
|
||||
_groupchat_handler(xmpp_conn_t * const conn,
|
||||
xmpp_stanza_t * const stanza, void * const userdata)
|
||||
{
|
||||
xmpp_ctx_t *ctx = connection_get_ctx();
|
||||
@ -341,7 +370,7 @@ _groupchat_message_handler(xmpp_conn_t * const conn,
|
||||
}
|
||||
|
||||
static int
|
||||
_chat_message_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
|
||||
_chat_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
|
||||
void * const userdata)
|
||||
{
|
||||
xmpp_ctx_t *ctx = connection_get_ctx();
|
||||
|
Loading…
Reference in New Issue
Block a user