Ver Fonte

can't warn bots

Mike há 10 meses atrás
pai
commit
c360e5b31b
3 ficheiros alterados com 70 adições e 50 exclusões
  1. 6 0
      foodgroup/helpers_test.go
  2. 15 50
      foodgroup/icbm.go
  3. 49 0
      foodgroup/icbm_test.go

+ 6 - 0
foodgroup/helpers_test.go

@@ -744,6 +744,12 @@ func sessOptChatRoomCookie(cookie string) func(session *state.Session) {
 	}
 	}
 }
 }
 
 
+// sessOptBot sets the bot flag to true on the session
+// object
+func sessOptBot(session *state.Session) {
+	session.SetUserInfoFlag(wire.OServiceUserFlagBot)
+}
+
 // sessOptInvisible sets the invisible flag to true on the session
 // sessOptInvisible sets the invisible flag to true on the session
 // object
 // object
 func sessOptInvisible(session *state.Session) {
 func sessOptInvisible(session *state.Session) {

+ 15 - 50
foodgroup/icbm.go

@@ -284,16 +284,7 @@ func (s ICBMService) EvilRequest(ctx context.Context, sess *state.Session, inFra
 	// don't let users warn themselves, it causes the AIM client to go into a
 	// don't let users warn themselves, it causes the AIM client to go into a
 	// weird state.
 	// weird state.
 	if identScreenName == sess.IdentScreenName() {
 	if identScreenName == sess.IdentScreenName() {
-		return wire.SNACMessage{
-			Frame: wire.SNACFrame{
-				FoodGroup: wire.ICBM,
-				SubGroup:  wire.ICBMErr,
-				RequestID: inFrame.RequestID,
-			},
-			Body: wire.SNACError{
-				Code: wire.ErrorCodeNotSupportedByHost,
-			},
-		}, nil
+		return *newICBMErr(inFrame.RequestID, wire.ErrorCodeNotSupportedByHost), nil
 	}
 	}
 
 
 	blocked, err := s.relationshipFetcher.Relationship(ctx, sess.IdentScreenName(), identScreenName)
 	blocked, err := s.relationshipFetcher.Relationship(ctx, sess.IdentScreenName(), identScreenName)
@@ -301,44 +292,26 @@ func (s ICBMService) EvilRequest(ctx context.Context, sess *state.Session, inFra
 		return wire.SNACMessage{}, err
 		return wire.SNACMessage{}, err
 	}
 	}
 	if blocked.BlocksYou || blocked.YouBlock {
 	if blocked.BlocksYou || blocked.YouBlock {
-		return wire.SNACMessage{
-			Frame: wire.SNACFrame{
-				FoodGroup: wire.ICBM,
-				SubGroup:  wire.ICBMErr,
-				RequestID: inFrame.RequestID,
-			},
-			Body: wire.SNACError{
-				Code: wire.ErrorCodeNotLoggedOn,
-			},
-		}, nil
+		// user or target is blocked
+		return *newICBMErr(inFrame.RequestID, wire.ErrorCodeNotLoggedOn), nil
 	}
 	}
 
 
 	recipSess := s.sessionRetriever.RetrieveSession(identScreenName)
 	recipSess := s.sessionRetriever.RetrieveSession(identScreenName)
 	if recipSess == nil {
 	if recipSess == nil {
-		return wire.SNACMessage{
-			Frame: wire.SNACFrame{
-				FoodGroup: wire.ICBM,
-				SubGroup:  wire.ICBMErr,
-				RequestID: inFrame.RequestID,
-			},
-			Body: wire.SNACError{
-				Code: wire.ErrorCodeNotLoggedOn,
-			},
-		}, nil
+		// target user is offline
+		return *newICBMErr(inFrame.RequestID, wire.ErrorCodeNotLoggedOn), nil
+	}
+
+	if recipSess.UserInfoBitmask()&wire.OServiceUserFlagBot == wire.OServiceUserFlagBot {
+		// target user is a bot, bots can't be warned
+		return *newICBMErr(inFrame.RequestID, wire.ErrorCodeRequestDenied), nil
 	}
 	}
 
 
 	canWarn := s.convoTracker.trackWarn(time.Now(), sess.IdentScreenName(), recipSess.IdentScreenName())
 	canWarn := s.convoTracker.trackWarn(time.Now(), sess.IdentScreenName(), recipSess.IdentScreenName())
 	if !canWarn {
 	if !canWarn {
-		return wire.SNACMessage{
-			Frame: wire.SNACFrame{
-				FoodGroup: wire.ICBM,
-				SubGroup:  wire.ICBMErr,
-				RequestID: inFrame.RequestID,
-			},
-			Body: wire.SNACError{
-				Code: wire.ErrorCodeRequestDenied,
-			},
-		}, nil
+		// user has warned target too many times or not enough messages have
+		// been received from target
+		return *newICBMErr(inFrame.RequestID, wire.ErrorCodeRequestDenied), nil
 	}
 	}
 
 
 	increase := evilDelta
 	increase := evilDelta
@@ -354,16 +327,8 @@ func (s ICBMService) EvilRequest(ctx context.Context, sess *state.Session, inFra
 
 
 	ok, newLevel := recipSess.IncrementWarning(int16(increase), classID)
 	ok, newLevel := recipSess.IncrementWarning(int16(increase), classID)
 	if !ok {
 	if !ok {
-		return wire.SNACMessage{
-			Frame: wire.SNACFrame{
-				FoodGroup: wire.ICBM,
-				SubGroup:  wire.ICBMErr,
-				RequestID: inFrame.RequestID,
-			},
-			Body: wire.SNACError{
-				Code: wire.ErrorCodeRequestDenied,
-			},
-		}, nil
+		// target's warning is at 100%
+		return *newICBMErr(inFrame.RequestID, wire.ErrorCodeRequestDenied), nil
 	}
 	}
 
 
 	notif := wire.SNAC_0x01_0x10_OServiceEvilNotification{
 	notif := wire.SNAC_0x01_0x10_OServiceEvilNotification{

+ 49 - 0
foodgroup/icbm_test.go

@@ -1179,6 +1179,55 @@ func TestICBMService_EvilRequest(t *testing.T) {
 				},
 				},
 			},
 			},
 		},
 		},
