Esempio n. 1
0
        /// <summary>
        /// Upload the received data to blob and returns the address
        /// </summary>
        private async Task HandleMediaAsync(EventMessageType type, string replyToken, string messageId, string blobDirectoryName, string blobName)
        {
            var stream = await messagingClient.GetContentStreamAsync(messageId);

            var ext = GetFileExtension(stream.ContentHeaders.ContentType.MediaType);
            var uri = await blobStorage.UploadFromStreamAsync(stream, blobDirectoryName, blobName + ext);

            ISendMessage reply = null;

            switch (type)
            {
            case EventMessageType.Audio:
                reply = new AudioMessage(uri.ToString(), 100);
                break;

            case EventMessageType.Image:
                reply = new ImageMessage(uri.ToString(), uri.ToString());
                break;

            case EventMessageType.Video:
                reply = new VideoMessage(uri.ToString(), "https://linetestbot123.blob.core.windows.net/linebotcontainer/User_U21d2cd1795be4caa1a32d069fe7b323f/7015056697532.jpeg");
                break;

            case EventMessageType.File:
                reply = new TextMessage(uri.ToString());
                break;
            }
            await messagingClient.ReplyMessageAsync(replyToken, new List <ISendMessage> {
                reply
            });

            //await messagingClient.ReplyMessageAsync(replyToken, uri.ToString());
        }
Esempio n. 2
0
        public Response SendAudio(AudioMessage message)
        {
            string url = baseUrl + "sendAudio";

            MultipartFormDataContent multiContent = new MultipartFormDataContent
            {
                { new StringContent(message.ChatId.ToString()), "chat_id" },
                { new StringContent(message.Caption), "caption" },
                { new StringContent(message.Title), "title" },
            };

            if (message.ReplyToMessageId != null)
            {
                multiContent.Add(new StringContent("reply_to_message_id"), message.ReplyToMessageId?.ToString());
            }

            ByteArrayContent audioContent = new ByteArrayContent(message.Audio);

            audioContent.Headers.ContentType = new MediaTypeHeaderValue("audio/mpeg");

            multiContent.Add(audioContent, "audio");


            HttpResponseMessage response = client.PostAsync(url, multiContent).Result;

            if (response.StatusCode == System.Net.HttpStatusCode.OK)
            {
                Response result = Utils.Deserialize <Response>(response.Content.ReadAsStringAsync().Result);
                return(result);
            }


            return(new Response());
        }
            public void ShouldSetTheProperties()
            {
                var message = new AudioMessage(new Uri("https://foo.url"), 1000);

                Assert.AreEqual("https://foo.url/", message.Url.ToString());
                Assert.AreEqual(1000, message.Duration);
            }
            public void ShouldConvertStringUrl()
            {
                var message = new AudioMessage("https://foo.url", 1000);

                Assert.AreEqual("https://foo.url/", message.Url.ToString());
                Assert.AreEqual(1000, message.Duration);
            }
Esempio n. 5
0
    public void SendMessage_Audio()
    {
        NeedsAudio = false;

        float[] AudioSignalOut = new float[AudioMessage.AudioSliceSize];

        //Aggregate NonMuted Classmates
        {
            foreach (var client in ClientsList)
            {
                int offset = (client.NextSliceToWrite + (ChunksPerSecond / 2)) % ChunksPerSecond;

                for (int i = 0; i < AudioMessage.AudioSliceSize; i++)
                {
                    AudioSignalOut[i] += client.audioData_Float[(i + AudioChunkOffsets[offset]) % SampleRate];
                }
            }
        }

        var audioMessageToClient = new AudioMessage();

        int samplesPerChunk = SampleRate / ChunksPerSecond;         //todo: this should be static like in client for consistency

        audioMessageToClient.data = new byte[samplesPerChunk * sizeof(float)];

        Buffer.BlockCopy(AudioSignalOut, 0, audioMessageToClient.data, 0, samplesPerChunk * sizeof(float));

        audioMessageToClient.header.messageType = MessageHeader.MessageType.audioMessage; //audio data = we need an enum I guess
        audioMessageToClient.header.ClientID    = 255;                                    //null userid
        audioMessageToClient.header.dataByte    = (byte)NextSliceToWrite;                 //which audio slice we're using

        WriteBytesToStream(audioMessageToClient.GetBytes(), networkStream);
    }
