change command-line style
parent
82f7536210
commit
094a888b1d
|
@ -5,7 +5,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"flag"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
|
@ -18,14 +18,11 @@ import (
|
||||||
"github.com/fatih/color"
|
"github.com/fatih/color"
|
||||||
"github.com/mattn/go-mastodon"
|
"github.com/mattn/go-mastodon"
|
||||||
"github.com/mattn/go-tty"
|
"github.com/mattn/go-tty"
|
||||||
|
"github.com/urfave/cli"
|
||||||
"golang.org/x/net/html"
|
"golang.org/x/net/html"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var ()
|
||||||
toot = flag.String("t", "", "toot text")
|
|
||||||
stream = flag.Bool("S", false, "streaming public")
|
|
||||||
fromfile = flag.String("ff", "", "post utf-8 string from a file(\"-\" means STDIN)")
|
|
||||||
)
|
|
||||||
|
|
||||||
func readFile(filename string) ([]byte, error) {
|
func readFile(filename string) ([]byte, error) {
|
||||||
if filename == "-" {
|
if filename == "-" {
|
||||||
|
@ -37,7 +34,7 @@ func readFile(filename string) ([]byte, error) {
|
||||||
func textContent(s string) string {
|
func textContent(s string) string {
|
||||||
doc, err := html.Parse(strings.NewReader(s))
|
doc, err := html.Parse(strings.NewReader(s))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
return s
|
||||||
}
|
}
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
||||||
|
@ -133,32 +130,111 @@ func getConfig() (string, *mastodon.Config, error) {
|
||||||
return file, config, nil
|
return file, config, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func authenticate(client *mastodon.Client, config *mastodon.Config, file string) {
|
func authenticate(client *mastodon.Client, config *mastodon.Config, file string) error {
|
||||||
email, password, err := prompt()
|
email, password, err := prompt()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
return err
|
||||||
}
|
}
|
||||||
err = client.Authenticate(email, password)
|
err = client.Authenticate(email, password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
return err
|
||||||
}
|
}
|
||||||
b, err := json.MarshalIndent(config, "", " ")
|
b, err := json.MarshalIndent(config, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("failed to store file:", err)
|
return fmt.Errorf("failed to store file:", err)
|
||||||
}
|
}
|
||||||
err = ioutil.WriteFile(file, b, 0700)
|
err = ioutil.WriteFile(file, b, 0700)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("failed to store file:", err)
|
return fmt.Errorf("failed to store file:", err)
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func streaming(client *mastodon.Client) {
|
func fatalIf(err error) {
|
||||||
|
if err == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Fprintf(os.Stderr, "%s: %v\n", os.Args[0], err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func run() int {
|
||||||
|
file, config, err := getConfig()
|
||||||
|
fatalIf(err)
|
||||||
|
|
||||||
|
client := mastodon.NewClient(config)
|
||||||
|
if config.AccessToken == "" {
|
||||||
|
err = authenticate(client, config, file)
|
||||||
|
fatalIf(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
app := cli.NewApp()
|
||||||
|
app.Metadata = map[string]interface{}{
|
||||||
|
"client": client,
|
||||||
|
"config": config,
|
||||||
|
}
|
||||||
|
app.Name = "mstdn"
|
||||||
|
app.Usage = "mastodon client"
|
||||||
|
app.Version = "0.0.1"
|
||||||
|
app.Commands = []cli.Command{
|
||||||
|
{
|
||||||
|
Name: "toot",
|
||||||
|
Usage: "post toot",
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
cli.StringFlag{
|
||||||
|
Name: "ff",
|
||||||
|
Usage: "post utf-8 string from a file(\"-\" means STDIN)",
|
||||||
|
Value: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Action: cmdToot,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "stream",
|
||||||
|
Usage: "stream statuses",
|
||||||
|
Action: cmdStream,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "timeline",
|
||||||
|
Usage: "show timeline",
|
||||||
|
Action: cmdTimeline,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
app.Run(os.Args)
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func cmdToot(c *cli.Context) error {
|
||||||
|
if !c.Args().Present() {
|
||||||
|
return errors.New("arguments required")
|
||||||
|
}
|
||||||
|
|
||||||
|
var toot string
|
||||||
|
ff := c.String("ff")
|
||||||
|
if ff != "" {
|
||||||
|
text, err := readFile(ff)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
toot = string(text)
|
||||||
|
} else {
|
||||||
|
toot = strings.Join(c.Args().Tail(), " ")
|
||||||
|
}
|
||||||
|
client := c.App.Metadata["client"].(*mastodon.Client)
|
||||||
|
_, err := client.PostStatus(&mastodon.Toot{
|
||||||
|
Status: toot,
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func cmdStream(c *cli.Context) error {
|
||||||
|
client := c.App.Metadata["client"].(*mastodon.Client)
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
sc := make(chan os.Signal, 1)
|
sc := make(chan os.Signal, 1)
|
||||||
signal.Notify(sc, os.Interrupt)
|
signal.Notify(sc, os.Interrupt)
|
||||||
q, err := client.StreamingPublic(ctx)
|
q, err := client.StreamingPublic(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
return err
|
||||||
}
|
}
|
||||||
go func() {
|
go func() {
|
||||||
<-sc
|
<-sc
|
||||||
|
@ -178,32 +254,14 @@ func streaming(client *mastodon.Client) {
|
||||||
color.Set(color.Reset)
|
color.Set(color.Reset)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func cmdTimeline(c *cli.Context) error {
|
||||||
flag.Parse()
|
client := c.App.Metadata["client"].(*mastodon.Client)
|
||||||
if *fromfile != "" {
|
|
||||||
text, err := readFile(*fromfile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
*toot = string(text)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func post(client *mastodon.Client, text string) {
|
|
||||||
_, err := client.PostStatus(&mastodon.Toot{
|
|
||||||
Status: text,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func timeline(client *mastodon.Client) {
|
|
||||||
timeline, err := client.GetTimelineHome()
|
timeline, err := client.GetTimelineHome()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
return err
|
||||||
}
|
}
|
||||||
for i := len(timeline) - 1; i >= 0; i-- {
|
for i := len(timeline) - 1; i >= 0; i-- {
|
||||||
t := timeline[i]
|
t := timeline[i]
|
||||||
|
@ -212,30 +270,9 @@ func timeline(client *mastodon.Client) {
|
||||||
color.Set(color.Reset)
|
color.Set(color.Reset)
|
||||||
fmt.Println(textContent(t.Content))
|
fmt.Println(textContent(t.Content))
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
file, config, err := getConfig()
|
os.Exit(run())
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
client := mastodon.NewClient(config)
|
|
||||||
|
|
||||||
if config.AccessToken == "" {
|
|
||||||
authenticate(client, config, file)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if *toot != "" {
|
|
||||||
post(client, *toot)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if *stream {
|
|
||||||
streaming(client)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
timeline(client)
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue