@@ -12,6 +12,8 @@ import (
1212 "net/http"
1313 "net/url"
1414 "strings"
15+ "sync"
16+ "sync/atomic"
1517 "time"
1618)
1719
@@ -54,10 +56,12 @@ type CallEndedEvent struct {
5456}
5557
5658type Bot struct {
57- cfg Config
58- client * http.Client
59- variants []EchoVariant
60- bgPackets []OpusPacket
59+ cfg Config
60+ client * http.Client
61+ variants []EchoVariant
62+ bgPackets []OpusPacket
63+ activeCalls sync.Map // callID → context.CancelFunc
64+ callCount atomic.Int64 // number of active call handlers
6165}
6266
6367func NewBot (cfg Config ) * Bot {
@@ -227,14 +231,24 @@ func (b *Bot) handleEvent(ctx context.Context, eventType, data string) {
227231 return
228232 }
229233 slog .Info ("incoming call" , "callId" , ev .CallID , "from" , ev .FromUserID )
230- go b .handleCall (ctx , ev )
234+
235+ callCtx , callCancel := context .WithCancel (ctx )
236+ b .activeCalls .Store (ev .CallID , callCancel )
237+ go func () {
238+ defer callCancel ()
239+ defer b .activeCalls .Delete (ev .CallID )
240+ b .handleCall (callCtx , ev )
241+ }()
231242
232243 case "callEnded" :
233244 var ev CallEndedEvent
234245 if err := json .Unmarshal ([]byte (data ), & ev ); err != nil {
235246 slog .Error ("failed to parse callEnded" , "error" , err )
236247 return
237248 }
249+ if cancel , ok := b .activeCalls .LoadAndDelete (ev .CallID ); ok {
250+ cancel .(context.CancelFunc )()
251+ }
238252 slog .Info ("call ended" , "callId" , ev .CallID )
239253
240254 default :
@@ -243,7 +257,16 @@ func (b *Bot) handleEvent(ctx context.Context, eventType, data string) {
243257}
244258
245259func (b * Bot ) handleCall (ctx context.Context , ev CallIncomingEvent ) {
246- callLog := slog .With ("callId" , ev .CallID , "from" , ev .FromUserID )
260+ n := b .callCount .Add (1 )
261+ defer b .callCount .Add (- 1 )
262+
263+ defer func () {
264+ if r := recover (); r != nil {
265+ slog .Error ("panic in handleCall" , "callId" , ev .CallID , "panic" , r )
266+ }
267+ }()
268+
269+ callLog := slog .With ("callId" , ev .CallID , "from" , ev .FromUserID , "activeCalls" , n )
247270
248271 v := b .variants [rand .Intn (len (b .variants ))]
249272 callLog .Info ("selected variant" , "variant" , v .Name )
0 commit comments