about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2014-12-02 20:50:21 +0000
committerJames Booth <boothj5@gmail.com>2014-12-02 20:50:21 +0000
commit1a8c805319eb7fea0068bde124f5900877e61ec6 (patch)
tree0ef3bd7c923e60cc195fc4d3826e01988f4757a1 /src
parentaae88753a3593adc78d488576a0e7644f4ccc912 (diff)
downloadprofani-tty-1a8c805319eb7fea0068bde124f5900877e61ec6.tar.gz
Added /resource command
Diffstat (limited to 'src')
-rw-r--r--src/command/command.c10
-rw-r--r--src/command/commands.c42
-rw-r--r--src/command/commands.h1
-rw-r--r--src/ui/titlebar.c23
-rw-r--r--src/ui/window.c2
-rw-r--r--src/ui/window.h1
6 files changed, 79 insertions, 0 deletions
diff --git a/src/command/command.c b/src/command/command.c
index 9abc4cf3..e382c03c 100644
--- a/src/command/command.c
+++ b/src/command/command.c
@@ -274,6 +274,16 @@ static struct cmd_t command_defs[] =
           "Example : /status jon",
           NULL } } },
 
+    { "/resource",
+        cmd_resource, parse_args, 1, 2, NULL,
+        { "/resource set|off [resource]", "Set the contact's resource.",
+        { "/resource set|off [resource]",
+          "----------------------------",
+          "Set the resource to use when chatting to a contact.",
+          "set resource - Set the resource.",
+          "off          - Let the server choose which resource to route messages to.",
+          NULL } } },
+
     { "/join",
         cmd_join, parse_args, 1, 5, NULL,
         { "/join room[@server] [nick value] [password value]", "Join a chat room.",
diff --git a/src/command/commands.c b/src/command/commands.c
index 4a69a05b..62a5a6dd 100644
--- a/src/command/commands.c
+++ b/src/command/commands.c
@@ -1528,6 +1528,48 @@ cmd_roster(gchar **args, struct cmd_help_t help)
 }
 
 gboolean
+cmd_resource(gchar **args, struct cmd_help_t help)
+{
+    ProfWin *current = wins_get_current();
+    if (current->type != WIN_CHAT) {
+        cons_show("The /resource command is only valid in chat windows.");
+        return TRUE;
+    }
+
+    char *cmd = args[0];
+
+    if (g_strcmp0(cmd, "set") == 0) {
+        char *resource = args[1];
+        if (!resource) {
+            cons_show("Usage: %s", help.usage);
+            return TRUE;
+        }
+
+        char *recipent = ui_current_recipient();
+        PContact contact = roster_get_contact(recipent);
+        if (!contact) {
+            cons_show("Cannot choose resource for contact not in roster.");
+            return TRUE;
+        }
+
+        if (!p_contact_get_resource(contact, resource)) {
+            cons_show("No such resource %s.", resource);
+            return TRUE;
+        }
+
+        current->chat_resource = strdup(resource);
+        return TRUE;
+
+    } else if (g_strcmp0(cmd, "off") == 0) {
+        FREE_SET_NULL(current->chat_resource);
+        return TRUE;
+    } else {
+        cons_show("Usage: %s", help.usage);
+        return TRUE;
+    }
+}
+
+gboolean
 cmd_status(gchar **args, struct cmd_help_t help)
 {
     char *usr = args[0];
diff --git a/src/command/commands.h b/src/command/commands.h
index b5646caf..5245b2c7 100644
--- a/src/command/commands.h
+++ b/src/command/commands.h
@@ -135,6 +135,7 @@ gboolean cmd_privileges(gchar **args, struct cmd_help_t help);
 gboolean cmd_presence(gchar **args, struct cmd_help_t help);
 gboolean cmd_wrap(gchar **args, struct cmd_help_t help);
 gboolean cmd_time(gchar **args, struct cmd_help_t help);
+gboolean cmd_resource(gchar **args, struct cmd_help_t help);
 
 gboolean cmd_form_field(char *tag, gchar **args);
 
diff --git a/src/ui/titlebar.c b/src/ui/titlebar.c
index ed9588cb..6ef3ec70 100644
--- a/src/ui/titlebar.c
+++ b/src/ui/titlebar.c
@@ -60,6 +60,7 @@ static GTimer *typing_elapsed;
 static void _title_bar_draw(void);
 static void _show_contact_presence(void);
 static void _show_self_presence(void);
+static void _show_contact_resource(void);
 #ifdef HAVE_LIBOTR
 static void _show_privacy(void);
 #endif
@@ -181,6 +182,10 @@ _title_bar_draw(void)
     mvwprintw(win, 0, 0, " %s", current_title);
 
     if (current && current->type == WIN_CHAT) {
+        if (TRUE) {
+//        if (prefs_get_boolean(PREF_RESOURCE)) {
+            _show_contact_resource();
+        }
         if (prefs_get_boolean(PREF_PRESENCE)) {
             _show_contact_presence();
         }
@@ -321,6 +326,24 @@ _show_privacy(void)
 #endif
 
 static void
+_show_contact_resource(void)
+{
+    int bracket_attrs = theme_attrs(THEME_TITLE_BRACKET);
+
+    ProfWin *current = wins_get_current();
+    if (current && current->chat_resource) {
+        wprintw(win, " ");
+        wattron(win, bracket_attrs);
+        wprintw(win, "[");
+        wattroff(win, bracket_attrs);
+        wprintw(win, current->chat_resource);
+        wattron(win, bracket_attrs);
+        wprintw(win, "]");
+        wattroff(win, bracket_attrs);
+    }
+}
+
+static void
 _show_contact_presence(void)
 {
     int bracket_attrs = theme_attrs(THEME_TITLE_BRACKET);
diff --git a/src/ui/window.c b/src/ui/window.c
index ea65f1da..cb2587f8 100644
--- a/src/ui/window.c
+++ b/src/ui/window.c
@@ -104,6 +104,7 @@ win_create(const char * const title, win_type_t type)
     new_win->is_otr = FALSE;
     new_win->is_trusted = FALSE;
     new_win->form = NULL;
+    new_win->chat_resource = NULL;
     scrollok(new_win->win, TRUE);
 
     return new_win;
@@ -151,6 +152,7 @@ win_free(ProfWin* window)
     if (window->subwin) {
         delwin(window->subwin);
     }
+    free(window->chat_resource);
     free(window->from);
     form_destroy(window->form);
     free(window);
diff --git a/src/ui/window.h b/src/ui/window.h
index e131fbfc..ecf3a771 100644
--- a/src/ui/window.h
+++ b/src/ui/window.h
@@ -68,6 +68,7 @@ typedef enum {
 
 typedef struct prof_win_t {
     char *from;
+    char *chat_resource;
     WINDOW *win;
     WINDOW *subwin;
     ProfBuff buffer;