1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-11-03 19:37:16 -05:00

Refactor muc_user_handler

This commit is contained in:
James Booth 2014-10-07 00:22:39 +01:00
parent 3228746827
commit ea511f8fbc
4 changed files with 105 additions and 83 deletions

View File

@ -745,3 +745,48 @@ handle_ping_error_result(const char * const from, const char * const error)
cons_show_error("Error returned from pinging %s: %s.", from, error); cons_show_error("Error returned from pinging %s: %s.", from, error);
} }
} }
void
handle_muc_self_online(const char * const room, const char * const nick, gboolean config_required,
const char * const role, const char * const affiliation)
{
// handle self nick change
if (muc_nick_change_pending(room)) {
handle_room_nick_change(room, nick);
// handle roster complete
} else if (!muc_roster_complete(room)) {
handle_room_roster_complete(room);
// room configuration required
if (config_required) {
handle_room_requires_config(room);
}
}
muc_set_role(room, role);
muc_set_affiliation(room, affiliation);
}
void
handle_muc_occupant_online(const char * const room, const char * const nick, const char * const jid,
const char * const role, const char * const affiliation, const char * const show_str, const char * const status_str)
{
if (!muc_roster_complete(room)) {
muc_roster_add(room, nick, jid, role, affiliation, show_str, status_str);
} else {
char *old_nick = muc_roster_nick_change_complete(room, nick);
if (old_nick) {
muc_roster_add(room, nick, jid, role, affiliation, show_str, status_str);
handle_room_member_nick_change(room, old_nick, nick);
free(old_nick);
} else {
if (!muc_roster_contains_nick(room, nick)) {
handle_room_member_online(room, nick, jid, role, affiliation, show_str, status_str);
} else {
handle_room_member_presence(room, nick, jid, role, affiliation, show_str, status_str);
}
}
}
}

View File

@ -121,5 +121,10 @@ void handle_room_configure(const char * const room, DataForm *form);
void handle_room_configuration_form_error(const char * const from, const char * const message); void handle_room_configuration_form_error(const char * const from, const char * const message);
void handle_room_config_submit_result(const char * const room); void handle_room_config_submit_result(const char * const room);
void handle_room_config_submit_result_error(const char * const room, const char * const message); void handle_room_config_submit_result_error(const char * const room, const char * const message);
void handle_muc_self_online(const char * const room, const char * const nick, gboolean config_required,
const char * const role, const char * const affiliation);
void handle_muc_occupant_online(const char * const room, const char * const nick, const char * const jid,
const char * const role, const char * const affiliation, const char * const show_str,
const char * const status_str);
#endif #endif

View File

