diff options
-rw-r--r-- | src/command/command.c | 4 | ||||
-rw-r--r-- | src/command/commands.c | 24 | ||||
-rw-r--r-- | src/muc.c | 23 | ||||
-rw-r--r-- | src/muc.h | 1 | ||||
-rw-r--r-- | src/ui/core.c | 59 | ||||
-rw-r--r-- | src/ui/ui.h | 1 | ||||
-rw-r--r-- | src/ui/window.c | 1 |
7 files changed, 107 insertions, 6 deletions
diff --git a/src/command/command.c b/src/command/command.c index 6cc8078e..2fe9df27 100644 --- a/src/command/command.c +++ b/src/command/command.c @@ -1231,6 +1231,10 @@ cmd_init(void) autocomplete_add(room_ac, "moderators"); autocomplete_add(room_ac, "participants"); autocomplete_add(room_ac, "visitors"); + autocomplete_add(room_ac, "owners"); + autocomplete_add(room_ac, "admins"); + autocomplete_add(room_ac, "members"); + autocomplete_add(room_ac, "outcasts"); form_ac = autocomplete_new(); autocomplete_add(form_ac, "submit"); diff --git a/src/command/commands.c b/src/command/commands.c index 8cbbc109..4b3dfa5c 100644 --- a/src/command/commands.c +++ b/src/command/commands.c @@ -2066,6 +2066,10 @@ cmd_room(gchar **args, struct cmd_help_t help) (g_strcmp0(args[0], "moderators") != 0) && (g_strcmp0(args[0], "participants") != 0) && (g_strcmp0(args[0], "visitors") != 0) && + (g_strcmp0(args[0], "owners") != 0) && + (g_strcmp0(args[0], "admins") != 0) && + (g_strcmp0(args[0], "members") != 0) && + (g_strcmp0(args[0], "outcasts") != 0) && (g_strcmp0(args[0], "info") != 0)) { cons_show("Usage: %s", help.usage); return TRUE; @@ -2089,17 +2093,33 @@ cmd_room(gchar **args, struct cmd_help_t help) ui_show_room_role_list(window, room, MUC_ROLE_MODERATOR); return TRUE; } - if (g_strcmp0(args[0], "participants") == 0) { ui_show_room_role_list(window, room, MUC_ROLE_PARTICIPANT); return TRUE; } - if (g_strcmp0(args[0], "visitors") == 0) { ui_show_room_role_list(window, room, MUC_ROLE_VISITOR); return TRUE; } + if (g_strcmp0(args[0], "owners") == 0) { + ui_show_room_affiliation_list(window, room, MUC_AFFILIATION_OWNER); + return TRUE; + } + if (g_strcmp0(args[0], "admins") == 0) { + ui_show_room_affiliation_list(window, room, MUC_AFFILIATION_ADMIN); + return TRUE; + } + if (g_strcmp0(args[0], "members") == 0) { + ui_show_room_affiliation_list(window, room, MUC_AFFILIATION_MEMBER); + return TRUE; + } + if (g_strcmp0(args[0], "outcasts") == 0) { + ui_show_room_affiliation_list(window, room, MUC_AFFILIATION_OUTCAST); + return TRUE; + } + + if (g_strcmp0(args[0], "accept") == 0) { gboolean requires_config = muc_requires_config(room); if (!requires_config) { diff --git a/src/muc.c b/src/muc.c index ee784bb8..508d77ee 100644 --- a/src/muc.c +++ b/src/muc.c @@ -542,6 +542,29 @@ muc_occupants_by_role(const char * const room, muc_role_t role) } } +GSList * +muc_occupants_by_affiliation(const char * const room, muc_affiliation_t affiliation) +{ + ChatRoom *chat_room = g_hash_table_lookup(rooms, room); + if (chat_room) { + GSList *result = NULL; + GHashTableIter iter; + gpointer key; + gpointer value; + + g_hash_table_iter_init(&iter, chat_room->roster); + while (g_hash_table_iter_next(&iter, &key, &value)) { + Occupant *occupant = (Occupant *)value; + if (occupant->affiliation == affiliation) { + result = g_slist_insert_sorted(result, value, (GCompareFunc)_compare_occupants); + } + } + return result; + } else { + return NULL; + } +} + /* * Remove the old_nick from the roster, and flag that a pending nickname change * is in progress diff --git a/src/muc.h b/src/muc.h index 77174892..491c5331 100644 --- a/src/muc.h +++ b/src/muc.h @@ -98,6 +98,7 @@ gboolean muc_occupant_available(Occupant *occupant); const char * muc_occupant_affiliation_str(Occupant *occupant); const char * muc_occupant_role_str(Occupant *occupant); GSList * muc_occupants_by_role(const char * const room, muc_role_t role); +GSList * muc_occupants_by_affiliation(const char * const room, muc_affiliation_t affiliation); void muc_roster_nick_change_start(const char * const room, const char * const new_nick, const char * const old_nick); char* muc_roster_nick_change_complete(const char * const room, const char * const nick); diff --git a/src/ui/core.c b/src/ui/core.c index 512cd10f..3995d60d 100644 --- a/src/ui/core.c +++ b/src/ui/core.c @@ -1892,7 +1892,6 @@ _ui_show_room_info(ProfWin *window, const char * const room) char *role = muc_role_str(room); char *affiliation = muc_affiliation_str(room); - win_save_print(window, '-', NULL, 0, 0, "", ""); win_save_vprint(window, '!', NULL, 0, 0, "", "Room: %s", room); win_save_vprint(window, '!', NULL, 0, 0, "", " Affiliation: %s", affiliation); win_save_vprint(window, '!', NULL, 0, 0, "", " Role: %s", role); @@ -1905,7 +1904,6 @@ _ui_show_room_role_list(ProfWin *window, const char * const room, muc_role_t rol GSList *occupants = muc_occupants_by_role(room, role); if (!occupants) { - win_save_print(window, '-', NULL, 0, 0, "", ""); switch (role) { case MUC_ROLE_MODERATOR: win_save_print(window, '!', NULL, 0, 0, "", "No moderators found."); @@ -1921,7 +1919,6 @@ _ui_show_room_role_list(ProfWin *window, const char * const room, muc_role_t rol } win_save_print(window, '-', NULL, 0, 0, "", ""); } else { - win_save_print(window, '-', NULL, 0, 0, "", ""); switch (role) { case MUC_ROLE_MODERATOR: win_save_print(window, '!', NULL, 0, 0, "", "Moderators:"); @@ -1951,6 +1948,61 @@ _ui_show_room_role_list(ProfWin *window, const char * const room, muc_role_t rol } static void +_ui_show_room_affiliation_list(ProfWin *window, const char * const room, muc_affiliation_t affiliation) +{ + GSList *occupants = muc_occupants_by_affiliation(room, affiliation); + + if (!occupants) { + switch (affiliation) { + case MUC_AFFILIATION_OWNER: + win_save_print(window, '!', NULL, 0, 0, "", "No owners found."); + break; + case MUC_AFFILIATION_ADMIN: + win_save_print(window, '!', NULL, 0, 0, "", "No admins found."); + break; + case MUC_AFFILIATION_MEMBER: + win_save_print(window, '!', NULL, 0, 0, "", "No members found."); + break; + case MUC_AFFILIATION_OUTCAST: + win_save_print(window, '!', NULL, 0, 0, "", "No outcasts found."); + break; + default: + break; + } + win_save_print(window, '-', NULL, 0, 0, "", ""); + } else { + switch (affiliation) { + case MUC_AFFILIATION_OWNER: + win_save_print(window, '!', NULL, 0, 0, "", "Owners:"); + break; + case MUC_AFFILIATION_ADMIN: + win_save_print(window, '!', NULL, 0, 0, "", "Admins:"); + break; + case MUC_AFFILIATION_MEMBER: + win_save_print(window, '!', NULL, 0, 0, "", "Members:"); + break; + case MUC_AFFILIATION_OUTCAST: + win_save_print(window, '!', NULL, 0, 0, "", "Outcasts:"); + break; + default: + break; + } + + GSList *curr_occupant = occupants; + while(curr_occupant) { + Occupant *occupant = curr_occupant->data; + if (occupant->affiliation == affiliation) { + win_save_vprint(window, '!', NULL, 0, 0, "", " %s", occupant->nick); + } + + curr_occupant = g_slist_next(curr_occupant); + } + + win_save_print(window, '-', NULL, 0, 0, "", ""); + } +} + +static void _ui_handle_form_field(ProfWin *window, char *tag, FormField *field) { win_save_vprint(window, '-', NULL, NO_EOL, COLOUR_AWAY, "", "[%s] ", tag); @@ -2579,4 +2631,5 @@ ui_init_module(void) ui_handle_room_configuration_form_error = _ui_handle_room_configuration_form_error; ui_show_room_info = _ui_show_room_info; ui_show_room_role_list = _ui_show_room_role_list; + ui_show_room_affiliation_list = _ui_show_room_affiliation_list; } diff --git a/src/ui/ui.h b/src/ui/ui.h index 9a9a4f5c..9955b7f9 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -139,6 +139,7 @@ void (*ui_room_requires_config)(const char * const room_jid); void (*ui_room_destroyed)(const char * const room_jid); void (*ui_show_room_info)(ProfWin *window, const char * const room); void (*ui_show_room_role_list)(ProfWin *window, const char * const room, muc_role_t role); +void (*ui_show_room_affiliation_list)(ProfWin *window, const char * const room, muc_affiliation_t affiliation); void (*ui_room_broadcast)(const char * const room_jid, const char * const message); diff --git a/src/ui/window.c b/src/ui/window.c index ace6e8aa..00167a17 100644 --- a/src/ui/window.c +++ b/src/ui/window.c @@ -195,7 +195,6 @@ win_show_occupant_info(ProfWin *window, const char * const room, Occupant *occup int presence_colour = win_presence_colour(presence_str); - win_save_print(window, '-', NULL, 0, 0, "", ""); win_save_print(window, '!', NULL, NO_EOL, presence_colour, "", occupant->nick); win_save_vprint(window, '!', NULL, NO_DATE | NO_EOL, presence_colour, "", " is %s", presence_str); |