7a04f298d2
- update to latest telegram layer - remove some references to fields in tg.Entities that don't exist in the schema - originally added here: https://github.com/beeper/td/commit/820929062a2ba0104397bc01235ab58a9cff780e - referenced here - https://github.com/mautrix/telegramgo/commit/124f0967ed195b5a380c9bd02e170ada9710dde3 - https://github.com/mautrix/telegramgo/commit/4205047aab2e0639217148b5d125bfaab668bd8e
122 lines
3.4 KiB
Go
122 lines
3.4 KiB
Go
package peers
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/go-faster/errors"
|
|
"go.uber.org/zap"
|
|
|
|
"go.mau.fi/mautrix-telegram/pkg/gotd/tg"
|
|
)
|
|
|
|
// getUserFull gets tg.UserFull using given tg.InputUserClass.
|
|
func (m *Manager) getUserFull(ctx context.Context, p tg.InputUserClass) (*tg.UserFull, error) {
|
|
if userID, ok := m.getIDFromInputUser(p); ok && !m.needsUpdateFull(userPeerID(userID)) {
|
|
// TODO(tdakkota): save full self.
|
|
u, found, err := m.cache.FindUserFull(ctx, userID)
|
|
if err == nil && found {
|
|
u.SetFlags()
|
|
return u, nil
|
|
}
|
|
if err != nil {
|
|
m.logger.Warn("Find full user error", zap.Int64("user_id", userID), zap.Error(err))
|
|
}
|
|
}
|
|
return m.updateUserFull(ctx, p)
|
|
}
|
|
|
|
// updateUserFull forcibly updates tg.UserFull using given tg.InputUserClass.
|
|
func (m *Manager) updateUserFull(ctx context.Context, p tg.InputUserClass) (*tg.UserFull, error) {
|
|
r, err := m.api.UsersGetFullUser(ctx, p)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "get full user")
|
|
}
|
|
|
|
if err := m.applyEntities(ctx, r.GetUsers(), r.GetChats()); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := m.applyFullUser(ctx, &r.FullUser); err != nil {
|
|
return nil, errors.Wrap(err, "update full user")
|
|
}
|
|
|
|
cp := r.FullUser
|
|
return &cp, nil
|
|
}
|
|
|
|
// getChatFull gets tg.ChatFull using given id.
|
|
func (m *Manager) getChatFull(ctx context.Context, p int64) (*tg.ChatFull, error) {
|
|
if !m.needsUpdateFull(chatPeerID(p)) {
|
|
c, found, err := m.cache.FindChatFull(ctx, p)
|
|
if err == nil && found {
|
|
c.SetFlags()
|
|
return c, nil
|
|
}
|
|
if err != nil {
|
|
m.logger.Warn("Find full chat error", zap.Int64("chat_id", p), zap.Error(err))
|
|
}
|
|
}
|
|
return m.updateChatFull(ctx, p)
|
|
}
|
|
|
|
// updateChatFull forcibly updates tg.ChatFull using given id.
|
|
func (m *Manager) updateChatFull(ctx context.Context, id int64) (*tg.ChatFull, error) {
|
|
r, err := m.api.MessagesGetFullChat(ctx, id)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "get full chat")
|
|
}
|
|
|
|
if err := m.applyEntities(ctx, r.GetUsers(), r.GetChats()); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ch, ok := r.FullChat.(*tg.ChatFull)
|
|
if !ok {
|
|
return nil, errors.Errorf("got unexpected type %T", r.FullChat)
|
|
}
|
|
|
|
if err := m.applyFullChat(ctx, ch); err != nil {
|
|
return nil, errors.Wrap(err, "update full chat")
|
|
}
|
|
|
|
return ch, nil
|
|
}
|
|
|
|
// getChannelFull gets tg.ChannelFull using given tg.InputChannelClass.
|
|
func (m *Manager) getChannelFull(ctx context.Context, p tg.InputChannelClass) (*tg.ChannelFull, error) {
|
|
if id, ok := getIDFromInputChannel(p); ok && !m.needsUpdateFull(channelPeerID(id)) {
|
|
c, found, err := m.cache.FindChannelFull(ctx, id)
|
|
if err == nil && found {
|
|
c.SetFlags()
|
|
return c, nil
|
|
}
|
|
if err != nil {
|
|
m.logger.Warn("Find channel error", zap.Int64("channel_id", id), zap.Error(err))
|
|
}
|
|
}
|
|
return m.updateChannelFull(ctx, p)
|
|
}
|
|
|
|
// updateChannelFull forcibly updates tg.ChannelFull using given tg.InputChannelClass.
|
|
func (m *Manager) updateChannelFull(ctx context.Context, p tg.InputChannelClass) (*tg.ChannelFull, error) {
|
|
r, err := m.api.ChannelsGetFullChannel(ctx, p)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "get full channel")
|
|
}
|
|
|
|
if err := m.applyEntities(ctx, r.GetUsers(), r.GetChats()); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ch, ok := r.FullChat.(*tg.ChannelFull)
|
|
if !ok {
|
|
return nil, errors.Errorf("got unexpected type %T", r.FullChat)
|
|
}
|
|
|
|
if err := m.applyFullChannel(ctx, ch); err != nil {
|
|
return nil, errors.Wrap(err, "update full channel")
|
|
}
|
|
|
|
return ch, nil
|
|
}
|