コード例 #1
0
        private void OnSpeaking(SocketFrame Event)
        {
            var speak = Event.GetData <DownstreamEvents.Speak>();

            _webrtcManager.SetSpeaking((uint)speak.SSRC, speak.Speaking);
            FireEventOnDelegate(Event, Speak);
        }
コード例 #2
0
ファイル: VoiceConnection.cs プロジェクト: rafal06/Quarrel
        async void IpDiscover(object sender, PacketReceivedEventArgs args)
        {
            var    packet = (byte[])args.Message;
            string ip     = "";
            int    port   = 0;

            try
            {
                ip   = Encoding.UTF8.GetString(packet, 4, 70 - 6).TrimEnd('\0');
                port = (packet[68] << 8) | packet[69];
            }
            catch /*(Exception exception)*/
            {
                //App.NavigateToBugReport(exception);
            }

            var info = new UdpProtocolInfo()
            {
                Address = ip,
                Port    = port,
                Codecs  = new List <Codec>()
                {
                    new Codec()
                    {
                        Name           = "opus",
                        payloadType    = 120,
                        Priority       = 1000,
                        Type           = "audio",
                        rtxPayloadType = 120
                    },
                    new Codec()
                    {
                        Name           = "VP8",
                        payloadType    = 101,
                        Priority       = 1000,
                        Type           = "video",
                        rtxPayloadType = 102
                    }
                }.ToArray(),
                Mode = "xsalsa20_poly1305" //"_suffix"
            };

            var payload = new SelectProtocol()
            {
                Protocol = "udp",
                Data     = info
            };

            SocketFrame package = new SocketFrame()
            {
                Operation = (int)OperationCode.SelectProtocol,
                Payload   = payload,
                Type      = EventNames.SELECT_PROTOCOL
            };

            _udpSocket.MessageReceived -= IpDiscover;
            _udpSocket.MessageReceived += processUdpPacket;

            await _webMessageSocket.SendJsonObjectAsync(package);
        }
コード例 #3
0
    // Use this for initialization
    void Start()
    {
        frame = new SocketFrame();

        clientSocket = new TcpClient();
        clientSocket.Connect("127.0.0.1", 6500);
        inStream = new byte[15000];
    }
コード例 #4
0
ファイル: RelayConnection.cs プロジェクト: NeKzor/Discord.Net
 private async Task SendAsync(GatewayOpCode opCode, object payload)
 {
     var frame = new SocketFrame {
         Operation = (int)opCode, Payload = payload
     };
     var bytes   = _server.Serialize(frame, _outBuffer);
     var segment = new ArraySegment <byte>(_outBuffer, 0, bytes);
     await _socket.SendAsync(segment, WebSocketMessageType.Text, true, CancellationToken.None).ConfigureAwait(false);
 }
コード例 #5
0
ファイル: Gateway.cs プロジェクト: rafal06/Quarrel
        private void OnReady(SocketFrame gatewayEvent)
        {
            var ready = gatewayEvent.GetData <Ready>();

            lastReady = ready;


            FireEventOnDelegate(gatewayEvent, Ready);
        }
コード例 #6
0
        private async void OnReady(SocketFrame Event)
        {
            var ready = Event.GetData <Ready>();

            lastReady = ready;

            FireEventOnDelegate(Event, Ready);

            await _webrtcManager.ConnectAsync(ready.Ip, ready.Port.ToString(), lastReady.SSRC);
        }
コード例 #7
0
ファイル: Gateway.cs プロジェクト: uponatime2019/Quarrel
 private void OnChannelDeleted(SocketFrame gatewayEvent)
 {
     if (IsChannelAGuildChannel(gatewayEvent))
     {
         FireEventOnDelegate(gatewayEvent, GuildChannelDeleted);
     }
     else
     {
         FireEventOnDelegate(gatewayEvent, DirectMessageChannelDeleted);
     }
 }
コード例 #8
0
ファイル: VoiceConnection.cs プロジェクト: rafal06/Quarrel
        private async void IdentifySelfToVoiceConnection()
        {
            var identifyEvent = new SocketFrame
            {
                Type      = EventNames.IDENTIFY,
                Operation = OperationCode.Identify.ToInt(),
                Payload   = GetIdentityAsync()
            };

            await _webMessageSocket.SendJsonObjectAsync(identifyEvent);
        }
