diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2004-02-29 16:31:26 +0000 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2004-02-29 16:31:26 +0000 |
commit | 81da0f41d7053f0358784b560b302b86e464b290 (patch) | |
tree | 0a90a9580eb50493e81211729bc8fca5ccf66673 /src/irc | |
parent | 070e1b6ec73d1cc1ef6dd56d445e2c6995dce9ae (diff) | |
download | weechat-81da0f41d7053f0358784b560b302b86e464b290.zip |
Added modes channel (and /mode command is now ok), dcc skeleton, fixed display bug for nicklist
Diffstat (limited to 'src/irc')
-rw-r--r-- | src/irc/Makefile.am | 1 | ||||
-rw-r--r-- | src/irc/irc-channel.c | 5 | ||||
-rw-r--r-- | src/irc/irc-commands.c | 6 | ||||
-rw-r--r-- | src/irc/irc-recv.c | 284 | ||||
-rw-r--r-- | src/irc/irc-send.c | 11 | ||||
-rw-r--r-- | src/irc/irc.h | 23 |
6 files changed, 252 insertions, 78 deletions
diff --git a/src/irc/Makefile.am b/src/irc/Makefile.am index 8bdc84cd8..5a0d5a5a7 100644 --- a/src/irc/Makefile.am +++ b/src/irc/Makefile.am @@ -26,4 +26,5 @@ lib_weechat_irc_a_SOURCES = irc.h \ irc-server.c \ irc-channel.c \ irc-nick.c \ + irc-dcc.c \ irc-display.c diff --git a/src/irc/irc-channel.c b/src/irc/irc-channel.c index 06dcd338a..7095d2053 100644 --- a/src/irc/irc-channel.c +++ b/src/irc/irc-channel.c @@ -32,6 +32,7 @@ t_irc_channel *current_channel = NULL; +char *channel_modes = "iklmnst"; /* @@ -55,6 +56,10 @@ channel_new (t_irc_server *server, int channel_type, char *channel_name, new_channel->type = channel_type; new_channel->name = strdup (channel_name); new_channel->topic = NULL; + memset (new_channel->modes, ' ', sizeof (new_channel->modes)); + new_channel->modes[sizeof (new_channel->modes) - 1] = '\0'; + new_channel->limit = 0; + new_channel->key = NULL; new_channel->nicks = NULL; new_channel->last_nick = NULL; diff --git a/src/irc/irc-commands.c b/src/irc/irc-commands.c index d3bc5bd8c..7acb23d70 100644 --- a/src/irc/irc-commands.c +++ b/src/irc/irc-commands.c @@ -44,6 +44,12 @@ t_irc_command irc_commands[] = N_("nickname type"), N_("nickname: user to send ctcp to\ntype: \"action\" or \"version\""), 2, MAX_ARGS, 1, NULL, irc_cmd_send_ctcp, NULL }, + { "dcc", N_("starts DCC (file or chat)"), + N_("action nickname [file]"), + N_("action: 'send' (file) or 'chat'\n" + "nickname: nickname to send file or chat\n" + "file: filename (on local host)"), + 2, 3, 1, NULL, irc_cmd_send_dcc, NULL }, { "deop", N_("removes channel operator status from nickname(s)"), N_("nickname [nickname]"), "", 1, 1, 1, irc_cmd_send_deop, NULL, NULL }, diff --git a/src/irc/irc-recv.c b/src/irc/irc-recv.c index 31a3cf2ed..189d63cc7 100644 --- a/src/irc/irc-recv.c +++ b/src/irc/irc-recv.c @@ -317,9 +317,6 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) pos_parm++; while (pos_parm[0] == ' ') pos_parm++; - pos2 = strchr (pos_parm, ' '); - if (pos2) - pos2[0] = '\0'; } set_flag = '+'; @@ -347,7 +344,6 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) _("sets ban on") : _("removes ban on"), pos_parm); - /* TODO: change & redraw channel modes */ break; case 'i': irc_display_mode (ptr_channel->window, @@ -356,16 +352,68 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) _("sets invite-only channel flag") : _("removes invite-only channel flag"), NULL); - /* TODO: change & redraw channel modes */ + 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 : NULL); - /* TODO: change & redraw channel modes */ + (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, @@ -374,7 +422,18 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) _("sets moderated channel flag") : _("removes moderated channel flag"), NULL); - /* TODO: change & redraw channel modes */ + 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, @@ -391,7 +450,6 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) gui_redraw_window_nick (ptr_channel->window); } break; - /* TODO: remove this obsolete (?) channel flag? */ case 'p': irc_display_mode (ptr_channel->window, arguments, set_flag, "p", host, @@ -399,7 +457,8 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) _("sets private channel flag") : _("removes private channel flag"), NULL); - /* TODO: change & redraw channel modes */ + SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), + CHANNEL_MODE_SECRET); break; case 's': irc_display_mode (ptr_channel->window, @@ -408,7 +467,8 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) _("sets secret channel flag") : _("removes secret channel flag"), NULL); - /* TODO: change & redraw channel modes */ + SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), + CHANNEL_MODE_SECRET); break; case 't': irc_display_mode (ptr_channel->window, @@ -417,7 +477,8 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) _("sets topic protection") : _("removes topic protection"), NULL); - /* TODO: change & redraw channel modes */ + SET_CHANNEL_MODE(ptr_channel, (set_flag == '+'), + CHANNEL_MODE_TOPIC); break; case 'v': irc_display_mode (ptr_channel->window, @@ -438,6 +499,7 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) } pos++; } + gui_draw_window_status (gui_current_window); } else { @@ -741,6 +803,7 @@ int irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) { char *pos, *pos2, *host2; + char *pos_file, *pos_addr, *pos_port, *pos_size; /* for DCC */ t_irc_channel *ptr_channel; t_irc_nick *ptr_nick; struct utsname *buf; @@ -893,79 +956,144 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) COLOR_WIN_CHAT, _("from")); gui_printf_color (server->window, COLOR_WIN_CHAT_NICK, " %s\n", host); + return 0; } - else + + /* ping request from another user => answer */ + if (strncmp (pos, "\01PING", 5) == 0) { - /* ping request from another user => answer */ - if (strncmp (pos, "\01PING", 5) == 0) + pos += 5; + while (pos[0] == ' ') + pos++; + pos2 = strchr (pos, '\01'); + if (pos2) + pos2[0] = '\0'; + else + pos = NULL; + if (pos && !pos[0]) + pos = NULL; + if (pos) + server_sendf (server, "NOTICE %s :\01PING %s\01\r\n", + host, pos); + else + server_sendf (server, "NOTICE %s :\01PING\01\r\n", + host); + return 0; + } + + /* incoming DCC file */ + if (strncmp (pos, "\01DCC SEND", 9) == 0) + { + pos2 = strchr (pos, '\01'); + if (!pos2) { - pos += 5; - while (pos[0] == ' ') - pos++; - pos2 = strchr (pos, '\01'); - if (pos2) - pos2[0] = '\0'; - else - pos = NULL; - if (pos && !pos[0]) - pos = NULL; - if (pos) - server_sendf (server, "NOTICE %s :\01PING %s\01\r\n", - host, pos); - else - server_sendf (server, "NOTICE %s :\01PING\01\r\n", - host); + gui_printf (server->window, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); + return -1; } - else + pos2[0] = '\0'; + pos_file = pos + 9; + while (pos_file[0] == ' ') + pos_file++; + + /* look for file size */ + pos_size = strrchr (pos_file, ' '); + if (!pos_size) { - /* private message received => display it */ - ptr_channel = channel_search (server, host); - if (!ptr_channel) - { - ptr_channel = channel_new (server, CHAT_PRIVATE, host, 0); - if (!ptr_channel) - { - gui_printf (server->window, - _("%s cannot create new private window \"%s\"\n"), - WEECHAT_ERROR, host); - return -1; - } - } - if (!ptr_channel->topic) - { - ptr_channel->topic = strdup (host2); - gui_redraw_window_title (ptr_channel->window); - } - - gui_printf_color_type (ptr_channel->window, - MSG_TYPE_NICK, - COLOR_WIN_CHAT_DARK, "<"); - if (strstr (pos, server->nick)) - { - gui_printf_color_type (ptr_channel->window, - MSG_TYPE_NICK, - COLOR_WIN_CHAT_HIGHLIGHT, - "%s", host); - if ( (cfg_look_infobar_delay_highlight > 0) - && (ptr_channel->window != gui_current_window) ) - gui_infobar_printf (cfg_look_infobar_delay_highlight, - COLOR_WIN_INFOBAR_HIGHLIGHT, - _("Private %s> %s"), - host, pos); - } - else - gui_printf_color_type (ptr_channel->window, - MSG_TYPE_NICK, - COLOR_WIN_NICK_PRIVATE, - "%s", host); - gui_printf_color_type (ptr_channel->window, - MSG_TYPE_NICK, - COLOR_WIN_CHAT_DARK, "> "); - gui_printf_color_type (ptr_channel->window, - MSG_TYPE_MSG, - COLOR_WIN_CHAT, "%s\n", pos); + gui_printf (server->window, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); + return -1; + } + pos2 = pos_size; + pos_size++; + while (pos2[0] == ' ') + pos2--; + pos2[1] = '\0'; + + /* look for DCC port */ + pos_port = strrchr (pos_file, ' '); + if (!pos_port) + { + gui_printf (server->window, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); + return -1; } + pos2 = pos_port; + pos_port++; + while (pos2[0] == ' ') + pos2--; + pos2[1] = '\0'; + + /* look for DCC address (IP) */ + pos_addr = strrchr (pos_file, ' '); + if (!pos_addr) + { + gui_printf (server->window, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); + return -1; + } + pos2 = pos_addr; + pos_addr++; + while (pos2[0] == ' ') + pos2--; + pos2[1] = '\0'; + + wee_log_printf ("Incoming DCC file (NOT DEVELOPED!): " + "\"%s\", address=\"%s\", port=\"%s\", size=\"%s\"\n", + pos_file, pos_addr, pos_port, pos_size); + return 0; } + + /* private message received => display it */ + ptr_channel = channel_search (server, host); + if (!ptr_channel) + { + ptr_channel = channel_new (server, CHAT_PRIVATE, host, 0); + if (!ptr_channel) + { + gui_printf (server->window, + _("%s cannot create new private window \"%s\"\n"), + WEECHAT_ERROR, host); + return -1; + } + } + if (!ptr_channel->topic) + { + ptr_channel->topic = strdup (host2); + gui_redraw_window_title (ptr_channel->window); + } + + gui_printf_color_type (ptr_channel->window, + MSG_TYPE_NICK, + COLOR_WIN_CHAT_DARK, "<"); + if (strstr (pos, server->nick)) + { + gui_printf_color_type (ptr_channel->window, + MSG_TYPE_NICK, + COLOR_WIN_CHAT_HIGHLIGHT, + "%s", host); + if ( (cfg_look_infobar_delay_highlight > 0) + && (ptr_channel->window != gui_current_window) ) + gui_infobar_printf (cfg_look_infobar_delay_highlight, + COLOR_WIN_INFOBAR_HIGHLIGHT, + _("Private %s> %s"), + host, pos); + } + else + gui_printf_color_type (ptr_channel->window, + MSG_TYPE_NICK, + COLOR_WIN_NICK_PRIVATE, + "%s", host); + gui_printf_color_type (ptr_channel->window, + MSG_TYPE_NICK, + COLOR_WIN_CHAT_DARK, "> "); + gui_printf_color_type (ptr_channel->window, + MSG_TYPE_MSG, + COLOR_WIN_CHAT, "%s\n", pos); } else { diff --git a/src/irc/irc-send.c b/src/irc/irc-send.c index e0890d978..ff7c9bc52 100644 --- a/src/irc/irc-send.c +++ b/src/irc/irc-send.c @@ -179,6 +179,17 @@ irc_cmd_send_ctcp (t_irc_server *server, char *arguments) } /* + * irc_cmd_send_dcc: starts DCC (file or chat) + */ + +int +irc_cmd_send_dcc (t_irc_server *server, char *arguments) +{ + /* TODO: write this command! */ + return 0; +} + +/* * irc_cmd_send_deop: remove operator privileges from nickname(s) */ diff --git a/src/irc/irc.h b/src/irc/irc.h index 112018892..1ad068aed 100644 --- a/src/irc/irc.h +++ b/src/irc/irc.h @@ -34,6 +34,20 @@ #define CHANNEL_PREFIX "#&+!" +#define NUM_CHANNEL_MODES 7 +#define CHANNEL_MODE_INVITE 0 +#define CHANNEL_MODE_KEY 1 +#define CHANNEL_MODE_LIMIT 2 +#define CHANNEL_MODE_MODERATED 3 +#define CHANNEL_MODE_NO_MSG_OUT 4 +#define CHANNEL_MODE_SECRET 5 +#define CHANNEL_MODE_TOPIC 6 +#define SET_CHANNEL_MODE(channel, set, mode) \ + if (set) \ + channel->modes[mode] = channel_modes[mode]; \ + else \ + channel->modes[mode] = ' '; + #define DEFAULT_IRC_PORT 6667 /* nick types */ @@ -64,6 +78,9 @@ struct t_irc_channel int type; /* channel type */ char *name; /* name of channel (exemple: "#abc") */ char *topic; /* topic of channel (host for private) */ + char modes[NUM_CHANNEL_MODES+1];/* channel modes */ + int limit; /* user limit (0 is limit not set) */ + char *key; /* channel key (NULL if no key is set) */ t_irc_nick *nicks; /* nicks on the channel */ t_irc_nick *last_nick; /* last nick on the channel */ t_gui_window *window; /* GUI window allocated for channel */ @@ -139,6 +156,7 @@ extern t_irc_command irc_commands[]; extern t_irc_server *irc_servers, *current_irc_server; extern t_irc_message *recv_msgq, *msgq_last_msg; extern t_irc_channel *current_channel; +extern char *channel_modes; /* server functions (irc-server.c) */ @@ -180,6 +198,10 @@ extern t_irc_nick *nick_search (t_irc_channel *, char *); extern void nick_count (t_irc_channel *, int *, int *, int *, int *, int *); extern int nick_get_max_length (t_irc_channel *); +/* DCC functions (irc-dcc.c) */ + +extern void dcc_send (); + /* IRC display (irc-diplay.c) */ extern void irc_display_prefix (/*@null@*/ t_gui_window *, char *); @@ -195,6 +217,7 @@ extern void irc_login (t_irc_server *); extern int irc_cmd_send_admin (t_irc_server *, char *); extern int irc_cmd_send_away (t_irc_server *, char *); extern int irc_cmd_send_ctcp (t_irc_server *, char *); +extern int irc_cmd_send_dcc (t_irc_server *, char *); extern int irc_cmd_send_deop (t_irc_server *, int, char **); extern int irc_cmd_send_devoice (t_irc_server *, int, char **); extern int irc_cmd_send_die (t_irc_server *, char *); |