Browse Source

send buddy icon info in unicastArrival

Mike 2 years ago
parent
commit
4a96b0fd52
5 changed files with 68 additions and 6 deletions
  1. 19 2
      foodgroup/buddy.go
  2. 9 3
      foodgroup/feedbag.go
  3. 29 0
      foodgroup/feedbag_test.go
  4. 3 1
      foodgroup/oservice.go
  5. 8 0
      foodgroup/oservice_test.go

+ 19 - 2
foodgroup/buddy.go

@@ -44,6 +44,10 @@ func (s BuddyService) RightsQuery(_ context.Context, frameIn wire.SNACFrame) wir
 	}
 }
 
+// broadcastArrival sends the latest user info to the user's adjacent users.
+// While updates are sent via the wire.BuddyArrived SNAC, the message is not
+// only used to indicate the user coming online. It can also notify changes to
+// buddy icons, warning levels, invisibility status, etc.
 func broadcastArrival(ctx context.Context, sess *state.Session, messageRelayer MessageRelayer, feedbagManager FeedbagManager) error {
 	screenNames, err := feedbagManager.AdjacentUsers(sess.ScreenName())
 	if err != nil {
@@ -153,16 +157,29 @@ func broadcastDeparture(ctx context.Context, sess *state.Session, messageRelayer
 	return nil
 }
 
-func unicastArrival(ctx context.Context, from *state.Session, to *state.Session, messageRelayer MessageRelayer) {
+// unicastArrival sends the latest user info to a particular user.
+// While updates are sent via the wire.BuddyArrived SNAC, the message is not
+// only used to indicate the user coming online. It can also notify changes to
+// buddy icons, warning levels, invisibility status, etc.
+func unicastArrival(ctx context.Context, from *state.Session, to *state.Session, messageRelayer MessageRelayer, feedbagManager FeedbagManager) error {
+	userInfo := from.TLVUserInfo()
+	icon, err := getBuddyIconRefFromFeedbag(from, feedbagManager)
+	switch {
+	case err != nil:
+		return err
+	case icon != nil:
+		userInfo.Append(wire.NewTLV(wire.OServiceUserInfoBARTInfo, *icon))
+	}
 	messageRelayer.RelayToScreenName(ctx, to.ScreenName(), wire.SNACMessage{
 		Frame: wire.SNACFrame{
 			FoodGroup: wire.Buddy,
 			SubGroup:  wire.BuddyArrived,
 		},
 		Body: wire.SNAC_0x03_0x0B_BuddyArrived{
-			TLVUserInfo: from.TLVUserInfo(),
+			TLVUserInfo: userInfo,
 		},
 	})
+	return nil
 }
 
 func unicastDeparture(ctx context.Context, from *state.Session, to *state.Session, messageRelayer MessageRelayer) {

+ 9 - 3
foodgroup/feedbag.go

@@ -195,7 +195,9 @@ func (s FeedbagService) UpsertItem(ctx context.Context, sess *state.Session, inF
 			if buddy == nil || buddy.Invisible() {
 				continue
 			}
-			unicastArrival(ctx, buddy, sess, s.messageRelayer)
+			if err := unicastArrival(ctx, buddy, sess, s.messageRelayer, s.feedbagManager); err != nil {
+				return wire.SNACMessage{}, nil
+			}
 		case wire.FeedbagClassIDDeny: // block buddy
 			if sess.Invisible() {
 				continue // user's offline, don't send departure notification
@@ -301,11 +303,15 @@ func (s FeedbagService) DeleteItem(ctx context.Context, sess *state.Session, inF
 			}
 			if !sess.Invisible() {
 				// alert unblocked user that current user is online
-				unicastArrival(ctx, sess, unblockedSess, s.messageRelayer)
+				if err := unicastArrival(ctx, sess, unblockedSess, s.messageRelayer, s.feedbagManager); err != nil {
+					return wire.SNACMessage{}, err
+				}
 			}
 			if !unblockedSess.Invisible() {
 				// alert current user that unblocked user is online
-				unicastArrival(ctx, unblockedSess, sess, s.messageRelayer)
+				if err := unicastArrival(ctx, unblockedSess, sess, s.messageRelayer, s.feedbagManager); err != nil {
+					return wire.SNACMessage{}, err
+				}
 			}
 		}
 	}

+ 29 - 0
foodgroup/feedbag_test.go

@@ -419,6 +419,14 @@ func TestFeedbagService_UpsertItem(t *testing.T) {
 							},
 						},
 					},
+					feedbagParams: feedbagParams{
+						{
+							screenName: "buddy_1_online",
+						},
+						{
+							screenName: "buddy_2_online",
+						},
+					},
 				},
 				messageRelayerParams: messageRelayerParams{
 					retrieveByScreenNameParams: retrieveByScreenNameParams{
@@ -1230,6 +1238,17 @@ func TestFeedbagService_DeleteItem(t *testing.T) {
 							},
 						},
 					},
+					feedbagParams: feedbagParams{
+						{
+							screenName: "buddy_1_online",
+						},
+						{
+							screenName: "buddy_2_online",
+						},
+						{
+							screenName: "user_screen_name",
+						},
+					},
 				},
 				messageRelayerParams: messageRelayerParams{
 					retrieveByScreenNameParams: retrieveByScreenNameParams{
@@ -1384,6 +1403,11 @@ func TestFeedbagService_DeleteItem(t *testing.T) {
 							},
 						},
 					},
+					feedbagParams: feedbagParams{
+						{
+							screenName: "user_screen_name",
+						},
+					},
 				},
 				messageRelayerParams: messageRelayerParams{
 					retrieveByScreenNameParams: retrieveByScreenNameParams{
@@ -1429,6 +1453,11 @@ func TestFeedbagService_DeleteItem(t *testing.T) {
 					FeedbagDelete(params.screenName, params.items).
 					Return(nil)
 			}
+			for _, params := range tc.mockParams.feedbagManagerParams.feedbagParams {
+				feedbagManager.EXPECT().
+					Feedbag(params.screenName).
+					Return(params.results, nil)
+			}
 			messageRelayer := newMockMessageRelayer(t)
 			for _, params := range tc.mockParams.messageRelayerParams.retrieveByScreenNameParams {
 				messageRelayer.EXPECT().

+ 3 - 1
foodgroup/oservice.go

@@ -446,7 +446,9 @@ func (s OServiceServiceForBOS) retrieveOnlineBuddies(ctx context.Context, sess *
 		if buddy == nil || buddy.Invisible() {
 			continue
 		}
-		unicastArrival(ctx, buddy, sess, s.messageRelayer)
+		if err := unicastArrival(ctx, buddy, sess, s.messageRelayer, s.feedbagManager); err != nil {
+			return err
+		}
 	}
 
 	return nil

+ 8 - 0
foodgroup/oservice_test.go

@@ -795,6 +795,14 @@ func TestOServiceServiceForBOS_ClientOnline(t *testing.T) {
 					screenName: "test-user",
 					results:    []wire.FeedbagItem{},
 				},
+				{
+					screenName: "buddy1",
+					results:    []wire.FeedbagItem{},
+				},
+				{
+					screenName: "buddy3",
+					results:    []wire.FeedbagItem{},
+				},
 			},
 		},
 	}