BareRTC/cmd/BareBot/commands/init.go

112 lines
2.8 KiB
Go

package commands
import (
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
"git.kirsle.net/apps/barertc/client"
"git.kirsle.net/apps/barertc/client/config"
"git.kirsle.net/apps/barertc/pkg/log"
"github.com/urfave/cli/v2"
)
// Init implements `BareBot init`
var Init *cli.Command
// Default folder structure
var defaultFolders = []string{
"brain",
"logs",
"userdata",
}
func init() {
Init = &cli.Command{
Name: "init",
Usage: "initialize a new BareBot robot at the given directory",
ArgsUsage: "<chatbot directory>",
Flags: []cli.Flag{},
Action: func(c *cli.Context) error {
if c.NArg() < 1 {
return cli.Exit("Usage: BareBot init <directory>\n"+
" Example: BareBot init ./chatbot\n"+
" Example: BareBot init .",
1,
)
}
// If they named an existing directory, ensure it is empty.
var botdir = c.Args().First()
stat, err := os.Stat(botdir)
if os.IsNotExist(err) {
log.Info("Creating chatbot directory: %s", botdir)
if err := os.MkdirAll(botdir, 0755); err != nil {
log.Error("Error creating chatbot directory: %s: %s", botdir, err)
return cli.Exit(err, 1)
}
} else if stat.IsDir() {
// They named an existing directory: is it empty?
fh, err := os.Open(botdir)
if err != nil {
log.Error("Checking if %s is empty: couldn't open: %s", botdir, err)
return cli.Exit("Exited", 1)
}
defer fh.Close()
_, err = fh.Readdirnames(1)
if err != io.EOF {
return cli.Exit(fmt.Sprintf(
"%s: not an empty directory, will not initialize the chatbot into it", botdir),
1,
)
}
}
// Enter the directory.
if err := os.Chdir(botdir); err != nil {
log.Error("Couldn't enter directory %s: %s", botdir, err)
return cli.Exit("Exited", 1)
}
// Initialize the folders.
for _, folder := range defaultFolders {
log.Info("Creating: %s", folder)
if err := os.MkdirAll(folder, 0755); err != nil {
return cli.Exit(fmt.Sprintf(
"Couldn't create %s: %s", folder, err,
), 1)
}
}
// Extract the default RiveScript brain.
if files, err := client.Embedded.ReadDir("brain"); err == nil {
for _, file := range files {
log.Info("Extracting: brain/%s", file.Name())
var (
filename = filepath.Join("brain", file.Name())
)
data, err := client.Embedded.ReadFile(filename)
if err != nil {
log.Error("Reading built-in brain file %s: %s", filename, err)
continue
}
ioutil.WriteFile(filename, data, 0644)
}
} else {
log.Error("Couldn't read default brain: %s", err)
}
// Initialize the settings file.
if err := config.WriteSettings(); err != nil {
log.Error("Writing chatbot.toml: %s", err)
return cli.Exit("Exited", 1)
}
return nil
},
}
}