コード例 #9
0
ファイル: VoiceConnection.cs プロジェクト: rafal06/Quarrel
        private async void OnReady(SocketFrame Event)
        {
            var ready = Event.GetData <Ready>();

            lastReady = ready;

            FireEventOnDelegate(Event, Ready);

            await ConnectUDPAsync(ready.Ip, ready.Port.ToString());

            SendSelectProtocol();
        }
コード例 #10
0
ファイル: Gateway.cs プロジェクト: rafal06/Quarrel
        private async Task UpdateStatus(StatusUpdate status)
        {
            var statusevent = new SocketFrame()
            {
                Operation = 3,
                Payload   = status
            };

            await SendMessageAsync(JsonConvert.SerializeObject(statusevent));

            //await _webMessageSocket.SendJsonObjectAsync(statusevent);
        }
コード例 #11
0
ファイル: Gateway.cs プロジェクト: rafal06/Quarrel
 private void OnHelloReceived(SocketFrame gatewayEvent)
 {
     if (TryResume)
     {
         SendResumeRequest();
         TryResume = false;
     }
     else
     {
         IdentifySelfToGateway();
         BeginHeartbeatAsync(gatewayEvent.GetData <Hello>().HeartbeatInterval);
     }
 }
コード例 #12
0
ファイル: Gateway.cs プロジェクト: rafal06/Quarrel
        private async void IdentifySelfToGateway()
        {
            var identifyEvent = new SocketFrame
            {
                Type      = EventNames.IDENTIFY,
                Operation = OperationCode.Identify.ToInt(),
                Payload   = GetIdentityAsync()
            };

            await SendMessageAsync(JsonConvert.SerializeObject(identifyEvent));

            // await _webMessageSocket.SendJsonObjectAsync(identifyEvent);
        }
コード例 #13
0
        internal DiscordVoiceAPIClient(DiscordSocketConfig config, ulong guildId, WebSocketProvider webSocketProvider, UdpSocketProvider udpSocketProvider, JsonSerializer serializer = null)
        {
            GuildId         = guildId;
            _connectionLock = new SemaphoreSlim(1, 1);
            _udp            = udpSocketProvider();
            Config          = config;

            _udp.ReceivedDatagram += async(data, index, count) =>
            {
                if (index != 0 || count != data.Length)
                {
                    byte[] newData = new byte[count];
                    Buffer.BlockCopy(data, index, newData, 0, count);
                    data = newData;
                }
                await _receivedPacketEvent.InvokeAsync(data).ConfigureAwait(false);
            };

            WebSocketClient = webSocketProvider();
            //_gatewayClient.SetHeader("user-agent", DiscordConfig.UserAgent); //(Causes issues in .Net 4.6+)

            WebSocketClient.BinaryMessage += async(data, index, count) =>
            {
                using (MemoryStream compressed = new MemoryStream(data, index + 2, count - 2))
                    using (MemoryStream decompressed = new MemoryStream())
                    {
                        using (DeflateStream zlib = new DeflateStream(compressed, CompressionMode.Decompress))
                            zlib.CopyTo(decompressed);
                        decompressed.Position = 0;
                        using (StreamReader reader = new StreamReader(decompressed))
                        {
                            SocketFrame msg = JsonConvert.DeserializeObject <SocketFrame>(reader.ReadToEnd());
                            await _receivedEvent.InvokeAsync((VoiceOpCode)msg.Operation, msg.Payload).ConfigureAwait(false);
                        }
                    }
            };
            WebSocketClient.TextMessage += async text =>
            {
                SocketFrame msg = JsonConvert.DeserializeObject <SocketFrame>(text);
                await _receivedEvent.InvokeAsync((VoiceOpCode)msg.Operation, msg.Payload).ConfigureAwait(false);
            };
            WebSocketClient.Closed += async ex =>
            {
                await DisconnectAsync().ConfigureAwait(false);

                await _disconnectedEvent.InvokeAsync(ex).ConfigureAwait(false);
            };
            _serializer = serializer ?? new JsonSerializer {
                ContractResolver = new DiscordContractResolver()
            };
        }
