コード例 #1
0
ファイル: ArkeCallFlowService.cs プロジェクト: zawhtut/arke
        private async void AriClientOnStasisStartEvent(IAriClient sender, StasisStartEvent e)
        {
            ICall line;

            if (e.Args.Contains("dialed") || e.Args.Contains("SnoopChannel"))
            {
                return;
            }
            _logger.Info("Line Offhook", new
            {
                ChannelId      = e.Channel.Id,
                CallerIdName   = e.Channel.Caller.Number,
                CallerIdNumber = e.Channel.Caller.Name
            });
            line = ArkeCallFactory.CreateArkeCall(e.Channel);
            ConnectedLines.Add(e.Channel.Id, line);
            _logger.Info("Starting Call Script", new
            {
                ChannelId = e.Channel.Id
            });

            // call answered and started
            await line.RunCallScript();

            _logger.Info("Call Script Complete", new { ChannelId = e.Channel.Id });
        }
コード例 #2
0
        private async void AriClientOnStasisStartEvent(IAriClient sender, StasisStartEvent e)
        {
            var   callScope = Tracer.Instance.StartActive("NewCall");
            ICall line;

            using (var answerScope = Tracer.Instance.StartActive("AnswerCall"))
            {
                if (e.Args.Contains("dialed") || e.Args.Contains("SnoopChannel"))
                {
                    return;
                }
                callScope.Span.SetTag("ChannelId", e.Channel.Id);
                _logger.Info("Line Offhook", new
                {
                    ChannelId      = e.Channel.Id,
                    CallerIdName   = e.Channel.Caller.Number,
                    CallerIdNumber = e.Channel.Caller.Name
                });
                line = ArkeCallFactory.CreateArkeCall(e.Channel, callScope);
                ConnectedLines.Add(e.Channel.Id, line);
                _logger.Info("Starting Call Script", new
                {
                    ChannelId = e.Channel.Id
                });
            }
            // call answered and started
            await line.RunCallScript();

            _logger.Info("Call Script Complete", new { ChannelId = e.Channel.Id });
            callScope.Close();
        }
コード例 #3
0
ファイル: ArkeCallFlowService.cs プロジェクト: nrjchnd/arke
        private async void AriClientOnStasisStartEvent(IAriClient sender, StasisStartEvent e)
        {
            _logger.Debug($"Line Connecting: {e.Channel.Name}");

            if (e.Args.Contains("dialed") || e.Args.Contains("SnoopChannel"))
            {
                return;
            }
            _logger.Information("Line Offhook", new
            {
                ChannelId      = e.Channel.Id,
                CallerIdName   = e.Channel.Caller.Number,
                CallerIdNumber = e.Channel.Caller.Name
            });
            var line = ArkeCallFactory.CreateArkeCall(e.Channel);

            ConnectedLines.Add(e.Channel.Id, line);
            _logger.Information("Starting Call Script", new
            {
                ChannelId = e.Channel.Id
            });

            // call answered and started
            await line.RunCallScriptAsync(_cancellationToken);

            await Task.Delay(1000, _cancellationToken);

            _logger.Information("Call Script Complete", new { ChannelId = e.Channel.Id });
        }
コード例 #4
0
        private static void c_OnStasisStartEvent(IAriClient sender, StasisStartEvent e)
        {
            // Answer the channel
            sender.Channels.Answer(e.Channel.Id);

            // Play an announcement
            sender.Channels.Play(e.Channel.Id, "sound:hello-world");
        }
コード例 #5
0
        private void AriClient_OnStasisStartEvent(IAriClient sender, StasisStartEvent e)
        {
            sender.Channels.Answer(e.Channel.Id);
            numbers.Add(e.Channel.Caller.Number, e.Channel.Id);
            ssso.OnValidateNumberBefore?.Invoke(new OnValidateNumberBeforeArgs(e.Channel));
            bool callerIdValidated = ssso.ValidateNumber(sender, e.Channel);

            ssso.OnValidateNumberAfter?.Invoke(new OnValidateNumberAfterArgs(e.Channel, callerIdValidated ? Constants.CallerIdValidated : Constants.CallerIdValidationError));
            if (!callerIdValidated)
            {
                ssso.OnAuthenticationFailed(new OnAuthenticationFailedArgs(e.Channel, Constants.CallerIdValidationError));
                Hangup(e.Channel);
                return;
            }

            DtmfItem dtmfItem = new DtmfItem(e.Channel, ssso.MaxWaitingTime.Value);

            dtmfs.Add(e.Channel.Id, dtmfItem);
        }