+		{
+			name:          "can't warn bots",
+			senderSession: newTestSession("sender-screen-name"),
+			msgsReceived:  1,
+			inputSNAC: wire.SNACMessage{
+				Frame: wire.SNACFrame{
+					RequestID: 1234,
+				},
+				Body: wire.SNAC_0x04_0x08_ICBMEvilRequest{
+					SendAs:     0, // make it identified
+					ScreenName: "recipient-screen-name",
+				},
+			},
+			expectOutput: wire.SNACMessage{
+				Frame: wire.SNACFrame{
+					FoodGroup: wire.ICBM,
+					SubGroup:  wire.ICBMErr,
+					RequestID: 1234,
+				},
+				Body: wire.SNACError{
+					Code: wire.ErrorCodeRequestDenied,
+				},
+			},
+			mockParams: mockParams{
+				relationshipFetcherParams: relationshipFetcherParams{
+					relationshipParams: relationshipParams{
+						{
+							me:   state.NewIdentScreenName("sender-screen-name"),
+							them: state.NewIdentScreenName("recipient-screen-name"),
+							result: state.Relationship{
+								User:          state.NewIdentScreenName("recipient-screen-name"),
+								BlocksYou:     false,
+								YouBlock:      false,
+								IsOnTheirList: false,
+								IsOnYourList:  false,
+							},
+						},
+					},
+				},
+				sessionRetrieverParams: sessionRetrieverParams{
+					retrieveSessionParams{
+						{
+							screenName: state.NewIdentScreenName("recipient-screen-name"),
+							result:     newTestSession("recipient-screen-name", sessOptBot),
+						},
+					},
+				},
+			},
+		},
 		{
 		{
 			name:          "don't let users warn themselves",
 			name:          "don't let users warn themselves",
 			senderSession: newTestSession("sender-screen-name"),
 			senderSession: newTestSession("sender-screen-name"),