aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-07-29 20:18:54 +0200
committerWilmer van der Gaast <wilmer@gaast.net>2010-07-29 20:18:54 +0200
commitf7ca5877b69d452ef2e2ab4dc4d06743072deca0 (patch)
tree6ce785e43326ef0b638105eaf4ccc2b1760bfc43
parent2fe5eb939ff77697b578bf45ba23cd99daee9c5f (diff)
Restore default_target setting, kill last_root_cmd variable and just use
the last_channel variable, like for any other user.
-rw-r--r--irc.c17
-rw-r--r--irc.h5
-rw-r--r--irc_channel.c31
-rw-r--r--irc_im.c1
-rw-r--r--irc_send.c32
-rw-r--r--irc_user.c3
-rw-r--r--root_commands.c8
7 files changed, 42 insertions, 55 deletions
diff --git a/irc.c b/irc.c
index b5487b38..26ec8012 100644
--- a/irc.c
+++ b/irc.c
@@ -243,7 +243,6 @@ void irc_free( irc_t * irc )
g_free( irc->sendbuffer );
g_free( irc->readbuffer );
g_free( irc->password );
- g_free( irc->last_root_cmd );
g_free( irc );
@@ -728,15 +727,15 @@ int irc_check_login( irc_t *irc )
set_setstr( &ic->set, "auto_join", "true" );
irc_channel_auto_joins( irc, NULL );
- irc->last_root_cmd = g_strdup( ROOT_CHAN );
+ irc->root->last_channel = irc->default_channel;
- irc_send_msg( irc->root, "PRIVMSG", ROOT_CHAN,
- "Welcome to the BitlBee gateway!\n\n"
- "If you've never used BitlBee before, please do read the help "
- "information using the \x02help\x02 command. Lots of FAQs are "
- "answered there.\n"
- "If you already have an account on this server, just use the "
- "\x02identify\x02 command to identify yourself.", NULL );
+ irc_usermsg( irc,
+ "Welcome to the BitlBee gateway!\n\n"
+ "If you've never used BitlBee before, please do read the help "
+ "information using the \x02help\x02 command. Lots of FAQs are "
+ "answered there.\n"
+ "If you already have an account on this server, just use the "
+ "\x02identify\x02 command to identify yourself." );
/* This is for bug #209 (use PASS to identify to NickServ). */
if( irc->password != NULL )
diff --git a/irc.h b/irc.h
index 9cacf13e..efc5cd40 100644
--- a/irc.h
+++ b/irc.h
@@ -66,10 +66,6 @@ typedef struct irc
struct irc_user *root;
struct irc_user *user;
- char *last_root_cmd; /* Either the nickname from which the last root
- msg came, or the last channel root was talked
- to. */
-
char *password; /* HACK: Used to save the user's password, but before
logging in, this may contain a password we should
send to identify after USER/NICK are received. */
@@ -154,6 +150,7 @@ typedef struct irc_channel
time_t topic_time;
GSList *users; /* struct irc_channel_user */
+ struct irc_user *last_target;
struct set *set;
GString *pastebuf; /* Paste buffer (combine lines into a multiline msg). */
diff --git a/irc_channel.c b/irc_channel.c
index 7d805014..dfb2161e 100644
--- a/irc_channel.c
+++ b/irc_channel.c
@@ -480,6 +480,7 @@ char *set_eval_irc_channel_ops( set_t *set, char *value )
static gboolean control_channel_privmsg( irc_channel_t *ic, const char *msg )
{
irc_t *irc = ic->irc;
+ irc_user_t *iu;
const char *s;
/* Scan for non-whitespace chars followed by a colon: */
@@ -488,33 +489,27 @@ static gboolean control_channel_privmsg( irc_channel_t *ic, const char *msg )
if( *s == ':' || *s == ',' )
{
char to[s-msg+1];
- irc_user_t *iu;
memset( to, 0, sizeof( to ) );
strncpy( to, msg, s - msg );
while( *(++s) && isspace( *s ) ) {}
+ msg = s;
- iu = irc_user_by_name( irc, to );
- if( iu && iu->f->privmsg )
- {
- iu->last_channel = ic;
- iu->f->privmsg( iu, s );
- }
- else
- {
+ if( !( iu = irc_user_by_name( irc, to ) ) )
irc_channel_printf( ic, "User does not exist: %s", to );
- }
+ else
+ ic->last_target = iu;
}
+ else if( g_strcasecmp( set_getstr( &irc->b->set, "default_target" ), "last" ) == 0 &&
+ ic->last_target && g_slist_find( irc->users, ic->last_target ) )
+ iu = ic->last_target;
else
+ iu = irc->root;
+
+ if( iu && iu->f->privmsg )
{
- /* TODO: Maybe just use root->privmsg here now? */
- char cmd[strlen(msg)+1];
-
- g_free( ic->irc->last_root_cmd );
- ic->irc->last_root_cmd = g_strdup( ic->name );
-
- strcpy( cmd, msg );
- root_command_string( ic->irc, cmd );
+ iu->last_channel = ic;
+ iu->f->privmsg( iu, msg );
}
return TRUE;
diff --git a/irc_im.c b/irc_im.c
index 465d8d20..2d4e8787 100644
--- a/irc_im.c
+++ b/irc_im.c
@@ -214,6 +214,7 @@ static gboolean bee_irc_user_msg( bee_t *bee, bee_user_t *bu, const char *msg, t
if( sent_at > 0 && set_getbool( &irc->b->set, "display_timestamps" ) )
ts = irc_format_timestamp( irc, sent_at );
+ /* Too similar to irc_usermsg()... */
if( iu->last_channel )
{
if( iu->last_channel->flags & IRC_CHANNEL_JOINED )
diff --git a/irc_send.c b/irc_send.c
index b6ffe130..003e0625 100644
--- a/irc_send.c
+++ b/irc_send.c
@@ -103,33 +103,31 @@ void irc_send_motd( irc_t *irc )
void irc_usermsg( irc_t *irc, char *format, ... )
{
- irc_channel_t *ic;
- irc_user_t *iu;
+ irc_channel_t *ic = NULL;
+ irc_user_t *iu = irc->root;
char text[1024];
va_list params;
+ char *dst;
va_start( params, format );
g_vsnprintf( text, sizeof( text ), format, params );
va_end( params );
- if( irc->last_root_cmd &&
- irc_channel_name_ok( irc->last_root_cmd ) &&
- ( ic = irc_channel_by_name( irc, irc->last_root_cmd ) ) &&
- ic->flags & IRC_CHANNEL_JOINED )
- irc_send_msg( irc->root, "PRIVMSG", irc->last_root_cmd, text, NULL );
- else if( irc->last_root_cmd &&
- ( iu = irc_user_by_name( irc, irc->last_root_cmd ) ) &&
- iu->f == &irc_user_root_funcs )
- irc_send_msg( iu, "PRIVMSG", irc->user->nick, text, NULL );
- else
+ /* Too similar to bee_irc_user_msg()... */
+ if( iu->last_channel )
{
- g_free( irc->last_root_cmd );
- irc->last_root_cmd = NULL;
-
- irc_send_msg( irc->root, "PRIVMSG", irc->user->nick, text, NULL );
+ if( iu->last_channel->flags & IRC_CHANNEL_JOINED )
+ ic = iu->last_channel;
+ else if( irc->default_channel->flags & IRC_CHANNEL_JOINED )
+ ic = irc->default_channel;
}
- /*return( irc_msgfrom( irc, u->nick, text ) );*/
+ if( ic )
+ dst = ic->name;
+ else
+ dst = irc->user->nick;
+
+ irc_send_msg( irc->root, "PRIVMSG", dst, text, NULL );
}
void irc_send_join( irc_channel_t *ic, irc_user_t *iu )
diff --git a/irc_user.c b/irc_user.c
index 8db1de28..8b290bbf 100644
--- a/irc_user.c
+++ b/irc_user.c
@@ -221,9 +221,6 @@ static gboolean root_privmsg( irc_user_t *iu, const char *msg )
{
char cmd[strlen(msg)+1];
- g_free( iu->irc->last_root_cmd );
- iu->irc->last_root_cmd = g_strdup( iu->nick );
-
strcpy( cmd, msg );
root_command_string( iu->irc, cmd );
diff --git a/root_commands.c b/root_commands.c
index 69aa3e98..fe445d26 100644
--- a/root_commands.c
+++ b/root_commands.c
@@ -559,9 +559,9 @@ static void cmd_channel( irc_t *irc, char **cmd )
{
/* If this doesn't match any channel, maybe this is the short
syntax (only works when used inside a channel). */
- if( ( len = strlen( cmd[1] ) ) &&
- g_strncasecmp( cmd[1], "set", len ) == 0 &&
- ( ic = irc_channel_by_name( irc, irc->last_root_cmd ) ) )
+ if( ( ic = irc->root->last_channel ) &&
+ ( len = strlen( cmd[1] ) ) &&
+ g_strncasecmp( cmd[1], "set", len ) == 0 )
cmd_set_real( irc, cmd + 1, &ic->set, NULL );
else
irc_usermsg( irc, "Could not find channel `%s'", cmd[1] );
@@ -641,7 +641,7 @@ static void cmd_add( irc_t *irc, char **cmd )
irc_channel_t *ic;
char *s, *group = NULL;;
- if( ( ic = irc_channel_by_name( irc, irc->last_root_cmd ) ) &&
+ if( ( ic = irc->root->last_channel ) &&
( s = set_getstr( &ic->set, "fill_by" ) ) &&
strcmp( s, "group" ) == 0 &&
( group = set_getstr( &ic->set, "group" ) ) )