rboot

package module
v1.3.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 7, 2021 License: MIT Imports: 30 Imported by: 2

README

Rboot

Build Status Go Report Card GitHub go.mod Go version GoDoc

rboot 是一个使用 golang 写的,简单、高效的聊天机器人框架,易于扩展,它可以工作在不同的聊天服务上,并通过扩展脚本可实现 聊天工作助手服务监控警报触发 等功能。

golang版本需求

golang v1.13+

快速创建自己的机器人

$ go get github.com/ghaoo/rboot
$ cd $GOPATH/github.com/ghaoo/rboot/robot
$ go build
$ ./robot

关于消息转接器

消息转接器是用来监听消息的传入和传出,通过消息转接器可以将聊天客户端的消息发送到机器人,经过脚本处理后返回消息发送给客户端。

rboot 提供了 命令行cli 微信网页版 企业微信 钉钉 倍洽 聊天转接器的简单实现。

关于插件

Plugin 并没有提供太多开箱即用的插件,除了一个help插件,其他的需要开发者根据自己的需求去开发。

help插件用法

!help <plugin>:查看插件帮助信息,当命令不带插件名称时会列出所有插件帮助信息,带插件名称只列出此插件的帮助信息。

使用golang编写插件

在文件夹 robot/plugins 下有简单的插件案例,开发者可查看插件编写方法。

使用其他语言编写插件

Plugin 不仅可以使用golang编写插件,也可以使用脚本插件来执行系统命令或使用脚本语言编写的插件文件。

脚本插件是用来解析脚本语言的Plugin插件,它是rboot插件的一个扩展。通过yaml配置文件来执行系统命令或脚本。

因为脚本插件是建立在Plugin基础之上的,每个脚本都会被注册到Plugin之中,所以确保插件之间名称不要重叠,否则可能先注册的插件会被后注册的插件替换!

如何编写脚本插件
配置
  • PLUGIN_DIR:脚本插件配置文件存放的文件夹,若不配置默认为scripts
快速开始

我们可以通过创建一个yaml文件来创建一个脚本插件,通过文件中的配置选项来实现对脚本插件的配置。比如我们创建一个 hello.yml 文件,它的内容如下:

name: hello
version: 0.1.0
ruleset:
    hello: "^hello"
usage:
    hi: echo hello world and 你好
description: 脚本插件示例
command:
    -
        cmd:
            - echo hi
            - echo hello world
    -
        dir: plugins
        cmd:
            - echo 你好

这个插件使用的是系统命令 echo。它的意思是:当我们输入“hello”后,脚本会返回 hihello world你好 三条信息。

配置中各个字段的含义:

配置 必须 意义
name 插件名称
ruleset 规则集合
version 插件版本
usage 插件用法
description 插件简介
command 插件命令集
--- --- ---
dir 命令执行文件夹
cmd 插件命令

command可配置多个命令集,执行顺序为从上到下依次执行

cmd可配置多条命令,执行顺序为从上到下依次执行

脚本插件支持系统命令脚本语言。系统命令模式如上面的hello.yml,只需在文件中填写文件夹和系统命令,当你发出命令后,机器人就会从上到下依次执行。

脚本语言是建立在系统命令模式之上的执行方式,我们可以使用系统命令调用语言脚本,从而执行比较复杂的脚本。比如我们使用python输出“hello robot”。

我们的python脚本如下:

#!/usr/bin/env python

print("Hello, robot! i am a python script")

我们的配置文件如下:

name: pyscript
version: 0.1.0
ruleset:
    py: "^hello python"
usage:
    py: execute python script
description: python插件示例
command:
        dir: script
        cmd:
            - ./hello.py

当我们输入 hello python 时,机器人会调用 hello.py 脚本,脚本输出"Hello, robot! i am a python script"并通过机器人展示给我们。

在不同操作系统下请确认 目录分隔符 是否符合当前系统设置。 windows 下请使用 \ unix 下请使用 /

文档

Rboot

GoDoc

版权

本项目采用 MIT 开源授权许可证,完整的授权说明可在 LICENSE 文件中找到。

Documentation

Index

Constants

View Source
const (
	HOOK_BEFORE_INCOMING int = iota + 1
	HOOK_AFTER_OUTGOING
)
View Source
const DefaultBoltDBFile = `db/rboot.db`

Variables

View Source
var JobQueue chan Job

JobQueue Job 通道

Functions

func DetectAdapter

func DetectAdapter(name string) (adapterF, error)

DetectAdapter 根据转接器名称获取转接器实例

func DetectBrain

func DetectBrain(name string) (func() Brain, error)

DetectBrain 获取名称为 name 的缓存器

func GetMsgChannel added in v1.3.0

func GetMsgChannel(from, to string) string

GetMsgChannel 获取消息通道

func LoadEnv added in v1.1.2

