craft-bot/context.go
Timofey.Kovalev 7fdb46d208 first commit
2021-06-10 21:12:47 +03:00

121 lines
2.7 KiB
Go

package main
import (
"context"
"github.com/sirupsen/logrus"
"os"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
)
type contextKey uint8
const (
_ contextKey = iota
ctxKeyLogger
ctxKeyBotApi
ctxKeyConfig
ctxKeyCommandHandler
ctxKeyMessageCleaner
ctxKeyDataBase
ctxKeyPlayersBoard
)
func createLogger(debug bool) *logrus.Logger {
logLevel := logrus.InfoLevel
if debug {
logLevel = logrus.DebugLevel
}
return &logrus.Logger{
Out: os.Stderr,
Formatter: &logrus.TextFormatter{
FullTimestamp: true,
TimestampFormat: "02 Jan 06 15:04",
//PadLevelText: true,
QuoteEmptyFields: true,
},
Hooks: make(logrus.LevelHooks),
Level: logLevel,
ExitFunc: os.Exit,
ReportCaller: false,
}
}
func createContext(config *Config, bot *tgbotapi.BotAPI, mc *messageCleaner, ch *commandHandler, db *dbLayer, pb *playersBoard) (context.Context, func()) {
ctx, cancelFunc := context.WithCancel(context.Background())
ctx = context.WithValue(ctx, ctxKeyLogger, createLogger(true))
ctx = context.WithValue(ctx, ctxKeyBotApi, bot)
ctx = context.WithValue(ctx, ctxKeyConfig, config)
ctx = context.WithValue(ctx, ctxKeyMessageCleaner, mc)
ctx = context.WithValue(ctx, ctxKeyCommandHandler, ch)
ctx = context.WithValue(ctx, ctxKeyDataBase, db)
ctx = context.WithValue(ctx, ctxKeyPlayersBoard, pb)
return ctx, cancelFunc
}
func getLogger(ctx context.Context) *logrus.Logger {
v := ctx.Value(ctxKeyLogger)
if logger, ok := v.(*logrus.Logger); ok {
return logger
}
panic("Failed to get logger from ctx")
}
func getBotApi(ctx context.Context) *tgbotapi.BotAPI {
v := ctx.Value(ctxKeyBotApi)
if botApi, ok := v.(*tgbotapi.BotAPI); ok {
return botApi
}
panic("Failed to get bot api from ctx")
}
func getConfig(ctx context.Context) *Config {
v := ctx.Value(ctxKeyConfig)
if config, ok := v.(*Config); ok {
return config
}
panic("Failed to get config from ctx")
}
func getMessageCleaner(ctx context.Context) *messageCleaner {
v := ctx.Value(ctxKeyMessageCleaner)
if mc, ok := v.(*messageCleaner); ok {
return mc
}
panic("Failed to get message cleaner from ctx")
}
func getCommandHandler(ctx context.Context) *commandHandler {
v := ctx.Value(ctxKeyCommandHandler)
if ch, ok := v.(*commandHandler); ok {
return ch
}
panic("Failed to get command handler from ctx")
}
func getDB(ctx context.Context) *dbLayer {
v := ctx.Value(ctxKeyDataBase)
if db, ok := v.(*dbLayer); ok {
return db
}
panic("Failed to get db from ctx")
}
func getDPlayersBoard(ctx context.Context) *playersBoard {
v := ctx.Value(ctxKeyPlayersBoard)
if pb, ok := v.(*playersBoard); ok {
return pb
}
panic("Failed to get players board from ctx")
}