aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--skype/README8
-rw-r--r--skype/skype.c34
2 files changed, 31 insertions, 11 deletions
diff --git a/skype/README b/skype/README
index 494e2d6f..191c06d7 100644
--- a/skype/README
+++ b/skype/README
@@ -91,14 +91,14 @@ NOTE: the <pass> option is not used currently.
- Adding / removing contacts
+- Set away state when you do a `/away`.
+
== What needs to be done (aka. TODO)
- detect when somebody wants to add us (confirm callback)
-- Due to some API limitations, I have no idea how to change status. This affects:
- * When you `/away`, Skype will be still show `Online`
- * When you `account off`, Skype will not set status to `Offline`
- * When you `account on`, Skype will not set status to `Online`
+- When you `account off`, Skype will not set status to `Offline`
+- When you `account on`, Skype will not set status to `Online`
== I would like to have support for ...
diff --git a/skype/skype.c b/skype/skype.c
index 8d3f7f62..2086c192 100644
--- a/skype/skype.c
+++ b/skype/skype.c
@@ -39,7 +39,8 @@ const struct skype_away_state skype_away_state_list[] =
{ "NA", "Not available" },
{ "DND", "Do Not Disturb" },
{ "INVISIBLE", "Invisible" },
- { "OFFLINE", "Offline" }
+ { "OFFLINE", "Offline" },
+ { NULL, NULL}
};
static void skype_init( account_t *acc )
@@ -257,18 +258,39 @@ static int skype_buddy_msg( struct im_connection *ic, char *who, char *message,
return st;
}
+const struct skype_away_state *skype_away_state_by_name( char *name )
+{
+ int i;
+
+ for( i = 0; skype_away_state_list[i].full_name; i ++ )
+ if( g_strcasecmp( skype_away_state_list[i].full_name, name ) == 0 )
+ return( skype_away_state_list + i );
+
+ return NULL;
+}
+
static void skype_set_away( struct im_connection *ic, char *state_txt, char *message )
{
+ const struct skype_away_state *state;
+ char *buf;
+
+ if( strcmp( state_txt, GAIM_AWAY_CUSTOM ) == 0 )
+ state = skype_away_state_by_name( "Away" );
+ else
+ state = skype_away_state_by_name( state_txt );
+ printf("would set to: '%s'\n", state->code);
+ buf = g_strdup_printf("SET USERSTATUS %s\n", state->code);
+ skype_write( ic, buf, strlen( buf ) );
+ g_free(buf);
}
static GList *skype_away_states( struct im_connection *ic )
{
- static GList *l = NULL;
+ GList *l = NULL;
int i;
- if( l == NULL )
- for( i = 0; skype_away_state_list[i].full_name; i ++ )
- l = g_list_append( l, (void*) skype_away_state_list[i].full_name );
+ for( i = 0; skype_away_state_list[i].full_name; i ++ )
+ l = g_list_append( l, (void*) skype_away_state_list[i].full_name );
return l;
}
@@ -314,8 +336,6 @@ void init_plugin(void)
ret->away_states = skype_away_states;
ret->add_buddy = skype_add_buddy;
ret->remove_buddy = skype_remove_buddy;
- ret->away_states = skype_away_states;
- ret->set_away = skype_set_away;
ret->handle_cmp = g_strcasecmp;
register_protocol( ret );
}