cmd/stream.go
author rjp <zimpenfish@gmail.com>
Mon, 23 Jan 2023 16:39:02 +0000
changeset 267 5b91a65ba95a
parent 239 605a00e9d1ab
child 265 05c40b36d3b2
permissions -rw-r--r--
Update to handle non-int64 IDs Pleroma/Akkoma and GotoSocial use opaque IDs rather than `int64`s like Mastodon which means that `madon` can't talk to either of those. This commit updates everything that can be an ID to `madon.ActivityID` which is an alias for `string` - can't create a specific type for it since there's more than a few places where they're concatenated directly to strings for URLs, etc. Which means it could just as easily be a direct `string` type itself but I find that having distinct types can often make the code more readable and understandable. One extra bit is that `statusOpts` has grown a `_hasReplyTo` boolean to indicate whether the `--in-reply-to` flag was given or not because we can't distinguish because "empty because default" or "empty because given and empty". Another way around this would be to set the default to some theoretically impossible or unlikely string but you never know when someone might spin up an instance where, e.g., admin posts have negative integer IDs.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
185
564d92b54b00 Update copyrights
Mikael Berthe <mikael@lilotux.net>
parents: 174
diff changeset
     1
// Copyright © 2017-2018 Mikael Berthe <mikael@lilotux.net>
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     2
//
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     3
// Licensed under the MIT license.
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     4
// Please see the LICENSE file is this directory.
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     5
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     6
package cmd
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     7
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
import (
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
	"io"
47
82d8b6074309 Set exit code to non-zero when API calls fail
Mikael Berthe <mikael@lilotux.net>
parents: 45
diff changeset
    10
	"os"
74
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
    11
	"strings"
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
45
b58a7ea1aeb2 Use github.com/pkg/errors
Mikael Berthe <mikael@lilotux.net>
parents: 44
diff changeset
    13
	"github.com/pkg/errors"
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
	"github.com/spf13/cobra"
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
239
605a00e9d1ab Switch to Go modules (and bump Go version requirement)
Mikael Berthe <mikael@lilotux.net>
parents: 236
diff changeset
    16
	"github.com/McKael/madon/v2"
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
)
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
var streamOpts struct {
144
15ecc49bbb25 Add stream user --notifications-only
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
    20
	command           string
15ecc49bbb25 Add stream user --notifications-only
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
    21
	notificationsOnly bool
166
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
    22
	notificationTypes string
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    23
}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
74
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
    25
// Maximum number of websockets (1 hashtag <=> 1 ws)
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
    26
