using System; using System.Linq; using Newtonsoft.Json.Linq; using PepperDash.Essentials.Devices.Common.AudioCodec; using PepperDash.Essentials.Devices.Common.Codec; namespace PepperDash.Essentials.AppServer.Messengers { /// /// Provides a messaging bridge for an AudioCodecBase device /// public class AudioCodecBaseMessenger : MessengerBase { /// /// Device being bridged /// public AudioCodecBase Codec { get; private set; } /// /// Constuctor /// /// /// /// public AudioCodecBaseMessenger(string key, AudioCodecBase codec, string messagePath) : base(key, messagePath, codec) { Codec = codec ?? throw new ArgumentNullException("codec"); codec.CallStatusChange += Codec_CallStatusChange; } /// protected override void RegisterActions() { base.RegisterActions(); AddAction("/fullStatus", (id, content) => SendAtcFullMessageObject(id)); AddAction("/audioDialerStatus", (id, content) => SendAtcFullMessageObject(id)); AddAction("/dial", (id, content) => { var msg = content.ToObject>(); Codec.Dial(msg.Value); }); AddAction("/endCallById", (id, content) => { var msg = content.ToObject>(); var call = GetCallWithId(msg.Value); if (call != null) Codec.EndCall(call); }); AddAction("/endAllCalls", (id, content) => Codec.EndAllCalls()); AddAction("/dtmf", (id, content) => { var msg = content.ToObject>(); Codec.SendDtmf(msg.Value); }); AddAction("/rejectById", (id, content) => { var msg = content.ToObject>(); var call = GetCallWithId(msg.Value); if (call != null) Codec.RejectCall(call); }); AddAction("/acceptById", (id, content) => { var msg = content.ToObject>(); var call = GetCallWithId(msg.Value); if (call != null) Codec.AcceptCall(call); }); } /// /// Helper to grab a call with string ID /// /// /// private CodecActiveCallItem GetCallWithId(string id) { return Codec.ActiveCalls.FirstOrDefault(c => c.Id == id); } private void Codec_CallStatusChange(object sender, CodecCallStatusItemChangeEventArgs e) { SendAtcFullMessageObject(); } /// /// Helper method to build call status for vtc /// /// private void SendAtcFullMessageObject(string id = null) { var info = Codec.CodecInfo; PostStatusMessage(JToken.FromObject(new { isInCall = Codec.IsInCall, calls = Codec.ActiveCalls, info = new { phoneNumber = info.PhoneNumber } }), id ); } } }