Esempio n. 6
0
 public virtual Task <Message> SendAudioAsync(AudioMessage message,
                                              CancellationToken cancellationToken = default)
 {
     return(Client.SendAudioAsync(message.ChatId, message.InputOnlineFile, message.Caption, message.ParseMode,
                                  message.Duration, message.Performer, message.Title,
                                  message.DisableNotification, message.ReplyToMessageId, message.ReplyMarkup, cancellationToken));
 }
Esempio n. 7
0
        /// <summary>
        /// 启动录音
        /// </summary>
        /// <param name="reciverID">接收者id,私聊就用用户id,频道聊天就用频道id</param>
        /// <param name="chatType">私聊消息还是频道消息</param>
        /// <param name="extraMsg">附带自定义文本消息内容</param>
        /// <param name="recognizeText">是否开启语音转文字识别功能</param>
        /// <param name="callback">语音消息发送回调通知,会通知多次,通过AudioMessage的sendStatus属性可以判断是哪个状态的回调</param>
        /// <returns></returns>
        public AudioMessage StartRecordAudio(string reciverID, ChatType chatType, string extraMsg, bool recognizeText, Action <StatusCode, AudioMessage> callback)
        {
            ulong reqID = 0;

            YIMEngine.ErrorCode code = 0;
            if (recognizeText)
            {
                code = IMAPI.Instance().SendAudioMessage(reciverID, (YIMEngine.ChatType)chatType, ref reqID);
            }
            else
            {
                code = IMAPI.Instance().SendOnlyAudioMessage(reciverID, (YIMEngine.ChatType)chatType, ref reqID);
            }
            var msg = new AudioMessage(GetCurrentUserID().UserID, reciverID, chatType, extraMsg, false);

            if (code == YIMEngine.ErrorCode.Success)
            {
                msg.requestID          = reqID;
                msg.sendStatus         = SendStatus.NotStartSend;
                lastRecordAudioMessage = msg;
                MessageCallbackObject callbackObj = new MessageCallbackObject(msg, MessageBodyType.Voice, callback);
                IMInternalManager.Instance.AddMessageCallback(reqID, callbackObj);
            }
            else
            {
                msg.sendStatus = SendStatus.Fail;
                Log.e("Start Record Fail! code:" + code.ToString());
                if (callback != null)
                {
                    callback(Conv.ErrorCodeConvert(code), msg);
                }
            }
            return(msg);
        }
Esempio n. 8
0
        /// <summary>
        /// 结束录音并发送语音消息
        /// </summary>
        /// <returns>false表示启动发送失败,true表示启动发送成功</returns>
        public bool StopRecordAndSendAudio()
        {
            if (lastRecordAudioMessage == null)
            {
                return(false);
            }
            var audioMsg = lastRecordAudioMessage;

            if (audioMsg.sendStatus == SendStatus.Fail)
            {
                Log.e("StopRecordAndSendAudio Fail! SendStatus is Fail!");
                lastRecordAudioMessage = null;
                return(false);
            }
            YIMEngine.ErrorCode code = IMAPI.Instance().StopAudioMessage(audioMsg.extraParam);
            lastRecordAudioMessage = null;
            if (code == YIMEngine.ErrorCode.Success)
            {
                return(true);
            }
            else
            {
                Log.e("StopRecordAndSendAudio Fail! code:" + code.ToString());
                return(false);
            }
        }
Esempio n. 9
0
        public AudioForm(AudioMessage am,bool isFrom)
        {
            InitializeComponent();
           
            image.Source = new BitmapImage(new Uri(imageSouce, UriKind.Relative));
            image.Stretch = Stretch.Fill;
            this.am = am;
            this.isFrom = isFrom;

            Member from=am.from as Member;
            Member to =am.to as Member;
            this.Closed += AudioForm_Closed;
            ///语音发起者
            if (isFrom)
            {
                btnAccept.Visibility = Visibility.Collapsed;
                grid.ColumnDefinitions.RemoveAt(4);
                this.Width = 240;
                this.role = am.to;
                nickName.Text = to.nickName;
                DataUtil.AudioForms.Add(to.id, this);
            }
            ///语音接受者
            else
            {
                this.role = am.from;
                nickName.Text = from.nickName;
                DataUtil.AudioForms.Add(from.id, this);
            }

            timer.Interval = TimeSpan.FromSeconds(1);
            timer.Tick += timer_Tick;
           
        }
