5 Star 15 Fork 9

Gitee 极速下载/rboot

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
此仓库是为了提升国内下载速度的镜像仓库,每日同步一次。 原始仓库: https://github.com/ghaoo/rboot
克隆/下载
adapter.go 2.34 KB
一键复制 编辑 原始数据 按行查看 历史
G.H 提交于 2020-01-21 15:43 . fix
package rboot
import (
"bufio"
"errors"
"fmt"
"io"
"os"
"strings"
)
// Adapter 是管理聊天转接器进出消息的接口
type Adapter interface {
Incoming() chan *Message // 接收到的消息
Outgoing() chan *Message // 回复的消息
}
type adapterF func(*Robot) Adapter
var adapters = make(map[string]adapterF)
// RegisterAdapter 注册转接器,名称不可重复
// 转接器需实现 Adapter 接口
func RegisterAdapter(name string, adp adapterF) {
if name == "" {
panic("RegisterAdapter: adapter must have a name")
}
if _, ok := adapters[name]; ok {
panic("RegisterAdapter: adapter named " + name + " already registered. ")
}
adapters[name] = adp
}
// DetectAdapter 根据转接器名称获取转接器实例
func DetectAdapter(name string) (adapterF, error) {
if adp, ok := adapters[name]; ok {
return adp, nil
}
if len(adapters) == 0 {
return nil, errors.New("no adapter available")
}
if name == "" {
if len(adapters) == 1 {
for _, adp := range adapters {
return adp, nil
}
}
return nil, errors.New("multiple adapters available; must choose one")
}
return nil, errors.New("unknown adapter " + name)
}
var (
stdin io.Reader = os.Stdin
stdout io.Writer = os.Stdout
)
type cli struct {
in chan *Message
out chan *Message
writer *bufio.Writer
}
// New returns an initialized adapter
func newCli(bot *Robot) Adapter {
c := &cli{
in: make(chan *Message),
out: make(chan *Message),
writer: bufio.NewWriter(stdout),
}
go c.run()
return c
}
func (c *cli) Incoming() chan *Message {
return c.in
}
func (c *cli) Outgoing() chan *Message {
return c.out
}
// Run executes the adapter run loop
func (c *cli) run() {
name := os.Getenv(`ROBOT_ALIAS`)
if name == `` {
name = os.Getenv(`ROBOT_NAME`)
}
go func() {
scanner := bufio.NewScanner(stdin)
for scanner.Scan() {
msg := NewMessage(scanner.Text())
c.in <- msg
forLoop:
for {
select {
case msg := <-c.out:
c.writeString(msg.String())
default:
break forLoop
}
}
}
}()
go func() {
for msg := range c.out {
c.writeString(msg.String())
}
}()
}
func (c *cli) writeString(str string) error {
msg := fmt.Sprintf("%s\n", strings.TrimSpace(str))
if _, err := c.writer.WriteString(msg); err != nil {
return err
}
return c.writer.Flush()
}
func init() {
RegisterAdapter(`cli`, newCli)
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/mirrors/rboot.git
git@gitee.com:mirrors/rboot.git
mirrors
rboot
rboot
master

搜索帮助

D67c1975 1850385 1daf7b77 1850385