MCPcopy
hub / github.com/EverythingSuckz/TG-FileStreamBot / StartWorkers

Function StartWorkers

internal/bot/workers.go:95–146  ·  view source on GitHub ↗
(log *zap.Logger)

Source from the content-addressed store, hash-verified

93}
94
95func StartWorkers(log *zap.Logger) (*BotWorkers, error) {
96 Workers.Init(log)
97
98 if len(config.ValueOf.MultiTokens) == 0 {
99 Workers.log.Sugar().Info("No worker bot tokens provided, skipping worker initialization")
100 return Workers, nil
101 }
102 Workers.log.Sugar().Info("Starting")
103 if config.ValueOf.UseSessionFile {
104 Workers.log.Sugar().Info("Using session file for workers")
105 newpath := filepath.Join(".", "sessions")
106 if err := os.MkdirAll(newpath, os.ModePerm); err != nil {
107 Workers.log.Error("Failed to create sessions directory", zap.Error(err))
108 return nil, err
109 }
110 }
111
112 var wg sync.WaitGroup
113 var successfulStarts int32
114 totalBots := len(config.ValueOf.MultiTokens)
115
116 for i := 0; i < totalBots; i++ {
117 wg.Add(1)
118 go func(i int) {
119 defer wg.Done()
120
121 ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
122 defer cancel()
123
124 done := make(chan error, 1)
125 go func() {
126 err := Workers.Add(config.ValueOf.MultiTokens[i])
127 done <- err
128 }()
129
130 select {
131 case err := <-done:
132 if err != nil {
133 Workers.log.Error("Failed to start worker", zap.Int("index", i), zap.Error(err))
134 } else {
135 atomic.AddInt32(&successfulStarts, 1)
136 }
137 case <-ctx.Done():
138 Workers.log.Error("Timed out starting worker", zap.Int("index", i))
139 }
140 }(i)
141 }
142
143 wg.Wait() // Wait for all goroutines to finish
144 Workers.log.Sugar().Infof("Successfully started %d/%d bots", successfulStarts, totalBots)
145 return Workers, nil
146}
147
148func startWorker(l *zap.Logger, botToken string, index int) (*gotgproto.Client, error) {
149 log := l.Named("Worker").Sugar()

Callers 1

runAppFunction · 0.92

Calls 2

AddMethod · 0.80
InitMethod · 0.45

Tested by

no test coverage detected