diff options
| author | Miklos Vajna <vmiklos@frugalware.org> | 2011-01-02 03:32:39 +0100 | 
|---|---|---|
| committer | Miklos Vajna <vmiklos@frugalware.org> | 2011-01-02 03:32:39 +0100 | 
| commit | 54ca2692dc70535a24e9cee0ff1370db8ae76099 (patch) | |
| tree | 002dd01f542bf1eb7a56f68ffac4af2a3d2c68a5 | |
| parent | 89d68459fe977cc76e22c09e8b099c7961863883 (diff) | |
Initial support for reading buddy groups
What works: if you have a few buddies in <group>, then /j &<group> will
show just those buddies.
What does not:
- If you later move buddies using Skype UI, BitlBee is not yet notified.
- You cannot move buddies using /invite yet.
What won't work in the near future: only the first group of each buddy
is parsed.
| -rw-r--r-- | skype/skype.c | 39 | 
1 files changed, 35 insertions, 4 deletions
| diff --git a/skype/skype.c b/skype/skype.c index b3062712..5f12733c 100644 --- a/skype/skype.c +++ b/skype/skype.c @@ -276,6 +276,24 @@ static char *skype_call_strerror(int err)  	}  } +static char *skype_group_by_username(struct im_connection *ic, char *username) +{ +	struct skype_data *sd = ic->proto_data; +	int i, j; + +	/* NEEDSWORK: we just search for the first group of the user, multiple +	 * groups / user is not yet supported by BitlBee. */ + +	for (i = 0; i < g_list_length(sd->groups); i++) { +		struct skype_group *sg = g_list_nth_data(sd->groups, i); +		for (j = 0; j < g_list_length(sg->users); j++) { +			if (!strcmp(g_list_nth_data(sg->users, j), username)) +				return sg->name; +		} +	} +	return NULL; +} +  static void skype_parse_users(struct im_connection *ic, char *line)  {  	char **i, **nicks; @@ -307,7 +325,7 @@ static void skype_parse_user(struct im_connection *ic, char *line)  				&& !strcmp(user, "echo123"))  				return;  		ptr = g_strdup_printf("%s@skype.com", user); -		imcb_add_buddy(ic, ptr, NULL); +		imcb_add_buddy(ic, ptr, skype_group_by_username(ic, user));  		if (strcmp(status, "OFFLINE") && (strcmp(status, "SKYPEOUT") ||  			!set_getbool(&ic->acc->set, "skypeout_offline")))  			flags |= OPT_LOGGED_IN; @@ -323,7 +341,7 @@ static void skype_parse_user(struct im_connection *ic, char *line)  		char *st = ptr + 12;  		if (!strcmp(st, "3")) {  			char *buf = g_strdup_printf("%s@skype.com", user); -			imcb_add_buddy(ic, buf, NULL); +			imcb_add_buddy(ic, buf, skype_group_by_username(ic, user));  			g_free(buf);  		}  	} else if (!strncmp(ptr, "MOOD_TEXT ", 10)) { @@ -770,6 +788,18 @@ static void skype_group_free(struct skype_group* sg, gboolean usersonly) {  	g_free(sg);  } +/* Update the group of each user in this group */ +static void skype_group_users(struct im_connection *ic, struct skype_group *sg) { +	int i; + +	for (i = 0; i < g_list_length(sg->users); i++) { +		char *user = g_list_nth_data(sg->users, i); +		char *buf = g_strdup_printf("%s@skype.com", user); +		imcb_add_buddy(ic, buf, sg->name); +		g_free(buf); +	} +} +  static void skype_parse_group(struct im_connection *ic, char *line)  {  	struct skype_data *sd = ic->proto_data; @@ -814,6 +844,7 @@ static void skype_parse_group(struct im_connection *ic, char *line)  				i++;  			}  			g_strfreev(users); +			skype_group_users(ic, sg);  		} else  			log_message(LOGLVL_ERROR, "No skype group with id %s. That's probably a bug.", id);  	} @@ -1039,8 +1070,8 @@ gboolean skype_start_stream(struct im_connection *ic)  	skype_printf(ic, "PASSWORD %s\n", ic->acc->pass);  	/* This will download all buddies and groups. */ -	st = skype_printf(ic, "SEARCH FRIENDS\n"); -	skype_printf(ic, "SEARCH GROUPS CUSTOM\n"); +	st = skype_printf(ic, "SEARCH GROUPS CUSTOM\n"); +	skype_printf(ic, "SEARCH FRIENDS\n");  	skype_printf(ic, "SET USERSTATUS ONLINE\n"); | 
