1. Slack 机器人

2. micro bot

micro bot 是一个机器人, 位于您的微服务环境中, 您可以通过 Slack, HipChat, XMPP 等进行交互. 它通过消息模拟 CLI 的功能.

2.1. 输入支持

  • Discord
  • Slack
  • Telegram

2.2. 入门

2.2.1. 使用 Slack

运行并使用 slack 输入参数

micro bot --inputs=slack --slack_token=SLACK_TOKEN

2.2.2. 多个输入

通过指定逗号分隔列表使用多个输入

micro bot --inputs=discord,slack --slack_token=SLACK_TOKEN --discord_token=DISCORD_TOKEN

2.2.3. 帮助

在 slack 中

micro help

deregister service [definition] - Deregisters a service
echo [text] - Returns the [text]
get service [name] - Returns a registered service
health [service] - Returns health of a service
hello - Returns a greeting
list services - Returns a list of registered services
ping - Returns pong
query [service] [method] [request] - Returns the response for a service query
register service [definition] - Registers a service
the three laws - Returns the three laws of robotics
time - Returns the server time

2.3. 添加新命令

命令是自动程序基于基于文本的模式匹配执行的函数.

2.3.1. 编写命令

import "github.com/micro/go-micro/v2/agent/command"

func Ping() command.Command {
    usage := "ping"
    description := "Returns pong"

    return command.NewCommand("ping", usage, desc, func(args ...string) ([]byte, error) {
        return []byte("pong"), nil
    })
}

2.3.2. 注册命令

可使用由 golang/regexp.Match 匹配的模式键将命令添加到 Commands 集合 .

import "github.com/micro/go-micro/v2/agent/command"

func init() {
    command.Commands["^ping$"] = Ping()
}

2.3.3. 重新构建 micro

生成二进制

cd github.com/micro/micro

// For local use
go build -i -o micro ./main.go

// For docker image
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-w' -i -o micro ./main.go

2.4. 添加新输入

输入是用于通信的插件, 例如 Slack, HipChat, XMPP, IRC, SMTP 等等.

可用以下方式添加新输入.

2.4.1. 编写输入

编写实现了输入接口的输入.

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
}

2.4.2. 注册输入

将输入添加到 Inputs 集合.

import "github.com/micro/go-micro/v2/agent/input"

func init() {
    input.Inputs["name"] = MyInput
}

2.4.3. 重新构建 Micro

生成二进制可执行文件

cd github.com/micro/micro

// For local use
go build -i -o micro ./main.go

// For docker image
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-w' -i -o micro ./main.go

2.5. 命令即服务

micro bot 支持将命令创建为微服务的能力.

2.5.1. 它是如何工作的?

机器人监视服务注册表的服务与它的命名空间. 默认命名空间为 go.micro.bot. 此命名空间中的任何服务将自动添加到可用命令列表中. 当执行命令时, 自动程序将使用 Command.Exec 方法调用服务. 它还希望该 Command.Help 方法存在使用情况信息.

服务接口如下所示, 可在这里找到 go-bot/proto

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;
}

2.5.2. 示例

这是一个命令即服务的示例

package main

import (
    "fmt"
    "strings"

    "github.com/micro/go-micro/v2"
    "golang.org/x/net/context"

    proto "github.com/micro/go-micro/v2/agent/proto"
)

type Command struct{}

// Help returns the command usage
func (c *Command) Help(ctx context.Context, req *proto.HelpRequest, rsp *proto.HelpResponse) error {
    // Usage should include the name of the command
    rsp.Usage = "echo"
    rsp.Description = "This is an example bot command as a micro service which echos the message"
    return nil
}

// Exec executes the command
func (c *Command) Exec(ctx context.Context, req *proto.ExecRequest, rsp *proto.ExecResponse) error {
    rsp.Result = []byte(strings.Join(req.Args, " "))
    // rsp.Error could be set to return an error instead
    // the function error would only be used for service level issues
    return nil
}

func main() {
    service := micro.NewService(
        micro.Name("go.micro.bot.echo"),
    )

    service.Init()

    proto.RegisterCommandHandler(service.Server(), new(Command))

    if err := service.Run(); err != nil {
        fmt.Println(err)
    }
}

results matching ""

    No results matching ""