Documentation ¶
Overview ¶
Package updates provides a Telegram's state synchronization manager.
It guarantees that all state-sensitive updates will be performed in correct order.
Limitations:
Manager cannot verify stateless types of updates (tg.UpdatesClass without Seq, or tg.UpdateClass without Pts or Qts).
Due to the fact that updates.getDifference and updates.getChannelDifference do not return event sequences, manager cannot guarantee the correctness of these operations. We rely on the server here.
Manager cannot recover the channel gap if there is a ChannelDifferenceTooLong error. Restoring the state in such situation is not the prerogative of this manager. See: https://core.telegram.org/constructor/updates.channelDifferenceTooLong
TODO: Write implementation details.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type ChannelAccessHasher ¶ added in v0.51.0
type ChannelAccessHasher interface { SetChannelAccessHash(userID, channelID int, accessHash int64) error GetChannelAccessHash(userID, channelID int) (accessHash int64, found bool, err error) }
ChannelAccessHasher stores users channel access hashes.
type Config ¶
type Config struct { // Handler where updates will be passed. Handler telegram.UpdateHandler // Callback called if manager cannot // recover channel gap (optional). OnChannelTooLong func(channelID int) // State storage. // In-mem used if not provided. Storage StateStorage // Channel access hash storage. // In-mem used if not provided. AccessHasher ChannelAccessHasher // Logger (optional). Logger *zap.Logger }
Config of the manager.
type Entities ¶
type Entities struct { Users map[int]*tg.User Chats map[int]*tg.Chat Channels map[int]*tg.Channel ChannelsForbidden map[int]*tg.ChannelForbidden }
Entities contains update entities.
func (*Entities) FromUpdates ¶
func (e *Entities) FromUpdates(u interface { tg.UpdatesClass MapUsers() tg.UserClassArray MapChats() tg.ChatClassArray }) *Entities
FromUpdates method.
type Manager ¶ added in v0.51.0
type Manager struct {
// contains filtered or unexported fields
}
Manager deals with gaps.
Important: Updates produced by this manager may contain negative Pts/Qts/Seq values in tg.UpdateClass/tg.UpdatesClass (does not affects to the tg.MessageClass).
This is because telegram server does not return these sequences for getDifference/getChannelDifference results. You SHOULD NOT use them in update handlers at all.
func (*Manager) Auth ¶ added in v0.51.0
Auth notifies manager about user authentication on the telegram server.
If forget is true, local state (if exist) will be overwritten with remote state.
type RawClient ¶
type RawClient interface { UpdatesGetState(ctx context.Context) (*tg.UpdatesState, error) UpdatesGetDifference(ctx context.Context, request *tg.UpdatesGetDifferenceRequest) (tg.UpdatesDifferenceClass, error) UpdatesGetChannelDifference(ctx context.Context, request *tg.UpdatesGetChannelDifferenceRequest) (tg.UpdatesChannelDifferenceClass, error) }
RawClient is the interface which contains Telegram RPC methods used by manager for state synchronization.
type StateStorage ¶ added in v0.51.0
type StateStorage interface { GetState(userID int) (state State, found bool, err error) SetState(userID int, state State) error SetPts(userID, pts int) error SetQts(userID, qts int) error SetDate(userID, date int) error SetSeq(userID, seq int) error SetDateSeq(userID, date, seq int) error GetChannelPts(userID, channelID int) (pts int, found bool, err error) SetChannelPts(userID, channelID, pts int) error ForEachChannels(userID int, f func(channelID, pts int) error) error }
StateStorage is the users state storage.
Note: SetPts, SetQts, SetDate, SetSeq, SetDateSeq should return error if user state does not exist.