Esempio n. 10
0
        private void HandleNonObsStream(AbstractRtmpMediaMessage msg)
        {
            if (msg is VideoMessage)
            {
                VideoMessage vm = (VideoMessage)msg;
                if (vm.Timestamp != null)
                {
                    vm.TimestampDelta = (vm.Timestamp - _videoTimestamp);
                    _videoTimestamp   = vm.Timestamp.Value;
                }
                else if (vm.TimestampDelta != null)
                {
                    _videoTimestamp += vm.TimestampDelta.Value;
                    vm.Timestamp     = _videoTimestamp;
                }
            }

            if (msg is AudioMessage)
            {
                AudioMessage am = (AudioMessage)msg;
                if (am.Timestamp != null)
                {
                    am.TimestampDelta = (am.Timestamp - _audioTimestamp);
                    _audioTimestamp   = am.Timestamp.Value;
                }
                else if (am.TimestampDelta != null)
                {
                    _audioTimestamp += am.TimestampDelta.Value;
                    am.Timestamp     = _audioTimestamp;
                }
            }
        }
Esempio n. 11
0
        public void Constructor_SerializedCorrectly()
        {
            AudioMessage message = new AudioMessage("https://foo.url", 10000);

            string serialized = JsonConvert.SerializeObject(message);

            Assert.AreEqual(@"{""type"":""audio"",""originalContentUrl"":""https://foo.url"",""duration"":10000}", serialized);
        }
Esempio n. 12
0
        private static string EVENT_AudioMsg(string Message, ref List <MessageBase> response)
        {
            string sURL = "https://203146b5091e8f0aafda-15d41c68795720c6e932125f5ace0c70.ssl.cf1.rackcdn.com/530000063.ogg";
            var    Msg  = new AudioMessage(new Uri(sURL), 17000);

            response.Add(Msg);
            return("");
        }
Esempio n. 13
0
        public void Url_Null_ThrowsException()
        {
            AudioMessage message = new AudioMessage();

            ExceptionAssert.Throws <InvalidOperationException>("The url cannot be null.", () =>
            {
                message.Url = null;
            });
        }
Esempio n. 14
0
        public void Duration_MoreThan59999Milliseconds_ThrowsException()
        {
            AudioMessage message = new AudioMessage();

            ExceptionAssert.Throws <InvalidOperationException>("The duration cannot be longer than 1 minute.", () =>
            {
                message.Duration = 60000;
            });
        }
            public void ShouldThrowExceptionWhenValueIsMoreThan59999()
            {
                AudioMessage message = new AudioMessage();

                ExceptionAssert.Throws <InvalidOperationException>("The duration cannot be longer than 1 minute.", () =>
                {
                    message.Duration = 60000;
                });
            }
            public void ShouldThrowExceptionWhenValueIsZero()
            {
                AudioMessage message = new AudioMessage();

                ExceptionAssert.Throws <InvalidOperationException>("The duration should be at least 1 millisecond.", () =>
                {
                    message.Duration = 0;
                });
            }
Esempio n. 17
0
        public void Url_NotHttps_ThrowsException()
        {
            AudioMessage message = new AudioMessage();

            ExceptionAssert.Throws <InvalidOperationException>("The url should use the https scheme.", () =>
            {
                message.Url = new Uri("http://foo.bar");
            });
        }
Esempio n. 18
0
 private void HandleAudioMessage(AudioMessage audioData)
 {
     if (AACConfigureRecord == null && audioData.Data.Length >= 2)
     {
         AACConfigureRecord = audioData;
         return;
     }
     OnAudioMessage?.Invoke(audioData);
 }
Esempio n. 19
0
        public void Url_MoreThan1000Chars_ThrowsException()
        {
            AudioMessage message = new AudioMessage();

            ExceptionAssert.Throws <InvalidOperationException>("The url cannot be longer than 1000 characters.", () =>
            {
                message.Url = new Uri("https://foo.bar/" + new string('x', 985));
            });
        }
Esempio n. 20
0
            public void ShouldThrowExceptionWhenValueIsMoreThan1000Chars()
            {
                var message = new AudioMessage();

                ExceptionAssert.Throws <InvalidOperationException>("The url cannot be longer than 1000 characters.", () =>
                {
                    message.Url = new Uri("https://foo.bar/" + new string('x', 985));
                });
            }
Esempio n. 21
0
            public void ShouldThrowExceptionWhenValueIsNotHttps()
            {
                var message = new AudioMessage();

                ExceptionAssert.Throws <InvalidOperationException>("The url should use the https scheme.", () =>
                {
                    message.Url = new Uri("http://foo.bar");
                });
            }
