You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
3.6 KiB
159 lines
3.6 KiB
package peer |
|
|
|
import ( |
|
"github.com/go-faster/errors" |
|
|
|
"github.com/gotd/td/tg" |
|
) |
|
|
|
// Entities is simple peer entities storage. |
|
type Entities struct { |
|
users map[int64]*tg.User |
|
chats map[int64]*tg.Chat |
|
channels map[int64]*tg.Channel |
|
} |
|
|
|
// NewEntities creates new Entities struct. |
|
func NewEntities( |
|
users map[int64]*tg.User, |
|
chats map[int64]*tg.Chat, |
|
channels map[int64]*tg.Channel, |
|
) Entities { |
|
return Entities{users: users, chats: chats, channels: channels} |
|
} |
|
|
|
// EntitySearchResult is abstraction for different RPC responses which |
|
// contains entities. |
|
type EntitySearchResult interface { |
|
MapChats() tg.ChatClassArray |
|
MapUsers() tg.UserClassArray |
|
} |
|
|
|
// EntitiesFromResult fills Entities struct using given context. |
|
func EntitiesFromResult(r EntitySearchResult) Entities { |
|
return NewEntities( |
|
r.MapUsers().UserToMap(), |
|
r.MapChats().ChatToMap(), |
|
r.MapChats().ChannelToMap(), |
|
) |
|
} |
|
|
|
// EntitiesFromUpdate fills Entities struct using given context. |
|
func EntitiesFromUpdate(uctx tg.Entities) Entities { |
|
return NewEntities( |
|
uctx.Users, |
|
uctx.Chats, |
|
uctx.Channels, |
|
) |
|
} |
|
|
|
// Users returns map of users. |
|
// Notice that returned map is not a copy. |
|
func (ent Entities) Users() map[int64]*tg.User { |
|
return ent.users |
|
} |
|
|
|
// Chats returns map of chats. |
|
// Notice that returned map is not a copy. |
|
func (ent Entities) Chats() map[int64]*tg.Chat { |
|
return ent.chats |
|
} |
|
|
|
// Channels returns map of channels. |
|
// Notice that returned map is not a copy. |
|
func (ent Entities) Channels() map[int64]*tg.Channel { |
|
return ent.channels |
|
} |
|
|
|
// FillFromResult adds and updates all entities from given result. |
|
func (ent Entities) FillFromResult(r EntitySearchResult) { |
|
r.MapUsers().FillUserMap(ent.users) |
|
r.MapChats().FillChatMap(ent.chats) |
|
r.MapChats().FillChannelMap(ent.channels) |
|
} |
|
|
|
// FillFromUpdate adds and updates all entities from given updates. |
|
func (ent Entities) FillFromUpdate(uctx tg.Entities) { |
|
ent.Fill( |
|
uctx.Users, |
|
uctx.Chats, |
|
uctx.Channels, |
|
) |
|
} |
|
|
|
// Fill adds and updates all entities from given maps. |
|
func (ent Entities) Fill( |
|
users map[int64]*tg.User, |
|
chats map[int64]*tg.Chat, |
|
channels map[int64]*tg.Channel, |
|
) { |
|
for k, v := range users { |
|
ent.users[k] = v |
|
} |
|
|
|
for k, v := range chats { |
|
ent.chats[k] = v |
|
} |
|
|
|
for k, v := range channels { |
|
ent.channels[k] = v |
|
} |
|
} |
|
|
|
// ExtractPeer finds and creates InputPeerClass using given PeerClass. |
|
func (ent Entities) ExtractPeer(peerID tg.PeerClass) (tg.InputPeerClass, error) { |
|
var peer tg.InputPeerClass |
|
switch p := peerID.(type) { |
|
case *tg.PeerUser: // peerUser#9db1bc6d |
|
dialog, ok := ent.users[p.UserID] |
|
if !ok { |
|
return nil, errors.Errorf("user %d not found", p.UserID) |
|
} |
|
|
|
peer = &tg.InputPeerUser{ |
|
UserID: dialog.ID, |
|
AccessHash: dialog.AccessHash, |
|
} |
|
case *tg.PeerChat: // peerChat#bad0e5bb |
|
dialog, ok := ent.chats[p.ChatID] |
|
if !ok { |
|
return nil, errors.Errorf("chat %d not found", p.ChatID) |
|
} |
|
|
|
peer = &tg.InputPeerChat{ |
|
ChatID: dialog.ID, |
|
} |
|
case *tg.PeerChannel: // peerChannel#bddde532 |
|
dialog, ok := ent.channels[p.ChannelID] |
|
if !ok { |
|
return nil, errors.Errorf("channel %d not found", p.ChannelID) |
|
} |
|
|
|
peer = &tg.InputPeerChannel{ |
|
ChannelID: dialog.ID, |
|
AccessHash: dialog.AccessHash, |
|
} |
|
default: |
|
return nil, errors.Errorf("unexpected peer type %T", peerID) |
|
} |
|
|
|
return peer, nil |
|
} |
|
|
|
// User finds user by given ID. |
|
func (ent Entities) User(id int64) (*tg.User, bool) { |
|
v, ok := ent.users[id] |
|
return v, ok |
|
} |
|
|
|
// Chat finds chat by given ID. |
|
func (ent Entities) Chat(id int64) (*tg.Chat, bool) { |
|
v, ok := ent.chats[id] |
|
return v, ok |
|
} |
|
|
|
// Channel finds channel by given ID. |
|
func (ent Entities) Channel(id int64) (*tg.Channel, bool) { |
|
v, ok := ent.channels[id] |
|
return v, ok |
|
}
|
|
|