コード例 #14
0
        public async Task SendAsync(VoiceOpCode opCode, object payload, RequestOptions options = null)
        {
            byte[] bytes = null;
            payload = new SocketFrame {
                Operation = (int)opCode, Payload = payload
            };
            if (payload != null)
            {
                bytes = Encoding.UTF8.GetBytes(SerializeJson(payload));
            }
            await WebSocketClient.SendAsync(bytes, 0, bytes.Length, true).ConfigureAwait(false);

            await _sentGatewayMessageEvent.InvokeAsync(opCode).ConfigureAwait(false);
        }
コード例 #15
0
ファイル: Gateway.cs プロジェクト: rafal06/Quarrel
        private void OnInvalidSession(SocketFrame gatewayEvent)
        {
            if (invalidSessionRetryCount > 0)
            {
                invalidSessionRetryCount--;
                _ = ConnectAsync(connectionUrl);
            }
            else
            {
                ConnectedSocket = false;

                FireEventOnDelegate(gatewayEvent, InvalidSession);
            }
        }
コード例 #16
0
ファイル: Gateway.cs プロジェクト: rafal06/Quarrel
        private void OnChannelDeleted(SocketFrame gatewayEvent)
        {
            GatewayEventArgs <Channel> eventArgs;

            if (IsChannelAGuildChannel(gatewayEvent))
            {
                eventArgs = new GatewayEventArgs <Channel>(gatewayEvent.GetData <GuildChannel>());
            }
            else
            {
                eventArgs = new GatewayEventArgs <Channel>(gatewayEvent.GetData <DirectMessageChannel>());
            }

            ChannelDeleted?.Invoke(this, eventArgs);
        }
コード例 #17
0
ファイル: VoiceConnection.cs プロジェクト: rafal06/Quarrel
        private void OnSessionDesc(SocketFrame Event)
        {
            var Desc = Event.GetData <SessionDescription>();

            secretkey = Desc.SecretKey;


            //Needs to speak 100 silent frames to get first listen packet
            SendSpeaking(true);
            for (int i = 0; i < 100; i++)
            {
                SendSilence();
            }
            SendSpeaking(false);
        }
コード例 #18
0
ファイル: VoiceConnection.cs プロジェクト: rafal06/Quarrel
        private void OnSocketMessageReceived(object sender, MessageReceivedEventArgs args)
        {
            var gatewayEvent = JsonConvert.DeserializeObject <SocketFrame>(args.Message);

            lastEvent = gatewayEvent;

            if (operationHandlers.ContainsKey(gatewayEvent.Operation.GetValueOrDefault()))
            {
                operationHandlers[gatewayEvent.Operation.GetValueOrDefault()](gatewayEvent);
            }

            if (gatewayEvent.Type != null && eventHandlers.ContainsKey(gatewayEvent.Type))
            {
                eventHandlers[gatewayEvent.Type](gatewayEvent);
            }
        }
コード例 #19
0
ファイル: Gateway.cs プロジェクト: rafal06/Quarrel
        /// <summary>
        /// Subscribe to various channel-specific events (most notably "Typing")
        /// </summary>
        /// <param name="channelIds"></param>
        /// <returns>True if the payload was valid, false if it wasn't</returns>
        public async Task <bool> SubscribeToGuild(string[] channelIds)
        {
            if (channelIds.Length > 193) //This is really, really random, but it's apparently the maximum array size for the op12 event.
            {
                return(false);
            }
            var identifyEvent = new SocketFrame
            {
                Operation = OperationCode.SubscribeToGuild.ToInt(),
                Payload   = channelIds
            };

            await SendMessageAsync(JsonConvert.SerializeObject(identifyEvent));

            return(true);
        }
コード例 #20
0
ファイル: VoiceConnection.cs プロジェクト: rafal06/Quarrel
        private async Task SendHeartbeatAsync()
        {
            try
            {
                var heartbeatEvent = new SocketFrame
                {
                    Operation = OperationCode.Heartbeat.ToInt(),
                    Payload   = Math.Round(DateTime.Now.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds)
                };

                await _webMessageSocket.SendJsonObjectAsync(heartbeatEvent);
            }
            catch /*(Exception exception)*/
            {
                //App.NavigateToBugReport(exception);
            }
        }
