78 lines
1.2 KiB
Go
78 lines
1.2 KiB
Go
package graw
|
|
|
|
import (
|
|
"log"
|
|
|
|
"github.com/turnage/graw/botfaces"
|
|
"github.com/turnage/graw/reddit"
|
|
)
|
|
|
|
func launch(
|
|
handler interface{},
|
|
kill chan bool,
|
|
errs <-chan error,
|
|
logger *log.Logger,
|
|
) (
|
|
func(),
|
|
func() error,
|
|
error,
|
|
) {
|
|
if setup, ok := handler.(botfaces.Loader); ok {
|
|
if err := setup.SetUp(); err != nil {
|
|
return nil, nil, err
|
|
}
|
|
}
|
|
|
|
tear := func() {
|
|
if tear, ok := handler.(botfaces.Tearer); ok {
|
|
tear.TearDown()
|
|
}
|
|
}
|
|
|
|
foremanKiller := make(chan bool)
|
|
foremanError := make(chan error)
|
|
|
|
go func() {
|
|
foremanError <- foreman(foremanKiller, kill, errs, logger)
|
|
}()
|
|
|
|
stop := func() {
|
|
defer tear()
|
|
close(foremanKiller)
|
|
}
|
|
|
|
wait := func() error {
|
|
defer tear()
|
|
return <-foremanError
|
|
}
|
|
|
|
return stop, wait, nil
|
|
}
|
|
|
|
func foreman(
|
|
kill <-chan bool,
|
|
killChildren chan<- bool,
|
|
errs <-chan error,
|
|
logger *log.Logger,
|
|
) error {
|
|
defer close(killChildren)
|
|
for {
|
|
select {
|
|
case <-kill:
|
|
return nil
|
|
case err := <-errs:
|
|
switch err {
|
|
case nil:
|
|
case reddit.BusyErr:
|
|
logger.Printf("Reddit was busy; staying up.")
|
|
case reddit.GatewayErr:
|
|
logger.Printf("Bad gateway error; staying up.")
|
|
case reddit.GatewayTimeoutErr:
|
|
logger.Printf("Gateway timeout; staying up.")
|
|
default:
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
}
|