const maximumHashtagStreamWS = 4
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
    27
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
// streamCmd represents the stream command
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
var streamCmd = &cobra.Command{
236
55accc8c0fe1 Add "stream direct" for direct messages stream
Mikael Berthe <mikael@lilotux.net>
parents: 204
diff changeset
    30
	Use:   "stream [user|local|public|direct|!LIST|:HASHTAG]",
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
	Short: "Listen to an event stream",
204
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    32
	Long: `Listen to an event stream
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    33
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    34
The stream command stays connected to the server and listen to a stream of
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
events (user, local or federated).
204
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    36
A list-based stream can be displayed by prefixing the list ID with a '!'.
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    37
It can also get a hashtag-based stream if the keyword is prefixed with
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    38
':' or '#'.`,
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    39
	Example: `  madonctl stream           # User timeline stream
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    40
  madonctl stream local     # Local timeline stream
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    41
  madonctl stream public    # Public timeline stream
236
55accc8c0fe1 Add "stream direct" for direct messages stream
Mikael Berthe <mikael@lilotux.net>
parents: 204
diff changeset
    42
  madonctl stream direct    # Direct messages stream
204
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    43
  madonctl stream '!42'     # List (ID 42)
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    44
  madonctl stream :mastodon # Hashtag
74
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
    45
  madonctl stream #madonctl
166
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
    46
  madonctl stream --notifications-only
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
    47
  madonctl stream --notifications-only --notification-types mentions,follows
74
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
    48
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
    49
Several (up to 4) hashtags can be given.
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
    50
Note: madonctl will use 1 websocket per hashtag stream.
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
    51
  madonctl stream #madonctl,#mastodon,#golang
204
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    52
  madonctl stream :madonctl,mastodon,api
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    53
`,
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    54
	RunE:       streamRunE,
236
55accc8c0fe1 Add "stream direct" for direct messages stream
Mikael Berthe <mikael@lilotux.net>
parents: 204
diff changeset
    55
	ValidArgs:  []string{"user", "public", "direct"},
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    56
	ArgAliases: []string{"home"},
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    57
}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    58
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    59
func init() {
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    60
	RootCmd.AddCommand(streamCmd)
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    61
112
58d30ab47543 Add flag --command to the stream command
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
    62
	streamCmd.Flags().StringVar(&streamOpts.command, "command", "", "Execute external command")
144
15ecc49bbb25 Add stream user --notifications-only
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
    63
	streamCmd.Flags().BoolVar(&streamOpts.notificationsOnly, "notifications-only", false, "Display only notifications (user stream)")
166
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
    64
	streamCmd.Flags().StringVar(&streamOpts.notificationTypes, "notification-types", "", "Filter notifications (mentions, favourites, reblogs, follows)")
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    65
}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    66
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    67
func streamRunE(cmd *cobra.Command, args []string) error {
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    68
	streamName := "user"
204
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    69
	var param string
74
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
    70
	var hashTagList []string
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    71
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    72
	if len(args) > 0 {
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    73
		if len(args) != 1 {
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    74
			return errors.New("too many parameters")
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    75
		}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    76
		arg := args[0]
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    77
		switch arg {
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    78
		case "", "user":
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    79
		case "public":
236
55accc8c0fe1 Add "stream direct" for direct messages stream
Mikael Berthe <mikael@lilotux.net>
parents: 204
diff changeset
    80
		case "direct":
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    81
			streamName = arg
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    82
		case "local":
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    83
			streamName = "public:local"
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    84
		default:
204
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    85
			if arg[0] == '!' {
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    86
				// List-based stream
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    87
				streamName = "list"
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    88
				param = arg[1:]
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    89
				if len(param) == 0 {
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    90
					return errors.New("empty list ID")
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    91
				}
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    92
				break
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    93
			}
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    94
			if arg[0] != ':' && arg[0] != '#' {
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    95
				return errors.New("invalid argument")
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    96
			}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    97
			streamName = "hashtag"
204
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    98
			param = arg[1:]
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    99
			if len(param) == 0 {
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   100
				return errors.New("empty hashtag")
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   101
			}
204
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
   102
			hashTagList = strings.Split(param, ",")
74
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   103
			for i, h := range hashTagList {
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   104
				if h[0] == ':' || h[0] == '#' {
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   105
					hashTagList[i] = h[1:]
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   106
				}
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   107
				if h == "" {
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   108
					return errors.New("empty hashtag")
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   109
				}
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   110
			}
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   111
			if len(hashTagList) > maximumHashtagStreamWS {
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   112
				return errors.Errorf("too many hashtags, maximum is %d", maximumHashtagStreamWS)
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   113
			}
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   114
		}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   115
	}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   116
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   117
	if err := madonInit(true); err != nil {
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   118
		return err
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   119
	}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   120
166
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
   121
	var filterMap *map[string]bool
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
   122
	if streamOpts.notificationTypes != "" {
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
   123
		var err error
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
   124
		filterMap, err = buildFilterMap(streamOpts.notificationTypes)
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
   125
		if err != nil {
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
   126
			return err
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
   127
		}
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
   128
	}
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
   129
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   130
	evChan := make(chan madon.StreamEvent, 10)
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   131
	stop := make(chan bool)
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   132
	done := make(chan bool)
74
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   133
	var err error
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   134
74
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   135
	if streamName != "hashtag" || len(hashTagList) <= 1 { // Usual case: Only 1 stream
204
81da8b48bbbc Add support for list-based streams
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
   136
		err = gClient.StreamListener(streamName, param, evChan, stop, done)
74
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   137
	} else { // Several streams
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   138
		n := len(hashTagList)
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   139
		tagEvCh := make([]chan madon.StreamEvent, n)
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   140
		tagDoneCh := make([]chan bool, n)
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   141
		for i, t := range hashTagList {
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   142
			if verbose {
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   143
				errPrint("Launching listener for tag '%s'", t)
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   144
			}
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   145
			tagEvCh[i] = make(chan madon.StreamEvent)
103
7a4604bb12d9 Fix panic when a streaming connection is closed (in multi-streams)
Mikael Berthe <mikael@lilotux.net>
parents: 81
diff changeset
   146
			tagDoneCh[i] = make(chan bool)
74
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   147
			e := gClient.StreamListener(streamName, t, tagEvCh[i], stop, tagDoneCh[i])
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   148
			if e != nil {
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   149
				if i > 0 { // Close previous connections
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   150
					close(stop)
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   151
				}
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   152
				err = e
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   153
				break
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   154
			}
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   155
			// Forward events to main ev channel
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   156
			go func(i int) {
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   157
				for {
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   158
					select {
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   159
					case _, ok := <-tagDoneCh[i]:
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   160
						if !ok { // end of streaming for this tag
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   161
							done <- true
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   162
							return
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   163
						}
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   164
					case ev := <-tagEvCh[i]:
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   165
						evChan <- ev
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   166
					}
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   167
				}
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   168
			}(i)
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   169
		}
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   170
	}
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   171
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   172
	if err != nil {
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   173
		errPrint("Error: %s", err.Error())
47
82d8b6074309 Set exit code to non-zero when API calls fail
Mikael Berthe <mikael@lilotux.net>
parents: 45
diff changeset
   174
		os.Exit(1)
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   175
	}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   176
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   177
	p, err := getPrinter()
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   178
	if err != nil {
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   179
		close(stop)
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   180
		<-done
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   181
		close(evChan)
81
b1671f83e91b Do not display usage when GetPrinter fails
Mikael Berthe <mikael@lilotux.net>
parents: 74
diff changeset
   182
		errPrint("Error: %s", err.Error())
b1671f83e91b Do not display usage when GetPrinter fails
Mikael Berthe <mikael@lilotux.net>
parents: 74
diff changeset
   183
		os.Exit(1)
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   184
	}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   185
112
58d30ab47543 Add flag --command to the stream command
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   186
	// Set up external command
58d30ab47543 Add flag --command to the stream command
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   187
	p.setCommand(streamOpts.command)
58d30ab47543 Add flag --command to the stream command
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   188
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   189
LISTEN:
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   190
	for {
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   191
		select {
103
7a4604bb12d9 Fix panic when a streaming connection is closed (in multi-streams)
Mikael Berthe <mikael@lilotux.net>
parents: 81
diff changeset
   192
		case v, ok := <-done:
7a4604bb12d9 Fix panic when a streaming connection is closed (in multi-streams)
Mikael Berthe <mikael@lilotux.net>
parents: 81
diff changeset
   193
			if !ok || v == true { // done is closed, end of streaming
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   194
				break LISTEN
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   195
			}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   196
		case ev := <-evChan:
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   197
			switch ev.Event {
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   198
			case "error":
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   199
				if ev.Error != nil {
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   200
					if ev.Error == io.ErrUnexpectedEOF {
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   201
						errPrint("The stream connection was unexpectedly closed")
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   202
						continue
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   203
					}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   204
					errPrint("Error event: [%s] %s", ev.Event, ev.Error)
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   205
					continue
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   206
				}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   207
				errPrint("Event: [%s]", ev.Event)
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   208
			case "update":
144
15ecc49bbb25 Add stream user --notifications-only
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
   209
				if streamOpts.notificationsOnly {
15ecc49bbb25 Add stream user --notifications-only
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
   210
					continue
15ecc49bbb25 Add stream user --notifications-only
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
   211
				}
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   212
				s := ev.Data.(madon.Status)
112
58d30ab47543 Add flag --command to the stream command
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   213
				if err = p.printObj(&s); err != nil {
58d30ab47543 Add flag --command to the stream command
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   214
					break LISTEN
58d30ab47543 Add flag --command to the stream command
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   215
				}
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   216
				continue
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   217
			case "notification":
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   218
				n := ev.Data.(madon.Notification)
166
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
   219
				if filterMap != nil && !(*filterMap)[n.Type] {
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
   220
					continue
79c0f8db66ff Add --notification-types to the stream command as well
Mikael Berthe <mikael@lilotux.net>
parents: 144
diff changeset
   221
				}
112
58d30ab47543 Add flag --command to the stream command
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   222
				if p.printObj(&n); err != nil {
58d30ab47543 Add flag --command to the stream command
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   223
					break LISTEN
58d30ab47543 Add flag --command to the stream command
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   224
				}
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   225
				continue
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   226
			case "delete":
144
15ecc49bbb25 Add stream user --notifications-only
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
   227
				if streamOpts.notificationsOnly {
15ecc49bbb25 Add stream user --notifications-only
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
   228
					continue
15ecc49bbb25 Add stream user --notifications-only
Mikael Berthe <mikael@lilotux.net>
parents: 112
diff changeset
   229
				}
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   230
				// TODO PrintObj ?
174
0b30e670aa82 Streams: Fix string IDs for deletion events with Mastodon v2 API
Mikael Berthe <mikael@lilotux.net>
parents: 166
diff changeset
   231
				errPrint("Event: [%s] Status %s was deleted", ev.Event, ev.Data.(string))
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   232
			default:
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   233
				errPrint("Unhandled event: [%s] %T", ev.Event, ev.Data)
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   234
			}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   235
		}
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   236
	}
74
78e1c63e4bbe Add support for several hashtag streams
Mikael Berthe <mikael@lilotux.net>
parents: 47
diff changeset
   237
	close(stop)
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   238
	close(evChan)
112
58d30ab47543 Add flag --command to the stream command
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   239
	if err != nil {
58d30ab47543 Add flag --command to the stream command
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   240
		errPrint("Error: %s", err.Error())
58d30ab47543 Add flag --command to the stream command
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   241
		os.Exit(1)
58d30ab47543 Add flag --command to the stream command
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   242
	}
0
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   243
	return nil
5abace724584 Initial public release
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   244
}