func LoadEnv(filenames ...string) (err error)

LoadEnv 加载env配置

func NewTicker added in v1.2.8

func NewTicker(d time.Duration, name string, f func()) *ticker

NewTicker 新建一个续断器实体

func NewTimer added in v1.2.8

func NewTimer(d time.Duration, name string, f func()) *timer

NewTimer 新建一个定时器

func RegisterAdapter

func RegisterAdapter(name string, adp adapterF)

RegisterAdapter 注册转接器,名称不可重复 转接器需实现 Adapter 接口

func RegisterBrain

func RegisterBrain(name string, m func() Brain)

RegisterBrain 注册存储器,名称须唯一 需实现Brain接口

func RegisterPlugin added in v1.2.1

func RegisterPlugin(name string, plugin Plugin)

RegisterPlugin 注册插件

func StrToDuration added in v1.2.8

func StrToDuration(t int, arc string) (time.Duration, error)

StrToDuration 将小时、分、秒转换为time.Duration

Types

type Adapter

type Adapter interface {
	Incoming() chan *Message // 接收到的消息
	Outgoing() chan *Message // 回复的消息
}

Adapter 是管理聊天转接器进出消息的接口

type Brain

type Brain interface {
	Set(bucket, key string, value []byte) error
	Get(bucket, key string) ([]byte, error)
	Remove(bucket, key string) error
	Close() error
}

Brain 是Rboot缓存器实现的接口

func Bolt added in v1.2.1

func Bolt() Brain

Bolt new bolt brain ...

type Dispatcher added in v1.2.2

type Dispatcher struct {
	// 工作池容量
	MaxWorkers int
	// 向调度程序注册的工作程序通道池
	WorkerPool chan chan Job
	Quit       chan bool
}

Dispatcher 调度器

func NewDispatcher added in v1.2.2

func NewDispatcher(maxWorkers int) *Dispatcher

NewDispatcher 新建一个调度器

func (*Dispatcher) Dispatch added in v1.2.2

func (d *Dispatcher) Dispatch()

Dispatch 分配任务

func (*Dispatcher) Run added in v1.2.2

func (d *Dispatcher) Run()

Run 运行调度器

func (*Dispatcher) Stop added in v1.2.2

func (d *Dispatcher) Stop()

Stop 调度器停止

type Header map[string][]string

Header 消息附带的头信息,键-值对

func (Header) Add added in v1.1.2

func (h Header) Add(key, value string)

Add 将键、值对添加到Header,附加到与键关联的现有值

func (Header) Del added in v1.1.2

func (h Header) Del(key string)

Del 删除与键关联的值

func (Header) Get added in v1.1.2

func (h Header) Get(key string) string

Get 从头信息中获取与给定键关联的第一个值

func (Header) GetKey added in v1.1.2

func (h Header) GetKey(key string) []string

GetKey 从头信息中获取与给定键关联的多个值

func (Header) Set added in v1.1.2

func (h Header) Set(key, value string)

Set 将key设置为单个值,它替换与key的现有值

type Hook added in v1.2.1

type Hook interface {
	Types() []int
	Fire(*Message) error
}

Hook interface

type Hooks added in v1.3.0

type Hooks map[int][]Hook

func (Hooks) Add added in v1.3.0

func (hooks Hooks) Add(hook Hook)

Add 新增钩子

func (Hooks) Fire added in v1.3.0

func (hooks Hooks) Fire(typ int, bot *Robot, msg *Message) error

Fire 执行

type Job added in v1.2.2

type Job interface {
	Do()
}

Job 表示要运行的Job的接口

type Message

type Message struct {
	Channel    string    `json:"channel"` // 自定义通道
	To         string    `json:"to"`      // 消息接收者
	From       string    `json:"from"`    // 消息来源
	Sender     string    `json:"sender"`  // 发送者
	Header     Header    `json:"header"`  // 头信息
	Content    string    `json:"content"` // 消息文本内容
	Time       time.Time `json:"time"`    // 消息发送时间
	KeepHeader bool      `json:"-"`       // 如果为true则传入消息的Header在一次会话结束之前不会清除
}

Message 表示一个消息的结构

func NewMessage added in v1.1.2

func NewMessage(content string, to ...string) *Message

NewMessage 新建一条消息,支持多个接收人

func NewMessages added in v1.1.2

func NewMessages(content string, to ...string) []*Message

NewMessages 新建一组消息

func (*Message) Cc added in v1.1.2

func (m *Message) Cc() []string

Cc 返回消息抄送信息

func (*Message) SetCc added in v1.1.2

func (m *Message) SetCc(to ...string)

SetCc 为消息设置抄送

func (*Message) String added in v1.1.2

func (m *Message) String() string

String 读取消息内容为 string

type Plugin added in v1.2.1

