diff --git a/bridgestate.go b/bridgestate.go index b4f282d..3243221 100644 --- a/bridgestate.go +++ b/bridgestate.go @@ -39,6 +39,8 @@ const ( GMBrowserInactiveInactivity status.BridgeStateErrorCode = "gm-browser-inactive-inactivity" GMPhoneNotResponding status.BridgeStateErrorCode = "gm-phone-not-responding" + + GMSwitchedToGoogleLogin status.BridgeStateErrorCode = "gm-switched-to-google-login" ) func init() { @@ -52,6 +54,7 @@ func init() { GMBrowserInactiveTimeout: "Google Messages disconnected due to timeout", GMBrowserInactiveInactivity: "Google Messages disconnected due to inactivity", GMPhoneNotResponding: "Your phone is not responding, please check that it is connected to the internet. You may need to open the Messages app on your phone for it to reconnect.", + GMSwitchedToGoogleLogin: "Please switch to the QR code pairing method in the Google Messages app to continue using SMS/RCS", }) } diff --git a/libgm/event_handler.go b/libgm/event_handler.go index 6dfa130..d6b9ccc 100644 --- a/libgm/event_handler.go +++ b/libgm/event_handler.go @@ -226,6 +226,10 @@ func (c *Client) handleUpdatesEvent(msg *IncomingRPCMessage) { } c.triggerEvent(evt.TypingEvent.GetData()) + case *gmproto.UpdateEvents_AccountChange: + c.logContent(msg, "", nil) + c.triggerEvent(evt.AccountChange) + default: c.Logger.Warn(). Str("evt_data", base64.StdEncoding.EncodeToString(msg.DecryptedData)). diff --git a/libgm/gmproto/events.pb.go b/libgm/gmproto/events.pb.go index eb5a094..c9cccba 100644 --- a/libgm/gmproto/events.pb.go +++ b/libgm/gmproto/events.pb.go @@ -175,6 +175,7 @@ type UpdateEvents struct { // *UpdateEvents_SettingsEvent // *UpdateEvents_UserAlertEvent // *UpdateEvents_BrowserPresenceCheckEvent + // *UpdateEvents_AccountChange Event isUpdateEvents_Event `protobuf_oneof:"event"` } @@ -259,6 +260,13 @@ func (x *UpdateEvents) GetBrowserPresenceCheckEvent() *BrowserPresenceCheckEvent return nil } +func (x *UpdateEvents) GetAccountChange() *AccountChangeOrSomethingEvent { + if x, ok := x.GetEvent().(*UpdateEvents_AccountChange); ok { + return x.AccountChange + } + return nil +} + type isUpdateEvents_Event interface { isUpdateEvents_Event() } @@ -287,6 +295,16 @@ type UpdateEvents_BrowserPresenceCheckEvent struct { BrowserPresenceCheckEvent *BrowserPresenceCheckEvent `protobuf:"bytes,7,opt,name=browserPresenceCheckEvent,proto3,oneof"` } +type UpdateEvents_AccountChange struct { + // ParticipantsEvent participantsEvent = 8; + // ConversationTypeEvent conversationTypeEvent = 9; + // FavoriteStickersEvent favoriteStickersEvent = 10; + // RecentStickerEvent recentStickerEvent = 11; + // CloudStoreInfoEvent cloudStoreInfoEvent = 12; + // BlobForAttachmentProgressUpdate blobForAttachmentProgressUpdate = 13; + AccountChange *AccountChangeOrSomethingEvent `protobuf:"bytes,15,opt,name=accountChange,proto3,oneof"` +} + func (*UpdateEvents_ConversationEvent) isUpdateEvents_Event() {} func (*UpdateEvents_MessageEvent) isUpdateEvents_Event() {} @@ -299,6 +317,63 @@ func (*UpdateEvents_UserAlertEvent) isUpdateEvents_Event() {} func (*UpdateEvents_BrowserPresenceCheckEvent) isUpdateEvents_Event() {} +func (*UpdateEvents_AccountChange) isUpdateEvents_Event() {} + +type AccountChangeOrSomethingEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Account string `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` +} + +func (x *AccountChangeOrSomethingEvent) Reset() { + *x = AccountChangeOrSomethingEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_events_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccountChangeOrSomethingEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccountChangeOrSomethingEvent) ProtoMessage() {} + +func (x *AccountChangeOrSomethingEvent) ProtoReflect() protoreflect.Message { + mi := &file_events_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccountChangeOrSomethingEvent.ProtoReflect.Descriptor instead. +func (*AccountChangeOrSomethingEvent) Descriptor() ([]byte, []int) { + return file_events_proto_rawDescGZIP(), []int{1} +} + +func (x *AccountChangeOrSomethingEvent) GetAccount() string { + if x != nil { + return x.Account + } + return "" +} + +func (x *AccountChangeOrSomethingEvent) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + type ConversationEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -310,7 +385,7 @@ type ConversationEvent struct { func (x *ConversationEvent) Reset() { *x = ConversationEvent{} if protoimpl.UnsafeEnabled { - mi := &file_events_proto_msgTypes[1] + mi := &file_events_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -323,7 +398,7 @@ func (x *ConversationEvent) String() string { func (*ConversationEvent) ProtoMessage() {} func (x *ConversationEvent) ProtoReflect() protoreflect.Message { - mi := &file_events_proto_msgTypes[1] + mi := &file_events_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -336,7 +411,7 @@ func (x *ConversationEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ConversationEvent.ProtoReflect.Descriptor instead. func (*ConversationEvent) Descriptor() ([]byte, []int) { - return file_events_proto_rawDescGZIP(), []int{1} + return file_events_proto_rawDescGZIP(), []int{2} } func (x *ConversationEvent) GetData() []*Conversation { @@ -357,7 +432,7 @@ type TypingEvent struct { func (x *TypingEvent) Reset() { *x = TypingEvent{} if protoimpl.UnsafeEnabled { - mi := &file_events_proto_msgTypes[2] + mi := &file_events_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -370,7 +445,7 @@ func (x *TypingEvent) String() string { func (*TypingEvent) ProtoMessage() {} func (x *TypingEvent) ProtoReflect() protoreflect.Message { - mi := &file_events_proto_msgTypes[2] + mi := &file_events_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -383,7 +458,7 @@ func (x *TypingEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use TypingEvent.ProtoReflect.Descriptor instead. func (*TypingEvent) Descriptor() ([]byte, []int) { - return file_events_proto_rawDescGZIP(), []int{2} + return file_events_proto_rawDescGZIP(), []int{3} } func (x *TypingEvent) GetData() *TypingData { @@ -404,7 +479,7 @@ type MessageEvent struct { func (x *MessageEvent) Reset() { *x = MessageEvent{} if protoimpl.UnsafeEnabled { - mi := &file_events_proto_msgTypes[3] + mi := &file_events_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -417,7 +492,7 @@ func (x *MessageEvent) String() string { func (*MessageEvent) ProtoMessage() {} func (x *MessageEvent) ProtoReflect() protoreflect.Message { - mi := &file_events_proto_msgTypes[3] + mi := &file_events_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -430,7 +505,7 @@ func (x *MessageEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use MessageEvent.ProtoReflect.Descriptor instead. func (*MessageEvent) Descriptor() ([]byte, []int) { - return file_events_proto_rawDescGZIP(), []int{3} + return file_events_proto_rawDescGZIP(), []int{4} } func (x *MessageEvent) GetData() []*Message { @@ -451,7 +526,7 @@ type UserAlertEvent struct { func (x *UserAlertEvent) Reset() { *x = UserAlertEvent{} if protoimpl.UnsafeEnabled { - mi := &file_events_proto_msgTypes[4] + mi := &file_events_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -464,7 +539,7 @@ func (x *UserAlertEvent) String() string { func (*UserAlertEvent) ProtoMessage() {} func (x *UserAlertEvent) ProtoReflect() protoreflect.Message { - mi := &file_events_proto_msgTypes[4] + mi := &file_events_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -477,7 +552,7 @@ func (x *UserAlertEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UserAlertEvent.ProtoReflect.Descriptor instead. func (*UserAlertEvent) Descriptor() ([]byte, []int) { - return file_events_proto_rawDescGZIP(), []int{4} + return file_events_proto_rawDescGZIP(), []int{5} } func (x *UserAlertEvent) GetAlertType() AlertType { @@ -496,7 +571,7 @@ type BrowserPresenceCheckEvent struct { func (x *BrowserPresenceCheckEvent) Reset() { *x = BrowserPresenceCheckEvent{} if protoimpl.UnsafeEnabled { - mi := &file_events_proto_msgTypes[5] + mi := &file_events_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -509,7 +584,7 @@ func (x *BrowserPresenceCheckEvent) String() string { func (*BrowserPresenceCheckEvent) ProtoMessage() {} func (x *BrowserPresenceCheckEvent) ProtoReflect() protoreflect.Message { - mi := &file_events_proto_msgTypes[5] + mi := &file_events_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -522,7 +597,7 @@ func (x *BrowserPresenceCheckEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use BrowserPresenceCheckEvent.ProtoReflect.Descriptor instead. func (*BrowserPresenceCheckEvent) Descriptor() ([]byte, []int) { - return file_events_proto_rawDescGZIP(), []int{5} + return file_events_proto_rawDescGZIP(), []int{6} } type TypingData struct { @@ -538,7 +613,7 @@ type TypingData struct { func (x *TypingData) Reset() { *x = TypingData{} if protoimpl.UnsafeEnabled { - mi := &file_events_proto_msgTypes[6] + mi := &file_events_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -551,7 +626,7 @@ func (x *TypingData) String() string { func (*TypingData) ProtoMessage() {} func (x *TypingData) ProtoReflect() protoreflect.Message { - mi := &file_events_proto_msgTypes[6] + mi := &file_events_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -564,7 +639,7 @@ func (x *TypingData) ProtoReflect() protoreflect.Message { // Deprecated: Use TypingData.ProtoReflect.Descriptor instead. func (*TypingData) Descriptor() ([]byte, []int) { - return file_events_proto_rawDescGZIP(), []int{6} + return file_events_proto_rawDescGZIP(), []int{7} } func (x *TypingData) GetConversationID() string { @@ -600,7 +675,7 @@ type User struct { func (x *User) Reset() { *x = User{} if protoimpl.UnsafeEnabled { - mi := &file_events_proto_msgTypes[7] + mi := &file_events_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -613,7 +688,7 @@ func (x *User) String() string { func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { - mi := &file_events_proto_msgTypes[7] + mi := &file_events_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -626,7 +701,7 @@ func (x *User) ProtoReflect() protoreflect.Message { // Deprecated: Use User.ProtoReflect.Descriptor instead. func (*User) Descriptor() ([]byte, []int) { - return file_events_proto_rawDescGZIP(), []int{7} + return file_events_proto_rawDescGZIP(), []int{8} } func (x *User) GetField1() int64 { @@ -658,7 +733,7 @@ type RPCPairData struct { func (x *RPCPairData) Reset() { *x = RPCPairData{} if protoimpl.UnsafeEnabled { - mi := &file_events_proto_msgTypes[8] + mi := &file_events_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -671,7 +746,7 @@ func (x *RPCPairData) String() string { func (*RPCPairData) ProtoMessage() {} func (x *RPCPairData) ProtoReflect() protoreflect.Message { - mi := &file_events_proto_msgTypes[8] + mi := &file_events_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -684,7 +759,7 @@ func (x *RPCPairData) ProtoReflect() protoreflect.Message { // Deprecated: Use RPCPairData.ProtoReflect.Descriptor instead. func (*RPCPairData) Descriptor() ([]byte, []int) { - return file_events_proto_rawDescGZIP(), []int{8} + return file_events_proto_rawDescGZIP(), []int{9} } func (m *RPCPairData) GetEvent() isRPCPairData_Event { @@ -742,45 +817,47 @@ func file_events_proto_rawDescGZIP() []byte { } var file_events_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_events_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_events_proto_msgTypes = make([]protoimpl.MessageInfo, 10) var file_events_proto_goTypes = []interface{}{ - (AlertType)(0), // 0: events.AlertType - (TypingTypes)(0), // 1: events.TypingTypes - (*UpdateEvents)(nil), // 2: events.UpdateEvents - (*ConversationEvent)(nil), // 3: events.ConversationEvent - (*TypingEvent)(nil), // 4: events.TypingEvent - (*MessageEvent)(nil), // 5: events.MessageEvent - (*UserAlertEvent)(nil), // 6: events.UserAlertEvent - (*BrowserPresenceCheckEvent)(nil), // 7: events.BrowserPresenceCheckEvent - (*TypingData)(nil), // 8: events.TypingData - (*User)(nil), // 9: events.User - (*RPCPairData)(nil), // 10: events.RPCPairData - (*Settings)(nil), // 11: settings.Settings - (*Conversation)(nil), // 12: conversations.Conversation - (*Message)(nil), // 13: conversations.Message - (*PairedData)(nil), // 14: authentication.PairedData - (*RevokePairData)(nil), // 15: authentication.RevokePairData + (AlertType)(0), // 0: events.AlertType + (TypingTypes)(0), // 1: events.TypingTypes + (*UpdateEvents)(nil), // 2: events.UpdateEvents + (*AccountChangeOrSomethingEvent)(nil), // 3: events.AccountChangeOrSomethingEvent + (*ConversationEvent)(nil), // 4: events.ConversationEvent + (*TypingEvent)(nil), // 5: events.TypingEvent + (*MessageEvent)(nil), // 6: events.MessageEvent + (*UserAlertEvent)(nil), // 7: events.UserAlertEvent + (*BrowserPresenceCheckEvent)(nil), // 8: events.BrowserPresenceCheckEvent + (*TypingData)(nil), // 9: events.TypingData + (*User)(nil), // 10: events.User + (*RPCPairData)(nil), // 11: events.RPCPairData + (*Settings)(nil), // 12: settings.Settings + (*Conversation)(nil), // 13: conversations.Conversation + (*Message)(nil), // 14: conversations.Message + (*PairedData)(nil), // 15: authentication.PairedData + (*RevokePairData)(nil), // 16: authentication.RevokePairData } var file_events_proto_depIdxs = []int32{ - 3, // 0: events.UpdateEvents.conversationEvent:type_name -> events.ConversationEvent - 5, // 1: events.UpdateEvents.messageEvent:type_name -> events.MessageEvent - 4, // 2: events.UpdateEvents.typingEvent:type_name -> events.TypingEvent - 11, // 3: events.UpdateEvents.settingsEvent:type_name -> settings.Settings - 6, // 4: events.UpdateEvents.userAlertEvent:type_name -> events.UserAlertEvent - 7, // 5: events.UpdateEvents.browserPresenceCheckEvent:type_name -> events.BrowserPresenceCheckEvent - 12, // 6: events.ConversationEvent.data:type_name -> conversations.Conversation - 8, // 7: events.TypingEvent.data:type_name -> events.TypingData - 13, // 8: events.MessageEvent.data:type_name -> conversations.Message - 0, // 9: events.UserAlertEvent.alertType:type_name -> events.AlertType - 9, // 10: events.TypingData.user:type_name -> events.User - 1, // 11: events.TypingData.type:type_name -> events.TypingTypes - 14, // 12: events.RPCPairData.paired:type_name -> authentication.PairedData - 15, // 13: events.RPCPairData.revoked:type_name -> authentication.RevokePairData - 14, // [14:14] is the sub-list for method output_type - 14, // [14:14] is the sub-list for method input_type - 14, // [14:14] is the sub-list for extension type_name - 14, // [14:14] is the sub-list for extension extendee - 0, // [0:14] is the sub-list for field type_name + 4, // 0: events.UpdateEvents.conversationEvent:type_name -> events.ConversationEvent + 6, // 1: events.UpdateEvents.messageEvent:type_name -> events.MessageEvent + 5, // 2: events.UpdateEvents.typingEvent:type_name -> events.TypingEvent + 12, // 3: events.UpdateEvents.settingsEvent:type_name -> settings.Settings + 7, // 4: events.UpdateEvents.userAlertEvent:type_name -> events.UserAlertEvent + 8, // 5: events.UpdateEvents.browserPresenceCheckEvent:type_name -> events.BrowserPresenceCheckEvent + 3, // 6: events.UpdateEvents.accountChange:type_name -> events.AccountChangeOrSomethingEvent + 13, // 7: events.ConversationEvent.data:type_name -> conversations.Conversation + 9, // 8: events.TypingEvent.data:type_name -> events.TypingData + 14, // 9: events.MessageEvent.data:type_name -> conversations.Message + 0, // 10: events.UserAlertEvent.alertType:type_name -> events.AlertType + 10, // 11: events.TypingData.user:type_name -> events.User + 1, // 12: events.TypingData.type:type_name -> events.TypingTypes + 15, // 13: events.RPCPairData.paired:type_name -> authentication.PairedData + 16, // 14: events.RPCPairData.revoked:type_name -> authentication.RevokePairData + 15, // [15:15] is the sub-list for method output_type + 15, // [15:15] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name } func init() { file_events_proto_init() } @@ -805,7 +882,7 @@ func file_events_proto_init() { } } file_events_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConversationEvent); i { + switch v := v.(*AccountChangeOrSomethingEvent); i { case 0: return &v.state case 1: @@ -817,7 +894,7 @@ func file_events_proto_init() { } } file_events_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TypingEvent); i { + switch v := v.(*ConversationEvent); i { case 0: return &v.state case 1: @@ -829,7 +906,7 @@ func file_events_proto_init() { } } file_events_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MessageEvent); i { + switch v := v.(*TypingEvent); i { case 0: return &v.state case 1: @@ -841,7 +918,7 @@ func file_events_proto_init() { } } file_events_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserAlertEvent); i { + switch v := v.(*MessageEvent); i { case 0: return &v.state case 1: @@ -853,7 +930,7 @@ func file_events_proto_init() { } } file_events_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BrowserPresenceCheckEvent); i { + switch v := v.(*UserAlertEvent); i { case 0: return &v.state case 1: @@ -865,7 +942,7 @@ func file_events_proto_init() { } } file_events_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TypingData); i { + switch v := v.(*BrowserPresenceCheckEvent); i { case 0: return &v.state case 1: @@ -877,7 +954,7 @@ func file_events_proto_init() { } } file_events_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*User); i { + switch v := v.(*TypingData); i { case 0: return &v.state case 1: @@ -889,6 +966,18 @@ func file_events_proto_init() { } } file_events_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_events_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RPCPairData); i { case 0: return &v.state @@ -908,8 +997,9 @@ func file_events_proto_init() { (*UpdateEvents_SettingsEvent)(nil), (*UpdateEvents_UserAlertEvent)(nil), (*UpdateEvents_BrowserPresenceCheckEvent)(nil), + (*UpdateEvents_AccountChange)(nil), } - file_events_proto_msgTypes[8].OneofWrappers = []interface{}{ + file_events_proto_msgTypes[9].OneofWrappers = []interface{}{ (*RPCPairData_Paired)(nil), (*RPCPairData_Revoked)(nil), } @@ -919,7 +1009,7 @@ func file_events_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_events_proto_rawDesc, NumEnums: 2, - NumMessages: 9, + NumMessages: 10, NumExtensions: 0, NumServices: 0, }, diff --git a/libgm/gmproto/events.pb.raw b/libgm/gmproto/events.pb.raw index 43d8b63..e676d19 100644 Binary files a/libgm/gmproto/events.pb.raw and b/libgm/gmproto/events.pb.raw differ diff --git a/libgm/gmproto/events.proto b/libgm/gmproto/events.proto index d27dd1a..8aad661 100644 --- a/libgm/gmproto/events.proto +++ b/libgm/gmproto/events.proto @@ -21,9 +21,15 @@ message UpdateEvents { //RecentStickerEvent recentStickerEvent = 11; //CloudStoreInfoEvent cloudStoreInfoEvent = 12; //BlobForAttachmentProgressUpdate blobForAttachmentProgressUpdate = 13; + AccountChangeOrSomethingEvent accountChange = 15; } } +message AccountChangeOrSomethingEvent { + string account = 1; + bool enabled = 2; +} + message ConversationEvent { repeated conversations.Conversation data = 2; } diff --git a/user.go b/user.go index 8eb7b77..d69ee0f 100644 --- a/user.go +++ b/user.go @@ -70,6 +70,7 @@ type User struct { longPollingError error browserInactiveType status.BridgeStateErrorCode + switchedToGoogleLogin bool batteryLow bool mobileData bool phoneResponding bool @@ -658,6 +659,8 @@ func (user *User) syncHandleEvent(event any) { user.handleUserAlert(v) case *gmproto.Settings: user.handleSettings(v) + case *gmproto.AccountChangeOrSomethingEvent: + user.handleAccountChange(v) default: user.zlog.Trace().Any("data", v).Type("data_type", v).Msg("Unknown event") } @@ -715,6 +718,20 @@ func (user *User) fetchAndSyncConversations() { } } +func (user *User) handleAccountChange(v *gmproto.AccountChangeOrSomethingEvent) { + user.zlog.Debug(). + Str("account", v.GetAccount()). + Bool("enabled", v.GetEnabled()). + Msg("Got account change event") + user.switchedToGoogleLogin = v.GetEnabled() + if user.switchedToGoogleLogin { + go user.sendMarkdownBridgeAlert(true, "The bridge will not work when the account-based pairing method is enabled in the Google Messages app. Unlink other devices and switch back to the QR code method to continue using the bridge.") + } else { + go user.sendMarkdownBridgeAlert(false, "Switched back to QR pairing, bridge should work now") + } + user.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnected}) +} + func (user *User) handleUserAlert(v *gmproto.UserAlertEvent) { user.zlog.Debug().Str("alert_type", v.GetAlertType().String()).Msg("Got user alert event") becameInactive := false @@ -816,6 +833,7 @@ func (user *User) FillBridgeState(state status.BridgeState) status.BridgeState { state.Info["battery_low"] = user.batteryLow state.Info["mobile_data"] = user.mobileData state.Info["browser_active"] = user.browserInactiveType == "" + state.Info["google_account_pairing"] = user.switchedToGoogleLogin if !user.ready { state.StateEvent = status.StateConnecting state.Error = GMConnecting @@ -824,6 +842,10 @@ func (user *User) FillBridgeState(state status.BridgeState) status.BridgeState { state.StateEvent = status.StateBadCredentials state.Error = GMPhoneNotResponding } + if user.switchedToGoogleLogin { + state.StateEvent = status.StateBadCredentials + state.Error = GMSwitchedToGoogleLogin + } if user.longPollingError != nil { state.StateEvent = status.StateTransientDisconnect state.Error = GMListenError