diff src/blist.c @ 10052:eaec201b2688

[gaim-migrate @ 11013] More rockin status stuff from Dave West! Things are beginning to shape up quite well. Dave, again, sorry it took me a week to get to this. Girl waits for no man. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sun, 19 Sep 2004 21:19:55 +0000
parents e6e68b9db19b
children 9fdbfe832fac
line wrap: on
line diff
--- a/src/blist.c	Sun Sep 19 21:14:28 2004 +0000
+++ b/src/blist.c	Sun Sep 19 21:19:55 2004 +0000
@@ -241,32 +241,6 @@
 		ops->set_visible(gaimbuddylist, show);
 }
 
-void gaim_blist_update_buddy_status(GaimBuddy *buddy, int status)
-{
-#if 0
-	GaimBlistUiOps *ops = gaimbuddylist->ui_ops;
-	int old_status;
-
-	g_return_if_fail(buddy != NULL);
-
-	old_status = buddy->uc;
-	if (old_status != status) {
-		buddy->uc = status;
-		gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy));
-
-		if ((status & UC_UNAVAILABLE) != (old_status & UC_UNAVAILABLE)) {
-			if (status & UC_UNAVAILABLE)
-				gaim_signal_emit(gaim_blist_get_handle(), "buddy-away", buddy);
-			else
-				gaim_signal_emit(gaim_blist_get_handle(), "buddy-back", buddy);
-		}
-	}
-
-	if (ops && ops->update)
-		ops->update(gaimbuddylist, (GaimBlistNode*)buddy);
-#endif
-}
-
 static gboolean presence_update_timeout_cb(GaimBuddy *buddy)
 {
 	GaimBlistUiOps *ops = gaimbuddylist->ui_ops;
@@ -299,35 +273,58 @@
 	return FALSE;
 }
 
-void gaim_blist_update_buddy_presence(GaimBuddy *buddy, gboolean online)
+void
+gaim_blist_update_buddy_status(GaimBuddy *buddy, GaimStatus *old_status)
 {
 	GaimBlistUiOps *ops = gaimbuddylist->ui_ops;
+	GaimPresence *presence;
+	GaimStatus *status;
 	gboolean did_something = FALSE;
 
 	g_return_if_fail(buddy != NULL);
 
-	if (!GAIM_BUDDY_IS_ONLINE(buddy) && online) {
+	presence = gaim_buddy_get_presence(buddy);
+	status = gaim_presence_get_active_status(presence);
+
+	gaim_debug_info("blist", "Updating buddy status\n");
+
+	if (gaim_status_is_online(status) &&
+		!gaim_status_is_online(old_status)) {
 		int old_present = buddy->present;
-		buddy->present = GAIM_BUDDY_SIGNING_ON;
+
 		gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-on", buddy);
-		did_something = TRUE;
-
 		if (old_present != GAIM_BUDDY_SIGNING_OFF) {
 			((GaimContact*)((GaimBlistNode*)buddy)->parent)->online++;
 			if (((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 1)
 				((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online++;
 		}
-	} else if (GAIM_BUDDY_IS_ONLINE(buddy) && !online) {
+		if (buddy->timer > 0)
+			gaim_timeout_remove(buddy->timer);
+		buddy->timer = gaim_timeout_add(10000, (GSourceFunc)presence_update_timeout_cb, buddy);
+		did_something = TRUE;
+
+	} else if (!gaim_status_is_online(status) &&
+				gaim_status_is_online(old_status)) {
 		buddy->present = GAIM_BUDDY_SIGNING_OFF;
 		gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-off", buddy);
+		if (buddy->timer > 0)
+			gaim_timeout_remove(buddy->timer);
+		buddy->timer = gaim_timeout_add(10000, (GSourceFunc)presence_update_timeout_cb, buddy);
 		did_something = TRUE;
+
+	} else if (gaim_status_is_available(status) &&
+			   !gaim_status_is_available(old_status)) {
+		gaim_signal_emit(gaim_blist_get_handle(), "buddy-back", buddy);
+		did_something = TRUE;
+
+	} else if (!gaim_status_is_available(status) &&
+			   gaim_status_is_available(old_status)) {
+		gaim_signal_emit(gaim_blist_get_handle(), "buddy-away", buddy);
+		did_something = TRUE;
+
 	}
 
 	if (did_something) {
-		if (buddy->timer > 0)
-			gaim_timeout_remove(buddy->timer);
-		buddy->timer = gaim_timeout_add(10000, (GSourceFunc)presence_update_timeout_cb, buddy);
-
 		gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy));
 		if (ops && ops->update)
 			ops->update(gaimbuddylist, (GaimBlistNode *)buddy);
@@ -607,6 +604,8 @@
 	buddy->alias    = g_strdup(alias);
 	buddy->presence = gaim_presence_new_for_buddy(buddy);
 
+	gaim_presence_set_status_active(buddy->presence, "offline", TRUE);
+
 	gaim_blist_node_initialize_settings((GaimBlistNode *)buddy);
 	((GaimBlistNode *)buddy)->type = GAIM_BLIST_BUDDY_NODE;