summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/weeconfig.c10
-rw-r--r--src/common/weeconfig.h4
-rw-r--r--src/irc/irc-display.c27
-rw-r--r--src/irc/irc-send.c227
-rw-r--r--src/irc/irc.h2
5 files changed, 138 insertions, 132 deletions
diff --git a/src/common/weeconfig.c b/src/common/weeconfig.c
index d0ddb588e..fd62293ba 100644
--- a/src/common/weeconfig.c
+++ b/src/common/weeconfig.c
@@ -650,6 +650,8 @@ t_config_option weechat_options_log[] =
/* config, irc section */
int cfg_irc_display_away;
+char *cfg_irc_display_away_values[] =
+{ "off", "local", "channel", NULL };
char *cfg_irc_default_msg_part;
char *cfg_irc_default_msg_quit;
int cfg_irc_notice_as_pv;
@@ -663,10 +665,10 @@ int cfg_irc_colors_receive;
int cfg_irc_colors_send;
t_config_option weechat_options_irc[] =
-{ { "irc_display_away", N_("display message to all channels when away"),
- N_("display message to all channels when (un)marking as away"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_irc_display_away, NULL, &config_change_noop },
+{ { "irc_display_away", N_("display message for away"),
+ N_("display message when (un)marking as away"),
+ OPTION_TYPE_INT_WITH_STRING, 0, 0, 0,
+ "off", cfg_irc_display_away_values, &cfg_irc_display_away, NULL, &config_change_noop },
{ "irc_default_msg_part", N_("default part message (leaving channel)"),
N_("default part message (leaving channel)"),
OPTION_TYPE_STRING, 0, 0, 0,
diff --git a/src/common/weeconfig.h b/src/common/weeconfig.h
index 9cfd8f006..23825ad55 100644
--- a/src/common/weeconfig.h
+++ b/src/common/weeconfig.h
@@ -54,6 +54,10 @@
#define CFG_LOOK_NICKLIST_TOP 2
#define CFG_LOOK_NICKLIST_BOTTOM 3
+#define CFG_IRC_DISPLAY_AWAY_OFF 0
+#define CFG_IRC_DISPLAY_AWAY_LOCAL 1
+#define CFG_IRC_DISPLAY_AWAY_CHANNEL 2
+
typedef struct t_config_section t_config_section;
struct t_config_section
diff --git a/src/irc/irc-display.c b/src/irc/irc-display.c
index b68762bed..4c628a944 100644
--- a/src/irc/irc-display.c
+++ b/src/irc/irc-display.c
@@ -135,6 +135,33 @@ irc_display_nick (t_gui_buffer *buffer, t_irc_nick *nick, char *nickname,
}
/*
+ * irc_display_away: display away on all channels of all servers
+ */
+
+void
+irc_display_away (t_irc_server *server, char *string1, char *string2)
+{
+ t_irc_channel *ptr_channel;
+
+ for (ptr_channel = server->channels; ptr_channel;
+ ptr_channel = ptr_channel->next_channel)
+ {
+ if (ptr_channel->type == CHANNEL_TYPE_CHANNEL)
+ {
+ gui_printf_nolog (ptr_channel->buffer,
+ "%s[%s%s%s %s: %s%s]\n",
+ GUI_COLOR(COLOR_WIN_CHAT_DARK),
+ GUI_COLOR(COLOR_WIN_CHAT_NICK),
+ server->nick,
+ GUI_COLOR(COLOR_WIN_CHAT),
+ string1,
+ string2,
+ GUI_COLOR(COLOR_WIN_CHAT_DARK));
+ }
+ }
+}
+
+/*
* irc_display_mode: display IRC message for mode change
*/
diff --git a/src/irc/irc-send.c b/src/irc/irc-send.c
index 7313b600e..77d24de08 100644
--- a/src/irc/irc-send.c
+++ b/src/irc/irc-send.c
@@ -85,6 +85,31 @@ irc_cmd_send_admin (t_irc_server *server, char *arguments)
}
/*
+ * irc_send_me: send a ctcp action to a channel
+ */
+
+int
+irc_send_me (t_irc_server *server, t_irc_channel *channel, char *arguments)
+{
+ char *string;
+
+ server_sendf (server, "PRIVMSG %s :\01ACTION %s\01\r\n",
+ channel->name,
+ (arguments && arguments[0]) ? arguments : "");
+ irc_display_prefix (NULL, channel->buffer, PREFIX_ACTION_ME);
+ string = (arguments && arguments[0]) ?
+ (char *)gui_color_decode ((unsigned char *)arguments, 1) : NULL;
+ gui_printf (channel->buffer, "%s%s %s%s\n",
+ GUI_COLOR(COLOR_WIN_CHAT_NICK),
+ server->nick,
+ GUI_COLOR(COLOR_WIN_CHAT),
+ (string) ? string : "");
+ if (string)
+ free (string);
+ return 0;
+}
+
+/*
* irc_cmd_send_ame: send a ctcp action to all channels of all connected servers
*/
@@ -93,7 +118,6 @@ irc_cmd_send_ame (t_irc_server *server, char *arguments)
{
t_irc_server *ptr_server;
t_irc_channel *ptr_channel;
- char *string;
/* make gcc happy */
(void) server;
@@ -108,21 +132,7 @@ irc_cmd_send_ame (t_irc_server *server, char *arguments)
ptr_channel = ptr_channel->next_channel)
{
if (ptr_channel->type == CHANNEL_TYPE_CHANNEL)
- {
- server_sendf (ptr_server, "PRIVMSG %s :\01ACTION %s\01\r\n",
- ptr_channel->name,
- (arguments && arguments[0]) ? arguments : "");
- irc_display_prefix (NULL, ptr_channel->buffer, PREFIX_ACTION_ME);
- string = (arguments && arguments[0]) ?
- (char *)gui_color_decode ((unsigned char *)arguments, 1) : NULL;
- gui_printf (ptr_channel->buffer, "%s%s %s%s\n",
- GUI_COLOR(COLOR_WIN_CHAT_NICK),
- ptr_server->nick,
- GUI_COLOR(COLOR_WIN_CHAT),
- (string) ? string : "");
- if (string)
- free (string);
- }
+ irc_send_me (ptr_server, ptr_channel, arguments);
}
}
}
@@ -189,108 +199,63 @@ irc_cmd_send_amsg (t_irc_server *server, char *arguments)
}
/*
- * irc_cmd_send_away: toggle away status
+ * irc_send_away: toggle away status for one server
*/
-int
-irc_cmd_send_away (t_irc_server *server, char *arguments)
+void
+irc_send_away (t_irc_server *server, char *arguments)
{
- char *pos;
- t_irc_server *ptr_server;
+ char *string, buffer[4096];
t_gui_window *ptr_window;
time_t elapsed;
- char buffer[4096];
- char *string;
- gui_add_hotlist = 0;
- if (arguments && (strncmp (arguments, "-all", 4) == 0))
+ if (arguments)
{
- pos = arguments + 4;
- while (pos[0] == ' ')
- pos++;
- if (!pos[0])
- pos = NULL;
-
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
+ server->is_away = 1;
+ server->away_time = time (NULL);
+ server_sendf (server, "AWAY :%s\r\n", arguments);
+ if (cfg_irc_display_away != CFG_IRC_DISPLAY_AWAY_OFF)
{
- if (ptr_server->is_connected)
+ string = (char *)gui_color_decode ((unsigned char *)arguments, 1);
+ if (cfg_irc_display_away == CFG_IRC_DISPLAY_AWAY_LOCAL)
+ irc_display_away (server, "away", (string) ? string : arguments);
+ else
{
- if (pos)
- {
- ptr_server->is_away = 1;
- ptr_server->away_time = time (NULL);
- server_sendf (ptr_server, "AWAY :%s\r\n", pos);
- if (cfg_irc_display_away)
- {
- string = (char *)gui_color_decode ((unsigned char *)pos, 1);
- snprintf (buffer, sizeof (buffer), "is away: %s", (string) ? string : "");
- irc_send_me_all_channels (ptr_server, buffer);
- if (string)
- free (string);
- }
- server_set_away (ptr_server, ptr_server->nick, 1);
- for (ptr_window = gui_windows; ptr_window;
- ptr_window = ptr_window->next_window)
- {
- if (SERVER(ptr_window->buffer) == ptr_server)
- ptr_window->buffer->last_read_line =
- ptr_window->buffer->last_line;
- }
- }
- else
- {
- server_sendf (ptr_server, "AWAY\r\n");
- ptr_server->is_away = 0;
- if (server->away_time != 0)
- {
- elapsed = time (NULL) - ptr_server->away_time;
- ptr_server->away_time = 0;
- if (cfg_irc_display_away)
- {
- snprintf (buffer, sizeof (buffer),
- "is back (gone %.2ld:%.2ld:%.2ld)",
- (long int)(elapsed / 3600),
- (long int)((elapsed / 60) % 60),
- (long int)(elapsed % 60));
- irc_send_me_all_channels (ptr_server, buffer);
- }
- }
- server_set_away (ptr_server, ptr_server->nick, 0);
- }
+ snprintf (buffer, sizeof (buffer), "is away: %s", (string) ? string : arguments);
+ irc_send_me_all_channels (server, buffer);
}
+ if (string)
+ free (string);
+ }
+ server_set_away (server, server->nick, 1);
+ for (ptr_window = gui_windows; ptr_window;
+ ptr_window = ptr_window->next_window)
+ {
+ if (SERVER(ptr_window->buffer) == server)
+ ptr_window->buffer->last_read_line =
+ ptr_window->buffer->last_line;
}
}
else
{
- if (arguments)
+ server_sendf (server, "AWAY\r\n");
+ server->is_away = 0;
+ if (server->away_time != 0)
{
- server->is_away = 1;
- server->away_time = time (NULL);
- server_sendf (server, "AWAY :%s\r\n", arguments);
- if (cfg_irc_display_away)
+ elapsed = time (NULL) - server->away_time;
+ server->away_time = 0;
+ if (cfg_irc_display_away != CFG_IRC_DISPLAY_AWAY_OFF)
{
- snprintf (buffer, sizeof (buffer), "is away: %s", arguments);
- irc_send_me_all_channels (server, buffer);
- }
- server_set_away (server, server->nick, 1);
- for (ptr_window = gui_windows; ptr_window;
- ptr_window = ptr_window->next_window)
- {
- if (SERVER(ptr_window->buffer) == server)
- ptr_window->buffer->last_read_line =
- ptr_window->buffer->last_line;
- }
- }
- else
- {
- server_sendf (server, "AWAY\r\n");
- server->is_away = 0;
- if (server->away_time != 0)
- {
- elapsed = time (NULL) - server->away_time;
- server->away_time = 0;
- if (cfg_irc_display_away)
+ if (cfg_irc_display_away == CFG_IRC_DISPLAY_AWAY_LOCAL)
+ {
+ snprintf (buffer, sizeof (buffer),
+ "gone %.2ld:%.2ld:%.2ld",
+ (long int)(elapsed / 3600),
+ (long int)((elapsed / 60) % 60),
+ (long int)(elapsed % 60));
+ irc_display_away (server, "back", buffer);
+ }
+ else
{
snprintf (buffer, sizeof (buffer),
"is back (gone %.2ld:%.2ld:%.2ld)",
@@ -300,9 +265,40 @@ irc_cmd_send_away (t_irc_server *server, char *arguments)
irc_send_me_all_channels (server, buffer);
}
}
- server_set_away (server, server->nick, 0);
}
+ server_set_away (server, server->nick, 0);
}
+}
+
+/*
+ * irc_cmd_send_away: toggle away status
+ */
+
+int
+irc_cmd_send_away (t_irc_server *server, char *arguments)
+{
+ char *pos;
+ t_irc_server *ptr_server;
+
+ gui_add_hotlist = 0;
+ if (arguments && (strncmp (arguments, "-all", 4) == 0))
+ {
+ pos = arguments + 4;
+ while (pos[0] == ' ')
+ pos++;
+ if (!pos[0])
+ pos = NULL;
+
+ for (ptr_server = irc_servers; ptr_server;
+ ptr_server = ptr_server->next_server)
+ {
+ if (ptr_server->is_connected)
+ irc_send_away (ptr_server, pos);
+ }
+ }
+ else
+ irc_send_away (server, arguments);
+
gui_draw_buffer_status (gui_current_window->buffer, 1);
gui_add_hotlist = 1;
return 0;
@@ -922,31 +918,6 @@ irc_cmd_send_lusers (t_irc_server *server, char *arguments)
}
/*
- * irc_send_me: send a ctcp action to a channel
- */
-
-int
-irc_send_me (t_irc_server *server, t_irc_channel *channel, char *arguments)
-{
- char *string;
-
- server_sendf (server, "PRIVMSG %s :\01ACTION %s\01\r\n",
- channel->name,
- (arguments && arguments[0]) ? arguments : "");
- irc_display_prefix (NULL, channel->buffer, PREFIX_ACTION_ME);
- string = (arguments && arguments[0]) ?
- (char *)gui_color_decode ((unsigned char *)arguments, 1) : NULL;
- gui_printf (channel->buffer, "%s%s %s%s\n",
- GUI_COLOR(COLOR_WIN_CHAT_NICK),
- server->nick,
- GUI_COLOR(COLOR_WIN_CHAT),
- (string) ? string : "");
- if (string)
- free (string);
- return 0;
-}
-
-/*
* irc_send_me_all_channels: send a ctcp action to all channels of a server
*/
diff --git a/src/irc/irc.h b/src/irc/irc.h
index 26c9c79fb..b15f67af3 100644
--- a/src/irc/irc.h
+++ b/src/irc/irc.h
@@ -45,6 +45,7 @@
#define PREFIX_QUIT "<--"
#define PREFIX_ERROR "=!="
#define PREFIX_PLUGIN "-P-"
+#define PREFIX_AWAY "-A-"
#define DEFAULT_IRC_PORT 6667
@@ -396,6 +397,7 @@ extern void dcc_print_log (t_irc_dcc *);
extern void irc_display_prefix (t_irc_server *, t_gui_buffer *, char *);
extern void irc_display_nick (t_gui_buffer *, t_irc_nick *, char *, int,
int, int, int);
+extern void irc_display_away (t_irc_server *, char *, char *);
extern void irc_display_mode (t_irc_server *, t_gui_buffer *, char *, char,
char *, char *, char *, char *);
extern void irc_display_server (t_irc_server *ptr_server);