HwidBot/main.go

121 lines
2.3 KiB
Go

package main
import (
"database/sql"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"github.com/BurntSushi/toml"
"github.com/bwmarrin/discordgo"
_ "github.com/lib/pq"
)
var (
config Config
client *discordgo.Session
db *sql.DB
)
type Config struct {
Discord Discord `toml:"discord"`
Database Database `toml:"database"`
}
type Discord struct {
Token string `toml:"client"`
GuildID string `toml:"guildid"`
}
type Database struct {
Host string `toml:"host"`
Port int `toml:"port"`
Name string `toml:"name"`
Username string `toml:"username"`
Password string `toml:"password"`
}
func loadConfig(filename string) (Config, error) {
var config Config
_, err := toml.DecodeFile(filename, &config)
return config, err
}
func connectDb(config Config) (*sql.DB, error) {
connectionString := fmt.Sprintf(
"host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
config.Database.Host,
config.Database.Port,
config.Database.Username,
config.Database.Password,
config.Database.Name,
)
log.Println(connectionString)
db, err := sql.Open("postgres", connectionString)
if err != nil {
return nil, fmt.Errorf("error connecting to the database: %v", err)
}
err = db.Ping()
if err != nil {
db.Close()
return nil, fmt.Errorf("error pinging the database: %v", err)
}
log.Println("Successfully connected to the database.")
return db, nil
}
func init() {
var err error
config, err = loadConfig("config.toml")
if err != nil {
log.Println("Error occurred whilst trying to load config:", err)
return
}
client, err = discordgo.New("Bot " + config.Discord.Token)
if err != nil {
log.Println("Error initializing bot:", err)
return
}
db, err = connectDb(config)
if err != nil {
log.Println("Error initializing db connection:", err)
return
}
}
func main() {
if client == nil {
log.Println("Bot client is not initialized")
return
}
client.AddHandler(func(client *discordgo.Session, r *discordgo.Ready) {
log.Println("Bot is online")
})
err := client.Open()
if err != nil {
log.Println("Error opening connection:", err)
return
}
stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
<-stop
log.Println("Gracefully shutting down.")
client.Close()
if db != nil {
db.Close()
}
}