Esempio n. 22
0
            public void ShouldThrowExceptionWhenValueIsNull()
            {
                var message = new AudioMessage();

                ExceptionAssert.Throws <InvalidOperationException>("The url cannot be null.", () =>
                {
                    message.Url = null;
                });
            }
Esempio n. 23
0
        public void Duration_MinusOne_ThrowsException()
        {
            AudioMessage message = new AudioMessage();

            ExceptionAssert.Throws <InvalidOperationException>("The duration should be at least 1 millisecond.", () =>
            {
                message.Duration = -1;
            });
        }
Esempio n. 24
0
            public void ShouldNotThrowExceptionWhenValid()
            {
                ISendMessage message = new AudioMessage()
                {
                    Duration = 10000,
                    Url      = new Uri("https://foo.url")
                };

                message.Validate();
            }
Esempio n. 25
0
    public void SendMessage_Audio()
    {
        //todo: science - allocating every time is surely not performance-friendly, but sitting setting and resetting the same data seems error-prone
        var audioMessageToServer = new AudioMessage();

        audioMessageToServer.data = AudioManager.instance.GetChunk_FloatBytes();
        audioMessageToServer.header.messageType = MessageHeader.MessageType.audioMessage;

        StreamUtils.WriteMessageToStream(audioMessageToServer, networkStream);
    }
Esempio n. 26
0
            public void ShouldConvertCustomIAudioMessageToAudioMessage()
            {
                var message = new TestAudioMessage();

                var audioMessage = AudioMessage.Convert(message);

                Assert.AreNotEqual(message, audioMessage);
                Assert.AreEqual(new Uri("https://foo.url"), audioMessage.Url);
                Assert.AreEqual(1000, audioMessage.Duration);
            }
            public void ShouldNotThrowExceptionWhenUrlIs59999Milliseconds()
            {
                int value = 59999;

                AudioMessage message = new AudioMessage()
                {
                    Duration = value
                };

                Assert.AreEqual(value, message.Duration);
            }
Esempio n. 28
0
        public void Duration_59999Milliseconds_ThrowsException()
        {
            int value = 59999;

            AudioMessage message = new AudioMessage()
            {
                Duration = value
            };

            Assert.AreEqual(value, message.Duration);
        }
Esempio n. 29
0
        public async Task <IList <IRequestMessage> > GetReplyMessagesAsync()
        {
            var msg = new AudioMessage("https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3");

            await Task.CompletedTask;

            return(new List <IRequestMessage>
            {
                msg
            });
        }
Esempio n. 30
0
            public void ShouldNotThrowExceptionWhenUrlIs1000Chars()
            {
                var value = new Uri("https://foo.bar/" + new string('x', 984));

                var message = new AudioMessage()
                {
                    Url = value
                };

                Assert.AreEqual(value, message.Url);
            }
Esempio n. 31
0
        public void Url_1000Chars_ThrowsNoException()
        {
            Uri value = new Uri("https://foo.bar/" + new string('x', 984));

            AudioMessage message = new AudioMessage()
            {
                Url = value
            };

            Assert.AreEqual(value, message.Url);
        }
Esempio n. 32
0
        void MyMenu_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {

            if (this.baseRole is Member)
            {
                Member member = this.baseRole as Member;
                if (member.status == MemberStatus.Offline)
                {
                    return;
                }

                switch(messageType)
                {
                    case MessageType.File:
                        {
                            OpenFileDialog ofd = new OpenFileDialog();
                            ofd.RestoreDirectory = true;
                            ofd.ShowDialog();

                            FileMessage fm = new FileMessage();
                            fm.from = DataUtil.Member;
                            fm.to = this.baseRole;

                            fm.Path = ofd.FileName;
                            if (!File.Exists(fm.Path))
                                return;
                            fm.FileName = ofd.SafeFileName;
                            fm.Size = ofd.OpenFile().Length;
                            fm.sendTime = DateTime.Now;
                            fm.Guid = Guid.NewGuid().ToString();


                            DataUtil.Transfer.SendFile(fm);
                            break;
                        }
                    case MessageType.Audio:
                        {

                            this.IsEnabled = false;
                            AudioMessage am = new AudioMessage();
                            am.from = DataUtil.Member;
                            am.to = this.baseRole;

                            DataUtil.Client.SendMesg(am);
                            AudioForm af = new AudioForm(am, true);
                            
                            af.Show();
                            af.Closed += new EventHandler((obj, args) =>
                                {
                                    this.IsEnabled = true;
                                });
                            break;
                        }
            }

            }
        }