コード例 #6
0
        private static async void c_OnStasisStartEvent(object sender, StasisStartEvent e)
        {
            if (e.Application != AppConfig.AppName)
            {
                return;
            }
            var failed = true;

            if (e.Args.Count == 0)
            {
                await Client.Channels.SetChannelVarAsync(e.Channel.Id, "CONFEXIT", "NOTFOUND");
            }

            var confId = e.Args[0];
            var conf   = Conference.Conferences.SingleOrDefault(x => x.ConferenceName == confId);

            if (conf == null)
            {
                await Client.Channels.SetChannelVarAsync(e.Channel.Id, "CONFEXIT", "NOTFOUND");
            }
            else
            if (!await conf.AddUser(e.Channel))
            {
                await Client.Channels.SetChannelVarAsync(e.Channel.Id, "CONFEXIT", "CANTJOIN");
            }
            else
            {
                Debug.Print("Added channel {0} to {1}", e.Channel.Id, confId);
                failed = false;
            }

            if (failed)
            {
                await Client.Channels.ContinueInDialplanAsync(e.Channel.Id,
                                                              e.Channel.Dialplan.Context,
                                                              e.Channel.Dialplan.Exten,
                                                              (int)e.Channel.Dialplan.Priority++);
            }
        }
コード例 #7
0
        private void Client_OnStasisStartEvent(IAriClient sender, StasisStartEvent e)
        {
            int argI;

            if (e.Args.Count < 1 || !int.TryParse(e.Args[0], out argI) || callerRegistry.ContainsKey(e.Channel.Id))
            {
                return;
            }
            StasisArgs arg = (StasisArgs)argI;

            switch (arg)
            {
            case StasisArgs.Caller:
                Caller c = new Caller(e.Channel.Id)
                {
                    Number  = e.Channel.Caller.Number,
                    Created = e.Channel.Creationtime
                };
                Logger.Log(c, "New caller with ID: " + e.Channel.Id);
                CallerStart?.Invoke(this, c);
                callerRegistry[e.Channel.Id] = c;
                break;

            case StasisArgs.Screener:
                string      name = e.Channel.Name;
                Destination s    = new Destination(name.Substring(0, name.IndexOf('-')))
                {
                    Id = e.Channel.Id
                };
                DestinationStart?.Invoke(this, s);
                DestinationRegistry[e.Channel.Id] = s;
                break;

            default:
                throw new NotSupportedException("Stasis argument unsupported");
            }
        }
コード例 #8
0
 private async void AriClientOnStasisStart(object sender, StasisStartEvent e)
 {
     _logger.Information($"AsteriskAriWebSocketService.OnStasisStartEvent. {e.Channel.Id}");
     await ProcessStasisEvents(e.Args, e.Channel);
 }
コード例 #9
0
 private void AriClientOnStasisStartEvent(IAriClient sender, StasisStartEvent e)
 {
     StartEvent?.Invoke(this, e);
 }
