diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/curses/gui-display.c | 12 | ||||
-rw-r--r-- | src/irc/irc-commands.c | 2 | ||||
-rw-r--r-- | src/irc/irc-recv.c | 494 | ||||
-rw-r--r-- | src/irc/irc.h | 2 |
4 files changed, 330 insertions, 180 deletions
diff --git a/src/gui/curses/gui-display.c b/src/gui/curses/gui-display.c index 883121251..12a314b26 100644 --- a/src/gui/curses/gui-display.c +++ b/src/gui/curses/gui-display.c @@ -826,7 +826,7 @@ gui_draw_window_status (t_gui_window *window) { t_gui_window *ptr_win; char format_more[32]; - int i; + int i, first_mode; /* TODO: manage splitted windows! */ if (window != gui_current_window) @@ -919,13 +919,21 @@ gui_draw_window_status (t_gui_window *window) if (gui_current_window == CHANNEL(ptr_win)->window) { /* display channel modes */ - wprintw (window->win_status, "(+"); + wprintw (window->win_status, "("); i = 0; + first_mode = 1; while (CHANNEL(ptr_win)->modes[i]) { if (CHANNEL(ptr_win)->modes[i] != ' ') + { + if (first_mode) + { + wprintw (window->win_status, "+"); + first_mode = 0; + } wprintw (window->win_status, "%c", CHANNEL(ptr_win)->modes[i]); + } i++; } if (CHANNEL(ptr_win)->modes[CHANNEL_MODE_KEY] != ' ') diff --git a/src/irc/irc-commands.c b/src/irc/irc-commands.c index 7acb23d70..8889718e2 100644 --- a/src/irc/irc-commands.c +++ b/src/irc/irc-commands.c @@ -286,6 +286,8 @@ t_irc_command irc_commands[] = { "321", N_("/list start"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_321 }, { "322", N_("channel (for /list)"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_322 }, { "323", N_("/list end"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_323 }, + { "324", N_("channel mode"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_324 }, + { "329", "???", "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_329 }, { "331", N_("no topic for channel"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_331 }, { "332", N_("topic of channel"), N_("channel :topic"), diff --git a/src/irc/irc-recv.c b/src/irc/irc-recv.c index 189d63cc7..004dfe3a1 100644 --- a/src/irc/irc-recv.c +++ b/src/irc/irc-recv.c @@ -272,16 +272,264 @@ irc_cmd_recv_kick (t_irc_server *server, char *host, char *arguments) } /* + * irc_get_channel_modes: get channel modes + */ + +void irc_get_channel_modes (t_irc_channel *ptr_channel, char *channel_name, + char *nick_host, char *modes, char *parm) +{ + char *pos, set_flag; + t_irc_nick *ptr_nick; + + set_flag = '+'; + while (modes && modes[0]) + { + switch (modes[0]) + { + case '+': + set_flag = '+'; + break; + case '-': + set_flag = '-'; + break; + case 'b': + pos = NULL; + if (parm) + { + pos = strchr (parm, ' '); + if (pos) + pos[0] = '\0'; + } + if (nick_host) + irc_display_mode (ptr_channel->window, + channel_name, set_flag, "b", nick_host, + (set_flag == '+') ? + _("sets ban on") : + _("removes ban on"), + (parm) ? parm : NULL); + + /* look for next parameter */ + if (parm && pos) + { + pos++; + while (pos[0] == ' ') + pos++; + parm = pos; + } + break; + case 'i': + if (nick_host) + irc_display_mode (ptr_channel->window, + channel_name, set_flag, "i", nick_host, + (set_flag == '+') ? + _("sets invite-only channel flag") : + _("removes invite-only channel flag"), + NULL); + SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), + CHANNEL_MODE_INVITE); + break; + case 'k': + pos = NULL; + if (parm) + { + pos = strchr (parm, ' '); + if (pos) + pos[0] = '\0'; + } + if (nick_host) + irc_display_mode (ptr_channel->window, + channel_name, set_flag, "k", nick_host, + (set_flag == '+') ? + _("sets channel key to") : + _("removes channel key"), + (set_flag == '+') ? + ((parm) ? parm : NULL) : + NULL); + SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), + CHANNEL_MODE_KEY); + if (ptr_channel->key) + free (ptr_channel->key); + ptr_channel->key = strdup (parm); + + /* look for next parameter */ + if (parm && pos) + { + pos++; + while (pos[0] == ' ') + pos++; + parm = pos; + } + break; + case 'l': + pos = NULL; + if (parm) + { + pos = strchr (parm, ' '); + if (pos) + pos[0] = '\0'; + } + if (nick_host) + irc_display_mode (ptr_channel->window, + channel_name, set_flag, "l", nick_host, + (set_flag == '+') ? + _("sets the user limit to") : + _("removes user limit"), + (set_flag == '+') ? + ((parm) ? parm : NULL) : + NULL); + SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), + CHANNEL_MODE_LIMIT); + ptr_channel->limit = atoi (parm); + + /* look for next parameter */ + if (parm && pos) + { + pos++; + while (pos[0] == ' ') + pos++; + parm = pos; + } + break; + case 'm': + if (nick_host) + irc_display_mode (ptr_channel->window, + channel_name, set_flag, "m", nick_host, + (set_flag == '+') ? + _("sets moderated channel flag") : + _("removes moderated channel flag"), + NULL); + SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), + CHANNEL_MODE_MODERATED); + break; + case 'n': + if (nick_host) + irc_display_mode (ptr_channel->window, + channel_name, set_flag, "n", nick_host, + (set_flag == '+') ? + _("sets messages from channel only flag") : + _("removes messages from channel only flag"), + NULL); + SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), + CHANNEL_MODE_NO_MSG_OUT); + break; + case 'o': + pos = NULL; + if (parm) + { + pos = strchr (parm, ' '); + if (pos) + pos[0] = '\0'; + } + if (nick_host) + irc_display_mode (ptr_channel->window, + channel_name, set_flag, "o", nick_host, + (set_flag == '+') ? + _("gives channel operator status to") : + _("removes channel operator status from"), + (parm) ? parm : NULL); + if (parm) + { + ptr_nick = nick_search (ptr_channel, parm); + if (ptr_nick) + { + ptr_nick->is_op = (set_flag == '+') ? 1 : 0; + nick_resort (ptr_channel, ptr_nick); + gui_redraw_window_nick (ptr_channel->window); + } + } + + /* look for next parameter */ + if (parm && pos) + { + pos++; + while (pos[0] == ' ') + pos++; + parm = pos; + } + break; + case 'p': + if (nick_host) + irc_display_mode (ptr_channel->window, + channel_name, set_flag, "p", nick_host, + (set_flag == '+') ? + _("sets private channel flag") : + _("removes private channel flag"), + NULL); + SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), + CHANNEL_MODE_SECRET); + break; + case 's': + if (nick_host) + irc_display_mode (ptr_channel->window, + channel_name, set_flag, "s", nick_host, + (set_flag == '+') ? + _("sets secret channel flag") : + _("removes secret channel flag"), + NULL); + SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), + CHANNEL_MODE_SECRET); + break; + case 't': + if (nick_host) + irc_display_mode (ptr_channel->window, + channel_name, set_flag, "t", nick_host, + (set_flag == '+') ? + _("sets topic protection") : + _("removes topic protection"), + NULL); + SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), + CHANNEL_MODE_TOPIC); + break; + case 'v': + pos = NULL; + if (parm) + { + pos = strchr (parm, ' '); + if (pos) + pos[0] = '\0'; + } + if (nick_host) + irc_display_mode (ptr_channel->window, + channel_name, set_flag, "v", nick_host, + (set_flag == '+') ? + _("gives voice to") : + _("removes voice from"), + (parm) ? parm : NULL); + + if (parm) + { + ptr_nick = nick_search (ptr_channel, parm); + if (ptr_nick) + { + ptr_nick->has_voice = (set_flag == '+') ? 1 : 0; + nick_resort (ptr_channel, ptr_nick); + gui_redraw_window_nick (ptr_channel->window); + } + } + + /* look for next parameter */ + if (parm && pos) + { + pos++; + while (pos[0] == ' ') + pos++; + parm = pos; + } + break; + } + modes++; + } +} + +/* * irc_cmd_recv_mode: 'mode' message received */ int irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) { - char *pos, *pos2, *pos_parm; - char set_flag; + char *pos, *pos_parm; t_irc_channel *ptr_channel; - t_irc_nick *ptr_nick; /* no host => we can't identify sender of message! */ if (host == NULL) @@ -319,186 +567,12 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) pos_parm++; } - set_flag = '+'; - if (string_is_channel (arguments)) { ptr_channel = channel_search (server, arguments); if (ptr_channel) { - /* channel modes */ - while (pos && pos[0]) - { - switch (pos[0]) - { - case '+': - set_flag = '+'; - break; - case '-': - set_flag = '-'; - break; - case 'b': - irc_display_mode (ptr_channel->window, - arguments, set_flag, "b", host, - (set_flag == '+') ? - _("sets ban on") : - _("removes ban on"), - pos_parm); - break; - case 'i': - irc_display_mode (ptr_channel->window, - arguments, set_flag, "i", host, - (set_flag == '+') ? - _("sets invite-only channel flag") : - _("removes invite-only channel flag"), - NULL); - SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), - CHANNEL_MODE_INVITE); - break; - case 'k': - pos2 = NULL; - if (pos_parm) - { - pos2 = strchr (pos_parm, ' '); - if (pos2) - pos2[0] = '\0'; - } - irc_display_mode (ptr_channel->window, - arguments, set_flag, "k", host, - (set_flag == '+') ? - _("sets channel key to") : - _("removes channel key"), - (set_flag == '+') ? - ((pos_parm) ? pos_parm : NULL) : - NULL); - SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), - CHANNEL_MODE_KEY); - if (ptr_channel->key) - free (ptr_channel->key); - ptr_channel->key = strdup (pos_parm); - - /* look for next parameter */ - if (pos_parm && pos2) - { - pos2++; - while (pos2[0] == ' ') - pos2++; - pos_parm = pos2; - } - break; - case 'l': - pos2 = NULL; - if (pos_parm) - { - pos2 = strchr (pos_parm, ' '); - if (pos2) - pos2[0] = '\0'; - } - irc_display_mode (ptr_channel->window, - arguments, set_flag, "l", host, - (set_flag == '+') ? - _("sets the user limit to") : - _("removes user limit"), - (set_flag == '+') ? - ((pos_parm) ? pos_parm : NULL) : - NULL); - SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), - CHANNEL_MODE_LIMIT); - ptr_channel->limit = atoi (pos_parm); - - /* look for next parameter */ - if (pos_parm && pos2) - { - pos2++; - while (pos2[0] == ' ') - pos2++; - pos_parm = pos2; - } - break; - case 'm': - irc_display_mode (ptr_channel->window, - arguments, set_flag, "m", host, - (set_flag == '+') ? - _("sets moderated channel flag") : - _("removes moderated channel flag"), - NULL); - SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), - CHANNEL_MODE_MODERATED); - break; - case 'n': - irc_display_mode (ptr_channel->window, - arguments, set_flag, "n", host, - (set_flag == '+') ? - _("sets messages from channel only flag") : - _("removes messages from channel only flag"), - NULL); - SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), - CHANNEL_MODE_NO_MSG_OUT); - break; - case 'o': - irc_display_mode (ptr_channel->window, - arguments, set_flag, "o", host, - (set_flag == '+') ? - _("gives channel operator status to") : - _("removes channel operator status from"), - pos_parm); - ptr_nick = nick_search (ptr_channel, pos_parm); - if (ptr_nick) - { - ptr_nick->is_op = (set_flag == '+') ? 1 : 0; - nick_resort (ptr_channel, ptr_nick); - gui_redraw_window_nick (ptr_channel->window); - } - break; - case 'p': - irc_display_mode (ptr_channel->window, - arguments, set_flag, "p", host, - (set_flag == '+') ? - _("sets private channel flag") : - _("removes private channel flag"), - NULL); - SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), - CHANNEL_MODE_SECRET); - break; - case 's': - irc_display_mode (ptr_channel->window, - arguments, set_flag, "s", host, - (set_flag == '+') ? - _("sets secret channel flag") : - _("removes secret channel flag"), - NULL); - SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), - CHANNEL_MODE_SECRET); - break; - case 't': - irc_display_mode (ptr_channel->window, - arguments, set_flag, "t", host, - (set_flag == '+') ? - _("sets topic protection") : - _("removes topic protection"), - NULL); - SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), - CHANNEL_MODE_TOPIC); - break; - case 'v': - irc_display_mode (ptr_channel->window, - arguments, set_flag, "v", host, - (set_flag == '+') ? - _("gives voice to") : - _("removes voice from"), - pos_parm); - - ptr_nick = nick_search (ptr_channel, pos_parm); - if (ptr_nick) - { - ptr_nick->has_voice = (set_flag == '+') ? 1 : 0; - nick_resort (ptr_channel, ptr_nick); - gui_redraw_window_nick (ptr_channel->window); - } - break; - } - pos++; - } + irc_get_channel_modes (ptr_channel, arguments, host, pos, pos_parm); gui_draw_window_status (gui_current_window); } else @@ -2135,6 +2209,69 @@ irc_cmd_recv_323 (t_irc_server *server, char *host, char *arguments) } /* + * irc_cmd_recv_324: '324' command (channel mode) + */ + +int +irc_cmd_recv_324 (t_irc_server *server, char *host, char *arguments) +{ + char *pos_chan, *pos, *pos_parm; + t_irc_channel *ptr_channel; + + /* make gcc happy */ + (void) host; + + pos_chan = strchr (arguments, ' '); + if (pos_chan) + { + pos_chan[0] = '\0'; + pos_chan++; + while (pos_chan[0] == ' ') + pos_chan++; + + pos = strchr (pos_chan, ' '); + if (pos) + { + pos[0] = '\0'; + pos++; + while (pos[0] == ' ') + pos++; + + pos_parm = strchr (pos, ' '); + if (pos_parm) + { + pos_parm[0] = '\0'; + pos_parm++; + while (pos_parm[0] == ' ') + pos_parm++; + } + ptr_channel = channel_search (server, pos_chan); + if (ptr_channel) + { + irc_get_channel_modes (ptr_channel, NULL, NULL, pos, pos_parm); + gui_draw_window_status (gui_current_window); + } + } + } + return 0; +} + +/* + * irc_cmd_recv_329: '329' command (???) + */ + +int +irc_cmd_recv_329 (t_irc_server *server, char *host, char *arguments) +{ + /* make gcc happy */ + (void) server; + (void) host; + (void) arguments; + + return 0; +} + +/* * irc_cmd_recv_331: '331' command received (no topic for channel) */ @@ -2643,6 +2780,7 @@ irc_cmd_recv_366 (t_irc_server *server, char *host, char *arguments) _("normal")); gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, ")\n"); + irc_cmd_send_mode (server, ptr_channel->name); } else { diff --git a/src/irc/irc.h b/src/irc/irc.h index 1ad068aed..1279f7444 100644 --- a/src/irc/irc.h +++ b/src/irc/irc.h @@ -295,6 +295,8 @@ extern int irc_cmd_recv_320 (t_irc_server *, char *, char *); extern int irc_cmd_recv_321 (t_irc_server *, char *, char *); extern int irc_cmd_recv_322 (t_irc_server *, char *, char *); extern int irc_cmd_recv_323 (t_irc_server *, char *, char *); +extern int irc_cmd_recv_324 (t_irc_server *, char *, char *); +extern int irc_cmd_recv_329 (t_irc_server *, char *, char *); extern int irc_cmd_recv_331 (t_irc_server *, char *, char *); extern int irc_cmd_recv_332 (t_irc_server *, char *, char *); extern int irc_cmd_recv_333 (t_irc_server *, char *, char *); |