remove agent
This commit is contained in:
		| @@ -1,2 +0,0 @@ | |||||||
| // Package agent provides an interface for building robots |  | ||||||
| package agent |  | ||||||
| @@ -1,54 +0,0 @@ | |||||||
| // Package command is an interface for defining bot commands |  | ||||||
| package command |  | ||||||
|  |  | ||||||
| var ( |  | ||||||
| 	// Commands keyed by golang/regexp patterns |  | ||||||
| 	// regexp.Match(key, input) is used to match |  | ||||||
| 	Commands = map[string]Command{} |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // Command is the interface for specific named |  | ||||||
| // commands executed via plugins or the bot. |  | ||||||
| type Command interface { |  | ||||||
| 	// Executes the command with args passed in |  | ||||||
| 	Exec(args ...string) ([]byte, error) |  | ||||||
| 	// Usage of the command |  | ||||||
| 	Usage() string |  | ||||||
| 	// Description of the command |  | ||||||
| 	Description() string |  | ||||||
| 	// Name of the command |  | ||||||
| 	String() string |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type cmd struct { |  | ||||||
| 	name        string |  | ||||||
| 	usage       string |  | ||||||
| 	description string |  | ||||||
| 	exec        func(args ...string) ([]byte, error) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (c *cmd) Description() string { |  | ||||||
| 	return c.description |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (c *cmd) Exec(args ...string) ([]byte, error) { |  | ||||||
| 	return c.exec(args...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (c *cmd) Usage() string { |  | ||||||
| 	return c.usage |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (c *cmd) String() string { |  | ||||||
| 	return c.name |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // NewCommand helps quickly create a new command |  | ||||||
| func NewCommand(name, usage, description string, exec func(args ...string) ([]byte, error)) Command { |  | ||||||
| 	return &cmd{ |  | ||||||
| 		name:        name, |  | ||||||
| 		usage:       usage, |  | ||||||
| 		description: description, |  | ||||||
| 		exec:        exec, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @@ -1,65 +0,0 @@ | |||||||
| package command |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"testing" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| func TestCommand(t *testing.T) { |  | ||||||
| 	c := &cmd{ |  | ||||||
| 		name:        "test", |  | ||||||
| 		usage:       "test usage", |  | ||||||
| 		description: "test description", |  | ||||||
| 		exec: func(args ...string) ([]byte, error) { |  | ||||||
| 			return []byte("test"), nil |  | ||||||
| 		}, |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if c.String() != c.name { |  | ||||||
| 		t.Fatalf("expected name %s got %s", c.name, c.String()) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if c.Usage() != c.usage { |  | ||||||
| 		t.Fatalf("expected usage %s got %s", c.usage, c.Usage()) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if c.Description() != c.description { |  | ||||||
| 		t.Fatalf("expected description %s got %s", c.description, c.Description()) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if r, err := c.Exec(); err != nil { |  | ||||||
| 		t.Fatal(err) |  | ||||||
| 	} else if string(r) != "test" { |  | ||||||
| 		t.Fatalf("expected exec result test got %s", string(r)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestNewCommand(t *testing.T) { |  | ||||||
| 	c := &cmd{ |  | ||||||
| 		name:        "test", |  | ||||||
| 		usage:       "test usage", |  | ||||||
| 		description: "test description", |  | ||||||
| 		exec: func(args ...string) ([]byte, error) { |  | ||||||
| 			return []byte("test"), nil |  | ||||||
| 		}, |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	nc := NewCommand(c.name, c.usage, c.description, c.exec) |  | ||||||
|  |  | ||||||
| 	if nc.String() != c.name { |  | ||||||
| 		t.Fatalf("expected name %s got %s", c.name, nc.String()) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if nc.Usage() != c.usage { |  | ||||||
| 		t.Fatalf("expected usage %s got %s", c.usage, nc.Usage()) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if nc.Description() != c.description { |  | ||||||
| 		t.Fatalf("expected description %s got %s", c.description, nc.Description()) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if r, err := nc.Exec(); err != nil { |  | ||||||
| 		t.Fatal(err) |  | ||||||
| 	} else if string(r) != "test" { |  | ||||||
| 		t.Fatalf("expected exec result test got %s", string(r)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @@ -1,22 +0,0 @@ | |||||||
| # Discord input for micro-bot |  | ||||||
| [Discord](https://discordapp.com) support for micro bot based on [discordgo](github.com/bwmarrin/discordgo). |  | ||||||
|  |  | ||||||
| This was originally written by Aleksandr Tihomirov (@zet4) and can be found at https://github.com/zet4/micro-misc/. |  | ||||||
|  |  | ||||||
| ## Options |  | ||||||
| ### discord_token |  | ||||||
|  |  | ||||||
| You have to supply an application token via `--discord_token`. |  | ||||||
|  |  | ||||||
| Head over to Discord's [developer introduction](https://discordapp.com/developers/docs/intro) |  | ||||||
| to learn how to create applications and how the API works. |  | ||||||
|  |  | ||||||
| ### discord_prefix |  | ||||||
|  |  | ||||||
| Set a command prefix with `--discord_prefix`. The default prefix is `Micro `. |  | ||||||
| You can mention the bot or use the prefix to run a command. |  | ||||||
|  |  | ||||||
| ### discord_whitelist |  | ||||||
|  |  | ||||||
| Pass a list of comma-separated user IDs with `--discord_whitelist`. Only allow |  | ||||||
| these users to use the bot. |  | ||||||
| @@ -1,116 +0,0 @@ | |||||||
| package discord |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"errors" |  | ||||||
| 	"strings" |  | ||||||
| 	"sync" |  | ||||||
|  |  | ||||||
| 	"github.com/bwmarrin/discordgo" |  | ||||||
| 	"github.com/micro/go-micro/v3/agent/input" |  | ||||||
| 	"github.com/micro/go-micro/v3/logger" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| type discordConn struct { |  | ||||||
| 	master *discordInput |  | ||||||
| 	exit   chan struct{} |  | ||||||
| 	recv   chan *discordgo.Message |  | ||||||
|  |  | ||||||
| 	sync.Mutex |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func newConn(master *discordInput) *discordConn { |  | ||||||
| 	conn := &discordConn{ |  | ||||||
| 		master: master, |  | ||||||
| 		exit:   make(chan struct{}), |  | ||||||
| 		recv:   make(chan *discordgo.Message), |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	conn.master.session.AddHandler(func(s *discordgo.Session, m *discordgo.MessageCreate) { |  | ||||||
| 		if m.Author.ID == master.botID { |  | ||||||
| 			return |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		whitelisted := false |  | ||||||
| 		for _, ID := range conn.master.whitelist { |  | ||||||
| 			if m.Author.ID == ID { |  | ||||||
| 				whitelisted = true |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if len(master.whitelist) > 0 && !whitelisted { |  | ||||||
| 			return |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		var valid bool |  | ||||||
| 		m.Message.Content, valid = conn.master.prefixfn(m.Message.Content) |  | ||||||
| 		if !valid { |  | ||||||
| 			return |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		conn.recv <- m.Message |  | ||||||
| 	}) |  | ||||||
|  |  | ||||||
| 	return conn |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (dc *discordConn) Recv(event *input.Event) error { |  | ||||||
| 	for { |  | ||||||
| 		select { |  | ||||||
| 		case <-dc.exit: |  | ||||||
| 			return errors.New("connection closed") |  | ||||||
| 		case msg := <-dc.recv: |  | ||||||
|  |  | ||||||
| 			event.From = msg.ChannelID + ":" + msg.Author.ID |  | ||||||
| 			event.To = dc.master.botID |  | ||||||
| 			event.Type = input.TextEvent |  | ||||||
| 			event.Data = []byte(msg.Content) |  | ||||||
| 			return nil |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func ChunkString(s string, chunkSize int) []string { |  | ||||||
| 	var chunks []string |  | ||||||
| 	runes := []rune(s) |  | ||||||
|  |  | ||||||
| 	if len(runes) == 0 { |  | ||||||
| 		return []string{s} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	for i := 0; i < len(runes); i += chunkSize { |  | ||||||
| 		nn := i + chunkSize |  | ||||||
| 		if nn > len(runes) { |  | ||||||
| 			nn = len(runes) |  | ||||||
| 		} |  | ||||||
| 		chunks = append(chunks, string(runes[i:nn])) |  | ||||||
| 	} |  | ||||||
| 	return chunks |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (dc *discordConn) Send(e *input.Event) error { |  | ||||||
| 	fields := strings.Split(e.To, ":") |  | ||||||
| 	for _, chunk := range ChunkString(string(e.Data), 2000) { |  | ||||||
| 		_, err := dc.master.session.ChannelMessageSend(fields[0], chunk) |  | ||||||
| 		if err != nil { |  | ||||||
| 			if logger.V(logger.ErrorLevel, logger.DefaultLogger) { |  | ||||||
| 				logger.Error("[bot][loop][send]", err) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (dc *discordConn) Close() error { |  | ||||||
| 	if err := dc.master.session.Close(); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	select { |  | ||||||
| 	case <-dc.exit: |  | ||||||
| 		return nil |  | ||||||
| 	default: |  | ||||||
| 		close(dc.exit) |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| @@ -1,153 +0,0 @@ | |||||||
| package discord |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"sync" |  | ||||||
|  |  | ||||||
| 	"errors" |  | ||||||
| 	"strings" |  | ||||||
|  |  | ||||||
| 	"github.com/bwmarrin/discordgo" |  | ||||||
| 	"github.com/micro/cli/v2" |  | ||||||
| 	"github.com/micro/go-micro/v3/agent/input" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| func init() { |  | ||||||
| 	input.Inputs["discord"] = newInput() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func newInput() *discordInput { |  | ||||||
| 	return &discordInput{} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type discordInput struct { |  | ||||||
| 	token     string |  | ||||||
| 	whitelist []string |  | ||||||
| 	prefix    string |  | ||||||
| 	prefixfn  func(string) (string, bool) |  | ||||||
| 	botID     string |  | ||||||
|  |  | ||||||
| 	session *discordgo.Session |  | ||||||
|  |  | ||||||
| 	sync.Mutex |  | ||||||
| 	running bool |  | ||||||
| 	exit    chan struct{} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (d *discordInput) Flags() []cli.Flag { |  | ||||||
| 	return []cli.Flag{ |  | ||||||
| 		&cli.StringFlag{ |  | ||||||
| 			Name:    "discord_token", |  | ||||||
| 			EnvVars: []string{"MICRO_DISCORD_TOKEN"}, |  | ||||||
| 			Usage:   "Discord token (prefix with Bot if it's for bot account)", |  | ||||||
| 		}, |  | ||||||
| 		&cli.StringFlag{ |  | ||||||
| 			Name:    "discord_whitelist", |  | ||||||
| 			EnvVars: []string{"MICRO_DISCORD_WHITELIST"}, |  | ||||||
| 			Usage:   "Discord Whitelist (seperated by ,)", |  | ||||||
| 		}, |  | ||||||
| 		&cli.StringFlag{ |  | ||||||
| 			Name:    "discord_prefix", |  | ||||||
| 			Usage:   "Discord Prefix", |  | ||||||
| 			EnvVars: []string{"MICRO_DISCORD_PREFIX"}, |  | ||||||
| 			Value:   "Micro ", |  | ||||||
| 		}, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (d *discordInput) Init(ctx *cli.Context) error { |  | ||||||
| 	token := ctx.String("discord_token") |  | ||||||
| 	whitelist := ctx.String("discord_whitelist") |  | ||||||
| 	prefix := ctx.String("discord_prefix") |  | ||||||
|  |  | ||||||
| 	if len(token) == 0 { |  | ||||||
| 		return errors.New("require token") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	d.token = token |  | ||||||
| 	d.prefix = prefix |  | ||||||
|  |  | ||||||
| 	if len(whitelist) > 0 { |  | ||||||
| 		d.whitelist = strings.Split(whitelist, ",") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (d *discordInput) Start() error { |  | ||||||
| 	if len(d.token) == 0 { |  | ||||||
| 		return errors.New("missing discord configuration") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	d.Lock() |  | ||||||
| 	defer d.Unlock() |  | ||||||
|  |  | ||||||
| 	if d.running { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	var err error |  | ||||||
| 	d.session, err = discordgo.New("Bot " + d.token) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	u, err := d.session.User("@me") |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	d.botID = u.ID |  | ||||||
| 	d.prefixfn = CheckPrefixFactory(fmt.Sprintf("<@%s> ", d.botID), fmt.Sprintf("<@!%s> ", d.botID), d.prefix) |  | ||||||
|  |  | ||||||
| 	d.exit = make(chan struct{}) |  | ||||||
| 	d.running = true |  | ||||||
|  |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (d *discordInput) Stream() (input.Conn, error) { |  | ||||||
| 	d.Lock() |  | ||||||
| 	defer d.Unlock() |  | ||||||
| 	if !d.running { |  | ||||||
| 		return nil, errors.New("not running") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	//Fire-n-forget close just in case... |  | ||||||
| 	d.session.Close() |  | ||||||
|  |  | ||||||
| 	conn := newConn(d) |  | ||||||
| 	if err := d.session.Open(); err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return conn, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (d *discordInput) Stop() error { |  | ||||||
| 	d.Lock() |  | ||||||
| 	defer d.Unlock() |  | ||||||
|  |  | ||||||
| 	if !d.running { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	close(d.exit) |  | ||||||
| 	d.running = false |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (d *discordInput) String() string { |  | ||||||
| 	return "discord" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // CheckPrefixFactory Creates a prefix checking function and stuff. |  | ||||||
| func CheckPrefixFactory(prefixes ...string) func(string) (string, bool) { |  | ||||||
| 	return func(content string) (string, bool) { |  | ||||||
| 		for _, prefix := range prefixes { |  | ||||||
| 			if strings.HasPrefix(content, prefix) { |  | ||||||
| 				return strings.TrimPrefix(content, prefix), true |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		return "", false |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @@ -1,55 +0,0 @@ | |||||||
| // Package input is an interface for bot inputs |  | ||||||
| package input |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"github.com/micro/cli/v2" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| type EventType string |  | ||||||
|  |  | ||||||
| const ( |  | ||||||
| 	TextEvent EventType = "text" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| var ( |  | ||||||
| 	// Inputs keyed by name |  | ||||||
| 	// Example slack or hipchat |  | ||||||
| 	Inputs = map[string]Input{} |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // Event is the unit sent and received |  | ||||||
| type Event struct { |  | ||||||
| 	Type EventType |  | ||||||
| 	From string |  | ||||||
| 	To   string |  | ||||||
| 	Data []byte |  | ||||||
| 	Meta map[string]interface{} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Input is an interface for sources which |  | ||||||
| // provide a way to communicate with the bot. |  | ||||||
| // Slack, HipChat, XMPP, etc. |  | ||||||
| type Input interface { |  | ||||||
| 	// Provide cli flags |  | ||||||
| 	Flags() []cli.Flag |  | ||||||
| 	// Initialise input using cli context |  | ||||||
| 	Init(*cli.Context) error |  | ||||||
| 	// Stream events from the input |  | ||||||
| 	Stream() (Conn, error) |  | ||||||
| 	// Start the input |  | ||||||
| 	Start() error |  | ||||||
| 	// Stop the input |  | ||||||
| 	Stop() error |  | ||||||
| 	// name of the input |  | ||||||
| 	String() string |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Conn interface provides a way to |  | ||||||
| // send and receive events. Send and |  | ||||||
| // Recv both block until succeeding |  | ||||||
| // or failing. |  | ||||||
| type Conn interface { |  | ||||||
| 	Close() error |  | ||||||
| 	Recv(*Event) error |  | ||||||
| 	Send(*Event) error |  | ||||||
| } |  | ||||||
| @@ -1,160 +0,0 @@ | |||||||
| package slack |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"errors" |  | ||||||
| 	"fmt" |  | ||||||
| 	"strings" |  | ||||||
| 	"sync" |  | ||||||
| 	"time" |  | ||||||
|  |  | ||||||
| 	"github.com/micro/go-micro/v3/agent/input" |  | ||||||
| 	"github.com/nlopes/slack" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // Satisfies the input.Conn interface |  | ||||||
| type slackConn struct { |  | ||||||
| 	auth *slack.AuthTestResponse |  | ||||||
| 	rtm  *slack.RTM |  | ||||||
| 	exit chan bool |  | ||||||
|  |  | ||||||
| 	sync.Mutex |  | ||||||
| 	names map[string]string |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (s *slackConn) run() { |  | ||||||
| 	// func retrieves user names and maps to IDs |  | ||||||
| 	setNames := func() { |  | ||||||
| 		names := make(map[string]string) |  | ||||||
| 		users, err := s.rtm.Client.GetUsers() |  | ||||||
| 		if err != nil { |  | ||||||
| 			return |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		for _, user := range users { |  | ||||||
| 			names[user.ID] = user.Name |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		s.Lock() |  | ||||||
| 		s.names = names |  | ||||||
| 		s.Unlock() |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	setNames() |  | ||||||
|  |  | ||||||
| 	t := time.NewTicker(time.Minute) |  | ||||||
| 	defer t.Stop() |  | ||||||
|  |  | ||||||
| 	for { |  | ||||||
| 		select { |  | ||||||
| 		case <-s.exit: |  | ||||||
| 			return |  | ||||||
| 		case <-t.C: |  | ||||||
| 			setNames() |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (s *slackConn) getName(id string) string { |  | ||||||
| 	s.Lock() |  | ||||||
| 	name := s.names[id] |  | ||||||
| 	s.Unlock() |  | ||||||
| 	return name |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (s *slackConn) Close() error { |  | ||||||
| 	select { |  | ||||||
| 	case <-s.exit: |  | ||||||
| 		return nil |  | ||||||
| 	default: |  | ||||||
| 		close(s.exit) |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (s *slackConn) Recv(event *input.Event) error { |  | ||||||
| 	if event == nil { |  | ||||||
| 		return errors.New("event cannot be nil") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	for { |  | ||||||
| 		select { |  | ||||||
| 		case <-s.exit: |  | ||||||
| 			return errors.New("connection closed") |  | ||||||
| 		case e := <-s.rtm.IncomingEvents: |  | ||||||
| 			switch ev := e.Data.(type) { |  | ||||||
| 			case *slack.MessageEvent: |  | ||||||
| 				// only accept type message |  | ||||||
| 				if ev.Type != "message" { |  | ||||||
| 					continue |  | ||||||
| 				} |  | ||||||
|  |  | ||||||
| 				// only accept DMs or messages to me |  | ||||||
| 				switch { |  | ||||||
| 				case strings.HasPrefix(ev.Channel, "D"): |  | ||||||
| 				case strings.HasPrefix(ev.Text, s.auth.User): |  | ||||||
| 				case strings.HasPrefix(ev.Text, fmt.Sprintf("<@%s>", s.auth.UserID)): |  | ||||||
| 				default: |  | ||||||
| 					continue |  | ||||||
| 				} |  | ||||||
|  |  | ||||||
| 				// Strip username from text |  | ||||||
| 				switch { |  | ||||||
| 				case strings.HasPrefix(ev.Text, s.auth.User): |  | ||||||
| 					args := strings.Split(ev.Text, " ")[1:] |  | ||||||
| 					ev.Text = strings.Join(args, " ") |  | ||||||
| 					event.To = s.auth.User |  | ||||||
| 				case strings.HasPrefix(ev.Text, fmt.Sprintf("<@%s>", s.auth.UserID)): |  | ||||||
| 					args := strings.Split(ev.Text, " ")[1:] |  | ||||||
| 					ev.Text = strings.Join(args, " ") |  | ||||||
| 					event.To = s.auth.UserID |  | ||||||
| 				} |  | ||||||
|  |  | ||||||
| 				if event.Meta == nil { |  | ||||||
| 					event.Meta = make(map[string]interface{}) |  | ||||||
| 				} |  | ||||||
|  |  | ||||||
| 				// fill in the blanks |  | ||||||
| 				event.From = ev.Channel + ":" + ev.User |  | ||||||
| 				event.Type = input.TextEvent |  | ||||||
| 				event.Data = []byte(ev.Text) |  | ||||||
| 				event.Meta["reply"] = ev |  | ||||||
| 				return nil |  | ||||||
| 			case *slack.InvalidAuthEvent: |  | ||||||
| 				return errors.New("invalid credentials") |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (s *slackConn) Send(event *input.Event) error { |  | ||||||
| 	var channel, message, name string |  | ||||||
|  |  | ||||||
| 	if len(event.To) == 0 { |  | ||||||
| 		return errors.New("require Event.To") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	parts := strings.Split(event.To, ":") |  | ||||||
|  |  | ||||||
| 	if len(parts) == 2 { |  | ||||||
| 		channel = parts[0] |  | ||||||
| 		name = s.getName(parts[1]) |  | ||||||
| 		// try using reply meta |  | ||||||
| 	} else if ev, ok := event.Meta["reply"]; ok { |  | ||||||
| 		channel = ev.(*slack.MessageEvent).Channel |  | ||||||
| 		name = s.getName(ev.(*slack.MessageEvent).User) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// don't know where to send the message |  | ||||||
| 	if len(channel) == 0 { |  | ||||||
| 		return errors.New("could not determine who message is to") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if len(name) == 0 || strings.HasPrefix(channel, "D") { |  | ||||||
| 		message = string(event.Data) |  | ||||||
| 	} else { |  | ||||||
| 		message = fmt.Sprintf("@%s: %s", name, string(event.Data)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	s.rtm.SendMessage(s.rtm.NewOutgoingMessage(message, channel)) |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| @@ -1,147 +0,0 @@ | |||||||
| package slack |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"errors" |  | ||||||
| 	"sync" |  | ||||||
|  |  | ||||||
| 	"github.com/micro/cli/v2" |  | ||||||
| 	"github.com/micro/go-micro/v3/agent/input" |  | ||||||
| 	"github.com/nlopes/slack" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| type slackInput struct { |  | ||||||
| 	debug bool |  | ||||||
| 	token string |  | ||||||
|  |  | ||||||
| 	sync.Mutex |  | ||||||
| 	running bool |  | ||||||
| 	exit    chan bool |  | ||||||
|  |  | ||||||
| 	api *slack.Client |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func init() { |  | ||||||
| 	input.Inputs["slack"] = NewInput() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (p *slackInput) Flags() []cli.Flag { |  | ||||||
| 	return []cli.Flag{ |  | ||||||
| 		&cli.BoolFlag{ |  | ||||||
| 			Name:    "slack_debug", |  | ||||||
| 			Usage:   "Slack debug output", |  | ||||||
| 			EnvVars: []string{"MICRO_SLACK_DEBUG"}, |  | ||||||
| 		}, |  | ||||||
| 		&cli.StringFlag{ |  | ||||||
| 			Name:    "slack_token", |  | ||||||
| 			Usage:   "Slack token", |  | ||||||
| 			EnvVars: []string{"MICRO_SLACK_TOKEN"}, |  | ||||||
| 		}, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (p *slackInput) Init(ctx *cli.Context) error { |  | ||||||
| 	debug := ctx.Bool("slack_debug") |  | ||||||
| 	token := ctx.String("slack_token") |  | ||||||
|  |  | ||||||
| 	if len(token) == 0 { |  | ||||||
| 		return errors.New("missing slack token") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	p.debug = debug |  | ||||||
| 	p.token = token |  | ||||||
|  |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (p *slackInput) Stream() (input.Conn, error) { |  | ||||||
| 	p.Lock() |  | ||||||
| 	defer p.Unlock() |  | ||||||
|  |  | ||||||
| 	if !p.running { |  | ||||||
| 		return nil, errors.New("not running") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// test auth |  | ||||||
| 	auth, err := p.api.AuthTest() |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	rtm := p.api.NewRTM() |  | ||||||
| 	exit := make(chan bool) |  | ||||||
|  |  | ||||||
| 	go rtm.ManageConnection() |  | ||||||
|  |  | ||||||
| 	go func() { |  | ||||||
| 		select { |  | ||||||
| 		case <-p.exit: |  | ||||||
| 			select { |  | ||||||
| 			case <-exit: |  | ||||||
| 				return |  | ||||||
| 			default: |  | ||||||
| 				close(exit) |  | ||||||
| 			} |  | ||||||
| 		case <-exit: |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		rtm.Disconnect() |  | ||||||
| 	}() |  | ||||||
|  |  | ||||||
| 	conn := &slackConn{ |  | ||||||
| 		auth:  auth, |  | ||||||
| 		rtm:   rtm, |  | ||||||
| 		exit:  exit, |  | ||||||
| 		names: make(map[string]string), |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	go conn.run() |  | ||||||
|  |  | ||||||
| 	return conn, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (p *slackInput) Start() error { |  | ||||||
| 	if len(p.token) == 0 { |  | ||||||
| 		return errors.New("missing slack token") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	p.Lock() |  | ||||||
| 	defer p.Unlock() |  | ||||||
|  |  | ||||||
| 	if p.running { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	api := slack.New(p.token, slack.OptionDebug(p.debug)) |  | ||||||
|  |  | ||||||
| 	// test auth |  | ||||||
| 	_, err := api.AuthTest() |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	p.api = api |  | ||||||
| 	p.exit = make(chan bool) |  | ||||||
| 	p.running = true |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (p *slackInput) Stop() error { |  | ||||||
| 	p.Lock() |  | ||||||
| 	defer p.Unlock() |  | ||||||
|  |  | ||||||
| 	if !p.running { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	close(p.exit) |  | ||||||
| 	p.running = false |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (p *slackInput) String() string { |  | ||||||
| 	return "slack" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func NewInput() input.Input { |  | ||||||
| 	return &slackInput{} |  | ||||||
| } |  | ||||||
| @@ -1,18 +0,0 @@ | |||||||
| # Telegram Messenger input for micro bot |  | ||||||
| [Telegram](https://telegram.org) support for micro bot based on [telegram-bot-api](https://github.com/go-telegram-bot-api/telegram-bot-api). |  | ||||||
|  |  | ||||||
| ## Options |  | ||||||
| ### --telegram_token (required) |  | ||||||
|  |  | ||||||
| Sets bot's token for interacting with API. |  | ||||||
|  |  | ||||||
| Head over to Telegram's [API documentation](https://core.telegram.org/bots/api) |  | ||||||
| to learn how to create bots and how the API works. |  | ||||||
|  |  | ||||||
| ### --telegram_debug |  | ||||||
|  |  | ||||||
| Sets the debug flag to make the bot's output verbose. |  | ||||||
|  |  | ||||||
| ### --telegram_whitelist |  | ||||||
|  |  | ||||||
| Sets a list of comma-separated nicknames (without @ symbol in the beginning) for interacting with bot. Only these users can use the bot. |  | ||||||
| @@ -1,115 +0,0 @@ | |||||||
| package telegram |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"errors" |  | ||||||
| 	"strings" |  | ||||||
| 	"sync" |  | ||||||
|  |  | ||||||
| 	"github.com/forestgiant/sliceutil" |  | ||||||
| 	"github.com/micro/go-micro/v3/agent/input" |  | ||||||
| 	"github.com/micro/go-micro/v3/logger" |  | ||||||
| 	tgbotapi "gopkg.in/telegram-bot-api.v4" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| type telegramConn struct { |  | ||||||
| 	input *telegramInput |  | ||||||
|  |  | ||||||
| 	recv <-chan tgbotapi.Update |  | ||||||
| 	exit chan bool |  | ||||||
|  |  | ||||||
| 	syncCond *sync.Cond |  | ||||||
| 	mutex    sync.Mutex |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func newConn(input *telegramInput) (*telegramConn, error) { |  | ||||||
| 	conn := &telegramConn{ |  | ||||||
| 		input: input, |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	conn.syncCond = sync.NewCond(&conn.mutex) |  | ||||||
|  |  | ||||||
| 	go conn.run() |  | ||||||
|  |  | ||||||
| 	return conn, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (tc *telegramConn) run() { |  | ||||||
| 	u := tgbotapi.NewUpdate(0) |  | ||||||
| 	u.Timeout = 60 |  | ||||||
| 	updates, err := tc.input.api.GetUpdatesChan(u) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	tc.recv = updates |  | ||||||
| 	tc.syncCond.Signal() |  | ||||||
|  |  | ||||||
| 	select { |  | ||||||
| 	case <-tc.exit: |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (tc *telegramConn) Close() error { |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (tc *telegramConn) Recv(event *input.Event) error { |  | ||||||
| 	if event == nil { |  | ||||||
| 		return errors.New("event cannot be nil") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	for { |  | ||||||
| 		if tc.recv == nil { |  | ||||||
| 			tc.mutex.Lock() |  | ||||||
| 			tc.syncCond.Wait() |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		update := <-tc.recv |  | ||||||
|  |  | ||||||
| 		if update.Message == nil || (len(tc.input.whitelist) > 0 && !sliceutil.Contains(tc.input.whitelist, update.Message.From.UserName)) { |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if event.Meta == nil { |  | ||||||
| 			event.Meta = make(map[string]interface{}) |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		event.Type = input.TextEvent |  | ||||||
| 		event.From = update.Message.From.UserName |  | ||||||
| 		event.To = tc.input.api.Self.UserName |  | ||||||
| 		event.Data = []byte(update.Message.Text) |  | ||||||
| 		event.Meta["chatId"] = update.Message.Chat.ID |  | ||||||
| 		event.Meta["chatType"] = update.Message.Chat.Type |  | ||||||
| 		event.Meta["messageId"] = update.Message.MessageID |  | ||||||
|  |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (tc *telegramConn) Send(event *input.Event) error { |  | ||||||
| 	messageText := strings.TrimSpace(string(event.Data)) |  | ||||||
|  |  | ||||||
| 	chatId := event.Meta["chatId"].(int64) |  | ||||||
| 	chatType := ChatType(event.Meta["chatType"].(string)) |  | ||||||
|  |  | ||||||
| 	msgConfig := tgbotapi.NewMessage(chatId, messageText) |  | ||||||
| 	msgConfig.ParseMode = tgbotapi.ModeHTML |  | ||||||
|  |  | ||||||
| 	if sliceutil.Contains([]ChatType{Group, Supergroup}, chatType) { |  | ||||||
| 		msgConfig.ReplyToMessageID = event.Meta["messageId"].(int) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	_, err := tc.input.api.Send(msgConfig) |  | ||||||
|  |  | ||||||
| 	if err != nil { |  | ||||||
| 		// probably it could be because of nested HTML tags -- telegram doesn't allow nested tags |  | ||||||
| 		if logger.V(logger.ErrorLevel, logger.DefaultLogger) { |  | ||||||
| 			logger.Error("[telegram][Send] error:", err) |  | ||||||
| 		} |  | ||||||
| 		msgConfig.Text = "This bot couldn't send the response (Internal error)" |  | ||||||
| 		tc.input.api.Send(msgConfig) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| @@ -1,101 +0,0 @@ | |||||||
| package telegram |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"errors" |  | ||||||
| 	"strings" |  | ||||||
| 	"sync" |  | ||||||
|  |  | ||||||
| 	"github.com/micro/cli/v2" |  | ||||||
| 	"github.com/micro/go-micro/v3/agent/input" |  | ||||||
| 	tgbotapi "gopkg.in/telegram-bot-api.v4" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| type telegramInput struct { |  | ||||||
| 	sync.Mutex |  | ||||||
|  |  | ||||||
| 	debug     bool |  | ||||||
| 	token     string |  | ||||||
| 	whitelist []string |  | ||||||
|  |  | ||||||
| 	api *tgbotapi.BotAPI |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type ChatType string |  | ||||||
|  |  | ||||||
| const ( |  | ||||||
| 	Private    ChatType = "private" |  | ||||||
| 	Group      ChatType = "group" |  | ||||||
| 	Supergroup ChatType = "supergroup" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| func init() { |  | ||||||
| 	input.Inputs["telegram"] = &telegramInput{} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (ti *telegramInput) Flags() []cli.Flag { |  | ||||||
| 	return []cli.Flag{ |  | ||||||
| 		&cli.BoolFlag{ |  | ||||||
| 			Name:    "telegram_debug", |  | ||||||
| 			EnvVars: []string{"MICRO_TELEGRAM_DEBUG"}, |  | ||||||
| 			Usage:   "Telegram debug output", |  | ||||||
| 		}, |  | ||||||
| 		&cli.StringFlag{ |  | ||||||
| 			Name:    "telegram_token", |  | ||||||
| 			EnvVars: []string{"MICRO_TELEGRAM_TOKEN"}, |  | ||||||
| 			Usage:   "Telegram token", |  | ||||||
| 		}, |  | ||||||
| 		&cli.StringFlag{ |  | ||||||
| 			Name:    "telegram_whitelist", |  | ||||||
| 			EnvVars: []string{"MICRO_TELEGRAM_WHITELIST"}, |  | ||||||
| 			Usage:   "Telegram bot's users (comma-separated values)", |  | ||||||
| 		}, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (ti *telegramInput) Init(ctx *cli.Context) error { |  | ||||||
| 	ti.debug = ctx.Bool("telegram_debug") |  | ||||||
| 	ti.token = ctx.String("telegram_token") |  | ||||||
|  |  | ||||||
| 	whitelist := ctx.String("telegram_whitelist") |  | ||||||
|  |  | ||||||
| 	if whitelist != "" { |  | ||||||
| 		ti.whitelist = strings.Split(whitelist, ",") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if len(ti.token) == 0 { |  | ||||||
| 		return errors.New("missing telegram token") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (ti *telegramInput) Stream() (input.Conn, error) { |  | ||||||
| 	ti.Lock() |  | ||||||
| 	defer ti.Unlock() |  | ||||||
|  |  | ||||||
| 	return newConn(ti) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (ti *telegramInput) Start() error { |  | ||||||
| 	ti.Lock() |  | ||||||
| 	defer ti.Unlock() |  | ||||||
|  |  | ||||||
| 	api, err := tgbotapi.NewBotAPI(ti.token) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	ti.api = api |  | ||||||
|  |  | ||||||
| 	api.Debug = ti.debug |  | ||||||
|  |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (ti *telegramInput) Stop() error { |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (p *telegramInput) String() string { |  | ||||||
| 	return "telegram" |  | ||||||
| } |  | ||||||
| @@ -1,333 +0,0 @@ | |||||||
| // Code generated by protoc-gen-go. DO NOT EDIT. |  | ||||||
| // source: agent/proto/bot.proto |  | ||||||
|  |  | ||||||
| package go_micro_bot |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	context "context" |  | ||||||
| 	fmt "fmt" |  | ||||||
| 	proto "github.com/golang/protobuf/proto" |  | ||||||
| 	grpc "google.golang.org/grpc" |  | ||||||
| 	codes "google.golang.org/grpc/codes" |  | ||||||
| 	status "google.golang.org/grpc/status" |  | ||||||
| 	math "math" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // Reference imports to suppress errors if they are not otherwise used. |  | ||||||
| var _ = proto.Marshal |  | ||||||
| var _ = fmt.Errorf |  | ||||||
| var _ = math.Inf |  | ||||||
|  |  | ||||||
| // This is a compile-time assertion to ensure that this generated file |  | ||||||
| // is compatible with the proto package it is being compiled against. |  | ||||||
| // A compilation error at this line likely means your copy of the |  | ||||||
| // proto package needs to be updated. |  | ||||||
| const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package |  | ||||||
|  |  | ||||||
| type HelpRequest struct { |  | ||||||
| 	XXX_NoUnkeyedLiteral struct{} `json:"-"` |  | ||||||
| 	XXX_unrecognized     []byte   `json:"-"` |  | ||||||
| 	XXX_sizecache        int32    `json:"-"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (m *HelpRequest) Reset()         { *m = HelpRequest{} } |  | ||||||
| func (m *HelpRequest) String() string { return proto.CompactTextString(m) } |  | ||||||
| func (*HelpRequest) ProtoMessage()    {} |  | ||||||
| func (*HelpRequest) Descriptor() ([]byte, []int) { |  | ||||||
| 	return fileDescriptor_79b974b8c77805fa, []int{0} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (m *HelpRequest) XXX_Unmarshal(b []byte) error { |  | ||||||
| 	return xxx_messageInfo_HelpRequest.Unmarshal(m, b) |  | ||||||
| } |  | ||||||
| func (m *HelpRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |  | ||||||
| 	return xxx_messageInfo_HelpRequest.Marshal(b, m, deterministic) |  | ||||||
| } |  | ||||||
| func (m *HelpRequest) XXX_Merge(src proto.Message) { |  | ||||||
| 	xxx_messageInfo_HelpRequest.Merge(m, src) |  | ||||||
| } |  | ||||||
| func (m *HelpRequest) XXX_Size() int { |  | ||||||
| 	return xxx_messageInfo_HelpRequest.Size(m) |  | ||||||
| } |  | ||||||
| func (m *HelpRequest) XXX_DiscardUnknown() { |  | ||||||
| 	xxx_messageInfo_HelpRequest.DiscardUnknown(m) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| var xxx_messageInfo_HelpRequest proto.InternalMessageInfo |  | ||||||
|  |  | ||||||
| type HelpResponse struct { |  | ||||||
| 	Usage                string   `protobuf:"bytes,1,opt,name=usage,proto3" json:"usage,omitempty"` |  | ||||||
| 	Description          string   `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` |  | ||||||
| 	XXX_NoUnkeyedLiteral struct{} `json:"-"` |  | ||||||
| 	XXX_unrecognized     []byte   `json:"-"` |  | ||||||
| 	XXX_sizecache        int32    `json:"-"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (m *HelpResponse) Reset()         { *m = HelpResponse{} } |  | ||||||
| func (m *HelpResponse) String() string { return proto.CompactTextString(m) } |  | ||||||
| func (*HelpResponse) ProtoMessage()    {} |  | ||||||
| func (*HelpResponse) Descriptor() ([]byte, []int) { |  | ||||||
| 	return fileDescriptor_79b974b8c77805fa, []int{1} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (m *HelpResponse) XXX_Unmarshal(b []byte) error { |  | ||||||
| 	return xxx_messageInfo_HelpResponse.Unmarshal(m, b) |  | ||||||
| } |  | ||||||
| func (m *HelpResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |  | ||||||
| 	return xxx_messageInfo_HelpResponse.Marshal(b, m, deterministic) |  | ||||||
| } |  | ||||||
| func (m *HelpResponse) XXX_Merge(src proto.Message) { |  | ||||||
| 	xxx_messageInfo_HelpResponse.Merge(m, src) |  | ||||||
| } |  | ||||||
| func (m *HelpResponse) XXX_Size() int { |  | ||||||
| 	return xxx_messageInfo_HelpResponse.Size(m) |  | ||||||
| } |  | ||||||
| func (m *HelpResponse) XXX_DiscardUnknown() { |  | ||||||
| 	xxx_messageInfo_HelpResponse.DiscardUnknown(m) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| var xxx_messageInfo_HelpResponse proto.InternalMessageInfo |  | ||||||
|  |  | ||||||
| func (m *HelpResponse) GetUsage() string { |  | ||||||
| 	if m != nil { |  | ||||||
| 		return m.Usage |  | ||||||
| 	} |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (m *HelpResponse) GetDescription() string { |  | ||||||
| 	if m != nil { |  | ||||||
| 		return m.Description |  | ||||||
| 	} |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type ExecRequest struct { |  | ||||||
| 	Args                 []string `protobuf:"bytes,1,rep,name=args,proto3" json:"args,omitempty"` |  | ||||||
| 	XXX_NoUnkeyedLiteral struct{} `json:"-"` |  | ||||||
| 	XXX_unrecognized     []byte   `json:"-"` |  | ||||||
| 	XXX_sizecache        int32    `json:"-"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (m *ExecRequest) Reset()         { *m = ExecRequest{} } |  | ||||||
| func (m *ExecRequest) String() string { return proto.CompactTextString(m) } |  | ||||||
| func (*ExecRequest) ProtoMessage()    {} |  | ||||||
| func (*ExecRequest) Descriptor() ([]byte, []int) { |  | ||||||
| 	return fileDescriptor_79b974b8c77805fa, []int{2} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (m *ExecRequest) XXX_Unmarshal(b []byte) error { |  | ||||||
| 	return xxx_messageInfo_ExecRequest.Unmarshal(m, b) |  | ||||||
| } |  | ||||||
| func (m *ExecRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |  | ||||||
| 	return xxx_messageInfo_ExecRequest.Marshal(b, m, deterministic) |  | ||||||
| } |  | ||||||
| func (m *ExecRequest) XXX_Merge(src proto.Message) { |  | ||||||
| 	xxx_messageInfo_ExecRequest.Merge(m, src) |  | ||||||
| } |  | ||||||
| func (m *ExecRequest) XXX_Size() int { |  | ||||||
| 	return xxx_messageInfo_ExecRequest.Size(m) |  | ||||||
| } |  | ||||||
| func (m *ExecRequest) XXX_DiscardUnknown() { |  | ||||||
| 	xxx_messageInfo_ExecRequest.DiscardUnknown(m) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| var xxx_messageInfo_ExecRequest proto.InternalMessageInfo |  | ||||||
|  |  | ||||||
| func (m *ExecRequest) GetArgs() []string { |  | ||||||
| 	if m != nil { |  | ||||||
| 		return m.Args |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type ExecResponse struct { |  | ||||||
| 	Result               []byte   `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` |  | ||||||
| 	Error                string   `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` |  | ||||||
| 	XXX_NoUnkeyedLiteral struct{} `json:"-"` |  | ||||||
| 	XXX_unrecognized     []byte   `json:"-"` |  | ||||||
| 	XXX_sizecache        int32    `json:"-"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (m *ExecResponse) Reset()         { *m = ExecResponse{} } |  | ||||||
| func (m *ExecResponse) String() string { return proto.CompactTextString(m) } |  | ||||||
| func (*ExecResponse) ProtoMessage()    {} |  | ||||||
| func (*ExecResponse) Descriptor() ([]byte, []int) { |  | ||||||
| 	return fileDescriptor_79b974b8c77805fa, []int{3} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (m *ExecResponse) XXX_Unmarshal(b []byte) error { |  | ||||||
| 	return xxx_messageInfo_ExecResponse.Unmarshal(m, b) |  | ||||||
| } |  | ||||||
| func (m *ExecResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |  | ||||||
| 	return xxx_messageInfo_ExecResponse.Marshal(b, m, deterministic) |  | ||||||
| } |  | ||||||
| func (m *ExecResponse) XXX_Merge(src proto.Message) { |  | ||||||
| 	xxx_messageInfo_ExecResponse.Merge(m, src) |  | ||||||
| } |  | ||||||
| func (m *ExecResponse) XXX_Size() int { |  | ||||||
| 	return xxx_messageInfo_ExecResponse.Size(m) |  | ||||||
| } |  | ||||||
| func (m *ExecResponse) XXX_DiscardUnknown() { |  | ||||||
| 	xxx_messageInfo_ExecResponse.DiscardUnknown(m) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| var xxx_messageInfo_ExecResponse proto.InternalMessageInfo |  | ||||||
|  |  | ||||||
| func (m *ExecResponse) GetResult() []byte { |  | ||||||
| 	if m != nil { |  | ||||||
| 		return m.Result |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (m *ExecResponse) GetError() string { |  | ||||||
| 	if m != nil { |  | ||||||
| 		return m.Error |  | ||||||
| 	} |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func init() { |  | ||||||
| 	proto.RegisterType((*HelpRequest)(nil), "go.micro.bot.HelpRequest") |  | ||||||
| 	proto.RegisterType((*HelpResponse)(nil), "go.micro.bot.HelpResponse") |  | ||||||
| 	proto.RegisterType((*ExecRequest)(nil), "go.micro.bot.ExecRequest") |  | ||||||
| 	proto.RegisterType((*ExecResponse)(nil), "go.micro.bot.ExecResponse") |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func init() { proto.RegisterFile("agent/proto/bot.proto", fileDescriptor_79b974b8c77805fa) } |  | ||||||
|  |  | ||||||
| var fileDescriptor_79b974b8c77805fa = []byte{ |  | ||||||
| 	// 234 bytes of a gzipped FileDescriptorProto |  | ||||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0x3f, 0x4f, 0xc3, 0x30, |  | ||||||
| 	0x10, 0xc5, 0x1b, 0x28, 0x45, 0xbd, 0x84, 0xc5, 0x02, 0x14, 0x3a, 0x05, 0x4f, 0x9d, 0x5c, 0x09, |  | ||||||
| 	0x56, 0x24, 0x06, 0x04, 0x62, 0xce, 0x37, 0x48, 0xd2, 0x53, 0x14, 0xa9, 0xf1, 0x99, 0xb3, 0x23, |  | ||||||
| 	0xf1, 0x1d, 0xf8, 0xd2, 0xc8, 0x7f, 0x06, 0xab, 0xea, 0x76, 0xcf, 0x67, 0xbd, 0xf7, 0x7b, 0x07, |  | ||||||
| 	0x0f, 0xdd, 0x88, 0xda, 0x1d, 0x0c, 0x93, 0xa3, 0x43, 0x4f, 0x4e, 0x85, 0x49, 0x54, 0x23, 0xa9, |  | ||||||
| 	0x79, 0x1a, 0x98, 0x54, 0x4f, 0x4e, 0xde, 0x41, 0xf9, 0x8d, 0x27, 0xd3, 0xe2, 0xcf, 0x82, 0xd6, |  | ||||||
| 	0xc9, 0x2f, 0xa8, 0xa2, 0xb4, 0x86, 0xb4, 0x45, 0x71, 0x0f, 0x37, 0x8b, 0xed, 0x46, 0xac, 0x8b, |  | ||||||
| 	0xa6, 0xd8, 0x6f, 0xdb, 0x28, 0x44, 0x03, 0xe5, 0x11, 0xed, 0xc0, 0x93, 0x71, 0x13, 0xe9, 0xfa, |  | ||||||
| 	0x2a, 0xec, 0xf2, 0x27, 0xf9, 0x0c, 0xe5, 0xe7, 0x2f, 0x0e, 0xc9, 0x56, 0x08, 0x58, 0x77, 0x3c, |  | ||||||
| 	0xda, 0xba, 0x68, 0xae, 0xf7, 0xdb, 0x36, 0xcc, 0xf2, 0x0d, 0xaa, 0xf8, 0x25, 0x45, 0x3d, 0xc2, |  | ||||||
| 	0x86, 0xd1, 0x2e, 0x27, 0x17, 0xb2, 0xaa, 0x36, 0x29, 0x8f, 0x80, 0xcc, 0xc4, 0x29, 0x26, 0x8a, |  | ||||||
| 	0x97, 0xbf, 0x02, 0x6e, 0x3f, 0x68, 0x9e, 0x3b, 0x7d, 0x14, 0xef, 0xb0, 0xf6, 0xd0, 0xe2, 0x49, |  | ||||||
| 	0xe5, 0xd5, 0x54, 0xd6, 0x6b, 0xb7, 0xbb, 0xb4, 0x8a, 0xc1, 0x72, 0xe5, 0x0d, 0x3c, 0xca, 0xb9, |  | ||||||
| 	0x41, 0xd6, 0xe0, 0xdc, 0x20, 0x27, 0x97, 0xab, 0x7e, 0x13, 0x4e, 0xfb, 0xfa, 0x1f, 0x00, 0x00, |  | ||||||
| 	0xff, 0xff, 0xe8, 0x08, 0x5e, 0xad, 0x73, 0x01, 0x00, 0x00, |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Reference imports to suppress errors if they are not otherwise used. |  | ||||||
| var _ context.Context |  | ||||||
| var _ grpc.ClientConn |  | ||||||
|  |  | ||||||
| // This is a compile-time assertion to ensure that this generated file |  | ||||||
| // is compatible with the grpc package it is being compiled against. |  | ||||||
| const _ = grpc.SupportPackageIsVersion4 |  | ||||||
|  |  | ||||||
| // CommandClient is the client API for Command service. |  | ||||||
| // |  | ||||||
| // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. |  | ||||||
| type CommandClient interface { |  | ||||||
| 	Help(ctx context.Context, in *HelpRequest, opts ...grpc.CallOption) (*HelpResponse, error) |  | ||||||
| 	Exec(ctx context.Context, in *ExecRequest, opts ...grpc.CallOption) (*ExecResponse, error) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type commandClient struct { |  | ||||||
| 	cc *grpc.ClientConn |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func NewCommandClient(cc *grpc.ClientConn) CommandClient { |  | ||||||
| 	return &commandClient{cc} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (c *commandClient) Help(ctx context.Context, in *HelpRequest, opts ...grpc.CallOption) (*HelpResponse, error) { |  | ||||||
| 	out := new(HelpResponse) |  | ||||||
| 	err := c.cc.Invoke(ctx, "/go.micro.bot.Command/Help", in, out, opts...) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return out, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (c *commandClient) Exec(ctx context.Context, in *ExecRequest, opts ...grpc.CallOption) (*ExecResponse, error) { |  | ||||||
| 	out := new(ExecResponse) |  | ||||||
| 	err := c.cc.Invoke(ctx, "/go.micro.bot.Command/Exec", in, out, opts...) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return out, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // CommandServer is the server API for Command service. |  | ||||||
| type CommandServer interface { |  | ||||||
| 	Help(context.Context, *HelpRequest) (*HelpResponse, error) |  | ||||||
| 	Exec(context.Context, *ExecRequest) (*ExecResponse, error) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // UnimplementedCommandServer can be embedded to have forward compatible implementations. |  | ||||||
| type UnimplementedCommandServer struct { |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (*UnimplementedCommandServer) Help(ctx context.Context, req *HelpRequest) (*HelpResponse, error) { |  | ||||||
| 	return nil, status.Errorf(codes.Unimplemented, "method Help not implemented") |  | ||||||
| } |  | ||||||
| func (*UnimplementedCommandServer) Exec(ctx context.Context, req *ExecRequest) (*ExecResponse, error) { |  | ||||||
| 	return nil, status.Errorf(codes.Unimplemented, "method Exec not implemented") |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func RegisterCommandServer(s *grpc.Server, srv CommandServer) { |  | ||||||
| 	s.RegisterService(&_Command_serviceDesc, srv) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func _Command_Help_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { |  | ||||||
| 	in := new(HelpRequest) |  | ||||||
| 	if err := dec(in); err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	if interceptor == nil { |  | ||||||
| 		return srv.(CommandServer).Help(ctx, in) |  | ||||||
| 	} |  | ||||||
| 	info := &grpc.UnaryServerInfo{ |  | ||||||
| 		Server:     srv, |  | ||||||
| 		FullMethod: "/go.micro.bot.Command/Help", |  | ||||||
| 	} |  | ||||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { |  | ||||||
| 		return srv.(CommandServer).Help(ctx, req.(*HelpRequest)) |  | ||||||
| 	} |  | ||||||
| 	return interceptor(ctx, in, info, handler) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func _Command_Exec_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { |  | ||||||
| 	in := new(ExecRequest) |  | ||||||
| 	if err := dec(in); err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	if interceptor == nil { |  | ||||||
| 		return srv.(CommandServer).Exec(ctx, in) |  | ||||||
| 	} |  | ||||||
| 	info := &grpc.UnaryServerInfo{ |  | ||||||
| 		Server:     srv, |  | ||||||
| 		FullMethod: "/go.micro.bot.Command/Exec", |  | ||||||
| 	} |  | ||||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { |  | ||||||
| 		return srv.(CommandServer).Exec(ctx, req.(*ExecRequest)) |  | ||||||
| 	} |  | ||||||
| 	return interceptor(ctx, in, info, handler) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| var _Command_serviceDesc = grpc.ServiceDesc{ |  | ||||||
| 	ServiceName: "go.micro.bot.Command", |  | ||||||
| 	HandlerType: (*CommandServer)(nil), |  | ||||||
| 	Methods: []grpc.MethodDesc{ |  | ||||||
| 		{ |  | ||||||
| 			MethodName: "Help", |  | ||||||
| 			Handler:    _Command_Help_Handler, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			MethodName: "Exec", |  | ||||||
| 			Handler:    _Command_Exec_Handler, |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	Streams:  []grpc.StreamDesc{}, |  | ||||||
| 	Metadata: "agent/proto/bot.proto", |  | ||||||
| } |  | ||||||
| @@ -1,110 +0,0 @@ | |||||||
| // Code generated by protoc-gen-micro. DO NOT EDIT. |  | ||||||
| // source: agent/proto/bot.proto |  | ||||||
|  |  | ||||||
| package go_micro_bot |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	fmt "fmt" |  | ||||||
| 	proto "github.com/golang/protobuf/proto" |  | ||||||
| 	math "math" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	context "context" |  | ||||||
| 	api "github.com/micro/go-micro/v3/api" |  | ||||||
| 	client "github.com/micro/go-micro/v3/client" |  | ||||||
| 	server "github.com/micro/go-micro/v3/server" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // Reference imports to suppress errors if they are not otherwise used. |  | ||||||
| var _ = proto.Marshal |  | ||||||
| var _ = fmt.Errorf |  | ||||||
| var _ = math.Inf |  | ||||||
|  |  | ||||||
| // This is a compile-time assertion to ensure that this generated file |  | ||||||
| // is compatible with the proto package it is being compiled against. |  | ||||||
| // A compilation error at this line likely means your copy of the |  | ||||||
| // proto package needs to be updated. |  | ||||||
| const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package |  | ||||||
|  |  | ||||||
| // Reference imports to suppress errors if they are not otherwise used. |  | ||||||
| var _ api.Endpoint |  | ||||||
| var _ context.Context |  | ||||||
| var _ client.Option |  | ||||||
| var _ server.Option |  | ||||||
|  |  | ||||||
| // Api Endpoints for Command service |  | ||||||
|  |  | ||||||
| func NewCommandEndpoints() []*api.Endpoint { |  | ||||||
| 	return []*api.Endpoint{} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Client API for Command service |  | ||||||
|  |  | ||||||
| type CommandService interface { |  | ||||||
| 	Help(ctx context.Context, in *HelpRequest, opts ...client.CallOption) (*HelpResponse, error) |  | ||||||
| 	Exec(ctx context.Context, in *ExecRequest, opts ...client.CallOption) (*ExecResponse, error) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type commandService struct { |  | ||||||
| 	c    client.Client |  | ||||||
| 	name string |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func NewCommandService(name string, c client.Client) CommandService { |  | ||||||
| 	return &commandService{ |  | ||||||
| 		c:    c, |  | ||||||
| 		name: name, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (c *commandService) Help(ctx context.Context, in *HelpRequest, opts ...client.CallOption) (*HelpResponse, error) { |  | ||||||
| 	req := c.c.NewRequest(c.name, "Command.Help", in) |  | ||||||
| 	out := new(HelpResponse) |  | ||||||
| 	err := c.c.Call(ctx, req, out, opts...) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return out, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (c *commandService) Exec(ctx context.Context, in *ExecRequest, opts ...client.CallOption) (*ExecResponse, error) { |  | ||||||
| 	req := c.c.NewRequest(c.name, "Command.Exec", in) |  | ||||||
| 	out := new(ExecResponse) |  | ||||||
| 	err := c.c.Call(ctx, req, out, opts...) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return out, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Server API for Command service |  | ||||||
|  |  | ||||||
| type CommandHandler interface { |  | ||||||
| 	Help(context.Context, *HelpRequest, *HelpResponse) error |  | ||||||
| 	Exec(context.Context, *ExecRequest, *ExecResponse) error |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func RegisterCommandHandler(s server.Server, hdlr CommandHandler, opts ...server.HandlerOption) error { |  | ||||||
| 	type command interface { |  | ||||||
| 		Help(ctx context.Context, in *HelpRequest, out *HelpResponse) error |  | ||||||
| 		Exec(ctx context.Context, in *ExecRequest, out *ExecResponse) error |  | ||||||
| 	} |  | ||||||
| 	type Command struct { |  | ||||||
| 		command |  | ||||||
| 	} |  | ||||||
| 	h := &commandHandler{hdlr} |  | ||||||
| 	return s.Handle(s.NewHandler(&Command{h}, opts...)) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type commandHandler struct { |  | ||||||
| 	CommandHandler |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (h *commandHandler) Help(ctx context.Context, in *HelpRequest, out *HelpResponse) error { |  | ||||||
| 	return h.CommandHandler.Help(ctx, in, out) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (h *commandHandler) Exec(ctx context.Context, in *ExecRequest, out *ExecResponse) error { |  | ||||||
| 	return h.CommandHandler.Exec(ctx, in, out) |  | ||||||
| } |  | ||||||
| @@ -1,25 +0,0 @@ | |||||||
| syntax = "proto3"; |  | ||||||
|  |  | ||||||
| package go.micro.bot; |  | ||||||
|  |  | ||||||
| service Command { |  | ||||||
| 	rpc Help(HelpRequest) returns (HelpResponse) {}; |  | ||||||
| 	rpc Exec(ExecRequest) returns (ExecResponse) {}; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| message HelpRequest { |  | ||||||
| } |  | ||||||
|  |  | ||||||
| message HelpResponse { |  | ||||||
| 	string usage = 1; |  | ||||||
| 	string description = 2; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| message ExecRequest { |  | ||||||
| 	repeated string args = 1; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| message ExecResponse { |  | ||||||
| 	bytes result = 1; |  | ||||||
| 	string error = 2; |  | ||||||
| } |  | ||||||
		Reference in New Issue
	
	Block a user