type Plugin struct {
	Action      PluginFunc        // 执行解析或一些必要加载
	Ruleset     map[string]string // 脚本规则集合
	Usage       map[string]string // 帮助信息
	Description string            // 简介
}

Plugin 脚本结构体

type PluginFunc added in v1.2.1

type PluginFunc func(bot *Robot, incoming *Message) []*Message

PluginFunc SetupFunc 脚本执行或解析函数 - bot: A Robot instance - incoming: The incoming message

func DirectivePlugin added in v1.2.1

func DirectivePlugin(name string) (PluginFunc, error)

DirectivePlugin 根据脚本名称获取插件执行函数

type Regex

type Regex struct{}

Regex 正则消息处理器

func (*Regex) Match

func (reg *Regex) Match(pattern, msg string) ([]string, bool)

Match 当匹配失败时返回 false,返回true证明匹配成功并返回消息的匹配文本和子表达式的匹配

type Robot

type Robot struct {
	// 路由,支持脚本自定义添加新路由
	Router *Router
	// 缓存
	Brain Brain
	// 钩子
	Hooks Hooks
	// 缓存文件夹
	CachePath string
	// 调试信息
	Debug bool
	// contains filtered or unexported fields
}

Robot 是 rboot 的一个实例,它包含了聊天转接器,规则处理器,缓存器,路由适配器和消息的进出通道

func New

func New() *Robot

New 获取一个Robot实例,

func (*Robot) AddHook added in v1.3.0

func (bot *Robot) AddHook(hook Hook)

AddHook 新增钩子

func (*Robot) Find added in v1.1.2

func (bot *Robot) Find(bucket, key string) ([]byte, error)

Find 从储存器中获取指定的bucket和key对应的信息

func (*Robot) Go

func (bot *Robot) Go()

Go 皮皮虾,我们走~~~~~~~~~

func (*Robot) Incoming added in v1.1.2

func (bot *Robot) Incoming() chan *Message

Incoming 获取传入消息通道

func (*Robot) Outgoing added in v1.1.2

func (bot *Robot) Outgoing(msg *Message)

Outgoing 发送消息

func (*Robot) Remove added in v1.1.2

func (bot *Robot) Remove(bucket, key string) error

Remove 从储存器中移除指定的bucket和key对应的信息

func (*Robot) SendText

func (bot *Robot) SendText(text string, to string)

SendText 发送文本消息

func (*Robot) SetBrain

func (bot *Robot) SetBrain(brain Brain)

SetBrain 设置储存器

func (*Robot) Stop

func (bot *Robot) Stop()

Stop 皮皮虾,快停下~~~~~~~~~

func (*Robot) Store added in v1.1.2

func (bot *Robot) Store(bucket, key string, value []byte) error

Store 向储存器中存入信息

func (*Robot) VerifySign added in v1.1.3

func (bot *Robot) VerifySign(sign, secret, content, datetime string) error

VerifySign 验证签名

type Router added in v1.1.2

type Router struct {
	// contains filtered or unexported fields
}

Router 包含了路由处理器 mux 和已经注册的所有路由集合,支持中间件

func (*Router) Handle added in v1.1.2

func (r *Router) Handle(path string, handler http.Handler) *route

Handle 为路径 path 注册一个新路由

func (*Router) HandleFunc added in v1.1.2

func (r *Router) HandleFunc(path string, f func(http.ResponseWriter, *http.Request)) *route

HandleFunc 为路径 path 注册一个新的路由处理函数

func (*Router) Use added in v1.1.2

func (r *Router) Use(mwf ...func(http.Handler) http.Handler)

Use 注册中间件,和 *mux.Router.Use 用法相同

type Rule

type Rule interface {
	Match(pattern, msg string) ([]string, bool)
}

Rule 消息处理器接口,暂时只支持正则

type Worker added in v1.2.2

type Worker struct {
	// WorkerPool 是个指向全局唯一的 chan 的引用,
	// 负责传递 Worker 接收 Job 的 chan。
	// Worker 空闲时,将自己的 JobChannel 放入 WorkerPool 中。
	// Dispatcher 收到新的 Job 时,从 JobChannel 中取出一个 chan, 并将 Job
	// 放入其中,此时 Worker 将从 Chan 中接收到 Job,并进行处理
	WorkerPool chan chan Job
	// Worker 用于接收 Job 的 chan
	JobChannel chan Job
	// 用于给 Worker 发送控制命令的 chan,用于停止 chan
	Quit chan bool
}

Worker 表示执行该Job的worker

func NewWorker added in v1.2.2

func NewWorker(workPool chan chan Job) Worker

func (Worker) Start added in v1.2.2

func (w Worker) Start()

Start 为worker启动运行循环,侦听退出通道

func (Worker) Stop added in v1.2.2

func (w Worker) Stop()

Directories

Path Synopsis
brain

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL