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:
parent
3228746827
commit
ea511f8fbc
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user