aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/user-guide/commands.xml10
-rw-r--r--irc.c1
-rw-r--r--lib/oauth.c6
-rw-r--r--lib/oauth.h6
-rw-r--r--protocols/nogaim.c92
-rw-r--r--protocols/twitter/twitter.c4
6 files changed, 94 insertions, 25 deletions
diff --git a/doc/user-guide/commands.xml b/doc/user-guide/commands.xml
index 9fcc91da..af2c5eb2 100644
--- a/doc/user-guide/commands.xml
+++ b/doc/user-guide/commands.xml
@@ -860,6 +860,16 @@
</description>
</bitlbee-setting>
+ <bitlbee-setting name="show_offline" type="boolean" scope="global">
+ <default>true</default>
+
+ <description>
+ <para>
+ If enabled causes BitlBee to also show offline users in Channel. Online-users will get op, away-users voice and offline users none of both. This option takes effect as soon as you reconnect.
+ </para>
+ </description>
+ </bitlbee-setting>
+
<bitlbee-setting name="simulate_netsplit" type="boolean" scope="global">
<default>true</default>
diff --git a/irc.c b/irc.c
index aa8bc140..22bb9fa6 100644
--- a/irc.c
+++ b/irc.c
@@ -200,6 +200,7 @@ irc_t *irc_new( int fd )
s = set_add( &irc->set, "query_order", "lifo", NULL, irc );
s = set_add( &irc->set, "root_nick", irc->mynick, set_eval_root_nick, irc );
s = set_add( &irc->set, "save_on_quit", "true", set_eval_bool, irc );
+ s = set_add( &irc->set, "show_offline", "false", set_eval_bool, irc );
s = set_add( &irc->set, "simulate_netsplit", "true", set_eval_bool, irc );
s = set_add( &irc->set, "status", NULL, set_eval_away_status, irc );
s->flags |= SET_NULL_OK;
diff --git a/lib/oauth.c b/lib/oauth.c
index 8012c37a..c60a5a52 100644
--- a/lib/oauth.c
+++ b/lib/oauth.c
@@ -232,7 +232,7 @@ void oauth_info_free( struct oauth_info *info )
}
}
-static void oauth_add_default_params( GSList **params, struct oauth_service *sp )
+static void oauth_add_default_params( GSList **params, const struct oauth_service *sp )
{
char *s;
@@ -293,7 +293,7 @@ static void *oauth_post_request( const char *url, GSList **params_, http_input_f
static void oauth_request_token_done( struct http_request *req );
-struct oauth_info *oauth_request_token( struct oauth_service *sp, oauth_cb func, void *data )
+struct oauth_info *oauth_request_token( const struct oauth_service *sp, oauth_cb func, void *data )
{
struct oauth_info *st = g_new0( struct oauth_info, 1 );
GSList *params = NULL;
@@ -438,7 +438,7 @@ char *oauth_to_string( struct oauth_info *oi )
return ret;
}
-struct oauth_info *oauth_from_string( char *in, struct oauth_service *sp )
+struct oauth_info *oauth_from_string( char *in, const struct oauth_service *sp )
{
struct oauth_info *oi = g_new0( struct oauth_info, 1 );
GSList *params = NULL;
diff --git a/lib/oauth.h b/lib/oauth.h
index 6b51dc2c..5dfe0ae5 100644
--- a/lib/oauth.h
+++ b/lib/oauth.h
@@ -39,7 +39,7 @@ typedef enum
struct oauth_info
{
oauth_stage_t stage;
- struct oauth_service *sp;
+ const struct oauth_service *sp;
oauth_cb func;
void *data;
@@ -67,7 +67,7 @@ struct oauth_service
Request an initial anonymous token which can be used to construct an
authorization URL for the user. This is passed to the callback function
in a struct oauth_info. */
-struct oauth_info *oauth_request_token( struct oauth_service *sp, oauth_cb func, void *data );
+struct oauth_info *oauth_request_token( const struct oauth_service *sp, oauth_cb func, void *data );
/* http://oauth.net/core/1.0a/#auth_step3 (section 6.3)
The user gets a PIN or so which we now exchange for the final access
@@ -87,4 +87,4 @@ void oauth_info_free( struct oauth_info *info );
/* Convert to and back from strings, for easier saving. */
char *oauth_to_string( struct oauth_info *oi );
-struct oauth_info *oauth_from_string( char *in, struct oauth_service *sp );
+struct oauth_info *oauth_from_string( char *in, const struct oauth_service *sp );
diff --git a/protocols/nogaim.c b/protocols/nogaim.c
index fca8b302..2248d11e 100644
--- a/protocols/nogaim.c
+++ b/protocols/nogaim.c
@@ -656,7 +656,18 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags,
g_free( u->status_msg );
u->away = u->status_msg = NULL;
- if( ( flags & OPT_LOGGED_IN ) && !u->online )
+ if( set_getbool( &ic->irc->set, "show_offline" ) && !u->online )
+ {
+ /* always set users as online */
+ irc_spawn( ic->irc, u );
+ u->online = 1;
+ if( !( flags & OPT_LOGGED_IN ) )
+ {
+ /* set away message if user isn't really online */
+ u->away = g_strdup( "User is offline" );
+ }
+ }
+ else if( ( flags & OPT_LOGGED_IN ) && !u->online )
{
irc_spawn( ic->irc, u );
u->online = 1;
@@ -665,14 +676,30 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags,
{
struct groupchat *c;
- irc_kill( ic->irc, u );
- u->online = 0;
-
- /* Remove him/her from the groupchats to prevent PART messages after he/she QUIT already */
- for( c = ic->groupchats; c; c = c->next )
- remove_chat_buddy_silent( c, handle );
+ if( set_getbool( &ic->irc->set, "show_offline" ) )
+ {
+ /* keep offline users in channel and set away message to "offline" */
+ u->away = g_strdup( "User is offline" );
+
+ /* Keep showing him/her in the control channel but not in groupchats. */
+ for( c = ic->groupchats; c; c = c->next )
+ {
+ if( remove_chat_buddy_silent( c, handle ) && c->joined )
+ irc_part( c->ic->irc, u, c->channel );
+ }
+ }
+ else
+ {
+ /* kill offline users */
+ irc_kill( ic->irc, u );
+ u->online = 0;
+
+ /* Remove him/her from the groupchats to prevent PART messages after he/she QUIT already */
+ for( c = ic->groupchats; c; c = c->next )
+ remove_chat_buddy_silent( c, handle );
+ }
}
-
+
if( flags & OPT_AWAY )
{
if( state && message )
@@ -697,11 +724,8 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags,
u->status_msg = g_strdup( message );
}
- /* LISPy... */
- if( ( set_getbool( &ic->irc->set, "away_devoice" ) ) && /* Don't do a thing when user doesn't want it */
- ( u->online ) && /* Don't touch offline people */
- ( ( ( u->online != oo ) && !u->away ) || /* Voice joining people */
- ( ( u->online == oo ) && ( oa == !u->away ) ) ) ) /* (De)voice people changing state */
+ /* early if-clause for show_offline even if there is some redundant code here because this isn't LISP but C ;) */
+ if( set_getbool( &ic->irc->set, "show_offline" ) && set_getbool( &ic->irc->set, "away_devoice" ) )
{
char *from;
@@ -714,9 +738,43 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags,
from = g_strdup_printf( "%s!%s@%s", ic->irc->mynick, ic->irc->mynick,
ic->irc->myhost );
}
- irc_write( ic->irc, ":%s MODE %s %cv %s", from, ic->irc->channel,
- u->away?'-':'+', u->nick );
- g_free( from );
+
+ /* if we use show_offline, we op online users, voice away users, and devoice/deop offline users */
+ if( flags & OPT_LOGGED_IN )
+ {
+ /* user is "online" (either really online or away) */
+ irc_write( ic->irc, ":%s MODE %s %cv%co %s %s", from, ic->irc->channel,
+ u->away?'+':'-', u->away?'-':'+', u->nick, u->nick );
+ }
+ else
+ {
+ /* user is offline */
+ irc_write( ic->irc, ":%s MODE %s -vo %s %s", from, ic->irc->channel, u->nick, u->nick );
+ }
+ }
+ else
+ {
+ /* LISPy... */
+ if( ( set_getbool( &ic->irc->set, "away_devoice" ) ) && /* Don't do a thing when user doesn't want it */
+ ( u->online ) && /* Don't touch offline people */
+ ( ( ( u->online != oo ) && !u->away ) || /* Voice joining people */
+ ( ( u->online == oo ) && ( oa == !u->away ) ) ) ) /* (De)voice people changing state */
+ {
+ char *from;
+
+ if( set_getbool( &ic->irc->set, "simulate_netsplit" ) )
+ {
+ from = g_strdup( ic->irc->myhost );
+ }
+ else
+ {
+ from = g_strdup_printf( "%s!%s@%s", ic->irc->mynick, ic->irc->mynick,
+ ic->irc->myhost );
+ }
+ irc_write( ic->irc, ":%s MODE %s %cv %s", from, ic->irc->channel,
+ u->away?'-':'+', u->nick );
+ g_free( from );
+ }
}
}
@@ -1193,7 +1251,7 @@ static char *format_timestamp( irc_t *irc, time_t msg_ts )
else
return g_strdup_printf( "\x02[\x02\x02\x02%04d-%02d-%02d "
"%02d:%02d:%02d\x02]\x02 ",
- msg.tm_year + 1900, msg.tm_mon, msg.tm_mday,
+ msg.tm_year + 1900, msg.tm_mon + 1, msg.tm_mday,
msg.tm_hour, msg.tm_min, msg.tm_sec );
}
diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c
index 589f2088..9c7b060c 100644
--- a/protocols/twitter/twitter.c
+++ b/protocols/twitter/twitter.c
@@ -65,7 +65,7 @@ static void twitter_main_loop_start( struct im_connection *ic )
}
-static struct oauth_service twitter_oauth =
+static const struct oauth_service twitter_oauth =
{
"http://api.twitter.com/oauth/request_token",
"http://api.twitter.com/oauth/access_token",
@@ -114,7 +114,7 @@ static gboolean twitter_oauth_callback( struct oauth_info *info )
}
else if( info->stage == OAUTH_ACCESS_TOKEN )
{
- if( info->token == NULL )
+ if( info->token == NULL || info->token_secret == NULL )
{
imcb_error( ic, "OAuth error: %s", info->http->status_string );
imc_logout( ic, TRUE );