120 lines
4.2 KiB
Go
120 lines
4.2 KiB
Go
package rpc
|
|
|
|
import (
|
|
"context"
|
|
"github.com/gotd/td/tg"
|
|
"telesrv/internal/domain"
|
|
)
|
|
|
|
func (r *Router) onMessagesDeleteMessages(ctx context.Context, req *tg.MessagesDeleteMessagesRequest) (*tg.MessagesAffectedMessages, error) {
|
|
authKeyID, _ := AuthKeyIDFrom(ctx)
|
|
userID, _, err := r.currentUserID(ctx)
|
|
if err != nil {
|
|
return nil, internalErr()
|
|
}
|
|
if len(req.ID) == 0 || r.deps.Messages == nil {
|
|
return r.affectedMessages(ctx, authKeyID, userID)
|
|
}
|
|
if len(req.ID) > domain.MaxDeleteMessageIDs {
|
|
return nil, limitInvalidErr()
|
|
}
|
|
// 官方对私聊 revoke 不做 block 限制:被对方拉黑后撤回自己的消息仍
|
|
// 双向生效;客户端删除请求的 fail handler 是静默的,服务端报错只会
|
|
// 造成"本地已删、服务端未删"的复活错乱。
|
|
sessionID, _ := SessionIDFrom(ctx)
|
|
res, err := r.deps.Messages.DeleteMessages(ctx, userID, domain.DeleteMessagesRequest{
|
|
OwnerUserID: userID,
|
|
IDs: req.ID,
|
|
Revoke: req.GetRevoke(),
|
|
Date: int(r.clock.Now().Unix()),
|
|
OriginAuthKeyID: rawAuthKeyIDForOrigin(ctx),
|
|
OriginSessionID: sessionID,
|
|
})
|
|
if err != nil {
|
|
return nil, internalErr()
|
|
}
|
|
self := res.Self()
|
|
if len(self.MessageIDs) == 0 || self.Event.Pts == 0 {
|
|
return r.affectedMessages(ctx, authKeyID, userID)
|
|
}
|
|
return &tg.MessagesAffectedMessages{Pts: self.Event.Pts, PtsCount: self.Event.PtsCount}, nil
|
|
}
|
|
|
|
func (r *Router) onMessagesDeleteHistory(ctx context.Context, req *tg.MessagesDeleteHistoryRequest) (*tg.MessagesAffectedHistory, error) {
|
|
authKeyID, _ := AuthKeyIDFrom(ctx)
|
|
userID, _, err := r.currentUserID(ctx)
|
|
if err != nil {
|
|
return nil, internalErr()
|
|
}
|
|
peer, err := r.checkedDomainPeerFromInputPeer(ctx, userID, req.Peer)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if peer.Type == domain.PeerTypeChannel {
|
|
if r.deps.Channels == nil {
|
|
return r.affectedHistory(ctx, authKeyID, userID, 0)
|
|
}
|
|
if req.MaxID < 0 || req.MaxID > domain.MaxMessageBoxID {
|
|
return nil, messageIDInvalidErr()
|
|
}
|
|
res, err := r.deps.Channels.DeleteHistory(ctx, userID, domain.DeleteChannelHistoryRequest{
|
|
UserID: userID,
|
|
ChannelID: peer.ID,
|
|
MaxID: req.MaxID,
|
|
ForEveryone: req.GetRevoke(),
|
|
Date: int(r.clock.Now().Unix()),
|
|
})
|
|
if err != nil {
|
|
return nil, channelDeleteErr(err)
|
|
}
|
|
if res.Event.Pts != 0 {
|
|
r.enqueueChannelFanout(ctx, channelFanoutMembers, userID, res.Channel.ID, res.Event.Pts, res.Recipients, func(_ context.Context, viewerUserID int64) *tg.Updates {
|
|
return r.channelDeleteMessagesUpdates(viewerUserID, res.Channel, res.Event)
|
|
})
|
|
return &tg.MessagesAffectedHistory{Pts: res.Event.Pts, PtsCount: res.Event.PtsCount, Offset: res.Offset}, nil
|
|
}
|
|
if res.AvailableMinID > 0 {
|
|
event := r.recordChannelAvailableMessages(ctx, userID, res.Channel.ID, res.AvailableMinID)
|
|
updates := r.channelAvailableMessagesUpdates(userID, res.Channel, event.MaxID)
|
|
updates.Updates = appendAuxPtsBookkeeping(updates.Updates, event)
|
|
r.pushUserUpdates(ctx, userID, updates)
|
|
if event.Pts != 0 {
|
|
return &tg.MessagesAffectedHistory{Pts: event.Pts, PtsCount: event.PtsCount, Offset: res.Offset}, nil
|
|
}
|
|
}
|
|
return &tg.MessagesAffectedHistory{Pts: res.Channel.Pts, PtsCount: 0, Offset: res.Offset}, nil
|
|
}
|
|
if peer.Type != domain.PeerTypeUser {
|
|
return nil, peerIDInvalidErr()
|
|
}
|
|
if r.deps.Messages == nil {
|
|
return r.affectedHistory(ctx, authKeyID, userID, 0)
|
|
}
|
|
sessionID, _ := SessionIDFrom(ctx)
|
|
minDate, _ := req.GetMinDate()
|
|
maxDate, _ := req.GetMaxDate()
|
|
res, err := r.deps.Messages.DeleteHistory(ctx, userID, domain.DeleteHistoryRequest{
|
|
OwnerUserID: userID,
|
|
Peer: peer,
|
|
MaxID: req.MaxID,
|
|
MinDate: minDate,
|
|
MaxDate: maxDate,
|
|
JustClear: req.GetJustClear(),
|
|
Revoke: req.GetRevoke(),
|
|
Date: int(r.clock.Now().Unix()),
|
|
OriginAuthKeyID: rawAuthKeyIDForOrigin(ctx),
|
|
OriginSessionID: sessionID,
|
|
})
|
|
if err != nil {
|
|
return nil, internalErr()
|
|
}
|
|
self := res.Self()
|
|
if len(self.MessageIDs) == 0 || self.Event.Pts == 0 {
|
|
return r.affectedHistory(ctx, authKeyID, userID, 0)
|
|
}
|
|
return &tg.MessagesAffectedHistory{
|
|
Pts: self.Event.Pts,
|
|
PtsCount: self.Event.PtsCount,
|
|
Offset: res.Offset,
|
|
}, nil
|
|
}
|