Documentation
¶
Overview ¶
Package redis contains gotd storage implementations using Redis.
Index ¶
- Variables
- type AccessHasher
- func (s *AccessHasher) GetChannelAccessHash(ctx context.Context, userID, channelID int64) (accessHash int64, found bool, err error)
- func (s *AccessHasher) GetUserAccessHash(ctx context.Context, userID, targetUserID int64) (accessHash int64, found bool, err error)
- func (s *AccessHasher) SetChannelAccessHash(ctx context.Context, userID, channelID, accessHash int64) error
- func (s *AccessHasher) SetUserAccessHash(ctx context.Context, userID, targetUserID, accessHash int64) error
- type Credentials
- type PeerStorage
- func (s PeerStorage) Add(ctx context.Context, value storage.Peer) error
- func (s PeerStorage) Assign(ctx context.Context, key string, value storage.Peer) (rerr error)
- func (s PeerStorage) Find(ctx context.Context, key storage.PeerKey) (storage.Peer, error)
- func (s PeerStorage) Iterate(ctx context.Context) (storage.PeerIterator, error)
- func (s PeerStorage) Resolve(ctx context.Context, key string) (storage.Peer, error)
- func (s *PeerStorage) WithBinaryEncoding() *PeerStorage
- type SessionStorage
- type StateStorage
- func (s *StateStorage) ForEachChannels(ctx context.Context, userID int64, ...) error
- func (s *StateStorage) GetChannelPts(ctx context.Context, userID, channelID int64) (pts int, found bool, err error)
- func (s *StateStorage) GetState(ctx context.Context, userID int64) (updates.State, bool, error)
- func (s *StateStorage) SetChannelPts(ctx context.Context, userID, channelID int64, pts int) error
- func (s *StateStorage) SetDate(ctx context.Context, userID int64, date int) error
- func (s *StateStorage) SetDateSeq(ctx context.Context, userID int64, date, seq int) error
- func (s *StateStorage) SetPts(ctx context.Context, userID int64, pts int) error
- func (s *StateStorage) SetQts(ctx context.Context, userID int64, qts int) error
- func (s *StateStorage) SetSeq(ctx context.Context, userID int64, seq int) error
- func (s *StateStorage) SetState(ctx context.Context, userID int64, state updates.State) error
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ErrStateNotFound = errors.New("state not found")
ErrStateNotFound is returned by StateStorage setters if user state does not exist, as updates.StateStorage requires.
Functions ¶
This section is empty.
Types ¶
type AccessHasher ¶ added in v0.26.0
type AccessHasher struct {
// contains filtered or unexported fields
}
AccessHasher is updates.ChannelAccessHasher and updates.UserAccessHasher implementation using redis.
func NewAccessHasher ¶ added in v0.26.0
func NewAccessHasher(client *redis.Client) *AccessHasher
NewAccessHasher creates new access hasher using redis.
func (*AccessHasher) GetChannelAccessHash ¶ added in v0.26.0
func (s *AccessHasher) GetChannelAccessHash(ctx context.Context, userID, channelID int64) (accessHash int64, found bool, err error)
GetChannelAccessHash implements updates.ChannelAccessHasher.
func (*AccessHasher) GetUserAccessHash ¶ added in v0.26.0
func (s *AccessHasher) GetUserAccessHash(ctx context.Context, userID, targetUserID int64) (accessHash int64, found bool, err error)
GetUserAccessHash implements updates.UserAccessHasher.
func (*AccessHasher) SetChannelAccessHash ¶ added in v0.26.0
func (s *AccessHasher) SetChannelAccessHash(ctx context.Context, userID, channelID, accessHash int64) error
SetChannelAccessHash implements updates.ChannelAccessHasher.
func (*AccessHasher) SetUserAccessHash ¶ added in v0.26.0
func (s *AccessHasher) SetUserAccessHash(ctx context.Context, userID, targetUserID, accessHash int64) error
SetUserAccessHash implements updates.UserAccessHasher.
type Credentials ¶
type Credentials struct {
kv.Credentials
}
Credentials stores user credentials to Redis.
Example ¶
package main
import (
"context"
"fmt"
"os"
"os/signal"
"github.com/go-faster/errors"
redisclient "github.com/go-redis/redis/v8"
tgauth "github.com/gotd/td/telegram/auth"
"github.com/gotd/td/telegram"
"github.com/gotd/contrib/auth"
"github.com/gotd/contrib/auth/terminal"
"github.com/gotd/contrib/redis"
)
func redisAuth(ctx context.Context) error {
redisClient := redisclient.NewClient(&redisclient.Options{})
cred := redis.NewCredentials(redisClient).
WithPhoneKey("phone").
WithPasswordKey("password")
client, err := telegram.ClientFromEnvironment(telegram.Options{})
if err != nil {
return errors.Wrap(err, "create client")
}
return client.Run(ctx, func(ctx context.Context) error {
return client.Auth().IfNecessary(
ctx,
tgauth.NewFlow(auth.Build(cred, terminal.OS()), tgauth.SendCodeOptions{}),
)
})
}
func main() {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()
if err := redisAuth(ctx); err != nil {
_, _ = fmt.Fprintf(os.Stderr, "%+v\n", err)
os.Exit(1)
}
}
Output:
func NewCredentials ¶
func NewCredentials(client *redis.Client) Credentials
NewCredentials creates new Credentials.
type PeerStorage ¶
type PeerStorage struct {
// contains filtered or unexported fields
}
PeerStorage is a peer storage based on redis.
func NewPeerStorage ¶
func NewPeerStorage(client *redis.Client) *PeerStorage
NewPeerStorage creates new peer storage using redis.
func (PeerStorage) Assign ¶
Assign adds given peer to the storage and associate it to the given key.
func (PeerStorage) Iterate ¶ added in v0.5.0
func (s PeerStorage) Iterate(ctx context.Context) (storage.PeerIterator, error)
Iterate creates and returns new PeerIterator.
func (*PeerStorage) WithBinaryEncoding ¶ added in v0.26.0
func (s *PeerStorage) WithBinaryEncoding() *PeerStorage
WithBinaryEncoding makes the storage write peers in the compact binary format (storage.PeerEncodingBinary) instead of JSON. Values in either format are read, but versions of this package before the binary format can't read binary values: downgrading needs the peer storage cleared.
type SessionStorage ¶
SessionStorage is a MTProto session Redis storage.
Example ¶
package main
import (
"context"
"fmt"
"os"
"os/signal"
"github.com/go-faster/errors"
redisclient "github.com/go-redis/redis/v8"
"github.com/gotd/td/telegram"
"github.com/gotd/contrib/redis"
)
func redisStorage(ctx context.Context) error {
redisClient := redisclient.NewClient(&redisclient.Options{})
storage := redis.NewSessionStorage(redisClient, "session")
client, err := telegram.ClientFromEnvironment(telegram.Options{
SessionStorage: storage,
})
if err != nil {
return errors.Wrap(err, "create client")
}
return client.Run(ctx, func(ctx context.Context) error {
// Force redis to flush DB.
// It may be necessary to be sure that session will be saved to the disk.
if err := redisClient.FlushDBAsync(ctx).Err(); err != nil {
return errors.Wrap(err, "flush")
}
_, err := client.Auth().Bot(ctx, os.Getenv("BOT_TOKEN"))
return err
})
}
func main() {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()
if err := redisStorage(ctx); err != nil {
_, _ = fmt.Fprintf(os.Stderr, "%+v\n", err)
os.Exit(1)
}
}
Output:
func NewSessionStorage ¶
func NewSessionStorage(client *redis.Client, key string) SessionStorage
NewSessionStorage creates new SessionStorage.
type StateStorage ¶ added in v0.26.0
type StateStorage struct {
// contains filtered or unexported fields
}
StateStorage is updates.StateStorage implementation using redis.
Common state of a user is stored in a hash, channel pts in another hash keyed by channel ID.
func NewStateStorage ¶ added in v0.26.0
func NewStateStorage(client *redis.Client) *StateStorage
NewStateStorage creates new updates state storage using redis.
func (*StateStorage) ForEachChannels ¶ added in v0.26.0
func (s *StateStorage) ForEachChannels( ctx context.Context, userID int64, f func(ctx context.Context, channelID int64, pts int) error, ) error
ForEachChannels implements updates.StateStorage.
func (*StateStorage) GetChannelPts ¶ added in v0.26.0
func (s *StateStorage) GetChannelPts(ctx context.Context, userID, channelID int64) (pts int, found bool, err error)
GetChannelPts implements updates.StateStorage.
func (*StateStorage) SetChannelPts ¶ added in v0.26.0
SetChannelPts implements updates.StateStorage.
func (*StateStorage) SetDateSeq ¶ added in v0.26.0
SetDateSeq implements updates.StateStorage.