From 3ddb7477f51d3cf1632e2a8b6f7da4c0609a52cb Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Fri, 26 Mar 2010 08:14:37 -0400 Subject: One total mess that doesn't do much yet, but reorganised some stuff and untying the IRC and the core parts a little bit. Lots of work left to do. --- irc_commands.c | 115 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 59 insertions(+), 56 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index a417e0d9..81ddd588 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -1,7 +1,7 @@ /********************************************************************\ * BitlBee -- An IRC to other IM-networks gateway * * * - * Copyright 2002-2006 Wilmer van der Gaast and others * + * Copyright 2002-2010 Wilmer van der Gaast and others * \********************************************************************/ /* IRC commands */ @@ -38,7 +38,7 @@ static void irc_cmd_pass( irc_t *irc, char **cmd ) command last. (Possibly it won't send it at all if it turns out we don't require it, which will break this feature.) Try to identify using the given password. */ - return root_command( irc, send_cmd ); + /*return root_command( irc, send_cmd );*/ } /* Handling in pre-logged-in state, first see if this server is password-protected: */ @@ -52,48 +52,48 @@ static void irc_cmd_pass( irc_t *irc, char **cmd ) } else if( global.conf->auth_pass ) { - irc_reply( irc, 464, ":Incorrect password" ); + irc_send_num( irc, 464, ":Incorrect password" ); } else { /* Remember the password and try to identify after USER/NICK. */ - irc_setpass( irc, cmd[1] ); + /*irc_setpass( irc, cmd[1] ); */ irc_check_login( irc ); } } static void irc_cmd_user( irc_t *irc, char **cmd ) { - irc->user = g_strdup( cmd[1] ); - irc->realname = g_strdup( cmd[4] ); + irc->user->user = g_strdup( cmd[1] ); + irc->user->fullname = g_strdup( cmd[4] ); irc_check_login( irc ); } static void irc_cmd_nick( irc_t *irc, char **cmd ) { - if( irc->nick ) + if( irc->user->nick ) { - irc_reply( irc, 438, ":The hand of the deity is upon thee, thy nick may not change" ); + irc_send_num( irc, 438, ":The hand of the deity is upon thee, thy nick may not change" ); } - /* This is not clean, but for now it'll have to be like this... */ - else if( ( nick_cmp( cmd[1], irc->mynick ) == 0 ) || ( nick_cmp( cmd[1], NS_NICK ) == 0 ) ) + else if( irc_user_find( irc, cmd[1] ) ) { - irc_reply( irc, 433, ":This nick is already in use" ); + irc_send_num( irc, 433, ":This nick is already in use" ); } else if( !nick_ok( cmd[1] ) ) { /* [SH] Invalid characters. */ - irc_reply( irc, 432, ":This nick contains invalid characters" ); + irc_send_num( irc, 432, ":This nick contains invalid characters" ); } else { - irc->nick = g_strdup( cmd[1] ); + irc->user->nick = g_strdup( cmd[1] ); irc_check_login( irc ); } } +#if 0 static void irc_cmd_quit( irc_t *irc, char **cmd ) { if( cmd[1] && *cmd[1] ) @@ -115,11 +115,11 @@ static void irc_cmd_oper( irc_t *irc, char **cmd ) strcmp( cmd[2], global.conf->oper_pass ) == 0 ) ) { irc_umode_set( irc, "+o", 1 ); - irc_reply( irc, 381, ":Password accepted" ); + irc_send_num( irc, 381, ":Password accepted" ); } else { - irc_reply( irc, 432, ":Incorrect password" ); + irc_send_num( irc, 432, ":Incorrect password" ); } } @@ -130,12 +130,12 @@ static void irc_cmd_mode( irc_t *irc, char **cmd ) if( cmd[2] ) { if( *cmd[2] == '+' || *cmd[2] == '-' ) - irc_reply( irc, 477, "%s :Can't change channel modes", cmd[1] ); + irc_send_num( irc, 477, "%s :Can't change channel modes", cmd[1] ); else if( *cmd[2] == 'b' ) - irc_reply( irc, 368, "%s :No bans possible", cmd[1] ); + irc_send_num( irc, 368, "%s :No bans possible", cmd[1] ); } else - irc_reply( irc, 324, "%s +%s", cmd[1], CMODE ); + irc_send_num( irc, 324, "%s +%s", cmd[1], CMODE ); } else { @@ -144,10 +144,10 @@ static void irc_cmd_mode( irc_t *irc, char **cmd ) if( cmd[2] ) irc_umode_set( irc, cmd[2], 0 ); else - irc_reply( irc, 221, "+%s", irc->umode ); + irc_send_num( irc, 221, "+%s", irc->umode ); } else - irc_reply( irc, 502, ":Don't touch their modes" ); + irc_send_num( irc, 502, ":Don't touch their modes" ); } } @@ -182,7 +182,7 @@ static void irc_cmd_part( irc_t *irc, char **cmd ) } else { - irc_reply( irc, 403, "%s :No such channel", cmd[1] ); + irc_send_num( irc, 403, "%s :No such channel", cmd[1] ); } } @@ -196,11 +196,11 @@ static void irc_cmd_join( irc_t *irc, char **cmd ) struct chat *c; if( strchr( CTYPES, cmd[1][0] ) == NULL || cmd[1][1] == 0 ) - irc_reply( irc, 479, "%s :Invalid channel name", cmd[1] ); + irc_send_num( irc, 479, "%s :Invalid channel name", cmd[1] ); else if( ( c = chat_bychannel( irc, cmd[1] ) ) && c->acc && c->acc->ic ) chat_join( irc, c, cmd[2] ); else - irc_reply( irc, 403, "%s :No such channel", cmd[1] ); + irc_send_num( irc, 403, "%s :No such channel", cmd[1] ); } } @@ -214,18 +214,18 @@ static void irc_cmd_invite( irc_t *irc, char **cmd ) if( c->ic && c->ic->acc->prpl->chat_invite ) { c->ic->acc->prpl->chat_invite( c, u->handle, NULL ); - irc_reply( irc, 341, "%s %s", nick, channel ); + irc_send_num( irc, 341, "%s %s", nick, channel ); return; } - irc_reply( irc, 482, "%s :Invite impossible; User/Channel non-existent or incompatible", channel ); + irc_send_num( irc, 482, "%s :Invite impossible; User/Channel non-existent or incompatible", channel ); } static void irc_cmd_privmsg( irc_t *irc, char **cmd ) { if ( !cmd[2] ) { - irc_reply( irc, 412, ":No text to send" ); + irc_send_num( irc, 412, ":No text to send" ); } else if ( irc->nick && g_strcasecmp( cmd[1], irc->nick ) == 0 ) { @@ -282,26 +282,26 @@ static void irc_cmd_who( irc_t *irc, char **cmd ) if( !channel || *channel == '0' || *channel == '*' || !*channel ) while( u ) { - irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", u->online ? irc->channel : "*", u->user, u->host, irc->myhost, u->nick, u->online ? ( u->away ? 'G' : 'H' ) : 'G', u->realname ); + irc_send_num( irc, 352, "%s %s %s %s %s %c :0 %s", u->online ? irc->channel : "*", u->user, u->host, irc->myhost, u->nick, u->online ? ( u->away ? 'G' : 'H' ) : 'G', u->realname ); u = u->next; } else if( g_strcasecmp( channel, irc->channel ) == 0 ) while( u ) { if( u->online ) - irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->away ? 'G' : 'H', u->realname ); + irc_send_num( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->away ? 'G' : 'H', u->realname ); u = u->next; } else if( ( c = irc_chat_by_channel( irc, channel ) ) ) for( l = c->in_room; l; l = l->next ) { if( ( u = user_findhandle( c->ic, l->data ) ) ) - irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->away ? 'G' : 'H', u->realname ); + irc_send_num( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->away ? 'G' : 'H', u->realname ); } else if( ( u = user_find( irc, channel ) ) ) - irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->online ? ( u->away ? 'G' : 'H' ) : 'G', u->realname ); + irc_send_num( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->online ? ( u->away ? 'G' : 'H' ) : 'G', u->realname ); - irc_reply( irc, 315, "%s :End of /WHO list", channel?channel:"**" ); + irc_send_num( irc, 315, "%s :End of /WHO list", channel?channel:"**" ); } static void irc_cmd_userhost( irc_t *irc, char **cmd ) @@ -319,9 +319,9 @@ static void irc_cmd_userhost( irc_t *irc, char **cmd ) if( ( u = user_find( irc, cmd[i] ) ) ) { if( u->online && u->away ) - irc_reply( irc, 302, ":%s=-%s@%s", u->nick, u->user, u->host ); + irc_send_num( irc, 302, ":%s=-%s@%s", u->nick, u->user, u->host ); else - irc_reply( irc, 302, ":%s=+%s@%s", u->nick, u->user, u->host ); + irc_send_num( irc, 302, ":%s=+%s@%s", u->nick, u->user, u->host ); } } @@ -376,7 +376,7 @@ static void irc_cmd_ison( irc_t *irc, char **cmd ) if( strlen( buff ) > 0 ) buff[strlen(buff)-1] = '\0'; - irc_reply( irc, 303, ":%s", buff ); + irc_send_num( irc, 303, ":%s", buff ); } static void irc_cmd_watch( irc_t *irc, char **cmd ) @@ -405,9 +405,9 @@ static void irc_cmd_watch( irc_t *irc, char **cmd ) g_hash_table_insert( irc->watches, nick, nick ); if( u && u->online ) - irc_reply( irc, 604, "%s %s %s %d :%s", u->nick, u->user, u->host, (int) time( NULL ), "is online" ); + irc_send_num( irc, 604, "%s %s %s %d :%s", u->nick, u->user, u->host, (int) time( NULL ), "is online" ); else - irc_reply( irc, 605, "%s %s %s %d :%s", nick, "*", "*", (int) time( NULL ), "is offline" ); + irc_send_num( irc, 605, "%s %s %s %d :%s", nick, "*", "*", (int) time( NULL ), "is offline" ); } else if( cmd[i][0] == '-' ) { @@ -418,7 +418,7 @@ static void irc_cmd_watch( irc_t *irc, char **cmd ) g_hash_table_remove( irc->watches, okey ); g_free( okey ); - irc_reply( irc, 602, "%s %s %s %d :%s", nick, "*", "*", 0, "Stopped watching" ); + irc_send_num( irc, 602, "%s %s %s %d :%s", nick, "*", "*", 0, "Stopped watching" ); } } } @@ -462,7 +462,7 @@ static void irc_cmd_away( irc_t *irc, char **cmd ) j ++; u->away[j] = 0; - irc_reply( irc, 306, ":You're now away: %s", u->away ); + irc_send_num( irc, 306, ":You're now away: %s", u->away ); /* irc_umode_set( irc, irc->myhost, "+a" ); */ } else @@ -470,7 +470,7 @@ static void irc_cmd_away( irc_t *irc, char **cmd ) if( u->away ) g_free( u->away ); u->away = NULL; /* irc_umode_set( irc, irc->myhost, "-a" ); */ - irc_reply( irc, 305, ":Welcome back" ); + irc_send_num( irc, 305, ":Welcome back" ); } set_setstr( &irc->set, "away", u->away ); @@ -483,27 +483,27 @@ static void irc_cmd_whois( irc_t *irc, char **cmd ) if( u ) { - irc_reply( irc, 311, "%s %s %s * :%s", u->nick, u->user, u->host, u->realname ); + irc_send_num( irc, 311, "%s %s %s * :%s", u->nick, u->user, u->host, u->realname ); if( u->ic ) - irc_reply( irc, 312, "%s %s.%s :%s network", u->nick, u->ic->acc->user, + irc_send_num( irc, 312, "%s %s.%s :%s network", u->nick, u->ic->acc->user, u->ic->acc->server && *u->ic->acc->server ? u->ic->acc->server : "", u->ic->acc->prpl->name ); else - irc_reply( irc, 312, "%s %s :%s", u->nick, irc->myhost, IRCD_INFO ); + irc_send_num( irc, 312, "%s %s :%s", u->nick, irc->myhost, IRCD_INFO ); if( !u->online ) - irc_reply( irc, 301, "%s :%s", u->nick, "User is offline" ); + irc_send_num( irc, 301, "%s :%s", u->nick, "User is offline" ); else if( u->away ) - irc_reply( irc, 301, "%s :%s", u->nick, u->away ); + irc_send_num( irc, 301, "%s :%s", u->nick, u->away ); if( u->status_msg ) - irc_reply( irc, 333, "%s :Status: %s", u->nick, u->status_msg ); + irc_send_num( irc, 333, "%s :Status: %s", u->nick, u->status_msg ); - irc_reply( irc, 318, "%s :End of /WHOIS list", nick ); + irc_send_num( irc, 318, "%s :End of /WHOIS list", nick ); } else { - irc_reply( irc, 401, "%s :Nick does not exist", nick ); + irc_send_num( irc, 401, "%s :Nick does not exist", nick ); } } @@ -514,8 +514,8 @@ static void irc_cmd_whowas( irc_t *irc, char **cmd ) message from irssi which is a bit annoying. So just respond with not-found and irssi users will get better error messages */ - irc_reply( irc, 406, "%s :Nick does not exist", cmd[1] ); - irc_reply( irc, 369, "%s :End of WHOWAS", cmd[1] ); + irc_send_num( irc, 406, "%s :Nick does not exist", cmd[1] ); + irc_send_num( irc, 369, "%s :End of WHOWAS", cmd[1] ); } static void irc_cmd_nickserv( irc_t *irc, char **cmd ) @@ -540,7 +540,7 @@ static void irc_cmd_pong( irc_t *irc, char **cmd ) static void irc_cmd_version( irc_t *irc, char **cmd ) { - irc_reply( irc, 351, "bitlbee-%s. %s :%s/%s ", BITLBEE_VERSION, irc->myhost, ARCH, CPU ); + irc_send_num( irc, 351, "bitlbee-%s. %s :%s/%s ", BITLBEE_VERSION, irc->myhost, ARCH, CPU ); } static void irc_cmd_completions( irc_t *irc, char **cmd ) @@ -571,13 +571,15 @@ static void irc_cmd_rehash( irc_t *irc, char **cmd ) else ipc_to_master( cmd ); - irc_reply( irc, 382, "%s :Rehashing", global.conf_file ); + irc_send_num( irc, 382, "%s :Rehashing", global.conf_file ); } +#endif static const command_t irc_commands[] = { { "pass", 1, irc_cmd_pass, 0 }, { "user", 4, irc_cmd_user, IRC_CMD_PRE_LOGIN }, { "nick", 1, irc_cmd_nick, 0 }, +#if 0 { "quit", 0, irc_cmd_quit, 0 }, { "ping", 0, irc_cmd_ping, 0 }, { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, @@ -609,6 +611,7 @@ static const command_t irc_commands[] = { { "rehash", 0, irc_cmd_rehash, IRC_CMD_OPER_ONLY }, { "restart", 0, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, { "kill", 2, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, +#endif { NULL } }; @@ -627,19 +630,19 @@ void irc_exec( irc_t *irc, char *cmd[] ) if( irc_commands[i].flags & IRC_CMD_PRE_LOGIN && irc->status & USTATUS_LOGGED_IN ) { - irc_reply( irc, 462, ":Only allowed before logging in" ); + irc_send_num( irc, 462, ":Only allowed before logging in" ); } else if( irc_commands[i].flags & IRC_CMD_LOGGED_IN && !( irc->status & USTATUS_LOGGED_IN ) ) { - irc_reply( irc, 451, ":Register first" ); + irc_send_num( irc, 451, ":Register first" ); } else if( irc_commands[i].flags & IRC_CMD_OPER_ONLY && !strchr( irc->umode, 'o' ) ) { - irc_reply( irc, 481, ":Permission denied - You're not an IRC operator" ); + irc_send_num( irc, 481, ":Permission denied - You're not an IRC operator" ); } else if( n_arg < irc_commands[i].required_parameters ) { - irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); + irc_send_num( irc, 461, "%s :Need more parameters", cmd[0] ); } else if( irc_commands[i].flags & IRC_CMD_TO_MASTER ) { @@ -656,5 +659,5 @@ void irc_exec( irc_t *irc, char *cmd[] ) } if( irc->status >= USTATUS_LOGGED_IN ) - irc_reply( irc, 421, "%s :Unknown command", cmd[0] ); + irc_send_num( irc, 421, "%s :Unknown command", cmd[0] ); } -- cgit v1.2.3 From ebaebfe35c82460581fa6db518d8848996c9a0f4 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Fri, 26 Mar 2010 21:57:00 -0400 Subject: PING and QUIT work now, and adding some files that weren't checked in so far. --- irc_commands.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 81ddd588..7a4ba57e 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -93,7 +93,6 @@ static void irc_cmd_nick( irc_t *irc, char **cmd ) } } -#if 0 static void irc_cmd_quit( irc_t *irc, char **cmd ) { if( cmd[1] && *cmd[1] ) @@ -104,9 +103,11 @@ static void irc_cmd_quit( irc_t *irc, char **cmd ) static void irc_cmd_ping( irc_t *irc, char **cmd ) { - irc_write( irc, ":%s PONG %s :%s", irc->myhost, irc->myhost, cmd[1]?cmd[1]:irc->myhost ); + irc_write( irc, ":%s PONG %s :%s", irc->root->host, + irc->root->host, cmd[1]?cmd[1]:irc->root->host ); } +#if 0 static void irc_cmd_oper( irc_t *irc, char **cmd ) { if( global.conf->oper_pass && @@ -579,9 +580,9 @@ static const command_t irc_commands[] = { { "pass", 1, irc_cmd_pass, 0 }, { "user", 4, irc_cmd_user, IRC_CMD_PRE_LOGIN }, { "nick", 1, irc_cmd_nick, 0 }, -#if 0 { "quit", 0, irc_cmd_quit, 0 }, { "ping", 0, irc_cmd_ping, 0 }, +#if 0 { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, { "mode", 1, irc_cmd_mode, IRC_CMD_LOGGED_IN }, { "names", 0, irc_cmd_names, IRC_CMD_LOGGED_IN }, -- cgit v1.2.3 From b9e020af6c6a88392caa9edd120fb576ec971430 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Fri, 26 Mar 2010 23:04:35 -0400 Subject: Added JOIN, NAMES and PART commands. --- irc_commands.c | 109 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 53 insertions(+), 56 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 7a4ba57e..e5a97ad9 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -107,7 +107,57 @@ static void irc_cmd_ping( irc_t *irc, char **cmd ) irc->root->host, cmd[1]?cmd[1]:irc->root->host ); } +static void irc_cmd_join( irc_t *irc, char **cmd ) +{ + irc_channel_t *ic; + + if( ( ic = irc_channel_by_name( irc, cmd[1] ) ) == NULL ) + ic = irc_channel_new( irc, cmd[1] ); + + if( ic == NULL ) + irc_send_num( irc, 479, "%s :Invalid channel name", cmd[1] ); + + if( ic->flags & IRC_CHANNEL_JOINED ) + return; /* Dude, you're already there... + RFC doesn't have any reply for that though? */ + + irc_channel_add_user( ic, irc->user ); +} + +static void irc_cmd_names( irc_t *irc, char **cmd ) +{ + irc_channel_t *ic; + + if( cmd[1] && ( ic = irc_channel_by_name( irc, cmd[1] ) ) ) + irc_send_names( ic ); + /* With no args, we should show /names of all chans. Make the code + below work well if necessary. + else + { + GSList *l; + + for( l = irc->channels; l; l = l->next ) + irc_send_names( l->data ); + } + */ +} + +static void irc_cmd_part( irc_t *irc, char **cmd ) +{ + irc_channel_t *ic; + + if( ( ic = irc_channel_by_name( irc, cmd[1] ) ) == NULL ) + { + irc_send_num( irc, 403, "%s :No such channel", cmd[1] ); + } + else if( !irc_channel_del_user( ic, irc->user ) ) + { + irc_send_num( irc, 442, "%s :You're not on that channel", cmd[1] ); + } +} + #if 0 +//#if 0 static void irc_cmd_oper( irc_t *irc, char **cmd ) { if( global.conf->oper_pass && @@ -152,59 +202,6 @@ static void irc_cmd_mode( irc_t *irc, char **cmd ) } } -static void irc_cmd_names( irc_t *irc, char **cmd ) -{ - irc_names( irc, cmd[1]?cmd[1]:irc->channel ); -} - -static void irc_cmd_part( irc_t *irc, char **cmd ) -{ - struct groupchat *c; - - if( g_strcasecmp( cmd[1], irc->channel ) == 0 ) - { - user_t *u = user_find( irc, irc->nick ); - - /* Not allowed to leave control channel */ - irc_part( irc, u, irc->channel ); - irc_join( irc, u, irc->channel ); - } - else if( ( c = irc_chat_by_channel( irc, cmd[1] ) ) ) - { - user_t *u = user_find( irc, irc->nick ); - - irc_part( irc, u, c->channel ); - - if( c->ic ) - { - c->joined = 0; - c->ic->acc->prpl->chat_leave( c ); - } - } - else - { - irc_send_num( irc, 403, "%s :No such channel", cmd[1] ); - } -} - -static void irc_cmd_join( irc_t *irc, char **cmd ) -{ - if( g_strcasecmp( cmd[1], irc->channel ) == 0 ) - ; /* Dude, you're already there... - RFC doesn't have any reply for that though? */ - else if( cmd[1] ) - { - struct chat *c; - - if( strchr( CTYPES, cmd[1][0] ) == NULL || cmd[1][1] == 0 ) - irc_send_num( irc, 479, "%s :Invalid channel name", cmd[1] ); - else if( ( c = chat_bychannel( irc, cmd[1] ) ) && c->acc && c->acc->ic ) - chat_join( irc, c, cmd[2] ); - else - irc_send_num( irc, 403, "%s :No such channel", cmd[1] ); - } -} - static void irc_cmd_invite( irc_t *irc, char **cmd ) { char *nick = cmd[1], *channel = cmd[2]; @@ -582,12 +579,12 @@ static const command_t irc_commands[] = { { "nick", 1, irc_cmd_nick, 0 }, { "quit", 0, irc_cmd_quit, 0 }, { "ping", 0, irc_cmd_ping, 0 }, + { "join", 1, irc_cmd_join, IRC_CMD_LOGGED_IN }, + { "names", 1, irc_cmd_names, IRC_CMD_LOGGED_IN }, + { "part", 1, irc_cmd_part, IRC_CMD_LOGGED_IN }, #if 0 { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, { "mode", 1, irc_cmd_mode, IRC_CMD_LOGGED_IN }, - { "names", 0, irc_cmd_names, IRC_CMD_LOGGED_IN }, - { "part", 1, irc_cmd_part, IRC_CMD_LOGGED_IN }, - { "join", 1, irc_cmd_join, IRC_CMD_LOGGED_IN }, { "invite", 2, irc_cmd_invite, IRC_CMD_LOGGED_IN }, { "privmsg", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, { "notice", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, -- cgit v1.2.3 From b95932eb5a897fd264f3762493285dd7037dccba Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Fri, 26 Mar 2010 23:39:23 -0400 Subject: Added WHOIS command. --- irc_commands.c | 68 +++++++++++++++++++++------------------------------------- 1 file changed, 24 insertions(+), 44 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index e5a97ad9..fbba928a 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -156,6 +156,28 @@ static void irc_cmd_part( irc_t *irc, char **cmd ) } } +static void irc_cmd_whois( irc_t *irc, char **cmd ) +{ + char *nick = cmd[1]; + irc_user_t *iu = irc_user_find( irc, nick ); + + if( iu ) + irc_send_whois( iu ); + else + irc_send_num( irc, 401, "%s :Nick does not exist", nick ); +} + +static void irc_cmd_whowas( irc_t *irc, char **cmd ) +{ + /* For some reason irssi tries a whowas when whois fails. We can + ignore this, but then the user never gets a "user not found" + message from irssi which is a bit annoying. So just respond + with not-found and irssi users will get better error messages */ + + irc_send_num( irc, 406, "%s :Nick does not exist", cmd[1] ); + irc_send_num( irc, 369, "%s :End of WHOWAS", cmd[1] ); +} + #if 0 //#if 0 static void irc_cmd_oper( irc_t *irc, char **cmd ) @@ -474,48 +496,6 @@ static void irc_cmd_away( irc_t *irc, char **cmd ) set_setstr( &irc->set, "away", u->away ); } -static void irc_cmd_whois( irc_t *irc, char **cmd ) -{ - char *nick = cmd[1]; - user_t *u = user_find( irc, nick ); - - if( u ) - { - irc_send_num( irc, 311, "%s %s %s * :%s", u->nick, u->user, u->host, u->realname ); - - if( u->ic ) - irc_send_num( irc, 312, "%s %s.%s :%s network", u->nick, u->ic->acc->user, - u->ic->acc->server && *u->ic->acc->server ? u->ic->acc->server : "", - u->ic->acc->prpl->name ); - else - irc_send_num( irc, 312, "%s %s :%s", u->nick, irc->myhost, IRCD_INFO ); - - if( !u->online ) - irc_send_num( irc, 301, "%s :%s", u->nick, "User is offline" ); - else if( u->away ) - irc_send_num( irc, 301, "%s :%s", u->nick, u->away ); - if( u->status_msg ) - irc_send_num( irc, 333, "%s :Status: %s", u->nick, u->status_msg ); - - irc_send_num( irc, 318, "%s :End of /WHOIS list", nick ); - } - else - { - irc_send_num( irc, 401, "%s :Nick does not exist", nick ); - } -} - -static void irc_cmd_whowas( irc_t *irc, char **cmd ) -{ - /* For some reason irssi tries a whowas when whois fails. We can - ignore this, but then the user never gets a "user not found" - message from irssi which is a bit annoying. So just respond - with not-found and irssi users will get better error messages */ - - irc_send_num( irc, 406, "%s :Nick does not exist", cmd[1] ); - irc_send_num( irc, 369, "%s :End of WHOWAS", cmd[1] ); -} - static void irc_cmd_nickserv( irc_t *irc, char **cmd ) { /* [SH] This aliases the NickServ command to PRIVMSG root */ @@ -582,6 +562,8 @@ static const command_t irc_commands[] = { { "join", 1, irc_cmd_join, IRC_CMD_LOGGED_IN }, { "names", 1, irc_cmd_names, IRC_CMD_LOGGED_IN }, { "part", 1, irc_cmd_part, IRC_CMD_LOGGED_IN }, + { "whois", 1, irc_cmd_whois, IRC_CMD_LOGGED_IN }, + { "whowas", 1, irc_cmd_whowas, IRC_CMD_LOGGED_IN }, #if 0 { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, { "mode", 1, irc_cmd_mode, IRC_CMD_LOGGED_IN }, @@ -594,8 +576,6 @@ static const command_t irc_commands[] = { { "watch", 1, irc_cmd_watch, IRC_CMD_LOGGED_IN }, { "topic", 1, irc_cmd_topic, IRC_CMD_LOGGED_IN }, { "away", 0, irc_cmd_away, IRC_CMD_LOGGED_IN }, - { "whois", 1, irc_cmd_whois, IRC_CMD_LOGGED_IN }, - { "whowas", 1, irc_cmd_whowas, IRC_CMD_LOGGED_IN }, { "nickserv", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, { "ns", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, { "motd", 0, irc_cmd_motd, IRC_CMD_LOGGED_IN }, -- cgit v1.2.3 From 9b69eb789bdcb3667c4cc4ac74f3404ae3f60869 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 27 Mar 2010 08:34:44 -0400 Subject: MOTD command added since, well, I had all the code for it already anyway. --- irc_commands.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index fbba928a..36807c54 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -178,6 +178,11 @@ static void irc_cmd_whowas( irc_t *irc, char **cmd ) irc_send_num( irc, 369, "%s :End of WHOWAS", cmd[1] ); } +static void irc_cmd_motd( irc_t *irc, char **cmd ) +{ + irc_send_motd( irc ); +} + #if 0 //#if 0 static void irc_cmd_oper( irc_t *irc, char **cmd ) @@ -243,11 +248,11 @@ static void irc_cmd_invite( irc_t *irc, char **cmd ) static void irc_cmd_privmsg( irc_t *irc, char **cmd ) { - if ( !cmd[2] ) + if( !cmd[2] ) { irc_send_num( irc, 412, ":No text to send" ); } - else if ( irc->nick && g_strcasecmp( cmd[1], irc->nick ) == 0 ) + else if( irc->nick && g_strcasecmp( cmd[1], irc->nick ) == 0 ) { irc_write( irc, ":%s!%s@%s %s %s :%s", irc->nick, irc->user, irc->host, cmd[0], cmd[1], cmd[2] ); } @@ -503,11 +508,6 @@ static void irc_cmd_nickserv( irc_t *irc, char **cmd ) root_command( irc, cmd + 1 ); } -static void irc_cmd_motd( irc_t *irc, char **cmd ) -{ - irc_motd( irc ); -} - static void irc_cmd_pong( irc_t *irc, char **cmd ) { /* We could check the value we get back from the user, but in @@ -564,6 +564,7 @@ static const command_t irc_commands[] = { { "part", 1, irc_cmd_part, IRC_CMD_LOGGED_IN }, { "whois", 1, irc_cmd_whois, IRC_CMD_LOGGED_IN }, { "whowas", 1, irc_cmd_whowas, IRC_CMD_LOGGED_IN }, + { "motd", 0, irc_cmd_motd, IRC_CMD_LOGGED_IN }, #if 0 { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, { "mode", 1, irc_cmd_mode, IRC_CMD_LOGGED_IN }, @@ -578,7 +579,6 @@ static const command_t irc_commands[] = { { "away", 0, irc_cmd_away, IRC_CMD_LOGGED_IN }, { "nickserv", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, { "ns", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, - { "motd", 0, irc_cmd_motd, IRC_CMD_LOGGED_IN }, { "pong", 0, irc_cmd_pong, IRC_CMD_LOGGED_IN }, { "version", 0, irc_cmd_version, IRC_CMD_LOGGED_IN }, { "completions", 0, irc_cmd_completions, IRC_CMD_LOGGED_IN }, -- cgit v1.2.3 From b91936398b8ada486e246f769f1f8b8836fa3f43 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 27 Mar 2010 10:31:03 -0400 Subject: Mode stuff. Also disallow unsetting +R umode which was possible so far (and shouldn't be). --- irc_commands.c | 50 +++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 36807c54..5f9ae39f 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -183,29 +183,15 @@ static void irc_cmd_motd( irc_t *irc, char **cmd ) irc_send_motd( irc ); } -#if 0 -//#if 0 -static void irc_cmd_oper( irc_t *irc, char **cmd ) -{ - if( global.conf->oper_pass && - ( strncmp( global.conf->oper_pass, "md5:", 4 ) == 0 ? - md5_verify_password( cmd[2], global.conf->oper_pass + 4 ) == 0 : - strcmp( cmd[2], global.conf->oper_pass ) == 0 ) ) - { - irc_umode_set( irc, "+o", 1 ); - irc_send_num( irc, 381, ":Password accepted" ); - } - else - { - irc_send_num( irc, 432, ":Incorrect password" ); - } -} - static void irc_cmd_mode( irc_t *irc, char **cmd ) { - if( strchr( CTYPES, *cmd[1] ) ) + if( irc_channel_name_ok( cmd[1] ) ) { - if( cmd[2] ) + irc_channel_t *ic; + + if( ( ic = irc_channel_by_name( irc, cmd[1] ) ) == NULL ) + irc_send_num( irc, 403, "%s :No such channel", cmd[1] ); + else if( cmd[2] ) { if( *cmd[2] == '+' || *cmd[2] == '-' ) irc_send_num( irc, 477, "%s :Can't change channel modes", cmd[1] ); @@ -213,11 +199,11 @@ static void irc_cmd_mode( irc_t *irc, char **cmd ) irc_send_num( irc, 368, "%s :No bans possible", cmd[1] ); } else - irc_send_num( irc, 324, "%s +%s", cmd[1], CMODE ); + irc_send_num( irc, 324, "%s +%s", cmd[1], ic->mode ); } else { - if( nick_cmp( cmd[1], irc->nick ) == 0 ) + if( nick_cmp( cmd[1], irc->user->nick ) == 0 ) { if( cmd[2] ) irc_umode_set( irc, cmd[2], 0 ); @@ -229,6 +215,24 @@ static void irc_cmd_mode( irc_t *irc, char **cmd ) } } +#if 0 +//#if 0 +static void irc_cmd_oper( irc_t *irc, char **cmd ) +{ + if( global.conf->oper_pass && + ( strncmp( global.conf->oper_pass, "md5:", 4 ) == 0 ? + md5_verify_password( cmd[2], global.conf->oper_pass + 4 ) == 0 : + strcmp( cmd[2], global.conf->oper_pass ) == 0 ) ) + { + irc_umode_set( irc, "+o", 1 ); + irc_send_num( irc, 381, ":Password accepted" ); + } + else + { + irc_send_num( irc, 432, ":Incorrect password" ); + } +} + static void irc_cmd_invite( irc_t *irc, char **cmd ) { char *nick = cmd[1], *channel = cmd[2]; @@ -565,9 +569,9 @@ static const command_t irc_commands[] = { { "whois", 1, irc_cmd_whois, IRC_CMD_LOGGED_IN }, { "whowas", 1, irc_cmd_whowas, IRC_CMD_LOGGED_IN }, { "motd", 0, irc_cmd_motd, IRC_CMD_LOGGED_IN }, + { "mode", 1, irc_cmd_mode, IRC_CMD_LOGGED_IN }, #if 0 { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, - { "mode", 1, irc_cmd_mode, IRC_CMD_LOGGED_IN }, { "invite", 2, irc_cmd_invite, IRC_CMD_LOGGED_IN }, { "privmsg", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, { "notice", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, -- cgit v1.2.3 From 2f53ada73d7d43b538c157563ab5eb39b7592137 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 27 Mar 2010 11:16:16 -0400 Subject: /WHO --- irc_commands.c | 49 ++++++++++++++++--------------------------------- 1 file changed, 16 insertions(+), 33 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 5f9ae39f..b06e59bd 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -215,6 +215,21 @@ static void irc_cmd_mode( irc_t *irc, char **cmd ) } } +static void irc_cmd_who( irc_t *irc, char **cmd ) +{ + char *channel = cmd[1]; + irc_channel_t *ic; + struct groupchat *c; + GList *l; + + if( !channel || *channel == '0' || *channel == '*' || !*channel ) + irc_send_who( irc, irc->users, "**" ); + else if( ( ic = irc_channel_by_name( irc, channel ) ) ) + irc_send_who( irc, ic->users, channel ); + else + irc_send_num( irc, 403, "%s :No such channel", channel ); +} + #if 0 //#if 0 static void irc_cmd_oper( irc_t *irc, char **cmd ) @@ -301,38 +316,6 @@ static void irc_cmd_privmsg( irc_t *irc, char **cmd ) } } -static void irc_cmd_who( irc_t *irc, char **cmd ) -{ - char *channel = cmd[1]; - user_t *u = irc->users; - struct groupchat *c; - GList *l; - - if( !channel || *channel == '0' || *channel == '*' || !*channel ) - while( u ) - { - irc_send_num( irc, 352, "%s %s %s %s %s %c :0 %s", u->online ? irc->channel : "*", u->user, u->host, irc->myhost, u->nick, u->online ? ( u->away ? 'G' : 'H' ) : 'G', u->realname ); - u = u->next; - } - else if( g_strcasecmp( channel, irc->channel ) == 0 ) - while( u ) - { - if( u->online ) - irc_send_num( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->away ? 'G' : 'H', u->realname ); - u = u->next; - } - else if( ( c = irc_chat_by_channel( irc, channel ) ) ) - for( l = c->in_room; l; l = l->next ) - { - if( ( u = user_findhandle( c->ic, l->data ) ) ) - irc_send_num( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->away ? 'G' : 'H', u->realname ); - } - else if( ( u = user_find( irc, channel ) ) ) - irc_send_num( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->online ? ( u->away ? 'G' : 'H' ) : 'G', u->realname ); - - irc_send_num( irc, 315, "%s :End of /WHO list", channel?channel:"**" ); -} - static void irc_cmd_userhost( irc_t *irc, char **cmd ) { user_t *u; @@ -570,12 +553,12 @@ static const command_t irc_commands[] = { { "whowas", 1, irc_cmd_whowas, IRC_CMD_LOGGED_IN }, { "motd", 0, irc_cmd_motd, IRC_CMD_LOGGED_IN }, { "mode", 1, irc_cmd_mode, IRC_CMD_LOGGED_IN }, + { "who", 0, irc_cmd_who, IRC_CMD_LOGGED_IN }, #if 0 { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, { "invite", 2, irc_cmd_invite, IRC_CMD_LOGGED_IN }, { "privmsg", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, { "notice", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, - { "who", 0, irc_cmd_who, IRC_CMD_LOGGED_IN }, { "userhost", 1, irc_cmd_userhost, IRC_CMD_LOGGED_IN }, { "ison", 1, irc_cmd_ison, IRC_CMD_LOGGED_IN }, { "watch", 1, irc_cmd_watch, IRC_CMD_LOGGED_IN }, -- cgit v1.2.3 From 280c56a7b24dc08b35a1ecd98c8f4b61435d1100 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 27 Mar 2010 13:36:47 -0400 Subject: Added privmsg handlers to users/channels. root commands are coming back. --- irc_commands.c | 99 +++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 60 insertions(+), 39 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index b06e59bd..e5c6a95f 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -76,7 +76,7 @@ static void irc_cmd_nick( irc_t *irc, char **cmd ) { irc_send_num( irc, 438, ":The hand of the deity is upon thee, thy nick may not change" ); } - else if( irc_user_find( irc, cmd[1] ) ) + else if( irc_user_by_name( irc, cmd[1] ) ) { irc_send_num( irc, 433, ":This nick is already in use" ); } @@ -159,7 +159,7 @@ static void irc_cmd_part( irc_t *irc, char **cmd ) static void irc_cmd_whois( irc_t *irc, char **cmd ) { char *nick = cmd[1]; - irc_user_t *iu = irc_user_find( irc, nick ); + irc_user_t *iu = irc_user_by_name( irc, nick ); if( iu ) irc_send_whois( iu ); @@ -219,8 +219,6 @@ static void irc_cmd_who( irc_t *irc, char **cmd ) { char *channel = cmd[1]; irc_channel_t *ic; - struct groupchat *c; - GList *l; if( !channel || *channel == '0' || *channel == '*' || !*channel ) irc_send_who( irc, irc->users, "**" ); @@ -230,50 +228,35 @@ static void irc_cmd_who( irc_t *irc, char **cmd ) irc_send_num( irc, 403, "%s :No such channel", channel ); } -#if 0 -//#if 0 -static void irc_cmd_oper( irc_t *irc, char **cmd ) +static void irc_cmd_privmsg( irc_t *irc, char **cmd ) { - if( global.conf->oper_pass && - ( strncmp( global.conf->oper_pass, "md5:", 4 ) == 0 ? - md5_verify_password( cmd[2], global.conf->oper_pass + 4 ) == 0 : - strcmp( cmd[2], global.conf->oper_pass ) == 0 ) ) + irc_channel_t *ic; + irc_user_t *iu; + + if( !cmd[2] ) { - irc_umode_set( irc, "+o", 1 ); - irc_send_num( irc, 381, ":Password accepted" ); + irc_send_num( irc, 412, ":No text to send" ); + } + else if( irc_channel_name_ok( cmd[1] ) && + ( ic = irc_channel_by_name( irc, cmd[1] ) ) ) + { + if( ic->f->privmsg ) + ic->f->privmsg( ic, cmd[2] ); + } + else if( ( iu = irc_user_by_name( irc, cmd[1] ) ) ) + { + if( iu->f->privmsg ) + iu->f->privmsg( iu, cmd[2] ); } else { - irc_send_num( irc, 432, ":Incorrect password" ); + irc_send_num( irc, 401, "%s :No such nick/channel", cmd[1] ); } -} -static void irc_cmd_invite( irc_t *irc, char **cmd ) -{ - char *nick = cmd[1], *channel = cmd[2]; - struct groupchat *c = irc_chat_by_channel( irc, channel ); - user_t *u = user_find( irc, nick ); - - if( u && c && ( u->ic == c->ic ) ) - if( c->ic && c->ic->acc->prpl->chat_invite ) - { - c->ic->acc->prpl->chat_invite( c, u->handle, NULL ); - irc_send_num( irc, 341, "%s %s", nick, channel ); - return; - } - - irc_send_num( irc, 482, "%s :Invite impossible; User/Channel non-existent or incompatible", channel ); -} -static void irc_cmd_privmsg( irc_t *irc, char **cmd ) -{ - if( !cmd[2] ) - { - irc_send_num( irc, 412, ":No text to send" ); - } +#if 0 else if( irc->nick && g_strcasecmp( cmd[1], irc->nick ) == 0 ) { - irc_write( irc, ":%s!%s@%s %s %s :%s", irc->nick, irc->user, irc->host, cmd[0], cmd[1], cmd[2] ); } else { @@ -314,6 +297,44 @@ static void irc_cmd_privmsg( irc_t *irc, char **cmd ) } irc_send( irc, cmd[1], cmd[2], ( g_strcasecmp( cmd[0], "NOTICE" ) == 0 ) ? OPT_AWAY : 0 ); } +#endif +} + + + +#if 0 +//#if 0 +static void irc_cmd_oper( irc_t *irc, char **cmd ) +{ + if( global.conf->oper_pass && + ( strncmp( global.conf->oper_pass, "md5:", 4 ) == 0 ? + md5_verify_password( cmd[2], global.conf->oper_pass + 4 ) == 0 : + strcmp( cmd[2], global.conf->oper_pass ) == 0 ) ) + { + irc_umode_set( irc, "+o", 1 ); + irc_send_num( irc, 381, ":Password accepted" ); + } + else + { + irc_send_num( irc, 432, ":Incorrect password" ); + } +} + +static void irc_cmd_invite( irc_t *irc, char **cmd ) +{ + char *nick = cmd[1], *channel = cmd[2]; + struct groupchat *c = irc_chat_by_channel( irc, channel ); + user_t *u = user_find( irc, nick ); + + if( u && c && ( u->ic == c->ic ) ) + if( c->ic && c->ic->acc->prpl->chat_invite ) + { + c->ic->acc->prpl->chat_invite( c, u->handle, NULL ); + irc_send_num( irc, 341, "%s %s", nick, channel ); + return; + } + + irc_send_num( irc, 482, "%s :Invite impossible; User/Channel non-existent or incompatible", channel ); } static void irc_cmd_userhost( irc_t *irc, char **cmd ) @@ -554,10 +575,10 @@ static const command_t irc_commands[] = { { "motd", 0, irc_cmd_motd, IRC_CMD_LOGGED_IN }, { "mode", 1, irc_cmd_mode, IRC_CMD_LOGGED_IN }, { "who", 0, irc_cmd_who, IRC_CMD_LOGGED_IN }, + { "privmsg", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, #if 0 { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, { "invite", 2, irc_cmd_invite, IRC_CMD_LOGGED_IN }, - { "privmsg", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, { "notice", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, { "userhost", 1, irc_cmd_userhost, IRC_CMD_LOGGED_IN }, { "ison", 1, irc_cmd_ison, IRC_CMD_LOGGED_IN }, -- cgit v1.2.3 From 3923003fb56f3b13eba1fa44c900175ae2574a1c Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 27 Mar 2010 22:49:19 -0400 Subject: Restored server-initiated PINGs. --- irc_commands.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index e5c6a95f..858b5bdd 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -107,6 +107,14 @@ static void irc_cmd_ping( irc_t *irc, char **cmd ) irc->root->host, cmd[1]?cmd[1]:irc->root->host ); } +static void irc_cmd_pong( irc_t *irc, char **cmd ) +{ + /* We could check the value we get back from the user, but in + fact we don't care, we're just happy s/he's still alive. */ + irc->last_pong = gettime(); + irc->pinging = 0; +} + static void irc_cmd_join( irc_t *irc, char **cmd ) { irc_channel_t *ic; @@ -516,14 +524,6 @@ static void irc_cmd_nickserv( irc_t *irc, char **cmd ) root_command( irc, cmd + 1 ); } -static void irc_cmd_pong( irc_t *irc, char **cmd ) -{ - /* We could check the value we get back from the user, but in - fact we don't care, we're just happy he's still alive. */ - irc->last_pong = gettime(); - irc->pinging = 0; -} - static void irc_cmd_version( irc_t *irc, char **cmd ) { irc_send_num( irc, 351, "bitlbee-%s. %s :%s/%s ", BITLBEE_VERSION, irc->myhost, ARCH, CPU ); @@ -567,6 +567,7 @@ static const command_t irc_commands[] = { { "nick", 1, irc_cmd_nick, 0 }, { "quit", 0, irc_cmd_quit, 0 }, { "ping", 0, irc_cmd_ping, 0 }, + { "pong", 0, irc_cmd_pong, IRC_CMD_LOGGED_IN }, { "join", 1, irc_cmd_join, IRC_CMD_LOGGED_IN }, { "names", 1, irc_cmd_names, IRC_CMD_LOGGED_IN }, { "part", 1, irc_cmd_part, IRC_CMD_LOGGED_IN }, @@ -587,7 +588,6 @@ static const command_t irc_commands[] = { { "away", 0, irc_cmd_away, IRC_CMD_LOGGED_IN }, { "nickserv", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, { "ns", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, - { "pong", 0, irc_cmd_pong, IRC_CMD_LOGGED_IN }, { "version", 0, irc_cmd_version, IRC_CMD_LOGGED_IN }, { "completions", 0, irc_cmd_completions, IRC_CMD_LOGGED_IN }, { "die", 0, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, -- cgit v1.2.3 From d860a8ddf5039f7208bff4c179bc9fe1549da6da Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 31 Mar 2010 23:38:50 -0400 Subject: Restored "account" root command and restored enough stuff to be able to send messages. Also started moving stuff out from nogaim.* into bee_* files. --- irc_commands.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 858b5bdd..03d05417 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -308,6 +308,13 @@ static void irc_cmd_privmsg( irc_t *irc, char **cmd ) #endif } +static void irc_cmd_nickserv( irc_t *irc, char **cmd ) +{ + /* [SH] This aliases the NickServ command to PRIVMSG root */ + /* [TV] This aliases the NS command to PRIVMSG root as well */ + root_command( irc, cmd + 1 ); +} + #if 0 @@ -517,13 +524,6 @@ static void irc_cmd_away( irc_t *irc, char **cmd ) set_setstr( &irc->set, "away", u->away ); } -static void irc_cmd_nickserv( irc_t *irc, char **cmd ) -{ - /* [SH] This aliases the NickServ command to PRIVMSG root */ - /* [TV] This aliases the NS command to PRIVMSG root as well */ - root_command( irc, cmd + 1 ); -} - static void irc_cmd_version( irc_t *irc, char **cmd ) { irc_send_num( irc, 351, "bitlbee-%s. %s :%s/%s ", BITLBEE_VERSION, irc->myhost, ARCH, CPU ); @@ -577,6 +577,8 @@ static const command_t irc_commands[] = { { "mode", 1, irc_cmd_mode, IRC_CMD_LOGGED_IN }, { "who", 0, irc_cmd_who, IRC_CMD_LOGGED_IN }, { "privmsg", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, + { "nickserv", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, + { "ns", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, #if 0 { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, { "invite", 2, irc_cmd_invite, IRC_CMD_LOGGED_IN }, @@ -586,8 +588,6 @@ static const command_t irc_commands[] = { { "watch", 1, irc_cmd_watch, IRC_CMD_LOGGED_IN }, { "topic", 1, irc_cmd_topic, IRC_CMD_LOGGED_IN }, { "away", 0, irc_cmd_away, IRC_CMD_LOGGED_IN }, - { "nickserv", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, - { "ns", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, { "version", 0, irc_cmd_version, IRC_CMD_LOGGED_IN }, { "completions", 0, irc_cmd_completions, IRC_CMD_LOGGED_IN }, { "die", 0, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, -- cgit v1.2.3 From fb117aee274bccfb6528288599ef81fe72191e12 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Thu, 1 Apr 2010 22:29:45 -0400 Subject: Cleaned lots of compiler warnings so I can get some signal again. --- irc_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 03d05417..57268d07 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -38,7 +38,7 @@ static void irc_cmd_pass( irc_t *irc, char **cmd ) command last. (Possibly it won't send it at all if it turns out we don't require it, which will break this feature.) Try to identify using the given password. */ - /*return root_command( irc, send_cmd );*/ + return root_command( irc, send_cmd ); } /* Handling in pre-logged-in state, first see if this server is password-protected: */ -- cgit v1.2.3 From ffa1173a0ea836029bae1f41ec13c64b39bfb6a4 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 11 Apr 2010 21:53:27 +0200 Subject: Allow the user to change his/her nick. My old concern was that it gets hairy when dealing with the storage/NickServ part. But meh, just reset all that state when the nick changes and require the user to re-register if s/he wants to save stuff. The only problem's when s/he identifies and may end up getting every account added twice. --- irc_commands.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 57268d07..b1b764b9 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -72,11 +72,7 @@ static void irc_cmd_user( irc_t *irc, char **cmd ) static void irc_cmd_nick( irc_t *irc, char **cmd ) { - if( irc->user->nick ) - { - irc_send_num( irc, 438, ":The hand of the deity is upon thee, thy nick may not change" ); - } - else if( irc_user_by_name( irc, cmd[1] ) ) + if( irc_user_by_name( irc, cmd[1] ) ) { irc_send_num( irc, 433, ":This nick is already in use" ); } @@ -85,6 +81,17 @@ static void irc_cmd_nick( irc_t *irc, char **cmd ) /* [SH] Invalid characters. */ irc_send_num( irc, 432, ":This nick contains invalid characters" ); } + else if( irc->user->nick ) + { + if( irc->status & USTATUS_IDENTIFIED ) + { + irc_setpass( irc, NULL ); + irc->status &= ~USTATUS_IDENTIFIED; + irc_umode_set( irc, "-R", 1 ); + } + + irc_user_set_nick( irc->user, cmd[1] ); + } else { irc->user->nick = g_strdup( cmd[1] ); -- cgit v1.2.3 From 57119e85387ba80192ccf36756c71b4dbb7947cb Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Mon, 12 Apr 2010 00:26:45 +0200 Subject: Actually bomb out if channel creation fails at /join time. --- irc_commands.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index b1b764b9..bf55e2b8 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -130,7 +130,10 @@ static void irc_cmd_join( irc_t *irc, char **cmd ) ic = irc_channel_new( irc, cmd[1] ); if( ic == NULL ) + { irc_send_num( irc, 479, "%s :Invalid channel name", cmd[1] ); + return; + } if( ic->flags & IRC_CHANNEL_JOINED ) return; /* Dude, you're already there... -- cgit v1.2.3 From 24b8bbb2616d685006a279e46a4bd2e8e7cf6694 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Mon, 12 Apr 2010 02:06:49 +0200 Subject: Start handling CTCPs, in a saner way than before. --- irc_commands.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index bf55e2b8..5387fb4d 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -254,16 +254,39 @@ static void irc_cmd_privmsg( irc_t *irc, char **cmd ) if( !cmd[2] ) { irc_send_num( irc, 412, ":No text to send" ); + return; } - else if( irc_channel_name_ok( cmd[1] ) && - ( ic = irc_channel_by_name( irc, cmd[1] ) ) ) + + /* Don't treat CTCP actions as real CTCPs, just convert them right now. */ + if( g_strncasecmp( cmd[2], "\001ACTION", 7 ) == 0 ) + { + cmd[2] += 4; + strcpy( cmd[2], "/me" ); + if( cmd[2][strlen(cmd[2])-1] == '\001' ) + cmd[2][strlen(cmd[2])-1] = '\0'; + } + + if( irc_channel_name_ok( cmd[1] ) && + ( ic = irc_channel_by_name( irc, cmd[1] ) ) ) { if( ic->f->privmsg ) ic->f->privmsg( ic, cmd[2] ); } else if( ( iu = irc_user_by_name( irc, cmd[1] ) ) ) { - if( iu->f->privmsg ) + if( cmd[2][0] == '\001' ) + { + char **ctcp; + + if( iu->f->ctcp == NULL ) + return; + if( cmd[2][strlen(cmd[2])-1] == '\001' ) + cmd[2][strlen(cmd[2])-1] = '\0'; + + ctcp = split_command_parts( cmd[2] + 1 ); + iu->f->ctcp( iu, ctcp ); + } + else if( iu->f->privmsg ) iu->f->privmsg( iu, cmd[2] ); } else -- cgit v1.2.3 From 81186cab101fa8c2f82137014d0b3c060b658cb0 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Tue, 13 Apr 2010 13:38:41 +0200 Subject: /away and set away/status stuff back. --- irc_commands.c | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 5387fb4d..54c0067c 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -351,7 +351,6 @@ static void irc_cmd_nickserv( irc_t *irc, char **cmd ) #if 0 -//#if 0 static void irc_cmd_oper( irc_t *irc, char **cmd ) { if( global.conf->oper_pass && @@ -523,40 +522,37 @@ static void irc_cmd_topic( irc_t *irc, char **cmd ) irc_topic( irc, channel ); } } +#endif static void irc_cmd_away( irc_t *irc, char **cmd ) { - user_t *u = user_find( irc, irc->nick ); - char *away = cmd[1]; - - if( !u ) return; + char *set; - if( away && *away ) + if( cmd[1] && *cmd[1] ) { + char away[strlen(cmd[1])+1]; int i, j; /* Copy away string, but skip control chars. Mainly because Jabber really doesn't like them. */ - u->away = g_malloc( strlen( away ) + 1 ); - for( i = j = 0; away[i]; i ++ ) - if( ( u->away[j] = away[i] ) >= ' ' ) + for( i = j = 0; cmd[1][i]; i ++ ) + if( ( away[j] = cmd[1][i] ) >= ' ' ) j ++; - u->away[j] = 0; + away[j] = '\0'; - irc_send_num( irc, 306, ":You're now away: %s", u->away ); - /* irc_umode_set( irc, irc->myhost, "+a" ); */ + irc_send_num( irc, 306, ":You're now away: %s", away ); + set = away; } else { - if( u->away ) g_free( u->away ); - u->away = NULL; - /* irc_umode_set( irc, irc->myhost, "-a" ); */ irc_send_num( irc, 305, ":Welcome back" ); + set = NULL; } - set_setstr( &irc->set, "away", u->away ); + set_setstr( &irc->b->set, "away", set ); } +#if 0 static void irc_cmd_version( irc_t *irc, char **cmd ) { irc_send_num( irc, 351, "bitlbee-%s. %s :%s/%s ", BITLBEE_VERSION, irc->myhost, ARCH, CPU ); @@ -612,6 +608,7 @@ static const command_t irc_commands[] = { { "privmsg", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, { "nickserv", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, { "ns", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, + { "away", 0, irc_cmd_away, IRC_CMD_LOGGED_IN }, #if 0 { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, { "invite", 2, irc_cmd_invite, IRC_CMD_LOGGED_IN }, @@ -620,7 +617,6 @@ static const command_t irc_commands[] = { { "ison", 1, irc_cmd_ison, IRC_CMD_LOGGED_IN }, { "watch", 1, irc_cmd_watch, IRC_CMD_LOGGED_IN }, { "topic", 1, irc_cmd_topic, IRC_CMD_LOGGED_IN }, - { "away", 0, irc_cmd_away, IRC_CMD_LOGGED_IN }, { "version", 0, irc_cmd_version, IRC_CMD_LOGGED_IN }, { "completions", 0, irc_cmd_completions, IRC_CMD_LOGGED_IN }, { "die", 0, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, -- cgit v1.2.3 From d7d677dac118a1240ada9ddcc8617c49293e5a5e Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 14 Apr 2010 14:34:39 +0200 Subject: Restored a few more trivial commands including all the oper stuff. --- irc_commands.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 54c0067c..f4c6ce48 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -350,7 +350,6 @@ static void irc_cmd_nickserv( irc_t *irc, char **cmd ) -#if 0 static void irc_cmd_oper( irc_t *irc, char **cmd ) { if( global.conf->oper_pass && @@ -367,6 +366,7 @@ static void irc_cmd_oper( irc_t *irc, char **cmd ) } } +#if 0 static void irc_cmd_invite( irc_t *irc, char **cmd ) { char *nick = cmd[1], *channel = cmd[2]; @@ -552,31 +552,30 @@ static void irc_cmd_away( irc_t *irc, char **cmd ) set_setstr( &irc->b->set, "away", set ); } -#if 0 static void irc_cmd_version( irc_t *irc, char **cmd ) { - irc_send_num( irc, 351, "bitlbee-%s. %s :%s/%s ", BITLBEE_VERSION, irc->myhost, ARCH, CPU ); + irc_send_num( irc, 351, "bitlbee-%s. %s :%s/%s ", + BITLBEE_VERSION, irc->root->host, ARCH, CPU ); } static void irc_cmd_completions( irc_t *irc, char **cmd ) { - user_t *u = user_find( irc, irc->mynick ); help_t *h; set_t *s; int i; - irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", "OK" ); + irc_send_msg_raw( irc->root, "NOTICE", irc->user->nick, "COMPLETIONS OK" ); for( i = 0; commands[i].command; i ++ ) - irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", commands[i].command ); + irc_send_msg_f( irc->root, "NOTICE", irc->user->nick, "COMPLETIONS %s", commands[i].command ); for( h = global.help; h; h = h->next ) - irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS help ", h->title ); + irc_send_msg_f( irc->root, "NOTICE", irc->user->nick, "COMPLETIONS help %s", h->title ); - for( s = irc->set; s; s = s->next ) - irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS set ", s->key ); + for( s = irc->b->set; s; s = s->next ) + irc_send_msg_f( irc->root, "NOTICE", irc->user->nick, "COMPLETIONS set %s", s->key ); - irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", "END" ); + irc_send_msg_raw( irc->root, "NOTICE", irc->user->nick, "COMPLETIONS END" ); } static void irc_cmd_rehash( irc_t *irc, char **cmd ) @@ -588,7 +587,6 @@ static void irc_cmd_rehash( irc_t *irc, char **cmd ) irc_send_num( irc, 382, "%s :Rehashing", global.conf_file ); } -#endif static const command_t irc_commands[] = { { "pass", 1, irc_cmd_pass, 0 }, @@ -609,16 +607,17 @@ static const command_t irc_commands[] = { { "nickserv", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, { "ns", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, { "away", 0, irc_cmd_away, IRC_CMD_LOGGED_IN }, -#if 0 + { "version", 0, irc_cmd_version, IRC_CMD_LOGGED_IN }, + { "completions", 0, irc_cmd_completions, IRC_CMD_LOGGED_IN }, { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, +#if 0 { "invite", 2, irc_cmd_invite, IRC_CMD_LOGGED_IN }, { "notice", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, { "userhost", 1, irc_cmd_userhost, IRC_CMD_LOGGED_IN }, { "ison", 1, irc_cmd_ison, IRC_CMD_LOGGED_IN }, { "watch", 1, irc_cmd_watch, IRC_CMD_LOGGED_IN }, { "topic", 1, irc_cmd_topic, IRC_CMD_LOGGED_IN }, - { "version", 0, irc_cmd_version, IRC_CMD_LOGGED_IN }, - { "completions", 0, irc_cmd_completions, IRC_CMD_LOGGED_IN }, +#endif { "die", 0, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, { "deaf", 0, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, { "wallops", 1, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, @@ -626,7 +625,6 @@ static const command_t irc_commands[] = { { "rehash", 0, irc_cmd_rehash, IRC_CMD_OPER_ONLY }, { "restart", 0, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, { "kill", 2, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, -#endif { NULL } }; -- cgit v1.2.3 From 003a12bd2361cd1ce4d83eeaa1b81d95101ea778 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 14 Apr 2010 15:35:41 +0200 Subject: Restored all remaining IRC commands that make some sense to have at this point. --- irc_commands.c | 48 +++++++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 21 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index f4c6ce48..35169607 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -383,10 +383,10 @@ static void irc_cmd_invite( irc_t *irc, char **cmd ) irc_send_num( irc, 482, "%s :Invite impossible; User/Channel non-existent or incompatible", channel ); } +#endif static void irc_cmd_userhost( irc_t *irc, char **cmd ) { - user_t *u; int i; /* [TV] Usable USERHOST-implementation according to @@ -396,18 +396,18 @@ static void irc_cmd_userhost( irc_t *irc, char **cmd ) */ for( i = 1; cmd[i]; i ++ ) - if( ( u = user_find( irc, cmd[i] ) ) ) - { - if( u->online && u->away ) - irc_send_num( irc, 302, ":%s=-%s@%s", u->nick, u->user, u->host ); - else - irc_send_num( irc, 302, ":%s=+%s@%s", u->nick, u->user, u->host ); - } + { + irc_user_t *iu = irc_user_by_name( irc, cmd[i] ); + + if( iu ) + irc_send_num( irc, 302, ":%s=%c%s@%s", iu->nick, + irc_user_get_away( iu ) ? '-' : '+', + iu->user, iu->host ); + } } static void irc_cmd_ison( irc_t *irc, char **cmd ) { - user_t *u; char buff[IRC_MAX_LINE]; int lenleft, i; @@ -423,17 +423,20 @@ static void irc_cmd_ison( irc_t *irc, char **cmd ) this = cmd[i]; while( *this ) { + irc_user_t *iu; + if( ( next = strchr( this, ' ' ) ) ) *next = 0; - if( ( u = user_find( irc, this ) ) && u->online ) + if( ( iu = irc_user_by_name( irc, this ) ) && + iu->bu && iu->bu->flags & BEE_USER_ONLINE ) { - lenleft -= strlen( u->nick ) + 1; + lenleft -= strlen( iu->nick ) + 1; if( lenleft < 0 ) break; - strcat( buff, u->nick ); + strcat( buff, iu->nick ); strcat( buff, " " ); } @@ -469,7 +472,7 @@ static void irc_cmd_watch( irc_t *irc, char **cmd ) for( i = 1; cmd[i]; i ++ ) { char *nick; - user_t *u; + irc_user_t *iu; if( !cmd[i][0] || !cmd[i][1] ) break; @@ -477,17 +480,19 @@ static void irc_cmd_watch( irc_t *irc, char **cmd ) nick = g_strdup( cmd[i] + 1 ); nick_lc( nick ); - u = user_find( irc, nick ); + iu = irc_user_by_name( irc, nick ); if( cmd[i][0] == '+' ) { if( !g_hash_table_lookup( irc->watches, nick ) ) g_hash_table_insert( irc->watches, nick, nick ); - if( u && u->online ) - irc_send_num( irc, 604, "%s %s %s %d :%s", u->nick, u->user, u->host, (int) time( NULL ), "is online" ); + if( iu && iu->bu && iu->bu->flags & BEE_USER_ONLINE ) + irc_send_num( irc, 604, "%s %s %s %d :%s", iu->nick, iu->user, + iu->host, (int) time( NULL ), "is online" ); else - irc_send_num( irc, 605, "%s %s %s %d :%s", nick, "*", "*", (int) time( NULL ), "is offline" ); + irc_send_num( irc, 605, "%s %s %s %d :%s", nick, "*", "*", + (int) time( NULL ), "is offline" ); } else if( cmd[i][0] == '-' ) { @@ -504,6 +509,7 @@ static void irc_cmd_watch( irc_t *irc, char **cmd ) } } +#if 0 static void irc_cmd_topic( irc_t *irc, char **cmd ) { char *channel = cmd[1]; @@ -609,15 +615,15 @@ static const command_t irc_commands[] = { { "away", 0, irc_cmd_away, IRC_CMD_LOGGED_IN }, { "version", 0, irc_cmd_version, IRC_CMD_LOGGED_IN }, { "completions", 0, irc_cmd_completions, IRC_CMD_LOGGED_IN }, - { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, -#if 0 - { "invite", 2, irc_cmd_invite, IRC_CMD_LOGGED_IN }, - { "notice", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, { "userhost", 1, irc_cmd_userhost, IRC_CMD_LOGGED_IN }, { "ison", 1, irc_cmd_ison, IRC_CMD_LOGGED_IN }, { "watch", 1, irc_cmd_watch, IRC_CMD_LOGGED_IN }, +#if 0 + { "invite", 2, irc_cmd_invite, IRC_CMD_LOGGED_IN }, + { "notice", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, { "topic", 1, irc_cmd_topic, IRC_CMD_LOGGED_IN }, #endif + { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, { "die", 0, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, { "deaf", 0, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, { "wallops", 1, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, -- cgit v1.2.3 From bce78c8e6b9363175943a1b10df76fdbd87ba0c8 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 2 May 2010 19:48:26 +0100 Subject: Restored classical control channel behaviour (the ability to talk to contacts in there). --- irc_commands.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 35169607..dd7cc730 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -287,7 +287,10 @@ static void irc_cmd_privmsg( irc_t *irc, char **cmd ) iu->f->ctcp( iu, ctcp ); } else if( iu->f->privmsg ) + { + iu->flags |= IRC_USER_PRIVATE; iu->f->privmsg( iu, cmd[2] ); + } } else { -- cgit v1.2.3 From 4a9fd5f7a980831ee2c96a728f4f83137cfc73fe Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 8 May 2010 15:19:12 +0100 Subject: Fixed *facepalm* memory management/scoping bug in /AWAY command. --- irc_commands.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index dd7cc730..b41c1a42 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -550,15 +550,13 @@ static void irc_cmd_away( irc_t *irc, char **cmd ) away[j] = '\0'; irc_send_num( irc, 306, ":You're now away: %s", away ); - set = away; + set_setstr( &irc->b->set, "away", away ); } else { irc_send_num( irc, 305, ":Welcome back" ); - set = NULL; + set_setstr( &irc->b->set, "away", NULL ); } - - set_setstr( &irc->b->set, "away", set ); } static void irc_cmd_version( irc_t *irc, char **cmd ) -- cgit v1.2.3 From eaaa9862451175392d6df48c4795b188518bed4b Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 8 May 2010 15:48:38 +0100 Subject: Misc. cleanup. Also updated the Yahoo! module to deal with struct groupchat in a GSList so that a default config fully compiles again. --- irc_commands.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index b41c1a42..f43ef583 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -535,8 +535,6 @@ static void irc_cmd_topic( irc_t *irc, char **cmd ) static void irc_cmd_away( irc_t *irc, char **cmd ) { - char *set; - if( cmd[1] && *cmd[1] ) { char away[strlen(cmd[1])+1]; -- cgit v1.2.3 From 66b9e36aa9dfd123c66194d645a3c60cc3dc49bc Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 8 May 2010 22:52:25 +0100 Subject: Restored /invite for groupchats. --- irc_commands.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index f43ef583..f56f45a0 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -369,24 +369,27 @@ static void irc_cmd_oper( irc_t *irc, char **cmd ) } } -#if 0 static void irc_cmd_invite( irc_t *irc, char **cmd ) { - char *nick = cmd[1], *channel = cmd[2]; - struct groupchat *c = irc_chat_by_channel( irc, channel ); - user_t *u = user_find( irc, nick ); + irc_channel_t *ic; + irc_user_t *iu; - if( u && c && ( u->ic == c->ic ) ) - if( c->ic && c->ic->acc->prpl->chat_invite ) - { - c->ic->acc->prpl->chat_invite( c, u->handle, NULL ); - irc_send_num( irc, 341, "%s %s", nick, channel ); - return; - } + if( ( iu = irc_user_by_name( irc, cmd[1] ) ) == NULL ) + { + irc_send_num( irc, 401, "%s :No such nick", cmd[1] ); + return; + } + else if( ( ic = irc_channel_by_name( irc, cmd[2] ) ) == NULL ) + { + irc_send_num( irc, 403, "%s :No such channel", cmd[2] ); + return; + } - irc_send_num( irc, 482, "%s :Invite impossible; User/Channel non-existent or incompatible", channel ); + if( ic->f->invite ) + ic->f->invite( ic, iu ); + else + irc_send_num( irc, 482, "%s :Can't invite people here", cmd[2] ); } -#endif static void irc_cmd_userhost( irc_t *irc, char **cmd ) { @@ -617,8 +620,8 @@ static const command_t irc_commands[] = { { "userhost", 1, irc_cmd_userhost, IRC_CMD_LOGGED_IN }, { "ison", 1, irc_cmd_ison, IRC_CMD_LOGGED_IN }, { "watch", 1, irc_cmd_watch, IRC_CMD_LOGGED_IN }, -#if 0 { "invite", 2, irc_cmd_invite, IRC_CMD_LOGGED_IN }, +#if 0 { "notice", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, { "topic", 1, irc_cmd_topic, IRC_CMD_LOGGED_IN }, #endif -- cgit v1.2.3 From 47fae0ffdda6ea4509ba00b56d15fb25ffe19eea Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 9 May 2010 13:05:50 +0100 Subject: No. Run the part handler from the IRC /PART command, not from irc_channel.c. This was causing troubles with Twitter at disconnect time. --- irc_commands.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index f56f45a0..e6954071 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -168,7 +168,12 @@ static void irc_cmd_part( irc_t *irc, char **cmd ) { irc_send_num( irc, 403, "%s :No such channel", cmd[1] ); } - else if( !irc_channel_del_user( ic, irc->user ) ) + else if( irc_channel_del_user( ic, irc->user ) ) + { + if( ic->f->part ) + ic->f->part( ic, NULL ); + } + else { irc_send_num( irc, 442, "%s :You're not on that channel", cmd[1] ); } -- cgit v1.2.3 From 7b71feb6f88b7e14199b8f7e9930f76d5324e356 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Fri, 14 May 2010 00:34:38 +0100 Subject: Just enough code to join named chatrooms again. This UI is *not* final, the "chat" command will probably mostly stick around for bw compatibility. Still thinking about how this should work eventually. --- irc_commands.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index e6954071..530e849b 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -139,6 +139,14 @@ static void irc_cmd_join( irc_t *irc, char **cmd ) return; /* Dude, you're already there... RFC doesn't have any reply for that though? */ + if( ic->f->join && !ic->f->join( ic ) ) + /* The story is: FALSE either means the handler showed an error + message, or is doing some work before the join should be + confirmed. (In the latter case, the caller should take care + of that confirmation.) + TRUE means all's good, let the user join the channel right away. */ + return; + irc_channel_add_user( ic, irc->user ); } -- cgit v1.2.3 From 4469e7ecb15f57151452c59040360a483e4f5ee9 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Thu, 3 Jun 2010 23:17:11 +0100 Subject: Support for the /topic command. --- irc_commands.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 530e849b..24be35e3 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -528,26 +528,27 @@ static void irc_cmd_watch( irc_t *irc, char **cmd ) } } -#if 0 static void irc_cmd_topic( irc_t *irc, char **cmd ) { - char *channel = cmd[1]; - char *topic = cmd[2]; + irc_channel_t *ic = irc_channel_by_name( irc, cmd[1] ); + const char *new = cmd[2]; - if( topic ) + if( ic == NULL ) { - /* Send the topic */ - struct groupchat *c = irc_chat_by_channel( irc, channel ); - if( c && c->ic && c->ic->acc->prpl->chat_topic ) - c->ic->acc->prpl->chat_topic( c, topic ); + irc_send_num( irc, 403, "%s :No such channel", cmd[1] ); + } + else if( new ) + { + if( ic->f->topic == NULL ) + irc_send_num( irc, 482, "%s :Can't change this channel's topic", ic->name ); + else if( ic->f->topic( ic, new ) ) + irc_send_topic( ic, TRUE ); } else { - /* Get the topic */ - irc_topic( irc, channel ); + irc_send_topic( ic, FALSE ); } } -#endif static void irc_cmd_away( irc_t *irc, char **cmd ) { @@ -636,8 +637,8 @@ static const command_t irc_commands[] = { { "invite", 2, irc_cmd_invite, IRC_CMD_LOGGED_IN }, #if 0 { "notice", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, - { "topic", 1, irc_cmd_topic, IRC_CMD_LOGGED_IN }, #endif + { "topic", 1, irc_cmd_topic, IRC_CMD_LOGGED_IN }, { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, { "die", 0, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, { "deaf", 0, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, -- cgit v1.2.3 From 5a75d1586478f78446b6c78b161572fc7cabe4d9 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 5 Jun 2010 23:32:36 +0100 Subject: Chatroom improvements. Merged chatroom stub into normal chatroom stuff, restored "chat add" behaviour a little bit better (don't clean up a channel when its room disappears, just disconnect it from the groupchat). --- irc_commands.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 24be35e3..ccfc2171 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -398,9 +398,7 @@ static void irc_cmd_invite( irc_t *irc, char **cmd ) return; } - if( ic->f->invite ) - ic->f->invite( ic, iu ); - else + if( !ic->f->invite || !ic->f->invite( ic, iu ) ) irc_send_num( irc, 482, "%s :Can't invite people here", cmd[2] ); } -- cgit v1.2.3 From 18da20bf7690ca3c1e9cf4b70c2749a11c75b339 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 6 Jun 2010 01:33:33 +0100 Subject: Added /part msgs, and the ability to silently remove users from channels (when sending a /quit instead, for example). --- irc_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index ccfc2171..4ea53299 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -176,7 +176,7 @@ static void irc_cmd_part( irc_t *irc, char **cmd ) { irc_send_num( irc, 403, "%s :No such channel", cmd[1] ); } - else if( irc_channel_del_user( ic, irc->user ) ) + else if( irc_channel_del_user( ic, irc->user, FALSE, cmd[2] ) ) { if( ic->f->part ) ic->f->part( ic, NULL ); -- cgit v1.2.3 From 92cb8c4c251fb04a483b29e7108e7a52388f14dd Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Mon, 7 Jun 2010 00:47:46 +0100 Subject: Complete (hopefully) fix for nickname changes: Add flags to the identify command to allow identifying without loading any new settings. With some documentation hints. --- irc_commands.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 4ea53299..4ce68f07 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -88,6 +88,10 @@ static void irc_cmd_nick( irc_t *irc, char **cmd ) irc_setpass( irc, NULL ); irc->status &= ~USTATUS_IDENTIFIED; irc_umode_set( irc, "-R", 1 ); + irc_usermsg( irc, "Changing nicks resets your identify status. " + "Re-identify or register a new account if you want " + "your configuration to be saved. See \x02help " + "nick_changes\x02." ); } irc_user_set_nick( irc->user, cmd[1] ); -- cgit v1.2.3 From 70f69ecc5f80f060d1780110ed9792f9e19d2507 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Mon, 7 Jun 2010 16:45:42 +0100 Subject: Restoring auto-identification using server password. --- irc_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 4ce68f07..6c425dee 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -57,7 +57,7 @@ static void irc_cmd_pass( irc_t *irc, char **cmd ) else { /* Remember the password and try to identify after USER/NICK. */ - /*irc_setpass( irc, cmd[1] ); */ + irc_setpass( irc, cmd[1] ); irc_check_login( irc ); } } -- cgit v1.2.3 From 46d215d562f8e1aba2b24e2d1feab27337956d50 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 9 Jun 2010 00:43:13 +0100 Subject: Allow moving contacts around between groups. Works with at least Jabber, will check the others now. --- irc_commands.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 6c425dee..ac851adf 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -402,8 +402,10 @@ static void irc_cmd_invite( irc_t *irc, char **cmd ) return; } - if( !ic->f->invite || !ic->f->invite( ic, iu ) ) + if( !ic->f->invite ) irc_send_num( irc, 482, "%s :Can't invite people here", cmd[2] ); + else if( ic->f->invite( ic, iu ) ) + irc_send_num( irc, 341, "%s %s", iu->nick, ic->name ); } static void irc_cmd_userhost( irc_t *irc, char **cmd ) -- cgit v1.2.3 From 6b90431eba3820aaa5535523622ba45ca65055f4 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 16 Jun 2010 10:31:40 +0200 Subject: More correct handling of channel names (according to RFC 1459). Pretty much any 8-bit character is allowed in there - while nicknames are very restricted. --- irc_commands.c | 46 ---------------------------------------------- 1 file changed, 46 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index ac851adf..b1fc74bf 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -313,52 +313,6 @@ static void irc_cmd_privmsg( irc_t *irc, char **cmd ) { irc_send_num( irc, 401, "%s :No such nick/channel", cmd[1] ); } - - -#if 0 - else if( irc->nick && g_strcasecmp( cmd[1], irc->nick ) == 0 ) - { - } - else - { - if( g_strcasecmp( cmd[1], irc->channel ) == 0 ) - { - unsigned int i; - char *t = set_getstr( &irc->set, "default_target" ); - - if( g_strcasecmp( t, "last" ) == 0 && irc->last_target ) - cmd[1] = irc->last_target; - else if( g_strcasecmp( t, "root" ) == 0 ) - cmd[1] = irc->mynick; - - for( i = 0; i < strlen( cmd[2] ); i ++ ) - { - if( cmd[2][i] == ' ' ) break; - if( cmd[2][i] == ':' || cmd[2][i] == ',' ) - { - cmd[1] = cmd[2]; - cmd[2] += i; - *cmd[2] = 0; - while( *(++cmd[2]) == ' ' ); - break; - } - } - - irc->is_private = 0; - - if( cmd[1] != irc->last_target ) - { - g_free( irc->last_target ); - irc->last_target = g_strdup( cmd[1] ); - } - } - else - { - irc->is_private = 1; - } - irc_send( irc, cmd[1], cmd[2], ( g_strcasecmp( cmd[0], "NOTICE" ) == 0 ) ? OPT_AWAY : 0 ); - } -#endif } static void irc_cmd_nickserv( irc_t *irc, char **cmd ) -- cgit v1.2.3 From 92c8d410eb1d26bfe876ae119734772f46c9a7da Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 26 Jun 2010 22:26:41 +0100 Subject: Remember in which channel the user talked to someone and show responses in that same channel. --- irc_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index b1fc74bf..5a0843ec 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -305,7 +305,7 @@ static void irc_cmd_privmsg( irc_t *irc, char **cmd ) } else if( iu->f->privmsg ) { - iu->flags |= IRC_USER_PRIVATE; + iu->last_channel = NULL; iu->f->privmsg( iu, cmd[2] ); } } -- cgit v1.2.3 From 84c3a72604a292c41348d678eccf1875263cb8dd Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 27 Jun 2010 13:39:07 +0100 Subject: Import chatrooms configured in older BitlBee versions. Settings are currently ignored though. Also removing the old chat.[ch] files since they're really not important anymore. --- irc_commands.c | 1 - 1 file changed, 1 deletion(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 5a0843ec..30518a99 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -26,7 +26,6 @@ #define BITLBEE_CORE #include "bitlbee.h" #include "ipc.h" -#include "chat.h" static void irc_cmd_pass( irc_t *irc, char **cmd ) { -- cgit v1.2.3 From 58646d9244557320ec811ee0b67519027170eede Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Mon, 28 Jun 2010 10:37:11 +0100 Subject: Allow joining multiple channels at once. Although BitlBee doesn't advertise support for this, irssi tries to do this anyway. --- irc_commands.c | 61 ++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 21 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 30518a99..bcb2fef2 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -127,30 +127,49 @@ static void irc_cmd_pong( irc_t *irc, char **cmd ) static void irc_cmd_join( irc_t *irc, char **cmd ) { - irc_channel_t *ic; - - if( ( ic = irc_channel_by_name( irc, cmd[1] ) ) == NULL ) - ic = irc_channel_new( irc, cmd[1] ); + char *comma, *s = cmd[1]; - if( ic == NULL ) + while( s ) { - irc_send_num( irc, 479, "%s :Invalid channel name", cmd[1] ); - return; + irc_channel_t *ic; + + if( ( comma = strchr( s, ',' ) ) ) + *comma = '\0'; + + if( ( ic = irc_channel_by_name( irc, s ) ) == NULL ) + ic = irc_channel_new( irc, s ); + + if( ic == NULL ) + { + irc_send_num( irc, 479, "%s :Invalid channel name", s ); + goto next; + } + + if( ic->flags & IRC_CHANNEL_JOINED ) + /* Dude, you're already there... + RFC doesn't have any reply for that though? */ + goto next; + + if( ic->f->join && !ic->f->join( ic ) ) + /* The story is: FALSE either means the handler + showed an error message, or is doing some work + before the join should be confirmed. (In the + latter case, the caller should take care of that + confirmation.) TRUE means all's good, let the + user join the channel right away. */ + goto next; + + irc_channel_add_user( ic, irc->user ); + +next: + if( comma ) + { + s = comma + 1; + *comma = ','; + } + else + break; } - - if( ic->flags & IRC_CHANNEL_JOINED ) - return; /* Dude, you're already there... - RFC doesn't have any reply for that though? */ - - if( ic->f->join && !ic->f->join( ic ) ) - /* The story is: FALSE either means the handler showed an error - message, or is doing some work before the join should be - confirmed. (In the latter case, the caller should take care - of that confirmation.) - TRUE means all's good, let the user join the channel right away. */ - return; - - irc_channel_add_user( ic, irc->user ); } static void irc_cmd_names( irc_t *irc, char **cmd ) -- cgit v1.2.3 From d7f850037c6288b5a2eebae789ed0247d0e5f7b3 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Thu, 1 Jul 2010 00:01:33 +0100 Subject: Support /NOTICE, although for now just to yourself - some IRC clients use this to measure lag. --- irc_commands.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index bcb2fef2..0a9b2c61 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -333,6 +333,20 @@ static void irc_cmd_privmsg( irc_t *irc, char **cmd ) } } +static void irc_cmd_notice( irc_t *irc, char **cmd ) +{ + if( !cmd[2] ) + { + irc_send_num( irc, 412, ":No text to send" ); + return; + } + + /* At least for now just echo. IIRC some IRC clients use self-notices + for lag checks, so try to support that. */ + if( nick_cmp( cmd[1], irc->user->nick ) == 0 ) + irc_send_msg( irc->user, "NOTICE", irc->user->nick, cmd[2], NULL ); +} + static void irc_cmd_nickserv( irc_t *irc, char **cmd ) { /* [SH] This aliases the NickServ command to PRIVMSG root */ @@ -602,6 +616,7 @@ static const command_t irc_commands[] = { { "mode", 1, irc_cmd_mode, IRC_CMD_LOGGED_IN }, { "who", 0, irc_cmd_who, IRC_CMD_LOGGED_IN }, { "privmsg", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, + { "notice", 1, irc_cmd_notice, IRC_CMD_LOGGED_IN }, { "nickserv", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, { "ns", 1, irc_cmd_nickserv, IRC_CMD_LOGGED_IN }, { "away", 0, irc_cmd_away, IRC_CMD_LOGGED_IN }, @@ -611,9 +626,6 @@ static const command_t irc_commands[] = { { "ison", 1, irc_cmd_ison, IRC_CMD_LOGGED_IN }, { "watch", 1, irc_cmd_watch, IRC_CMD_LOGGED_IN }, { "invite", 2, irc_cmd_invite, IRC_CMD_LOGGED_IN }, -#if 0 - { "notice", 1, irc_cmd_privmsg, IRC_CMD_LOGGED_IN }, -#endif { "topic", 1, irc_cmd_topic, IRC_CMD_LOGGED_IN }, { "oper", 2, irc_cmd_oper, IRC_CMD_LOGGED_IN }, { "die", 0, NULL, IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, -- cgit v1.2.3 From e1f3f94eaf2f18f4707dc48db9adc541f16d1679 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 3 Jul 2010 18:39:37 +0100 Subject: Fix handling of outgoing CTCP ACTIONs. --- irc_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 0a9b2c61..197a7e6e 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -296,7 +296,7 @@ static void irc_cmd_privmsg( irc_t *irc, char **cmd ) if( g_strncasecmp( cmd[2], "\001ACTION", 7 ) == 0 ) { cmd[2] += 4; - strcpy( cmd[2], "/me" ); + memcpy( cmd[2], "/me", 3 ); if( cmd[2][strlen(cmd[2])-1] == '\001' ) cmd[2][strlen(cmd[2])-1] = '\0'; } -- cgit v1.2.3 From 9a9b520df6044cfc034f9736fb97660a46e879b9 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Thu, 8 Jul 2010 23:31:01 +0100 Subject: Allow nick changes if they're only different in capitalisation, fixed faulty responses in the NICK command, and fixing crash bug in nick changes before finishing login. --- irc_commands.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 197a7e6e..0573601d 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -71,16 +71,18 @@ static void irc_cmd_user( irc_t *irc, char **cmd ) static void irc_cmd_nick( irc_t *irc, char **cmd ) { - if( irc_user_by_name( irc, cmd[1] ) ) + irc_user_t *iu; + + if( ( iu = irc_user_by_name( irc, cmd[1] ) ) && iu != irc->user ) { - irc_send_num( irc, 433, ":This nick is already in use" ); + irc_send_num( irc, 433, "%s :This nick is already in use", cmd[1] ); } else if( !nick_ok( cmd[1] ) ) { /* [SH] Invalid characters. */ - irc_send_num( irc, 432, ":This nick contains invalid characters" ); + irc_send_num( irc, 432, "%s :This nick contains invalid characters", cmd[1] ); } - else if( irc->user->nick ) + else if( irc->status & USTATUS_LOGGED_IN ) { if( irc->status & USTATUS_IDENTIFIED ) { @@ -97,6 +99,7 @@ static void irc_cmd_nick( irc_t *irc, char **cmd ) } else { + g_free( irc->user->nick ); irc->user->nick = g_strdup( cmd[1] ); irc_check_login( irc ); -- cgit v1.2.3 From b1af3e8750e81869c8c1d2a12c9c27f6913aa58d Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Tue, 13 Jul 2010 23:50:06 +0100 Subject: Fixed cleaning up of channels. Something broke when changing the irc_channel_del_user() syntax. --- irc_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index 0573601d..d11d46d3 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -201,7 +201,7 @@ static void irc_cmd_part( irc_t *irc, char **cmd ) { irc_send_num( irc, 403, "%s :No such channel", cmd[1] ); } - else if( irc_channel_del_user( ic, irc->user, FALSE, cmd[2] ) ) + else if( irc_channel_del_user( ic, irc->user, IRC_CDU_PART, cmd[2] ) ) { if( ic->f->part ) ic->f->part( ic, NULL ); -- cgit v1.2.3 From 324c378cd2d3f208b000e1279d462665d163edb7 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 14 Jul 2010 00:14:41 +0100 Subject: Move control channel autoconfiguration to irc_cmd_join() instead so that it only triggers on channels created by the user. (And not at identify time, which was causing odd problems on my test setup.) --- irc_commands.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'irc_commands.c') diff --git a/irc_commands.c b/irc_commands.c index d11d46d3..0bf20cfc 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -140,7 +140,31 @@ static void irc_cmd_join( irc_t *irc, char **cmd ) *comma = '\0'; if( ( ic = irc_channel_by_name( irc, s ) ) == NULL ) + { ic = irc_channel_new( irc, s ); + + if( strcmp( set_getstr( &ic->set, "type" ), "control" ) != 0 ) + { + /* Autoconfiguration is for control channels only ATM. */ + } + else if( bee_group_by_name( ic->irc->b, ic->name + 1, FALSE ) ) + { + set_setstr( &ic->set, "group", ic->name + 1 ); + set_setstr( &ic->set, "fill_by", "group" ); + } + else if( set_setstr( &ic->set, "protocol", ic->name + 1 ) ) + { + set_setstr( &ic->set, "fill_by", "protocol" ); + } + else if( set_setstr( &ic->set, "account", ic->name + 1 ) ) + { + set_setstr( &ic->set, "fill_by", "account" ); + } + else + { + bee_irc_channel_update( ic->irc, ic, NULL ); + } + } if( ic == NULL ) { -- cgit v1.2.3