diff options
author | James Booth <boothj5@gmail.com> | 2014-10-01 00:27:25 +0100 |
---|---|---|
committer | James Booth <boothj5@gmail.com> | 2014-10-01 00:27:25 +0100 |
commit | 5879f497ad7bdd9abd7e7c419c1d8c503d6d14d6 (patch) | |
tree | cc97813ac58b2e8c3cc669b639e87c308337d3bc | |
parent | 76d2b9e9b5c1c7fa4dd6fdaa3072365eafa84473 (diff) | |
download | profani-tty-5879f497ad7bdd9abd7e7c419c1d8c503d6d14d6.tar.gz |
Added /room <role> command
-rw-r--r-- | src/command/command.c | 3 | ||||
-rw-r--r-- | src/command/commands.c | 18 | ||||
-rw-r--r-- | src/muc.c | 23 | ||||
-rw-r--r-- | src/muc.h | 3 | ||||
-rw-r--r-- | src/ui/core.c | 52 | ||||
-rw-r--r-- | src/ui/ui.h | 2 |
6 files changed, 100 insertions, 1 deletions
diff --git a/src/command/command.c b/src/command/command.c index bea6cbcd..6cc8078e 100644 --- a/src/command/command.c +++ b/src/command/command.c @@ -1228,6 +1228,9 @@ cmd_init(void) autocomplete_add(room_ac, "destroy"); autocomplete_add(room_ac, "config"); autocomplete_add(room_ac, "info"); + autocomplete_add(room_ac, "moderators"); + autocomplete_add(room_ac, "participants"); + autocomplete_add(room_ac, "visitors"); form_ac = autocomplete_new(); autocomplete_add(form_ac, "submit"); diff --git a/src/command/commands.c b/src/command/commands.c index 4a3cdd43..8cbbc109 100644 --- a/src/command/commands.c +++ b/src/command/commands.c @@ -2063,6 +2063,9 @@ cmd_room(gchar **args, struct cmd_help_t help) if ((g_strcmp0(args[0], "accept") != 0) && (g_strcmp0(args[0], "destroy") != 0) && (g_strcmp0(args[0], "config") != 0) && + (g_strcmp0(args[0], "moderators") != 0) && + (g_strcmp0(args[0], "participants") != 0) && + (g_strcmp0(args[0], "visitors") != 0) && (g_strcmp0(args[0], "info") != 0)) { cons_show("Usage: %s", help.usage); return TRUE; @@ -2082,6 +2085,21 @@ cmd_room(gchar **args, struct cmd_help_t help) return TRUE; } + if (g_strcmp0(args[0], "moderators") == 0) { + 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], "accept") == 0) { gboolean requires_config = muc_requires_config(room); if (!requires_config) { diff --git a/src/muc.c b/src/muc.c index ec9c9bfe..ee784bb8 100644 --- a/src/muc.c +++ b/src/muc.c @@ -519,6 +519,29 @@ muc_occupant_role_str(Occupant *occupant) return _role_to_string(occupant->role); } +GSList * +muc_occupants_by_role(const char * const room, muc_role_t role) +{ + 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->role == role) { + 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 7a25e87c..77174892 100644 --- a/src/muc.h +++ b/src/muc.h @@ -85,7 +85,7 @@ char* muc_old_nick(const char * const room, const char * const new_nick); gboolean muc_roster_contains_nick(const char * const room, const char * const nick); gboolean muc_roster_complete(const char * const room); -gboolean muc_roster_add(const char * const room, const char * const nick, const char * const role, +gboolean muc_roster_add(const char * const room, const char * const nick, const char * const role, const char * const affiliation, const char * const show, const char * const status); void muc_roster_remove(const char * const room, const char * const nick); @@ -97,6 +97,7 @@ Occupant* muc_roster_item(const char * const room, const char * const nick); 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); 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 7c6d24cb..512cd10f 100644 --- a/src/ui/core.c +++ b/src/ui/core.c @@ -1900,6 +1900,57 @@ _ui_show_room_info(ProfWin *window, const char * const room) } static void +_ui_show_room_role_list(ProfWin *window, const char * const room, muc_role_t role) +{ + 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."); + break; + case MUC_ROLE_PARTICIPANT: + win_save_print(window, '!', NULL, 0, 0, "", "No participants found."); + break; + case MUC_ROLE_VISITOR: + win_save_print(window, '!', NULL, 0, 0, "", "No visitors found."); + break; + default: + break; + } + 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:"); + break; + case MUC_ROLE_PARTICIPANT: + win_save_print(window, '!', NULL, 0, 0, "", "Participants:"); + break; + case MUC_ROLE_VISITOR: + win_save_print(window, '!', NULL, 0, 0, "", "Visitors:"); + break; + default: + break; + } + + GSList *curr_occupant = occupants; + while(curr_occupant) { + Occupant *occupant = curr_occupant->data; + if (occupant->role == role) { + 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); @@ -2527,4 +2578,5 @@ ui_init_module(void) ui_show_lines = _ui_show_lines; 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; } diff --git a/src/ui/ui.h b/src/ui/ui.h index 85649c0e..9a9a4f5c 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -138,6 +138,8 @@ void (*ui_room_subject)(const char * const room_jid, 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_room_broadcast)(const char * const room_jid, const char * const message); void (*ui_room_member_offline)(const char * const room, const char * const nick); |