Example #1
0
        /// <inheritdoc cref="ConnectAsync"/>
        public Task ConnectAsync(ISession session, bool appearOnline = false,
                                 int connectTimeoutSec = DefaultConnectTimeout)
        {
            var                tcs      = new TaskCompletionSource <bool>();
            Action             callback = () => tcs.SetResult(true);
            Action <Exception> errback  = e => tcs.SetException(e);

            _adapter.Connected     += callback;
            _adapter.ReceivedError += errback;
            var uri = new UriBuilder(_baseUri)
            {
                Path  = "/ws",
                Query = $"lang=en&status={appearOnline}&token={session.AuthToken}"
            }.Uri;

            tcs.Task.ContinueWith(_ =>
            {
                // NOTE Not fired in Unity WebGL builds.
                _adapter.Connected     -= callback;
                _adapter.ReceivedError -= errback;
            });
            _adapter.Connect(uri);
            // NOTE Task.Delay does not work with Unity WebGL builds.
            return(tcs.Task);
            //return Task.WhenAny(tcs.Task, Task.Delay(DefaultConnectTimeout));
        }
        public void Listen()
        {
            try
            {
                //вытаскиваем параметры подключения к астериску
                var asteriskConfiguration = mPbxConfigurationService.GetPbxConfiguration();
                var loginCommand          = mPbxConfigurationService.GetLoginCommand(asteriskConfiguration);

                using (ISocketAdapter socket = mSocketAdapterFactory.CreateSocketAdapter())
                {
                    //Создаём сокет для подключения к астериску и подключаемся к нему
                    socket.Connect(asteriskConfiguration.IpAddress, asteriskConfiguration.Port);

                    //авторизуемся
                    socket.Send(Encoding.ASCII.GetBytes(loginCommand));

                    //читаем cSocketReadBufer байт из сокета
                    var bytesRead = 1;

                    while (bytesRead != 0)
                    {
                        var asteriskAnswer = new byte[cSocketReadBufer];
                        bytesRead = socket.Receive(asteriskAnswer);

                        OnFullMessageRecived(new PbxRawMessageEventArgs {
                            Message = Encoding.ASCII.GetString(asteriskAnswer, 0, asteriskAnswer.Length)
                        });
                        //Полученный массив байт преобразуем к строке
                        var asteriskMessage = ParseFullAsteriskMessage(asteriskAnswer);

                        var messages       = mPbxMessagesParser.ExtractPbxMessages(asteriskMessage);
                        var parsedMessages =
                            messages
                            .Select
                            (
                                t => mPbxMessagesParser.ParseMessage(t)
                            )
                            .Where
                            (
                                r =>
                                r.ContainsKey("Event")
                                &&
                                mValueableEvents.Contains(r["Event"])
                            )
                            .ToList();

                        //Если нашли события, запускаем событие полученного сообщения
                        if (parsedMessages.Any())
                        {
                            OnPbxMessageRecived(new PbxMessagesEventArgs {
                                Messages = parsedMessages
                            });
                        }

                        //Читаем следующее сообщение
                        //asteriskAnswer = socket.Receive(cSocketReadBufer);
                    }
                }
            }
            catch (Exception ex)
            {
                var errorMessage = String.Format("Подключение к астериску отвалилось с ошибкой. \r\n {0}", ex);
                OnPbxConnectionLost(new PbxErrorEventArgs {
                    ErrorMessage = errorMessage
                });
            }


            OnPbxConnectionLost(new PbxErrorEventArgs {
                ErrorMessage = "Подключение к астериску отвалилось"
            });
        }