package client
import (
"context"
"encoding/json"
"fmt"
"net/url"
"strconv"
"github.com/keys-pub/keys"
"github.com/keys-pub/keys-ext/http/api"
"github.com/keys-pub/keys/dstore"
"github.com/keys-pub/keys/dstore/events"
)
func (c *Client) MessageSend(ctx context.Context, message *api.Message, sender *keys.EdX25519Key, channel *keys.EdX25519Key) error {
encrypted, err := message.Encrypt(sender, channel.ID())
if err != nil {
return err
}
path := dstore.Path("channel", channel.ID(), "msgs")
vals := url.Values{}
if _, err := c.req(ctx, request{Method: "POST", Path: path, Params: vals, Body: encrypted, Key: channel}); err != nil {
return err
}
return nil
}
type MessagesOpts struct {
Index int64
Order events.Direction
Limit int
}
func (c *Client) Messages(ctx context.Context, channel *keys.EdX25519Key, opts *MessagesOpts) (*api.Events, error) {
path := dstore.Path("channel", channel.ID(), "msgs")
return c.events(ctx, path, channel, opts)
}
func (c *Client) events(ctx context.Context, path string, key *keys.EdX25519Key, opts *MessagesOpts) (*api.Events, error) {
if opts == nil {
opts = &MessagesOpts{}
}
params := url.Values{}
if opts.Index != 0 {
params.Add("idx", strconv.FormatInt(opts.Index, 10))
}
if opts.Order != "" {
params.Add("order", string(opts.Order))
}
if opts.Limit != 0 {
params.Add("limit", fmt.Sprintf("%d", opts.Limit))
}
resp, err := c.req(ctx, request{
Method: "GET",
Path: path,
Params: params,
Key: key,
})
if err != nil {
return nil, err
}
if resp == nil {
return nil, nil
}
var out api.Events
if err := json.Unmarshal(resp.Data, &out); err != nil {
return nil, err
}
return &out, nil
}