code.oscarkilo.com/okg/chat.go

.gitignore
README.md
auth.go
authz.go
chat.go
chat/
client.go
config.go
embed.go
exemplary.go
go.mod
go.sum
group.go
internal/
klee/
klex.go
main.go
okg_test.go
one.go
pr.go
repo.go
who/
package main

import "encoding/json"
import "flag"
import "fmt"

import "oscarkilo.com/okg/chat"

func runChat(cfg *Config, args []string) error {
  if len(args) == 0 {
    return fmt.Errorf(
      "usage: okg chat SUBCOMMAND ... " +
        "(try `okg --help`)")
  }
  switch args[0] {
  case "send":
    return runChatSend(cfg, args[1:])
  case "fetch":
    return runChatFetch(cfg, args[1:])
  default:
    return fmt.Errorf(
      "unknown chat subcommand: %s", args[0])
  }
}

func runChatSend(cfg *Config, args []string) error {
  fs := flag.NewFlagSet("chat send", flag.ContinueOnError)
  if err := fs.Parse(args); err != nil {
    return err
  }
  positional := fs.Args()
  if len(positional) != 2 {
    return fmt.Errorf("usage: okg chat send TO TEXT")
  }
  to := positional[0]
  text := positional[1]

  c, err := newChatClient(cfg)
  if err != nil {
    return err
  }
  msg, err := c.Send(chat.SendRequest{To: to, Text: text})
  if err != nil {
    return err
  }
  fmt.Printf(
    "Sent (from=%s, to=%s, at=%s)\n",
    msg.From, msg.To,
    msg.CreatedAt.Format("2006-01-02 15:04:05"))
  return nil
}

func runChatFetch(cfg *Config, args []string) error {
  fs := flag.NewFlagSet("chat fetch", flag.ContinueOnError)
  to := fs.String("to", "",
    "filter by destination group (default: all visible)")
  asJSON := fs.Bool("json", false, "output raw JSON")
  if err := fs.Parse(args); err != nil {
    return err
  }

  c, err := newChatClient(cfg)
  if err != nil {
    return err
  }
  msgs, err := c.Search(chat.SearchRequest{To: *to})
  if err != nil {
    return err
  }

  if *asJSON {
    buf, err := json.MarshalIndent(msgs, "", "  ")
    if err != nil {
      return err
    }
    fmt.Println(string(buf))
    return nil
  }

  for _, m := range msgs {
    fmt.Printf(
      "[%s] %s → %s: %s\n",
      m.CreatedAt.Format("2006-01-02 15:04:05"),
      m.From, m.To, m.Text)
  }
  return nil
}

// newChatClient builds a //chat client.
func newChatClient(cfg *Config) (*chat.HTTPClient, error) {
  if cfg.ApiKey == "" {
    return nil, fmt.Errorf(
      "no API key — run `okg auth login --key sk-...`")
  }
  return chat.NewHTTPClient(cfg.Host, cfg.ApiKey), nil
}