Explorar o código

feat: implement seticqphone

siohaza hai 5 meses
pai
achega
bca2ef3326

+ 5 - 0
foodgroup/icq.go

@@ -518,6 +518,11 @@ func (s ICQService) SetEmails(ctx context.Context, instance *state.SessionInstan
 	return s.reqAck(ctx, instance, seq, wire.ICQDBQueryMetaReplySetEmails)
 }
 
+func (s ICQService) SetICQPhone(ctx context.Context, instance *state.SessionInstance, inBody wire.ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone, seq uint16) error {
+	s.logger.Debug("received SetICQPhone request")
+	return s.reqAck(ctx, instance, seq, wire.ICQDBQueryMetaReplySetICQPhone)
+}
+
 func (s ICQService) SetInterests(ctx context.Context, instance *state.SessionInstance, inBody wire.ICQ_0x07D0_0x0410_DBQueryMetaReqSetInterests, seq uint16) error {
 	if len(inBody.Interests) != 4 {
 		return fmt.Errorf("%w: expected 4 interests", errICQBadRequest)

+ 65 - 0
foodgroup/icq_test.go

@@ -2194,6 +2194,71 @@ func TestICQService_SetEmails(t *testing.T) {
 	}
 }
 
+func TestICQService_SetICQPhone(t *testing.T) {
+	tests := []struct {
+		name       string
+		seq        uint16
+		instance   *state.SessionInstance
+		req        wire.ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone
+		mockParams mockParams
+		wantErr    error
+	}{
+		{
+			name:     "happy path",
+			seq:      1,
+			instance: newTestInstance("100003", sessOptUIN(100003)),
+			req:      wire.ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone{},
+			mockParams: mockParams{
+				messageRelayerParams: messageRelayerParams{
+					relayToScreenNameParams: relayToScreenNameParams{
+						{
+							screenName: state.NewIdentScreenName("100003"),
+							message: wire.SNACMessage{
+								Frame: wire.SNACFrame{
+									FoodGroup: wire.ICQ,
+									SubGroup:  wire.ICQDBReply,
+								},
+								Body: wire.SNAC_0x15_0x02_DBReply{
+									TLVRestBlock: wire.TLVRestBlock{
+										TLVList: wire.TLVList{
+											wire.NewTLVBE(wire.ICQTLVTagsMetadata, wire.ICQMessageReplyEnvelope{
+												Message: wire.ICQ_0x07DA_0x00DC_DBQueryMetaReplyMoreInfo{
+													ICQMetadata: wire.ICQMetadata{
+														UIN:     100003,
+														ReqType: wire.ICQDBQueryMetaReply,
+														Seq:     1,
+													},
+													ReqSubType: wire.ICQDBQueryMetaReplySetICQPhone,
+													Success:    wire.ICQStatusCodeOK,
+												},
+											}),
+										},
+									},
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			messageRelayer := newMockMessageRelayer(t)
+			for _, params := range tt.mockParams.relayToScreenNameParams {
+				messageRelayer.EXPECT().RelayToScreenName(mock.Anything, params.screenName, params.message)
+			}
+
+			s := ICQService{
+				logger:         slog.Default(),
+				messageRelayer: messageRelayer,
+			}
+			err := s.SetICQPhone(context.Background(), tt.instance, tt.req, tt.seq)
+			assert.NoError(t, err)
+		})
+	}
+}
+
 func TestICQService_SetBasicInfo(t *testing.T) {
 	tests := []struct {
 		name       string

+ 8 - 0
server/oscar/handler.go

@@ -513,6 +513,14 @@ func (rt Handler) ICQDBQuery(ctx context.Context, instance *state.SessionInstanc
 			if err := rt.ICQService.SetPermissions(ctx, instance, req, icqMD.Seq); err != nil {
 				return err
 			}
+		case wire.ICQDBQueryMetaReqSetICQPhone:
+			req := wire.ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone{}
+			if err := wire.UnmarshalLE(&req, buf); err != nil {
+				return err
+			}
+			if err := rt.ICQService.SetICQPhone(ctx, instance, req, icqMD.Seq); err != nil {
+				return err
+			}
 		case wire.ICQDBQueryMetaReqSearchByUIN:
 			req := wire.ICQ_0x07D0_0x051F_DBQueryMetaReqSearchByUIN{}
 			if err := wire.UnmarshalLE(&req, buf); err != nil {

+ 33 - 0
server/oscar/handler_test.go

@@ -2818,6 +2818,7 @@ func TestHandler_ICQDBQuery(t *testing.T) {
 		setInterests      *mockParam
 		setMoreInfo       *mockParam
 		setPermissions    *mockParam
+		setICQPhone       *mockParam
 		setUserNotes      *mockParam
 		setWorkInfo       *mockParam
 		shortUserInfo     *mockParam
@@ -2988,6 +2989,34 @@ func TestHandler_ICQDBQuery(t *testing.T) {
 				},
 			},
 		},
+		{
+			name: "MetaReqSetICQPhone - happy path",
+			reqParams: reqParams{
+				instance: state.NewSession().AddInstance(),
+				inBody: wire.SNAC_0x15_0x02_BQuery{
+					TLVRestBlock: wire.TLVRestBlock{
+						TLVList: wire.TLVList{
+							wire.NewTLVBE(wire.ICQTLVTagsMetadata, wire.ICQMessageReplyEnvelope{
+								Message: ICQMetaRequest{
+									ICQMetadata: wire.ICQMetadata{
+										ReqType: wire.ICQDBQueryMetaReq,
+										Seq:     1,
+									},
+									ReqSubType:  wire.ICQDBQueryMetaReqSetICQPhone,
+									MetaRequest: wire.ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone{},
+								},
+							}),
+						},
+					},
+				},
+				seq: 1,
+			},
+			allMockParams: allMockParams{
+				setICQPhone: &mockParam{
+					req: wire.ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone{},
+				},
+			},
+		},
 		{
 			name: "MetaReqSearchByUIN - happy path",
 			reqParams: reqParams{
@@ -3659,6 +3688,10 @@ func TestHandler_ICQDBQuery(t *testing.T) {
 				icqService.EXPECT().
 					SetPermissions(mock.Anything, tt.reqParams.instance, tt.allMockParams.setPermissions.req, tt.reqParams.seq).
 					Return(tt.allMockParams.setPermissions.wantErr)
+			case tt.allMockParams.setICQPhone != nil:
+				icqService.EXPECT().
+					SetICQPhone(mock.Anything, tt.reqParams.instance, tt.allMockParams.setICQPhone.req, tt.reqParams.seq).
+					Return(tt.allMockParams.setICQPhone.wantErr)
 			case tt.allMockParams.findByUIN != nil:
 				icqService.EXPECT().
 					FindByUIN(mock.Anything, tt.reqParams.instance, tt.allMockParams.findByUIN.req, tt.reqParams.seq).

+ 69 - 0
server/oscar/mock_icq_service_test.go

@@ -924,6 +924,75 @@ func (_c *mockICQService_SetEmails_Call) RunAndReturn(run func(ctx context.Conte
 	return _c
 }
 
+// SetICQPhone provides a mock function for the type mockICQService
+func (_mock *mockICQService) SetICQPhone(ctx context.Context, instance *state.SessionInstance, inBody wire.ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone, seq uint16) error {
+	ret := _mock.Called(ctx, instance, inBody, seq)
+
+	if len(ret) == 0 {
+		panic("no return value specified for SetICQPhone")
+	}
+
+	var r0 error
+	if returnFunc, ok := ret.Get(0).(func(context.Context, *state.SessionInstance, wire.ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone, uint16) error); ok {
+		r0 = returnFunc(ctx, instance, inBody, seq)
+	} else {
+		r0 = ret.Error(0)
+	}
+	return r0
+}
+
+// mockICQService_SetICQPhone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetICQPhone'
+type mockICQService_SetICQPhone_Call struct {
+	*mock.Call
+}
+
+// SetICQPhone is a helper method to define mock.On call
+//   - ctx context.Context
+//   - instance *state.SessionInstance
+//   - inBody wire.ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone
+//   - seq uint16
+func (_e *mockICQService_Expecter) SetICQPhone(ctx interface{}, instance interface{}, inBody interface{}, seq interface{}) *mockICQService_SetICQPhone_Call {
+	return &mockICQService_SetICQPhone_Call{Call: _e.mock.On("SetICQPhone", ctx, instance, inBody, seq)}
+}
+
+func (_c *mockICQService_SetICQPhone_Call) Run(run func(ctx context.Context, instance *state.SessionInstance, inBody wire.ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone, seq uint16)) *mockICQService_SetICQPhone_Call {
+	_c.Call.Run(func(args mock.Arguments) {
+		var arg0 context.Context
+		if args[0] != nil {
+			arg0 = args[0].(context.Context)
+		}
+		var arg1 *state.SessionInstance
+		if args[1] != nil {
+			arg1 = args[1].(*state.SessionInstance)
+		}
+		var arg2 wire.ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone
+		if args[2] != nil {
+			arg2 = args[2].(wire.ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone)
+		}
+		var arg3 uint16
+		if args[3] != nil {
+			arg3 = args[3].(uint16)
+		}
+		run(
+			arg0,
+			arg1,
+			arg2,
+			arg3,
+		)
+	})
+	return _c
+}
+
+func (_c *mockICQService_SetICQPhone_Call) Return(err error) *mockICQService_SetICQPhone_Call {
+	_c.Call.Return(err)
+	return _c
+}
+
+func (_c *mockICQService_SetICQPhone_Call) RunAndReturn(run func(ctx context.Context, instance *state.SessionInstance, inBody wire.ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone, seq uint16) error) *mockICQService_SetICQPhone_Call {
+	_c.Call.Return(run)
+	return _c
+}
+
 // SetInterests provides a mock function for the type mockICQService
 func (_mock *mockICQService) SetInterests(ctx context.Context, instance *state.SessionInstance, inBody wire.ICQ_0x07D0_0x0410_DBQueryMetaReqSetInterests, seq uint16) error {
 	ret := _mock.Called(ctx, instance, inBody, seq)

+ 1 - 0
server/oscar/types.go

@@ -129,6 +129,7 @@ type ICQService interface {
 	SetInterests(ctx context.Context, instance *state.SessionInstance, inBody wire.ICQ_0x07D0_0x0410_DBQueryMetaReqSetInterests, seq uint16) error
 	SetMoreInfo(ctx context.Context, instance *state.SessionInstance, inBody wire.ICQ_0x07D0_0x03FD_DBQueryMetaReqSetMoreInfo, seq uint16) error
 	SetPermissions(ctx context.Context, instance *state.SessionInstance, inBody wire.ICQ_0x07D0_0x0424_DBQueryMetaReqSetPermissions, seq uint16) error
+	SetICQPhone(ctx context.Context, instance *state.SessionInstance, inBody wire.ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone, seq uint16) error
 	SetUserNotes(ctx context.Context, instance *state.SessionInstance, inBody wire.ICQ_0x07D0_0x0406_DBQueryMetaReqSetNotes, seq uint16) error
 	SetWorkInfo(ctx context.Context, instance *state.SessionInstance, inBody wire.ICQ_0x07D0_0x03F3_DBQueryMetaReqSetWorkInfo, seq uint16) error
 	ShortUserInfo(ctx context.Context, instance *state.SessionInstance, inBody wire.ICQ_0x07D0_0x04BA_DBQueryMetaReqShortInfo, seq uint16) error

+ 8 - 0
wire/snacs.go

@@ -1924,6 +1924,7 @@ const (
 	ICQDBQueryMetaReqSetInterests      uint16 = 0x0410
 	ICQDBQueryMetaReqSetAffiliations   uint16 = 0x041A
 	ICQDBQueryMetaReqSetPermissions    uint16 = 0x0424
+	ICQDBQueryMetaReqSetICQPhone       uint16 = 0x0654
 	ICQDBQueryMetaReqShortInfo         uint16 = 0x04BA
 	ICQDBQueryMetaReqFullInfo          uint16 = 0x04B2
 	ICQDBQueryMetaReqFullInfo2         uint16 = 0x04D0
@@ -1957,6 +1958,7 @@ const (
 	ICQDBQueryMetaReplySetInterests    uint16 = 0x008C
 	ICQDBQueryMetaReplySetAffiliations uint16 = 0x0096
 	ICQDBQueryMetaReplySetPermissions  uint16 = 0x00A0
+	ICQDBQueryMetaReplySetICQPhone     uint16 = 0x031E
 	ICQDBQueryMetaReplyBasicInfo       uint16 = 0x00C8
 	ICQDBQueryMetaReplyWorkInfo        uint16 = 0x00D2
 	ICQDBQueryMetaReplyMoreInfo        uint16 = 0x00DC
@@ -1990,6 +1992,12 @@ type ICQ_0x07D0_0x0424_DBQueryMetaReqSetPermissions struct {
 	Unknown       uint8
 }
 
+// ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone represents a request to set
+// ICQPhone information.
+type ICQ_0x07D0_0x0654_DBQueryMetaReqSetICQPhone struct {
+	// acknowledge the data, do nothing
+}
+
 type ICQ_0x07D0_0x051F_DBQueryMetaReqSearchByUIN struct {
 	UIN uint32
 }

+ 2 - 0
wire/snacs_string.go

@@ -353,6 +353,7 @@ var icqDBQueryMeta = map[uint16]string{
 	ICQDBQueryMetaReqSetInterests:      "ICQDBQueryMetaReqSetInterests",
 	ICQDBQueryMetaReqSetAffiliations:   "ICQDBQueryMetaReqSetAffiliations",
 	ICQDBQueryMetaReqSetPermissions:    "ICQDBQueryMetaReqSetPermissions",
+	ICQDBQueryMetaReqSetICQPhone:       "ICQDBQueryMetaReqSetICQPhone",
 	ICQDBQueryMetaReqFullInfo:          "ICQDBQueryMetaReqFullInfo",
 	ICQDBQueryMetaReqFullInfo2:         "ICQDBQueryMetaReqFullInfo2",
 	ICQDBQueryMetaReqSearchByDetails:   "ICQDBQueryMetaReqSearchByDetails",
@@ -381,6 +382,7 @@ var icqDBQueryMeta = map[uint16]string{
 	ICQDBQueryMetaReplySetInterests:    "ICQDBQueryMetaReplySetInterests",
 	ICQDBQueryMetaReplySetAffiliations: "ICQDBQueryMetaReplySetAffiliations",
 	ICQDBQueryMetaReplySetPermissions:  "ICQDBQueryMetaReplySetPermissions",
+	ICQDBQueryMetaReplySetICQPhone:     "ICQDBQueryMetaReplySetICQPhone",
 	ICQDBQueryMetaReplyBasicInfo:       "ICQDBQueryMetaReplyBasicInfo",
 	ICQDBQueryMetaReplyWorkInfo:        "ICQDBQueryMetaReplyWorkInfo",
 	ICQDBQueryMetaReplyMoreInfo:        "ICQDBQueryMetaReplyMoreInfo",