71 lines
1.6 KiB
Go
71 lines
1.6 KiB
Go
package chatclient
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
pb "gitea.fe.kaien.ru/kaien/l-ai-chat-proto"
|
|
)
|
|
|
|
type HistoryRequest struct {
|
|
TopicID string
|
|
BeforeSequence int64
|
|
AfterSequence int64
|
|
Limit int32
|
|
}
|
|
|
|
func (c *Client) History(ctx context.Context, req HistoryRequest) (*pb.HistoryResponse, error) {
|
|
if err := c.checkOpen(); err != nil {
|
|
return nil, err
|
|
}
|
|
if req.BeforeSequence > 0 && req.AfterSequence > 0 {
|
|
return nil, fmt.Errorf("%w: before and after sequence are mutually exclusive", ErrInvalidConfig)
|
|
}
|
|
return c.api.History(ctx, &pb.HistoryRequest{
|
|
TopicId: req.TopicID,
|
|
BeforeSequence: req.BeforeSequence,
|
|
AfterSequence: req.AfterSequence,
|
|
Limit: req.Limit,
|
|
})
|
|
}
|
|
|
|
type HistoryPager struct {
|
|
client *Client
|
|
req HistoryRequest
|
|
forward bool
|
|
done bool
|
|
}
|
|
|
|
func (c *Client) NewHistoryPager(req HistoryRequest) (*HistoryPager, error) {
|
|
if req.BeforeSequence > 0 && req.AfterSequence > 0 {
|
|
return nil, fmt.Errorf("%w: before and after sequence are mutually exclusive", ErrInvalidConfig)
|
|
}
|
|
return &HistoryPager{
|
|
client: c,
|
|
req: req,
|
|
forward: req.AfterSequence > 0,
|
|
}, nil
|
|
}
|
|
|
|
func (p *HistoryPager) Next(ctx context.Context) (*pb.HistoryResponse, error) {
|
|
if p.done {
|
|
return &pb.HistoryResponse{}, nil
|
|
}
|
|
resp, err := p.client.History(ctx, p.req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(resp.GetMessages()) == 0 || !resp.GetHasMore() {
|
|
p.done = true
|
|
}
|
|
if len(resp.GetMessages()) > 0 {
|
|
last := resp.GetMessages()[len(resp.GetMessages())-1].GetSequence()
|
|
if p.forward {
|
|
p.req.AfterSequence = last
|
|
} else {
|
|
p.req.BeforeSequence = last
|
|
}
|
|
}
|
|
return resp, nil
|
|
}
|