@ -675,34 +675,36 @@ _send_caps_request(char *node, char *caps_key, char *id, char *from)
} }
} }
static int static int
_muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata)
void * const userdata)
{ {
char *type = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_TYPE);
char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
// handler still fires if error // handler still fires if error
if (g_strcmp0(xmpp_stanza_get_type(stanza), STANZA_TYPE_ERROR) == 0) { if (g_strcmp0(type, STANZA_TYPE_ERROR) == 0) {
return 1; return 1;
} }
char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM); // invalid from attribute
Jid *from_jid = jid_create(from); Jid *from_jid = jid_create(from);
if (from_jid == NULL || from_jid->resourcepart == NULL) { if (from_jid == NULL || from_jid->resourcepart == NULL) {
return 1; return 1;
} }
char *from_room = from_jid->barejid; char *room = from_jid->barejid;
char *from_nick = from_jid->resourcepart; char *nick = from_jid->resourcepart;
// handle self presence // handle self presence
if (stanza_is_muc_self_presence(stanza, jabber_get_fulljid())) { if (stanza_is_muc_self_presence(stanza, jabber_get_fulljid())) {
char *type = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_TYPE); log_debug("Room self presence received from %s", from_jid->fulljid);
char *new_nick = stanza_get_new_nick(stanza);
// self unavailable // self unavailable
if ((type != NULL) && (strcmp(type, STANZA_TYPE_UNAVAILABLE) == 0)) { if (g_strcmp0(type, STANZA_TYPE_UNAVAILABLE) == 0) {
// leave room if not self nick change // handle nickname change
if (new_nick != NULL) { char *new_nick = stanza_get_new_nick(stanza);
muc_nick_change_start(from_room, new_nick); if (new_nick) {
muc_nick_change_start(room, new_nick);
} else { } else {
GSList *status_codes = stanza_get_status_codes_by_ns(stanza, STANZA_NS_MUC_USER); GSList *status_codes = stanza_get_status_codes_by_ns(stanza, STANZA_NS_MUC_USER);
@ -711,7 +713,7 @@ _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
char *new_jid = stanza_get_muc_destroy_alternative_room(stanza); char *new_jid = stanza_get_muc_destroy_alternative_room(stanza);
char *password = stanza_get_muc_destroy_alternative_password(stanza); char *password = stanza_get_muc_destroy_alternative_password(stanza);
char *reason = stanza_get_muc_destroy_reason(stanza); char *reason = stanza_get_muc_destroy_reason(stanza);
handle_room_destroyed(from_room, new_jid, password, reason); handle_room_destroyed(room, new_jid, password, reason);
free(password); free(password);
free(reason); free(reason);
@ -719,19 +721,19 @@ _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
} else if (g_slist_find_custom(status_codes, "307", (GCompareFunc)g_strcmp0) != NULL) { } else if (g_slist_find_custom(status_codes, "307", (GCompareFunc)g_strcmp0) != NULL) {
char *actor = stanza_get_kickban_actor(stanza); char *actor = stanza_get_kickban_actor(stanza);
char *reason = stanza_get_kickban_reason(stanza); char *reason = stanza_get_kickban_reason(stanza);
handle_room_kicked(from_room, actor, reason); handle_room_kicked(room, actor, reason);
free(reason); free(reason);
// banned from room // banned from room
} else if (g_slist_find_custom(status_codes, "301", (GCompareFunc)g_strcmp0) != NULL) { } else if (g_slist_find_custom(status_codes, "301", (GCompareFunc)g_strcmp0) != NULL) {
char *actor = stanza_get_kickban_actor(stanza); char *actor = stanza_get_kickban_actor(stanza);
char *reason = stanza_get_kickban_reason(stanza); char *reason = stanza_get_kickban_reason(stanza);
handle_room_banned(from_room, actor, reason); handle_room_banned(room, actor, reason);
free(reason); free(reason);
// normal exit // normal exit
} else { } else {
handle_leave_room(from_room); handle_leave_room(room);
} }
g_slist_free(status_codes); g_slist_free(status_codes);
@ -739,52 +741,36 @@ _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
// self online // self online
} else { } else {
gboolean config_required = stanza_muc_requires_config(stanza);
char *role = NULL;
char *affiliation = NULL;
// handle self nick change // get own affiliation and role
if (muc_nick_change_pending(from_room)) {
handle_room_nick_change(from_room, from_nick);
// handle roster complete
} else if (!muc_roster_complete(from_room)) {
handle_room_roster_complete(from_room);
// room configuration required
if (stanza_muc_requires_config(stanza)) {
handle_room_requires_config(from_room);
}
}
// set own affiliation and role
xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER); xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
if (x) { if (x) {
xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(x, STANZA_NAME_ITEM); xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(x, STANZA_NAME_ITEM);
if (item) { if (item) {
char *role = xmpp_stanza_get_attribute(item, "role"); role = xmpp_stanza_get_attribute(item, "role");
muc_set_role(from_room, role); affiliation = xmpp_stanza_get_attribute(item, "affiliation");
char *affiliation = xmpp_stanza_get_attribute(item, "affiliation");
muc_set_affiliation(from_room, affiliation);
} }
} }
handle_muc_self_online(room, nick, config_required, role, affiliation);
} }
// handle presence from room members // handle presence from room members
} else { } else {
char *type = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_TYPE);
char *status_str;
log_debug("Room presence received from %s", from_jid->fulljid); log_debug("Room presence received from %s", from_jid->fulljid);
char *status_str = stanza_get_status(stanza, NULL);
status_str = stanza_get_status(stanza, NULL); if (g_strcmp0(type, STANZA_TYPE_UNAVAILABLE) == 0) {
if ((type != NULL) && (strcmp(type, STANZA_TYPE_UNAVAILABLE) == 0)) {
// handle nickname change // handle nickname change
if (stanza_is_room_nick_change(stanza)) { char *new_nick = stanza_get_new_nick(stanza);
char *new_nick = stanza_get_new_nick(stanza); if (new_nick) {
if (new_nick != NULL) { muc_roster_nick_change_start(room, new_nick, nick);
muc_roster_nick_change_start(from_room, new_nick, from_nick);
free(new_nick); // handle left room
}
} else { } else {
GSList *status_codes = stanza_get_status_codes_by_ns(stanza, STANZA_NS_MUC_USER); GSList *status_codes = stanza_get_status_codes_by_ns(stanza, STANZA_NS_MUC_USER);
@ -792,21 +778,23 @@ _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
if (g_slist_find_custom(status_codes, "307", (GCompareFunc)g_strcmp0) != NULL) { if (g_slist_find_custom(status_codes, "307", (GCompareFunc)g_strcmp0) != NULL) {
char *actor = stanza_get_kickban_actor(stanza); char *actor = stanza_get_kickban_actor(stanza);
char *reason = stanza_get_kickban_reason(stanza); char *reason = stanza_get_kickban_reason(stanza);
handle_room_occupent_kicked(from_room, from_nick, actor, reason); handle_room_occupent_kicked(room, nick, actor, reason);
free(reason); free(reason);
// banned from room // banned from room
} else if (g_slist_find_custom(status_codes, "301", (GCompareFunc)g_strcmp0) != NULL) { } else if (g_slist_find_custom(status_codes, "301", (GCompareFunc)g_strcmp0) != NULL) {
char *actor = stanza_get_kickban_actor(stanza); char *actor = stanza_get_kickban_actor(stanza);
char *reason = stanza_get_kickban_reason(stanza); char *reason = stanza_get_kickban_reason(stanza);
handle_room_occupent_banned(from_room, from_nick, actor, reason); handle_room_occupent_banned(room, nick, actor, reason);
free(reason); free(reason);
// normal exit // normal exit
} else { } else {
handle_room_member_offline(from_room, from_nick, "offline", status_str); handle_room_member_offline(room, nick, "offline", status_str);
} }
} }
// room occupant online
} else { } else {
// send disco info for capabilities, if not cached // send disco info for capabilities, if not cached
if (stanza_contains_caps(stanza)) { if (stanza_contains_caps(stanza)) {
@ -829,25 +817,9 @@ _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
} }
} }
if (!muc_roster_complete(from_room)) { handle_muc_occupant_online(room, nick, jid, role, affiliation, show_str, status_str);
muc_roster_add(from_room, from_nick, jid, role, affiliation, show_str, status_str);
} else {
char *old_nick = muc_roster_nick_change_complete(from_room, from_nick);
if (old_nick != NULL) { free(show_str);
muc_roster_add(from_room, from_nick, jid, role, affiliation, show_str, status_str);
handle_room_member_nick_change(from_room, old_nick, from_nick);
free(old_nick);
} else {
if (!muc_roster_contains_nick(from_room, from_nick)) {
handle_room_member_online(from_room, from_nick, jid, role, affiliation, show_str, status_str);
} else {
handle_room_member_presence(from_room, from_nick, jid, role, affiliation, show_str, status_str);
}
}
}
free(show_str);
} }
free(status_str); free(status_str);

