Skip to content

Commit

Permalink
feat(core): initial bot implementation (#28)
Browse files Browse the repository at this point in the history
  • Loading branch information
moul committed Aug 3, 2018
1 parent 9e884b8 commit bd95b72
Show file tree
Hide file tree
Showing 7 changed files with 186 additions and 0 deletions.
Empty file removed client/go/bot/.gitkeep
Empty file.
58 changes: 58 additions & 0 deletions client/go/bot/bot.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package bot

import (
"context"
"io"

"github.com/berty/berty/core/api/node"
"github.com/berty/berty/core/client"
)

type Bot struct {
client *client.Client
handlers []Handler
}

func New(opts ...Option) (*Bot, error) {
bot := Bot{
handlers: make([]Handler, 0),
}

for _, opt := range opts {
if err := opt(&bot); err != nil {
return nil, err
}
}

if bot.client == nil {
return nil, ErrNoClient
}

return &bot, nil
}

func (b *Bot) Run() error {
ctx := context.Background()
stream, err := b.client.Node().EventStream(ctx, &node.Void{})
if err != nil {
return err
}
for {
event, err := stream.Recv()
if err == io.EOF {
break
}
if err != nil {
return err
}
botEvent := &Event{
*event,
}
for _, handler := range b.handlers {
if err := handler.Handle(b, botEvent); err != nil {
return err
}
}
}
return nil
}
7 changes: 7 additions & 0 deletions client/go/bot/errors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package bot

import "errors"

var (
ErrNoClient = errors.New("bot has no client configured")
)
7 changes: 7 additions & 0 deletions client/go/bot/event.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package bot

import "github.com/berty/berty/core/api/p2p"

type Event struct {
p2p.Event
}
34 changes: 34 additions & 0 deletions client/go/bot/examples/berty-bot-example/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package main

import (
"fmt"
"log"

"github.com/berty/berty/client/go/bot"
)

func main() {
b, err := bot.New(bot.WithDefaultDaemon())
if err != nil {
panic(err)
}

b.AddHandlerFunc(func(b *bot.Bot, e *bot.Event) error {
fmt.Println("a", e)
return nil
})
b.AddHandler(bot.Trigger{
If: func(b *bot.Bot, e *bot.Event) bool {
return true
},
Then: func(b *bot.Bot, e *bot.Event) error {
fmt.Println("b", e)
return nil
},
})

log.Println("starting bot...")
if err := b.Run(); err != nil {
log.Fatal(err)
}
}
47 changes: 47 additions & 0 deletions client/go/bot/handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package bot

//
// Handler
//

type Handler interface {
Handle(*Bot, *Event) error
}

func (b *Bot) AddHandler(h Handler) {
b.handlers = append(b.handlers, h)
}

//
// HandlerFunc
//

type HandlerFunc func(*Bot, *Event) error

type handlerFuncHandler struct {
f HandlerFunc
}

func (h handlerFuncHandler) Handle(bot *Bot, event *Event) error {
return h.f(bot, event)
}

func (b *Bot) AddHandlerFunc(f HandlerFunc) {
b.handlers = append(b.handlers, handlerFuncHandler{f: f})
}

//
// Trigger
//

type Trigger struct {
If func(*Bot, *Event) bool
Then HandlerFunc
}

func (t Trigger) Handle(bot *Bot, event *Event) error {
if t.If(bot, event) {
return t.Then(bot, event)
}
return nil
}
33 changes: 33 additions & 0 deletions client/go/bot/option.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package bot

import (
grpc "google.golang.org/grpc"

"github.com/berty/berty/core/client"
)

type Option func(b *Bot) error

func WithDefaultDaemon() Option {
return func(b *Bot) error {
conn, err := grpc.Dial("127.0.0.1:1337", grpc.WithInsecure())
if err != nil {
return err
}
return WithGRPCConn(conn)(b)
}
}

func WithGRPCConn(conn *grpc.ClientConn) Option {
return func(b *Bot) error {
b.client = client.New(conn)
return nil
}
}

func WithClient(client *client.Client) Option {
return func(b *Bot) error {
b.client = client
return nil
}
}

0 comments on commit bd95b72

Please sign in to comment.