KickerBot/db/db.go

76 lines
1.6 KiB
Go

package db
import (
"context"
"errors"
"fmt"
"log"
"os"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type DB struct {
Initialized bool
Ctx context.Context
URI string
Database *mongo.Database
Client *mongo.Client
}
type EmptyStruct struct {
}
var database DB = DB{}
func Init(URI string) (DB, error) {
if (DB{}) != database {
return DB{}, errors.New("database already exists")
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
client, err := mongo.Connect(ctx, options.Client().ApplyURI(URI).SetAuth(options.Credential{Username: os.Getenv("DB_USER"), Password: os.Getenv("DB_PASSWORD")}))
if err != nil {
return DB{}, err
}
db := client.Database("godotkicker")
database = DB{
URI: URI,
Database: db,
Client: client,
}
Log("startup", nil)
return database, nil
}
func Log(event string, what interface{}) {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
t := time.Now()
content := fmt.Sprintf("%v", what)
log.Printf("%v :: EVENT: %s\n%v", t, event, what)
_, err := database.Database.Collection("logs").InsertOne(ctx, bson.D{
primitive.E{Key: "time", Value: t},
primitive.E{Key: "event", Value: event},
primitive.E{Key: "what", Value: content},
})
if err != nil {
log.Print(err)
}
}
func GetDatabase() DB {
return database
}
func (d *DB) Stop() {
if err := d.Client.Disconnect(d.Ctx); err != nil {
panic(err)
}
}