github.com/sharovik/devbot@v1.0.1-0.20240308094637-4a0387c40516/cmd/devbot/main.go (about) 1 package main 2 3 import ( 4 "time" 5 6 _time "github.com/sharovik/devbot/internal/service/time" 7 8 "github.com/sharovik/devbot/internal/service/schedule" 9 10 "github.com/sharovik/devbot/internal/service/definedevents" 11 12 "github.com/sharovik/devbot/internal/config" 13 14 "github.com/sharovik/devbot/internal/container" 15 "github.com/sharovik/devbot/internal/log" 16 "github.com/sharovik/devbot/internal/service/message" 17 ) 18 19 func init() { 20 cnt, err := container.Init() 21 if err != nil { 22 panic(err) 23 } 24 25 container.C = cnt 26 definedevents.InitializeDefinedEvents() 27 message.InitService() 28 schedule.InitS(container.C.Config, container.C.Dictionary.GetDBClient(), container.C.DefinedEvents) 29 } 30 31 const ( 32 maximumRetries = 4 33 delayBetweenRetries = time.Second * 600 //10 minutes 34 ) 35 36 var ( 37 numberOfRetries = 0 38 lastRetry = time.Now() 39 ) 40 41 func run() error { 42 if err := schedule.S.Run(); err != nil { 43 log.Logger().AddError(err).Msg("Failed to run schedule service") 44 45 return err 46 } 47 48 for { 49 if err := message.S.InitWebSocketReceiver(); err != nil { 50 log.Logger().AddError(err).Msg("Error received during application run") 51 52 if numberOfRetries >= maximumRetries { 53 return err 54 } 55 56 currentTime := _time.Service.Now() 57 58 //We set to 0 number of retries if there were no any retries since 30 minutes 59 elapsed := time.Duration(currentTime.Sub(lastRetry).Nanoseconds()) 60 if elapsed > delayBetweenRetries { 61 numberOfRetries = 0 62 } 63 64 numberOfRetries++ 65 lastRetry = _time.Service.Now() 66 67 log.Logger().AppendGlobalContext(map[string]interface{}{ 68 "number_retries": numberOfRetries, 69 "last_retry": lastRetry, 70 }) 71 72 log.Logger().Debug().Msg("Triggered retry") 73 if container.C.Config.GetAppEnv() != config.EnvironmentTesting { 74 time.Sleep(time.Duration(numberOfRetries) * time.Minute) 75 } 76 77 continue 78 } 79 } 80 } 81 82 func main() { 83 log.Logger().AppendGlobalContext(map[string]interface{}{ 84 "number_retries": numberOfRetries, 85 "maximum_retries": maximumRetries, 86 "started": lastRetry, 87 }) 88 89 log.Logger().StartMessage("DevBot") 90 if err := run(); err != nil { 91 log.Logger().AddError(err).Msg("Application was interrupted by an error") 92 } 93 94 container.C.Terminate() 95 log.Logger().FinishMessage("DevBot") 96 }