Georg Pfuetzenreuter
b7f2ad6dcd
This adds integration between Watbot and the Limnoria Jeopardy plugin. If a game of Jeopardy ends, Watbot will parse the finishers message and pay a small share of the Jeopardy price money in the form of Watcoins. To avoid abuse, only Jeopardy finishing messages from authorized bots are considered. An IRC user is considered an authorized bot if the hostmask matches one of the configured bot hostmasks, and if the nickname is configured for "jeopardy" in the newly introduced bot games configuration. Signed-off-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
120 lines
2.7 KiB
Go
120 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
|
|
"flag"
|
|
"github.com/go-irc/irc"
|
|
|
|
"git.circuitco.de/self/watbot/wat"
|
|
"github.com/creasty/defaults"
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
type Config struct {
|
|
Watbot watConfig `yaml:"watbot"`
|
|
}
|
|
|
|
type watConfig struct {
|
|
Nick string `yaml:"nick"`
|
|
Pass string `yaml:"pass"`
|
|
User string `yaml:"user"`
|
|
Name string `yaml:"name"`
|
|
Bots struct {
|
|
Hosts []string `yaml:"hosts"`
|
|
Games wat.BotGameConfig `yaml:"games"`
|
|
} `yaml:"bots"`
|
|
Admins struct {
|
|
Hosts []string `yaml:"hosts"`
|
|
} `yaml:"admins"`
|
|
Channels struct {
|
|
Join []string `yaml:"join"`
|
|
Permitted []string `yaml:"permitted"`
|
|
} `yaml:"channels"`
|
|
Ignores struct {
|
|
Hosts []string `yaml:"hosts"`
|
|
} `yaml:"ignores"`
|
|
Server struct {
|
|
Host string `yaml:"host"`
|
|
Port int `default:"6697" yaml:"port"`
|
|
TlsVerify bool `default:"true" yaml:"tls_verify"`
|
|
} `yaml:"server"`
|
|
}
|
|
|
|
func readConfig(configPath string) (*watConfig, error) {
|
|
allConfig := Config{}
|
|
|
|
buffer, err := os.ReadFile(configPath)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Could not read configuration file: %s", err)
|
|
}
|
|
|
|
err = yaml.Unmarshal(buffer, &allConfig)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Could not parse configuration file: %s", err)
|
|
}
|
|
|
|
config := &allConfig.Watbot
|
|
defaults.Set(config)
|
|
|
|
if config.Server.Host == "" {
|
|
return nil, errors.New("Shall I play wattery to know where to connect to?")
|
|
}
|
|
|
|
if config.Name != "" && config.Nick == "" {
|
|
config.Nick = config.Name
|
|
}
|
|
|
|
if config.Nick != "" && config.User == "" {
|
|
config.User = config.Nick
|
|
}
|
|
|
|
if config.Name == "" || config.Nick == "" || config.User == "" {
|
|
return nil, errors.New("Don't know who I am.")
|
|
}
|
|
|
|
return config, nil
|
|
}
|
|
|
|
func main() {
|
|
var configPathArg string
|
|
flag.StringVar(&configPathArg, "config", "config.yaml", "Path to configuration file")
|
|
flag.Parse()
|
|
log.Println("Starting with configuration:", configPathArg)
|
|
|
|
config, err := readConfig(configPathArg)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
ircConfig := irc.ClientConfig{
|
|
Nick: config.Nick,
|
|
Pass: config.Pass,
|
|
User: config.User,
|
|
Name: config.Name,
|
|
}
|
|
watConfig := wat.WatConfig{
|
|
AutoJoinChannels: config.Channels.Join,
|
|
PermittedChannels: config.Channels.Permitted,
|
|
IgnoredHosts: config.Ignores.Hosts,
|
|
AdminHosts: config.Admins.Hosts,
|
|
BotHosts: config.Bots.Hosts,
|
|
BotGames: config.Bots.Games,
|
|
}
|
|
tcpConf := &tls.Config{
|
|
InsecureSkipVerify: !config.Server.TlsVerify,
|
|
}
|
|
conn, err := tls.Dial("tcp", fmt.Sprintf("%s:%d", config.Server.Host, config.Server.Port), tcpConf)
|
|
if err != nil {
|
|
fmt.Println("err " + err.Error())
|
|
return
|
|
}
|
|
wwat := wat.NewWatBot(&ircConfig, &watConfig, conn)
|
|
wwat.Run()
|
|
}
|