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  }