コード例 #10
0
ファイル: CallManager.cs プロジェクト: nrjchnd/CloverQ
        private void Pbx_OnStasisStartEvent(IAriClient sender, StasisStartEvent e)
        {
            lock (_locker)                     //Refinar esto, estoy bloqueando durante todo el evento
            {
                if (e.Replace_channel != null) //esto me indica si no es null que hubo un rename, por ejemplo por un transfer
                {
                    CallHandler callHandler = callHandlerCache.GetByChannelId(e.Replace_channel.Id);
                    if (callHandler != null)
                    {
                        //Lo comento porque si remplazo el canal, el nuevo canal no esta en stasis y nunca detecto el hangup
                        //para poder hacer esto debería recibir los eventos de todos los canales osea pbx.Applications.Subscribe(appName, "channel:");
                        callHandler.ChannelReplace(e.Replace_channel, e.Channel);
                    }
                }
                else
                {
                    //TODO: si e.Replace_channel != null (rename) es un nuevo canal que reemplaza a otro, hasta ahora solo me pasa con las transferencias atendidas, debo buscar el callhandler que tiene el e.Replace_channel y reemplazarlo por el nuevo channel
                    //Verifico: si el canal es de una llamada que ya existe no creo nada. Esto es para el caso en que hago un originate al agente, ya tengo un callhandler creado por el caller que llamó inicialmente
                    if (callHandlerCache.GetByChannelId(e.Channel.Id) == null)
                    {
                        Log.Logger.Debug("El canal: " + e.Channel.Id + " entró a la app: " + e.Application);
                        Bridge bridge = bridgesList.GetFreeBridge();
                        if (bridge == null) //si no hay un bridge libre creo uno y lo agrego a la lista
                        {
                            bridge = pbx.Bridges.Create("mixing", Guid.NewGuid().ToString());
                            bridgesList.AddNewBridge(bridge);
                            Log.Logger.Debug("Se crea un Bridge: " + bridge.Id);
                        }
                        else
                        {
                            Log.Logger.Debug("Se usa un Bridge existente: " + bridge.Id);
                        }

                        CallHandler callHandler = new CallHandler(source, appName, pbx, bridge, e.Channel);
                        callHandlerCache.AddCallHandler(callHandler);
                        Log.Logger.Debug("Se crea un callhandler: " + callHandler.Id + " para el canal: " + e.Channel.Id);

                        //Agrego el canal al bridge
                        try
                        {
                            //Seteo la variabl callhandlerid del canal para identificarlo, esto solo para el caller
                            //ver que pasa cuando se hace un transfer a una cola, deberia cambiar el callhandlerid?
                            //En el hangup pregunto por esta variable y si la encuentro, libero la llamada y marco el bridge como libre
                            pbx.Channels.SetChannelVar(e.Channel.Id, "cq_callhandlerid", callHandler.Id);
                            //agrego el canal al bridge, controlar que pasa si falla el originate
                            pbx.Bridges.AddChannel(callHandler.Bridge.Id, e.Channel.Id, null);
                        }
                        catch (Exception ex)
                        {
                            Log.Logger.Debug("No se pudo agregar el canal: " + e.Channel.Id + " al bridge: " + callHandler.Bridge.Id + " Error: " + ex.Message);
                        }

                        //supongo que aca debo avisar a akka que cree el manejador para esta llamada y me mande el mesajito para que atienda
                        //TODO: si este parametro no existe no entrar al evento stasisstart
                        var queueId = e.Args[0];
                        if (e.Args.Count >= 1)
                        {
                            callHandler.SetTimeOut(e.Args[1]);
                        }
                        ProtocolMessages.Message msg = null;
                        msg = callHandler.SetCurrentQueue(queueId);
                        if (msg != null)
                        {
                            actorPbxProxy.Send(msg);
                        }
                    }
                    else //si no es null entonces el canal lo agregé yo cuando hice el CallTo
                    {
                        CallHandler callHandler = callHandlerCache.GetByChannelId(e.Channel.Id);
                        try
                        {
                            //lo conecte a un member, asi que temuevo el timeout
                            callTimeOutHandler.CancelCallTimOut(callHandler.Id);
                            //Le digo al callhandler que el canal generado en el callto ya está en el dial plan, cuando el estado pasa a Up es que contestó el agente
                            callHandler.CallToSuccess(e.Channel.Id);
                        }
                        catch (Exception ex)
                        {
                            Log.Logger.Debug("No se pudo agregar el canal: " + e.Channel.Id + " al bridge: " + callHandler.Bridge.Id + " Error: " + ex.Message);
                        }
                    }
                }
            }
        }
コード例 #11
0
 private static void E_OnStasisStartEvent(IAriClient sender, StasisStartEvent e)
 {
     // sender if BrokerSession which implements IAriClient
     sender.Channels.Answer(e.Channel.Id);
     sender.Channels.Play(e.Channel.Id, "sound:demo-congrats");
 }