mirror of
https://github.com/iyear/tdl
synced 2025-01-09 04:17:35 +08:00
parent
52f326935b
commit
edf579bdc8
105
app/chat/ls.go
105
app/chat/ls.go
@ -4,15 +4,11 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/antonmedv/expr"
|
||||
"github.com/go-faster/errors"
|
||||
"github.com/go-faster/jx"
|
||||
"github.com/gotd/contrib/middleware/ratelimit"
|
||||
"github.com/gotd/td/telegram/message/peer"
|
||||
"github.com/gotd/td/telegram/peers"
|
||||
@ -61,17 +57,6 @@ type ListOptions struct {
|
||||
Filter string
|
||||
}
|
||||
|
||||
type printer interface {
|
||||
Header() error
|
||||
Record(*Dialog) error
|
||||
Footer() error
|
||||
}
|
||||
|
||||
var printers = map[ListOutput]printer{
|
||||
ListOutputTable: &tablePrinter{w: os.Stdout},
|
||||
ListOutputJson: &jsonPrinter{enc: jx.NewStreamingEncoder(os.Stdout, 128)},
|
||||
}
|
||||
|
||||
func List(ctx context.Context, opts ListOptions) error {
|
||||
log := logger.From(ctx)
|
||||
|
||||
@ -96,11 +81,6 @@ func List(ctx context.Context, opts ListOptions) error {
|
||||
return fmt.Errorf("failed to compile filter: %w", err)
|
||||
}
|
||||
|
||||
prt, ok := printers[opts.Output]
|
||||
if !ok {
|
||||
return fmt.Errorf("unknown output: %s", opts.Output)
|
||||
}
|
||||
|
||||
c, kvd, err := tgc.NoLogin(ctx, ratelimit.New(rate.Every(time.Millisecond*400), 2))
|
||||
if err != nil {
|
||||
return err
|
||||
@ -118,11 +98,7 @@ func List(ctx context.Context, opts ListOptions) error {
|
||||
}
|
||||
|
||||
manager := peers.Options{Storage: storage.NewPeers(kvd)}.Build(c.API())
|
||||
|
||||
if err = prt.Header(); err != nil {
|
||||
return errors.Wrap(err, "print header")
|
||||
}
|
||||
|
||||
result := make([]*Dialog, 0, len(dialogs))
|
||||
for _, d := range dialogs {
|
||||
id := utils.Telegram.GetInputPeerID(d.Peer)
|
||||
|
||||
@ -160,76 +136,43 @@ func List(ctx context.Context, opts ListOptions) error {
|
||||
continue
|
||||
}
|
||||
|
||||
if err = prt.Record(r); err != nil {
|
||||
return errors.Wrap(err, "print record")
|
||||
}
|
||||
result = append(result, r)
|
||||
}
|
||||
|
||||
if err = prt.Footer(); err != nil {
|
||||
return errors.Wrap(err, "print tailer")
|
||||
switch opts.Output {
|
||||
case ListOutputTable:
|
||||
printTable(result)
|
||||
case ListOutputJson:
|
||||
bytes, err := json.MarshalIndent(result, "", "\t")
|
||||
if err != nil {
|
||||
return fmt.Errorf("marshal json: %w", err)
|
||||
}
|
||||
|
||||
fmt.Println(string(bytes))
|
||||
default:
|
||||
return fmt.Errorf("unknown output: %s", opts.Output)
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
type tablePrinter struct {
|
||||
w io.Writer
|
||||
}
|
||||
|
||||
func (t *tablePrinter) Header() error {
|
||||
_, err := fmt.Fprintf(t.w, "%s %s %s %s %s\n",
|
||||
func printTable(result []*Dialog) {
|
||||
fmt.Printf("%s %s %s %s %s\n",
|
||||
trunc("ID", 10),
|
||||
trunc("Type", 8),
|
||||
trunc("VisibleName", 20),
|
||||
trunc("Username", 20),
|
||||
"Topics")
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "write header")
|
||||
|
||||
for _, r := range result {
|
||||
fmt.Printf("%s %s %s %s %s\n",
|
||||
trunc(strconv.FormatInt(r.ID, 10), 10),
|
||||
trunc(r.Type, 8),
|
||||
trunc(r.VisibleName, 20),
|
||||
trunc(r.Username, 20),
|
||||
topicsString(r.Topics))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *tablePrinter) Record(dialog *Dialog) error {
|
||||
_, err := fmt.Fprintf(t.w, "%s %s %s %s %s\n",
|
||||
trunc(strconv.FormatInt(dialog.ID, 10), 10),
|
||||
trunc(dialog.Type, 8),
|
||||
trunc(dialog.VisibleName, 20),
|
||||
trunc(dialog.Username, 20),
|
||||
topicsString(dialog.Topics))
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "write record")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *tablePrinter) Footer() error { return nil }
|
||||
|
||||
type jsonPrinter struct {
|
||||
enc *jx.Encoder
|
||||
}
|
||||
|
||||
func (j *jsonPrinter) Header() error {
|
||||
j.enc.SetIdent(4)
|
||||
j.enc.ArrStart()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (j *jsonPrinter) Record(dialog *Dialog) error {
|
||||
b, err := json.Marshal(dialog)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "marshal record")
|
||||
}
|
||||
|
||||
j.enc.Raw(b)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (j *jsonPrinter) Footer() error {
|
||||
j.enc.ArrEnd()
|
||||
|
||||
return j.enc.Close()
|
||||
}
|
||||
|
||||
func trunc(s string, len int) string {
|
||||
|
Loading…
Reference in New Issue
Block a user