summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/irc/irc-bar-item.c5
-rw-r--r--src/plugins/irc/irc-config.c96
-rw-r--r--src/plugins/irc/irc-config.h6
-rw-r--r--src/plugins/irc/irc-nick.c113
-rw-r--r--src/plugins/irc/irc-nick.h6
-rw-r--r--src/plugins/irc/irc-protocol.c23
6 files changed, 154 insertions, 95 deletions
diff --git a/src/plugins/irc/irc-bar-item.c b/src/plugins/irc/irc-bar-item.c
index dce6b6dda..e6e24e682 100644
--- a/src/plugins/irc/irc-bar-item.c
+++ b/src/plugins/irc/irc-bar-item.c
@@ -423,7 +423,7 @@ irc_bar_item_input_prompt (void *data, struct t_gui_bar_item *item,
struct t_irc_channel *channel;
struct t_irc_nick *ptr_nick;
char *buf, str_prefix[64];
- int length, prefix_color;
+ int length;
/* make C compiler happy */
(void) data;
@@ -451,9 +451,8 @@ irc_bar_item_input_prompt (void *data, struct t_gui_bar_item *item,
{
if (ptr_nick->prefix[0] != ' ')
{
- prefix_color = irc_nick_get_prefix_color (server, ptr_nick);
snprintf (str_prefix, sizeof (str_prefix), "%s%s",
- weechat_color (weechat_config_string (weechat_config_get (irc_nick_get_prefix_color_name (prefix_color)))),
+ weechat_color (irc_nick_get_prefix_color_name (server, ptr_nick)),
ptr_nick->prefix);
}
}
diff --git a/src/plugins/irc/irc-config.c b/src/plugins/irc/irc-config.c
index 5a1fb26d7..641a76aea 100644
--- a/src/plugins/irc/irc-config.c
+++ b/src/plugins/irc/irc-config.c
@@ -99,10 +99,7 @@ struct t_config_option *irc_config_look_topic_strip_colors;
struct t_config_option *irc_config_color_message_join;
struct t_config_option *irc_config_color_message_quit;
-struct t_config_option *irc_config_color_nick_prefix_op;
-struct t_config_option *irc_config_color_nick_prefix_halfop;
-struct t_config_option *irc_config_color_nick_prefix_voice;
-struct t_config_option *irc_config_color_nick_prefix_user;
+struct t_config_option *irc_config_color_nick_prefixes;
struct t_config_option *irc_config_color_nick_prefix;
struct t_config_option *irc_config_color_nick_suffix;
struct t_config_option *irc_config_color_notice;
@@ -135,6 +132,7 @@ struct t_hook *irc_config_hook_config_nick_colors = NULL;
char **irc_config_nick_colors = NULL;
int irc_config_num_nick_colors = 0;
struct t_hashtable *irc_config_hashtable_nick_color_force = NULL;
+struct t_hashtable *irc_config_hashtable_nick_prefixes = NULL;
int irc_config_write_temp_servers = 0;
@@ -586,18 +584,52 @@ irc_config_change_color_item_lag (void *data,
}
/*
- * irc_config_change_color_nick_prefix: called when the color of a nick prefix
- * is changed
+ * irc_config_change_color_nick_prefixes: called when the string with color of
+ * nick prefixes is changed
*/
void
-irc_config_change_color_nick_prefix (void *data,
- struct t_config_option *option)
+irc_config_change_color_nick_prefixes (void *data,
+ struct t_config_option *option)
{
+ char **items, *pos;
+ int num_items, i;
+
/* make C compiler happy */
(void) data;
(void) option;
+ if (!irc_config_hashtable_nick_prefixes)
+ {
+ irc_config_hashtable_nick_prefixes = weechat_hashtable_new (8,
+ WEECHAT_HASHTABLE_STRING,
+ WEECHAT_HASHTABLE_STRING,
+ NULL,
+ NULL);
+ }
+ else
+ weechat_hashtable_remove_all (irc_config_hashtable_nick_prefixes);
+
+ items = weechat_string_split (weechat_config_string (irc_config_color_nick_prefixes),
+ ";", 0, 0, &num_items);
+ if (items)
+ {
+ for (i = 0; i < num_items; i++)
+ {
+ pos = strchr (items[i], ':');
+ if (pos)
+ {
+ pos[0] = '\0';
+ weechat_hashtable_set (irc_config_hashtable_nick_prefixes,
+ items[i],
+ pos + 1);
+ }
+ }
+ weechat_string_free_split (items);
+ }
+
+ irc_nick_nicklist_set_prefix_color_all ();
+
weechat_bar_item_update ("input_prompt");
weechat_bar_item_update ("nicklist");
}
@@ -1777,6 +1809,11 @@ irc_config_init ()
WEECHAT_HASHTABLE_STRING,
NULL,
NULL);
+ irc_config_hashtable_nick_prefixes = weechat_hashtable_new (8,
+ WEECHAT_HASHTABLE_STRING,
+ WEECHAT_HASHTABLE_STRING,
+ NULL,
+ NULL);
irc_config_file = weechat_config_new (IRC_CONFIG_NAME,
&irc_config_reload, NULL);
@@ -2105,30 +2142,17 @@ irc_config_init ()
N_("color for text in part/quit messages"),
NULL, -1, 0, "red", NULL, 0, NULL, NULL,
NULL, NULL, NULL, NULL);
- irc_config_color_nick_prefix_op = weechat_config_new_option (
- irc_config_file, ptr_section,
- "nick_prefix_op", "color",
- N_("color for prefix of nick which is op/admin/owner on channel"),
- NULL, -1, 0, "lightgreen", NULL, 0, NULL, NULL,
- &irc_config_change_color_nick_prefix, NULL, NULL, NULL);
- irc_config_color_nick_prefix_halfop = weechat_config_new_option (
- irc_config_file, ptr_section,
- "nick_prefix_halfop", "color",
- N_("color for prefix of nick which is halfop on channel"),
- NULL, -1, 0, "lightmagenta", NULL, 0, NULL, NULL,
- &irc_config_change_color_nick_prefix, NULL, NULL, NULL);
- irc_config_color_nick_prefix_voice = weechat_config_new_option (
- irc_config_file, ptr_section,
- "nick_prefix_voice", "color",
- N_("color for prefix of nick which has voice on channel"),
- NULL, -1, 0, "yellow", NULL, 0, NULL, NULL,
- &irc_config_change_color_nick_prefix, NULL, NULL, NULL);
- irc_config_color_nick_prefix_user = weechat_config_new_option (
- irc_config_file, ptr_section,
- "nick_prefix_user", "color",
- N_("color for prefix of nick which is user on channel"),
- NULL, -1, 0, "blue", NULL, 0, NULL, NULL,
- &irc_config_change_color_nick_prefix, NULL, NULL, NULL);
+ irc_config_color_nick_prefixes = weechat_config_new_option (
+ irc_config_file, ptr_section,
+ "nick_prefixes", "string",
+ N_("color for nick prefixes using mode char (o=op, h=halfop, v=voice, "
+ "..), format is: \"o:color1;h:color2;v:color3\" (if a mode is not "
+ "found, WeeChat will try with next modes received from server "
+ "(\"PREFIX\"); a special mode \"*\" can be used as default color "
+ "if no mode has been found in list)"),
+ NULL, 0, 0, "q:lightred;a:lightcyan;o:lightgreen;h:lightmagenta;"
+ "v:yellow;*:lightblue", NULL, 0, NULL, NULL,
+ &irc_config_change_color_nick_prefixes, NULL, NULL, NULL);
irc_config_color_nick_prefix = weechat_config_new_option (
irc_config_file, ptr_section,
"nick_prefix", "color",
@@ -2360,6 +2384,8 @@ irc_config_read ()
if (rc == WEECHAT_CONFIG_READ_OK)
{
irc_notify_new_for_all_servers ();
+ irc_config_change_look_nick_color_force (NULL, NULL);
+ irc_config_change_color_nick_prefixes (NULL, NULL);
irc_config_change_network_notify_check_ison (NULL, NULL);
irc_config_change_network_notify_check_whois (NULL, NULL);
}
@@ -2404,4 +2430,10 @@ irc_config_free ()
weechat_hashtable_free (irc_config_hashtable_nick_color_force);
irc_config_hashtable_nick_color_force = NULL;
}
+
+ if (irc_config_hashtable_nick_prefixes)
+ {
+ weechat_hashtable_free (irc_config_hashtable_nick_prefixes);
+ irc_config_hashtable_nick_prefixes = NULL;
+ }
}
diff --git a/src/plugins/irc/irc-config.h b/src/plugins/irc/irc-config.h
index 1f505460e..ae01d5931 100644
--- a/src/plugins/irc/irc-config.h
+++ b/src/plugins/irc/irc-config.h
@@ -122,10 +122,7 @@ extern struct t_config_option *irc_config_look_topic_strip_colors;
extern struct t_config_option *irc_config_color_message_join;
extern struct t_config_option *irc_config_color_message_quit;
-extern struct t_config_option *irc_config_color_nick_prefix_op;
-extern struct t_config_option *irc_config_color_nick_prefix_halfop;
-extern struct t_config_option *irc_config_color_nick_prefix_voice;
-extern struct t_config_option *irc_config_color_nick_prefix_user;
+extern struct t_config_option *irc_config_color_nick_prefixes;
extern struct t_config_option *irc_config_color_nick_prefix;
extern struct t_config_option *irc_config_color_nick_suffix;
extern struct t_config_option *irc_config_color_notice;
@@ -154,6 +151,7 @@ extern char **irc_config_nick_colors;
extern int irc_config_num_nick_colors;
extern struct t_hashtable *irc_config_hashtable_nick_color_force;
+extern struct t_hashtable *irc_config_hashtable_nick_prefixes;
extern void irc_config_set_nick_colors ();
extern void irc_config_server_change_cb (void *data,
diff --git a/src/plugins/irc/irc-nick.c b/src/plugins/irc/irc-nick.c
index 2dadbc9ae..ead04f71d 100644
--- a/src/plugins/irc/irc-nick.c
+++ b/src/plugins/irc/irc-nick.c
@@ -384,52 +384,48 @@ irc_nick_get_nicklist_group (struct t_irc_server *server,
}
/*
- * irc_nick_get_prefix_color: get prefix color index for a nick
+ * irc_nick_get_prefix_color_name: return name of prefix color for a nick
*/
-int
-irc_nick_get_prefix_color (struct t_irc_server *server,
- struct t_irc_nick *nick)
+const char *
+irc_nick_get_prefix_color_name (struct t_irc_server *server,
+ struct t_irc_nick *nick)
{
- int index, prefix_color;
+ static char *default_color = "chat";
+ const char *prefix_modes, *color;
+ char mode[2];
+ int i, index;
- prefix_color = 0;
- index = irc_server_get_prefix_char_index (server, nick->prefix[0]);
- if (index >= 0)
+ if (irc_config_hashtable_nick_prefixes)
{
- if (index <= irc_server_get_prefix_mode_index (server, 'o'))
- prefix_color = 1; /* color for op (or better than op) */
- else if (index == irc_server_get_prefix_mode_index (server, 'h'))
- prefix_color = 2; /* color for halh-op */
- else if (index == irc_server_get_prefix_mode_index (server, 'v'))
- prefix_color = 3; /* color for voice */
- else if (index == irc_server_get_prefix_mode_index (server, 'u'))
- prefix_color = 4; /* color for chan user */
+ index = irc_server_get_prefix_char_index (server, nick->prefix[0]);
+ if (index >= 0)
+ {
+ mode[0] = ' ';
+ mode[1] = '\0';
+ prefix_modes = irc_server_get_prefix_modes (server);
+ for (i = index; prefix_modes[i]; i++)
+ {
+ mode[0] = prefix_modes[i];
+ color = weechat_hashtable_get (irc_config_hashtable_nick_prefixes,
+ mode);
+ if (color)
+ return color;
+ }
+ /*
+ * no color found with mode (and following modes)?
+ * => fallback to "*"
+ */
+ mode[0] = '*';
+ color = weechat_hashtable_get (irc_config_hashtable_nick_prefixes,
+ mode);
+ if (color)
+ return color;
+ }
}
- return prefix_color;
-}
-
-/*
- * irc_nick_get_prefix_color_name: return name of color with a prefix number
- */
-
-const char *
-irc_nick_get_prefix_color_name (int prefix_color)
-{
- static char *color_for_prefix[] = {
- "chat",
- "irc.color.nick_prefix_op",
- "irc.color.nick_prefix_halfop",
- "irc.color.nick_prefix_voice",
- "irc.color.nick_prefix_user",
- };
-
- if ((prefix_color >= 0) && (prefix_color <= 4))
- return color_for_prefix[prefix_color];
-
- /* no color by default (should not happen) */
- return color_for_prefix[0];
+ /* no color by default */
+ return default_color;
}
/*
@@ -467,16 +463,14 @@ irc_nick_nicklist_add (struct t_irc_server *server,
struct t_irc_channel *channel,
struct t_irc_nick *nick)
{
- int prefix_color;
struct t_gui_nick_group *ptr_group;
ptr_group = irc_nick_get_nicklist_group (server, channel->buffer, nick);
- prefix_color = irc_nick_get_prefix_color (server, nick);
weechat_nicklist_add_nick (channel->buffer, ptr_group,
nick->name,
irc_nick_get_color_for_nicklist (server, nick),
nick->prefix,
- irc_nick_get_prefix_color_name (prefix_color),
+ irc_nick_get_prefix_color_name (server, nick),
1);
}
@@ -517,6 +511,35 @@ irc_nick_nicklist_set (struct t_irc_channel *channel,
}
/*
+ * irc_nick_nicklist_set_prefix_color_all: set nick prefix colors in nicklist
+ * for all servers/channels
+ */
+
+void
+irc_nick_nicklist_set_prefix_color_all ()
+{
+ struct t_irc_server *ptr_server;
+ struct t_irc_channel *ptr_channel;
+ struct t_irc_nick *ptr_nick;
+
+ for (ptr_server = irc_servers; ptr_server;
+ ptr_server = ptr_server->next_server)
+ {
+ for (ptr_channel = ptr_server->channels; ptr_channel;
+ ptr_channel = ptr_channel->next_channel)
+ {
+ for (ptr_nick = ptr_channel->nicks; ptr_nick;
+ ptr_nick = ptr_nick->next_nick)
+ {
+ irc_nick_nicklist_set (ptr_channel, ptr_nick, "prefix_color",
+ irc_nick_get_prefix_color_name (ptr_server,
+ ptr_nick));
+ }
+ }
+ }
+}
+
+/*
* irc_nick_nicklist_set_color_all: set nick colors in nicklist for all
* servers/channels
*/
@@ -840,19 +863,17 @@ irc_nick_as_prefix (struct t_irc_server *server, struct t_irc_nick *nick,
static char result[256];
char prefix[2];
const char *str_prefix_color;
- int prefix_color;
-
+
prefix[0] = (nick) ? nick->prefix[0] : '\0';
prefix[1] = '\0';
if (weechat_config_boolean (weechat_config_get ("weechat.look.nickmode")))
{
if (nick)
{
- prefix_color = irc_nick_get_prefix_color (server, nick);
if ((prefix[0] == ' ')
&& !weechat_config_boolean (weechat_config_get ("weechat.look.nickmode_empty")))
prefix[0] = '\0';
- str_prefix_color = weechat_color (weechat_config_string (weechat_config_get (irc_nick_get_prefix_color_name (prefix_color))));
+ str_prefix_color = weechat_color (irc_nick_get_prefix_color_name (server, nick));
}
else
{
diff --git a/src/plugins/irc/irc-nick.h b/src/plugins/irc/irc-nick.h
index b5da137d1..e40347f23 100644
--- a/src/plugins/irc/irc-nick.h
+++ b/src/plugins/irc/irc-nick.h
@@ -55,9 +55,9 @@ extern int irc_nick_is_op (struct t_irc_server *server,
extern int irc_nick_has_prefix_mode (struct t_irc_server *server,
struct t_irc_nick *nick,
char prefix_mode);
-extern int irc_nick_get_prefix_color (struct t_irc_server *server,
- struct t_irc_nick *nick);
-extern const char *irc_nick_get_prefix_color_name (int prefix_color);
+extern const char *irc_nick_get_prefix_color_name (struct t_irc_server *server,
+ struct t_irc_nick *nick);
+extern void irc_nick_nicklist_set_prefix_color_all ();
extern void irc_nick_nicklist_set_color_all ();
extern struct t_irc_nick *irc_nick_new (struct t_irc_server *server,
struct t_irc_channel *channel,
diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c
index a81854f39..1f070822e 100644
--- a/src/plugins/irc/irc-protocol.c
+++ b/src/plugins/irc/irc-protocol.c
@@ -3549,7 +3549,7 @@ IRC_PROTOCOL_CALLBACK(366)
struct t_config_option *ptr_option;
int num_nicks, num_op, num_halfop, num_voice, num_normal, length, i;
char *string;
- const char *prefix, *nickname;
+ const char *prefix, *prefix_color, *nickname;
/*
* 366 message looks like:
@@ -3599,12 +3599,21 @@ IRC_PROTOCOL_CALLBACK(366)
prefix = weechat_infolist_string (infolist, "prefix");
if (prefix[0] && (prefix[0] != ' '))
{
- weechat_config_search_with_string (weechat_infolist_string (infolist,
- "prefix_color"),
- NULL, NULL, &ptr_option,
- NULL);
- if (ptr_option)
- strcat (string, weechat_color (weechat_config_string (ptr_option)));
+ prefix_color = weechat_infolist_string (infolist,
+ "prefix_color");
+ if (strchr (prefix_color, '.'))
+ {
+ weechat_config_search_with_string (weechat_infolist_string (infolist,
+ "prefix_color"),
+ NULL, NULL, &ptr_option,
+ NULL);
+ if (ptr_option)
+ strcat (string, weechat_color (weechat_config_string (ptr_option)));
+ }
+ else
+ {
+ strcat (string, weechat_color (prefix_color));
+ }
strcat (string, prefix);
}
nickname = weechat_infolist_string (infolist, "name");