コード例 #21
0
ファイル: Gateway.cs プロジェクト: rafal06/Quarrel
        private void HandleMessage(TextReader reader)
        {
            if (Logger?.IsEnabled(LogLevel.Trace) ?? false)
            {
                Logger?.LogTrace("Handle Message.");
            }

            using (JsonReader jsreader = new JsonTextReader(reader))
            {
                JsonSerializer serializer = new JsonSerializer();
                SocketFrame    frame      = serializer.Deserialize <SocketFrame>(jsreader);

                if (Logger?.IsEnabled(LogLevel.Trace) ?? false)
                {
                    Logger?.LogTrace($"Frame:" +
                                     $"\n\tOperation: {frame.Operation}" +
                                     $"\n\tSequenceNumber: {frame.SequenceNumber}" +
                                     $"\n\tType: {frame.Type}" +
                                     $"\n\tPayload: {frame.Payload}"
                                     );
                }

                if (frame.SequenceNumber.HasValue)
                {
                    lastGatewayEventSeq = frame.SequenceNumber.Value;
                }
                if (operationHandlers.ContainsKey(frame.Operation.GetValueOrDefault()))
                {
                    operationHandlers[frame.Operation.GetValueOrDefault()](frame);
                }
                else if (frame.Type != null && eventHandlers.ContainsKey(frame.Type))
                {
                    eventHandlers[frame.Type](frame);
                }
                else
                {
                    Logger?.LogDebug($"Unknown message:" +
                                     $"\n\tOperation: {frame.Operation}" +
                                     $"\n\tSequenceNumber: {frame.SequenceNumber}" +
                                     $"\n\tType: {frame.Type}" +
                                     $"\n\tPayload: {frame.Payload}"
                                     );
                }
            }
        }
コード例 #22
0
ファイル: Gateway.cs プロジェクト: rafal06/Quarrel
        public async Task Search(string query, List <string> guilds, int limit)
        {
            var frame = new SocketFrame()
            {
                Operation = 8,
                Payload   = new Search
                {
                    query    = query,
                    limit    = limit,
                    guild_id = guilds
                }
            };

            await SendMessageAsync(JsonConvert.SerializeObject(frame));

            // var serialzedObject = ;
            // await _webMessageSocket.SendJsonObjectAsync(frame);
        }
コード例 #23
0
        private async void WebrtcManagerOnIpAndPortObtained(object sender, Tuple <string, ushort> e)
        {
            var info = new UdpProtocolInfo()
            {
                Address = e.Item1,
                Port    = e.Item2,
                Codecs  = new List <Codec>()
                {
                    new Codec()
                    {
                        Name           = "opus",
                        payloadType    = 120,
                        Priority       = 1000,
                        Type           = "audio",
                        rtxPayloadType = 120,
                    },
                    new Codec()
                    {
                        Name           = "VP8",
                        payloadType    = 101,
                        Priority       = 1000,
                        Type           = "video",
                        rtxPayloadType = 102,
                    },
                }.ToArray(),
                Mode = "xsalsa20_poly1305", //"_suffix"
            };

            var payload = new SelectProtocol()
            {
                Protocol = "udp",
                Data     = info,
            };

            SocketFrame package = new SocketFrame()
            {
                Operation = (int)OperationCode.SelectProtocol,
                Payload   = payload,
                Type      = EventNames.SELECT_PROTOCOL,
            };

            await _webMessageSocket.SendJsonObjectAsync(package);
        }
コード例 #24
0
ファイル: Gateway.cs プロジェクト: rafal06/Quarrel
        public async Task RequestAllGuildMembers(string guildid)
        {
            var payload = new GuildMembersRequest()
            {
                GuildId = guildid,
                Query   = "",
                Limit   = 0
            };

            var request = new SocketFrame()
            {
                Operation = (int)OperationCode.RequestGuildMembers,
                Payload   = payload
            };

            await SendMessageAsync(JsonConvert.SerializeObject(request));

            //await _webMessageSocket.SendJsonObjectAsync(request);
        }
