about summary refs log tree commit diff stats
path: root/src/ui/core.c
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2014-10-05 20:52:34 +0100
committerJames Booth <boothj5@gmail.com>2014-10-05 20:52:34 +0100
commitd12534c58e5c466d2b9443e196df151205c2b879 (patch)
tree330aa0b7a7a749552b4a99d11edccc6c3059e9f8 /src/ui/core.c
parentac7bc02c63a5aed8decfcbbdc5582e9e5b389030 (diff)
downloadprofani-tty-d12534c58e5c466d2b9443e196df151205c2b879.tar.gz
Implemented /room kick command
Diffstat (limited to 'src/ui/core.c')
-rw-r--r--src/ui/core.c117
1 files changed, 100 insertions, 17 deletions
diff --git a/src/ui/core.c b/src/ui/core.c
index 620d08d8..a0712142 100644
--- a/src/ui/core.c
+++ b/src/ui/core.c
@@ -1494,6 +1494,31 @@ _ui_room_member_offline(const char * const room, const char * const nick)
 }
 
 static void
+_ui_room_member_kicked(const char * const room, const char * const nick, const char * const actor,
+    const char * const reason)
+{
+    ProfWin *window = wins_get_by_recipient(room);
+    if (window == NULL) {
+        log_error("Received kick for room participant %s, but no window open for %s.", nick, room);
+    } else {
+        GString *message = g_string_new(nick);
+        g_string_append(message, " has been kicked from the room");
+        if (actor) {
+            g_string_append(message, " by ");
+            g_string_append(message, actor);
+        }
+        if (reason) {
+            g_string_append(message, ", reason: ");
+            g_string_append(message, reason);
+        }
+
+        win_save_vprint(window, '!', NULL, 0, COLOUR_OFFLINE, "", "<- %s", message->str);
+        g_string_free(message, TRUE);
+    }
+}
+
+
+static void
 _ui_room_member_online(const char * const room, const char * const nick,
     const char * const show, const char * const status)
 {
@@ -1691,7 +1716,7 @@ _ui_room_requires_config(const char * const room_jid)
 }
 
 static void
-_ui_room_destroyed(const char * const room_jid)
+_ui_room_destroy(const char * const room_jid)
 {
     ProfWin *window = wins_get_by_recipient(room_jid);
     if (window == NULL) {
@@ -1704,6 +1729,71 @@ _ui_room_destroyed(const char * const room_jid)
 }
 
 static void
+_ui_leave_room(const char * const room)
+{
+    ProfWin *window = wins_get_by_recipient(room);
+    if (window) {
+        int num = wins_get_num(window);
+        ui_close_win(num);
+    }
+}
+
+static void
+_ui_room_destroyed(const char * const room, const char * const reason, const char * const new_jid,
+    const char * const password)
+{
+    ProfWin *window = wins_get_by_recipient(room);
+    if (window == NULL) {
+        log_error("Received room destroy, but no window open for %s.", room);
+    } else {
+        int num = wins_get_num(window);
+        ui_close_win(num);
+        ProfWin *console = wins_get_console();
+
+        if (reason) {
+            win_save_vprint(console, '!', NULL, 0, COLOUR_TYPING, "", "<- Room destroyed: %s, reason: %s", room, reason);
+        } else {
+            win_save_vprint(console, '!', NULL, 0, COLOUR_TYPING, "", "<- Room destroyed: %s", room);
+        }
+
+        if (new_jid) {
+            if (password) {
+                win_save_vprint(console, '!', NULL, 0, COLOUR_TYPING, "", "Replacement room: %s, password: %s", new_jid, password);
+            } else {
+                win_save_vprint(console, '!', NULL, 0, COLOUR_TYPING, "", "Replacement room: %s", new_jid);
+            }
+        }
+    }
+}
+
+static void
+_ui_room_kicked(const char * const room, const char * const actor, const char * const reason)
+{
+    ProfWin *window = wins_get_by_recipient(room);
+    if (window == NULL) {
+        log_error("Received kick, but no window open for %s.", room);
+    } else {
+        int num = wins_get_num(window);
+        ui_close_win(num);
+
+        GString *message = g_string_new("Kicked from ");
+        g_string_append(message, room);
+        if (actor) {
+            g_string_append(message, " by ");
+            g_string_append(message, actor);
+        }
+        if (reason) {
+            g_string_append(message, ", reason: ");
+            g_string_append(message, reason);
+        }
+
+        ProfWin *console = wins_get_console();
+        win_save_vprint(console, '!', NULL, 0, COLOUR_TYPING, "", "<- %s", message->str);
+        g_string_free(message, TRUE);
+    }
+}
+
+static void
 _ui_room_subject(const char * const room, const char * const nick, const char * const subject)
 {
     ProfWin *window = wins_get_by_recipient(room);
@@ -1751,17 +1841,6 @@ _ui_handle_room_kick_error(const char * const room, const char * const nick, con
 }
 
 static void
-_ui_handle_room_kick(const char * const room, const char * const nick)
-{
-    ProfWin *window = wins_get_by_recipient(room);
-    if (window == NULL) {
-        log_error("Kick result received for %s, but no window open for %s.", nick, room);
-    } else {
-        win_save_vprint(window, '!', NULL, 0, 0, "", "%s has been kicked from the room", nick);
-    }
-}
-
-static void
 _ui_room_broadcast(const char * const room_jid, const char * const message)
 {
     ProfWin *window = wins_get_by_recipient(room_jid);
@@ -2766,7 +2845,7 @@ ui_init_module(void)
     ui_swap_wins = _ui_swap_wins;
     ui_update = _ui_update;
     ui_room_requires_config = _ui_room_requires_config;
-    ui_room_destroyed = _ui_room_destroyed;
+    ui_room_destroy = _ui_room_destroy;
     ui_handle_room_configuration = _ui_handle_room_configuration;
     ui_handle_room_config_submit_result = _ui_handle_room_config_submit_result;
     ui_handle_room_config_submit_result_error = _ui_handle_room_config_submit_result_error;
@@ -2783,9 +2862,13 @@ ui_init_module(void)
     ui_handle_room_info_error = _ui_handle_room_info_error;
     ui_show_room_disco_info = _ui_show_room_disco_info;
     ui_handle_room_affiliation_list_error = _ui_handle_room_affiliation_list_error;
-    ui_handle_room_affiliation_list =_ui_handle_room_affiliation_list;
-    ui_handle_room_affiliation_set_error =_ui_handle_room_affiliation_set_error;
+    ui_handle_room_affiliation_list = _ui_handle_room_affiliation_list;
+    ui_handle_room_affiliation_set_error = _ui_handle_room_affiliation_set_error;
     ui_handle_room_affiliation_set = _ui_handle_room_affiliation_set;
-    ui_handle_room_kick_error =_ui_handle_room_kick_error;
-    ui_handle_room_kick = _ui_handle_room_kick;
+    ui_handle_room_kick_error = _ui_handle_room_kick_error;
+    ui_room_destroyed = _ui_room_destroyed;
+    ui_room_kicked = _ui_room_kicked;
+    ui_leave_room = _ui_leave_room;
+    ui_room_member_kicked = _ui_room_member_kicked;
 }
+