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") }