コード例 #25
0
        public async void SendSpeaking(int speaking)
        {
            DownstreamEvents.Speak Event = new DownstreamEvents.Speak
            {
                Speaking = speaking,
            };
            Speak?.Invoke(this, new VoiceConnectionEventArgs <DownstreamEvents.Speak>(Event));

            var speakingPacket = new SocketFrame
            {
                Operation = OperationCode.Speaking.ToInt(),
                Payload   = new UpstreamEvents.Speak()
                {
                    Speaking = speaking,
                    Delay    = 0,
                    SSRC     = lastReady?.SSRC ?? 0,
                },
            };
            await _webMessageSocket.SendJsonObjectAsync(speakingPacket);
        }
コード例 #26
0
ファイル: Gateway.cs プロジェクト: rafal06/Quarrel
        public async Task SubscribeToGuildLazy(string guildId, IReadOnlyDictionary <string, IEnumerable <int[]> > channels = null, IEnumerable <string> members = null)
        {
            var updateGuildSubscriptions = new SocketFrame
            {
                Operation = (int)OperationCode.UpdateGuildSubscriptions,
                Payload   = new UpdateGuildSubscriptions()
                {
                    GuildId  = guildId,
                    Channels = channels,
                    Members  = members,
                    Typing   = true
                }
            };

            await SendMessageAsync(JsonConvert.SerializeObject(updateGuildSubscriptions, Formatting.None, new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore
            }
                                                               ));
        }
コード例 #27
0
ファイル: Gateway.cs プロジェクト: rafal06/Quarrel
        public async Task VoiceStatusUpdate(string guildId, string channelId, bool selfMute, bool selfDeaf)
        {
            var payload = new VoiceStatusUpdate()
            {
                GuildId   = guildId,
                ChannelId = channelId,
                Deaf      = selfDeaf,
                Mute      = selfMute
            };

            var request = new SocketFrame()
            {
                Operation = (int)OperationCode.VoiceStateUpdate,
                Payload   = payload
            };

            await SendMessageAsync(JsonConvert.SerializeObject(request));

            //await _webMessageSocket.SendJsonObjectAsync(request);
        }
コード例 #28
0
ファイル: Gateway.cs プロジェクト: rafal06/Quarrel
        public async Task RequestGuildMembers(IEnumerable <string> guildIds, string query, int?limit, bool?presences, IEnumerable <string> userIds)
        {
            var updateGuildSubscriptions = new SocketFrame
            {
                Operation = (int)OperationCode.RequestGuildMembers,
                Payload   = new GuildRequestMembers()
                {
                    GuildIds  = guildIds,
                    Query     = query,
                    Limit     = limit,
                    Presences = presences,
                    UserIds   = userIds
                }
            };

            await SendMessageAsync(JsonConvert.SerializeObject(updateGuildSubscriptions, Formatting.None, new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore
            }
                                                               ));
        }
コード例 #29
0
ファイル: Gateway.cs プロジェクト: rafal06/Quarrel
        private async Task SendHeartbeatAsync()
        {
            try
            {
                var heartbeatEvent = new SocketFrame
                {
                    Operation = OperationCode.Heartbeat.ToInt(),
                    Payload   = lastGatewayEventSeq
                };

                if (DateTime.Now.Day == 1 && DateTime.Now.Month == 4) //April 1st
                {
                    //App.PlayHeartBeat();
                }
                await SendMessageAsync(JsonConvert.SerializeObject(heartbeatEvent));

                //await _webMessageSocket.SendJsonObjectAsync(heartbeatEvent);
            }
            catch /*(Exception exception)*/
            {
                //App.NavigateToBugReport(exception);
            }
        }
コード例 #30
0
ファイル: VoiceConnection.cs プロジェクト: rafal06/Quarrel
        public async void SendSpeaking(bool speaking)
        {
            DownstreamEvents.Speak Event = new DownstreamEvents.Speak
            {
                Speaking = speaking
            };
            Speak?.Invoke(this, new VoiceConnectionEventArgs <DownstreamEvents.Speak>(Event));
            if (speaking == false)
            {
                SendSilence();
            }

            var speakingPacket = new SocketFrame
            {
                Operation = OperationCode.Speaking.ToInt(),
                Payload   = new UpstreamEvents.Speak()
                {
                    Speaking = speaking,
                    Delay    = 0,
                    SSRC     = lastReady != null ? lastReady.SSRC : 0
                }
            };
            await _webMessageSocket.SendJsonObjectAsync(speakingPacket);
        }