View File

@ -1260,23 +1260,23 @@ char *
stanza_get_new_nick(xmpp_stanza_t * const stanza) stanza_get_new_nick(xmpp_stanza_t * const stanza)
{ {
if (!stanza_is_room_nick_change(stanza)) { if (!stanza_is_room_nick_change(stanza)) {
return NULL;
} else {
xmpp_stanza_t *x = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_X);
xmpp_stanza_t *x_children = xmpp_stanza_get_children(x);
while (x_children != NULL) {
if (strcmp(xmpp_stanza_get_name(x_children), STANZA_NAME_ITEM) == 0) {
char *nick = xmpp_stanza_get_attribute(x_children, STANZA_ATTR_NICK);
if (nick != NULL) {
return strdup(nick);
}
}
x_children = xmpp_stanza_get_next(x_children);
}
return NULL; return NULL;
} }
xmpp_stanza_t *x = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_X);
xmpp_stanza_t *x_children = xmpp_stanza_get_children(x);
while (x_children != NULL) {
if (strcmp(xmpp_stanza_get_name(x_children), STANZA_NAME_ITEM) == 0) {
char *nick = xmpp_stanza_get_attribute(x_children, STANZA_ATTR_NICK);
if (nick) {
return nick;
}
}
x_children = xmpp_stanza_get_next(x_children);
}
return NULL;
} }
int int