diff --git a/pkg/connector/client.go b/pkg/connector/client.go index d0c1d5cc..f6a7dd36 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -113,32 +113,6 @@ type TelegramClient struct { var _ bridgev2.NetworkAPI = (*TelegramClient)(nil) -type UpdateDispatcher struct { - tg.UpdateDispatcher - EntityHandler func(context.Context, tg.Entities) error -} - -func (u UpdateDispatcher) Handle(ctx context.Context, updates tg.UpdatesClass) error { - var e tg.Entities - switch u := updates.(type) { - case *tg.Updates: - e.Users = u.MapUsers().NotEmptyToMap() - chats := u.MapChats() - e.Chats = chats.ChatToMap() - e.Channels = chats.ChannelToMap() - case *tg.UpdatesCombined: - e.Users = u.MapUsers().NotEmptyToMap() - chats := u.MapChats() - e.Chats = chats.ChatToMap() - e.Channels = chats.ChannelToMap() - } - if u.EntityHandler != nil { - u.EntityHandler(ctx, e) - } - - return u.UpdateDispatcher.Handle(ctx, updates) -} - var messageLinkRegex = regexp.MustCompile(`^https?://t(?:elegram)?\.(?:me|dog)/([A-Za-z][A-Za-z0-9_]{3,31}[A-Za-z0-9]|[Cc]/[0-9]{1,20})/([0-9]{1,20})(?:/([0-9]{1,20}))?$`) func (tg *TelegramConnector) deviceConfig() telegram.DeviceConfig { @@ -198,10 +172,8 @@ func NewTelegramClient(ctx context.Context, tc *TelegramConnector, login *bridge return &client, nil } - dispatcher := UpdateDispatcher{ - UpdateDispatcher: tg.NewUpdateDispatcher(), - EntityHandler: client.onEntityUpdate, - } + dispatcher := tg.NewUpdateDispatcher() + dispatcher.OnFallback(client.onEntityUpdate) dispatcher.OnNewMessage(func(ctx context.Context, e tg.Entities, update *tg.UpdateNewMessage) error { return client.onUpdateNewMessage(ctx, e, update) }) diff --git a/pkg/connector/handletelegram.go b/pkg/connector/handletelegram.go index 9ac48927..4ecefbff 100644 --- a/pkg/connector/handletelegram.go +++ b/pkg/connector/handletelegram.go @@ -817,7 +817,7 @@ func (t *TelegramClient) updateChannel(ctx context.Context, channel *tg.Channel) return userInfo, nil } -func (t *TelegramClient) onEntityUpdate(ctx context.Context, e tg.Entities) error { +func (t *TelegramClient) onEntityUpdate(ctx context.Context, e tg.Entities, _ tg.UpdateClass) error { for userID, user := range e.Users { if _, err := t.updateGhost(ctx, userID, user); err != nil { return err diff --git a/pkg/gotd/gen/_template/handlers.tmpl b/pkg/gotd/gen/_template/handlers.tmpl index 6b47cd62..14936232 100644 --- a/pkg/gotd/gen/_template/handlers.tmpl +++ b/pkg/gotd/gen/_template/handlers.tmpl @@ -5,13 +5,14 @@ type Handler = func(context.Context, Entities, UpdateClass) error type UpdateDispatcher struct { - handlers map[uint32]Handler + handlers map[uint32]Handler fallback Handler } func NewUpdateDispatcher() UpdateDispatcher { - return UpdateDispatcher{ - handlers: map[uint32]Handler{}, + return UpdateDispatcher{ + handlers: map[uint32]Handler{}, + fallback: func(ctx context.Context, entities Entities, class UpdateClass) error { return nil }, } } @@ -67,17 +68,17 @@ func (u UpdateDispatcher) Handle(ctx context.Context, updates UpdatesClass) erro } func (u UpdateDispatcher) dispatch(ctx context.Context, e Entities, update UpdateClass) error { - if update == nil { - return nil - } - typeID := update.TypeID() - handler, ok := u.handlers[typeID] + if update == nil { + return nil + } + if err := u.fallback(ctx, e, update); err != nil { + return err + } + typeID := update.TypeID() + handler, ok := u.handlers[typeID] if ok { return handler(ctx, e, update) } - if u.fallback != nil { - return u.fallback(ctx, e, update) - } return nil } diff --git a/pkg/gotd/tg/tl_handlers_gen.go b/pkg/gotd/tg/tl_handlers_gen.go index 9f1a6f2e..1655cbfb 100644 --- a/pkg/gotd/tg/tl_handlers_gen.go +++ b/pkg/gotd/tg/tl_handlers_gen.go @@ -41,6 +41,7 @@ type UpdateDispatcher struct { func NewUpdateDispatcher() UpdateDispatcher { return UpdateDispatcher{ handlers: map[uint32]Handler{}, + fallback: func(ctx context.Context, entities Entities, class UpdateClass) error { return nil }, } } @@ -99,14 +100,14 @@ func (u UpdateDispatcher) dispatch(ctx context.Context, e Entities, update Updat if update == nil { return nil } + if err := u.fallback(ctx, e, update); err != nil { + return err + } typeID := update.TypeID() handler, ok := u.handlers[typeID] if ok { return handler(ctx, e, update) } - if u.fallback != nil { - return u.fallback(ctx, e, update) - } return nil }