static void ari_OnStasisStartEvent(object sender, AsterNET.ARI.Models.StasisStartEvent e) { Console.WriteLine("Channel {0} has entered the application", e.Channel.Id); _ari.Channels.Ring(e.Channel.Id); Thread.Sleep(2000); // wait 2 seconds Console.WriteLine("Answering channel {0}", e.Channel.Id); _ari.Channels.Answer(e.Channel.Id); _ari.Channels.StartSilence(e.Channel.Id); Thread.Sleep(4000); // wait 4 seconds Console.WriteLine("hanging up channel {0}", e.Channel.Id); _ari.Channels.Hangup(e.Channel.Id); }
/// <summary> /// This stasis app receives in e.Args[0] the action like "login" and then send de corresponding msg to the login proxy /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Pbx_OnStasisStartEvent(IAriClient sender, AsterNET.ARI.Models.StasisStartEvent e) { //string eventname = ((JObject)e.Userevent).SelectToken("eventname").Value<string>(); string eventname = e.Args[0]; //["eventname"]; string memberId = e.Args[1]; //["agent"]; string password = e.Args[2]; //["password"]; string contact = e.Args[3]; //["contact"]; string pauseReason = ""; if (e.Args.Count >= 5) //verifico que tenga 4 o mas argumentos para tratar de recuperar el pause reason { pauseReason = e.Args[4]; } string channelId = e.Channel.Id; //Envio el channel ID para trackear la respuesta string deviceId = ""; try { //obtenemos el deviceId del string de contacto deviceId = Regex.Match(contact, @"\<(.+?)\@").Groups[1].Value.Replace(":", "/").ToUpper(); } catch (Exception ex) { Log.Logger.Debug("PbxLoginProvider: Error al obtener deviceId del contacto. " + ex.Message); } //Si no me pasan el memberId, trato de recuperarlo del deviceMemberMap if (String.IsNullOrEmpty(memberId)) { lock (_locker) { memberId = deviceMemberMap.GetMemberIdFromDeviceId(deviceId); } //Si tampoco lo encuentro en el deviceMemberMap if (String.IsNullOrEmpty(memberId)) { Log.Logger.Debug("PbxLoginProvider: no se pudo determinar el memeberId para el device: " + deviceId); } } if (eventname == "login") { //meter todo este parse en un metodo estático tal vez una clase contact Contact.Parse? contact = contact.Replace(";", ">"); deviceId = Regex.Match(contact, @"\<(.+?)\@").Groups[1].Value.Replace(":", "/").ToUpper(); string number = Regex.Match(contact, @"\:(.+?)\@").Groups[1].Value; string address = Regex.Match(contact, @"\@(.+?)\>").Groups[1].Value; string uri = Regex.Match(contact, @"\<(.+?)\>").Groups[1].Value.Replace("<", "").Replace(">", ""); string destination = "SIP/" + address + "/" + number; //esta llamada la tengo que pasar de ask a tell para poder hacer todo async //MessageMemberLoginResponse mlr = await Log.Logger.Debug("Login para: " + memberId); actorLoginProxy.Send(new MessageMemberLogin() { From = source, MemberId = memberId, Password = password, Contact = destination, DeviceId = deviceId, RequestId = channelId }); } else if (eventname == "logoff") { if (!String.IsNullOrEmpty(memberId)) { lock (_locker) { deviceMemberMap.UnTrackMemberDeviceId(deviceId); } actorLoginProxy.Send(new MessageMemberLogoff() { From = source, MemberId = memberId, Password = password, RequestId = e.Channel.Id }); } else { Log.Logger.Debug("LogOff: Error MembderId es nulo o vacio"); } //como no manejo nada mas sigo adelante en el dialplan lock (_locker) { pbx.Channels.ContinueInDialplan(e.Channel.Id); } } else if (eventname == "pause") { if (!String.IsNullOrEmpty(memberId)) { actorLoginProxy.Send(new MessageMemberPause() { From = source, MemberId = memberId, Password = password, PauseReason = pauseReason, RequestId = e.Channel.Id }); } else { Log.Logger.Debug("Pause: Error MembderId es nulo o vacio"); } //como no manejo nada mas sigo adelante en el dialplan lock (_locker) { pbx.Channels.ContinueInDialplan(e.Channel.Id); } } else if (eventname == "unpause") { if (!String.IsNullOrEmpty(memberId)) { actorLoginProxy.Send(new MessageMemberUnPause() { From = source, MemberId = memberId, Password = password, RequestId = e.Channel.Id }); } else { Log.Logger.Debug("UnPause: Error MembderId es nulo o vacio"); } lock (_locker) { //como no manejo nada mas sigo adelante en el dialplan pbx.Channels.ContinueInDialplan(e.Channel.Id); } } }
private void ActionClient_OnStasisStartEvent(IAriClient sender, AsterNET.ARI.Models.StasisStartEvent e) { throw new System.NotImplementedException(); }