Beispiel #1
0
        public WebSocket(SessionThread sessionThread, InternalConnectionOptions options, string serverAddress, StreamListener streamListener, ConnectionListener connListener)
        {
            this.sessionThread = sessionThread;
            this.options       = options;
            if (TransportFactory <WebSocketProvider> .DefaultWebSocketFactory == null)
            {
                /* Note:
                 * this is a temporary hack. If the WebSocket support is not available, the transport uses a void implementation
                 * which just ignores the requests.
                 * The goal is to emulate the behavior of the old (non TLCP) Android compact client.
                 * That client doesn't support WebSocket, so when a user forces WebSocket transport
                 * the client simply ignores the requests.
                 * In the future we must address this question and work out a more user-friendly API behavior.
                 */
                this.wsClient = new DummyWebSocketClient();
            }
            else
            {
                this.wsClient = TransportFactory <WebSocketProvider> .DefaultWebSocketFactory.getInstance(sessionThread);
            }

            this.sessionListener = new MySessionRequestListener(sessionThread, streamListener, connListener);
            open(serverAddress, streamListener, connListener);

            if (log.IsDebugEnabled)
            {
                log.Debug("WebSocket transport - : " + sessionListener.state);
            }
        }
        public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketProvider webSocketProvider, string userAgent,
            string url = null, RetryMode defaultRetryMode = RetryMode.AlwaysRetry, JsonSerializer serializer = null,
            RateLimitPrecision rateLimitPrecision = RateLimitPrecision.Second,
			bool useSystemClock = true)
            : base(restClientProvider, userAgent, defaultRetryMode, serializer, rateLimitPrecision, useSystemClock)
        {
            _gatewayUrl = url;
            if (url != null)
                _isExplicitUrl = true;
            WebSocketClient = webSocketProvider();
            //WebSocketClient.SetHeader("user-agent", DiscordConfig.UserAgent); (Causes issues in .NET Framework 4.6+)

            WebSocketClient.BinaryMessage += async (data, index, count) =>
            {
                using (var decompressed = new MemoryStream())
                {
                    if (data[0] == 0x78)
                    {
                        //Strip the zlib header
                        _compressed.Write(data, index + 2, count - 2);
                        _compressed.SetLength(count - 2);
                    }
                    else
                    {
                        _compressed.Write(data, index, count);
                        _compressed.SetLength(count);
                    }

                    //Reset positions so we don't run out of memory
                    _compressed.Position = 0;
                    _decompressor.CopyTo(decompressed);
                    _compressed.Position = 0;
                    decompressed.Position = 0;

                    using (var reader = new StreamReader(decompressed))
                    using (var jsonReader = new JsonTextReader(reader))
                    {
                        var msg = _serializer.Deserialize<SocketFrame>(jsonReader);
                        if (msg != null)
                            await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false);
                    }
                }
            };
            WebSocketClient.TextMessage += async text =>
            {
                using (var reader = new StringReader(text))
                using (var jsonReader = new JsonTextReader(reader))
                {
                    var msg = _serializer.Deserialize<SocketFrame>(jsonReader);
                    if (msg != null)
                        await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false);
                }
            };
            WebSocketClient.Closed += async ex =>
            {
                await DisconnectAsync().ConfigureAwait(false);
                await _disconnectedEvent.InvokeAsync(ex).ConfigureAwait(false);
            };
        }
        internal static async Task <T> SendWebSocketDataWithCallClientServiceMethod <T>(ServerBase serverBase, ClientInfo client, Type returnType, string serviceName, string methodName, params Shared.Models.ParameterInfo[] args)
        {
            if (returnType == null || returnType == typeof(void))
            {
                returnType = typeof(object);
            }
            else if (returnType.GetBaseType() == typeof(Task))
            {
                returnType = returnType.GetGenericArguments()[0];
            }

            if (methodName.LastIndexOf("Async", StringComparison.OrdinalIgnoreCase) == methodName.Length - 5)
            {
                methodName = methodName.Substring(0, methodName.Length - 5);
            }
#if (NET35 || NET40)
            return(null);// Task<object>.Factory.StartNew(run);
#else
            Type           type = typeof(TaskCompletionSource <>).MakeGenericType(returnType);
            object         taskCompletionSource = Activator.CreateInstance(type);
            MethodCallInfo callInfo             = new MethodCallInfo();
            callInfo.ServiceName = serviceName;
            callInfo.MethodName  = methodName;
            callInfo.Parameters  = args;
            string guid = Guid.NewGuid().ToString();
            callInfo.Guid = guid;
            serverBase.ClientServiceCallMethodsResult.TryAdd(guid, new KeyValue <Type, object>(returnType, taskCompletionSource));

            string json = ServerSerializationHelper.SerializeObject(callInfo, serverBase);
            ///when length is large we need to send data by parts
            if (json.Length > 30000)
            {
                List <string> listOfParts = WebSocketProvider.GeneratePartsOfData(json);
                int           i           = 1;
                foreach (string item in listOfParts)
                {
                    MethodCallInfo cb = callInfo.Clone();
                    cb.PartNumber = i == listOfParts.Count ? (short)-1 : (short)i;
                    json          = (int)DataType.CallMethod + "," + (int)CompressMode.None + "/" + ServerSerializationHelper.SerializeObject(cb, serverBase);
                    byte[] bytes = Encoding.UTF8.GetBytes(json);
                    await client.StreamHelper.WriteToStreamAsync(client.ClientStream, bytes);

                    i++;
                }
            }
            else
            {
                json = (int)DataType.CallMethod + "," + (int)CompressMode.None + "/" + json;
                byte[] bytes = Encoding.UTF8.GetBytes(json);
                await client.StreamHelper.WriteToStreamAsync(client.ClientStream, bytes);
            }
            object value  = taskCompletionSource.GetType().GetProperty("Task").GetValue(taskCompletionSource, null);
            T      result = await(Task <T>) value;
            return(result);
#endif
        }
Beispiel #4
0
        public DiscordRpcConfig()
        {
#if NETSTANDARD1_3
            WebSocketProvider = () => new DefaultWebSocketClient();
#else
            WebSocketProvider = () =>
            {
                throw new InvalidOperationException("The default websocket provider is not supported on this platform.\n" +
                                                    "You must specify a WebSocketProvider or target a runtime supporting .NET Standard 1.3, such as .NET Framework 4.6+.");
            };
#endif
        }
        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()
            };
        }
Beispiel #6
0
        public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketProvider webSocketProvider, string userAgent,
                                      string url = null, RetryMode defaultRetryMode = RetryMode.AlwaysRetry, JsonSerializer serializer = null)
            : base(restClientProvider, userAgent, defaultRetryMode, serializer)
        {
            _gatewayUrl = url;
            if (url != null)
            {
                _isExplicitUrl = true;
            }
            WebSocketClient = webSocketProvider();
            //WebSocketClient.SetHeader("user-agent", DiscordConfig.UserAgent); (Causes issues in .NET Framework 4.6+)
            WebSocketClient.BinaryMessage += async(data, index, count) =>
            {
                using (var compressed = new MemoryStream(data, index + 2, count - 2))
                    using (var decompressed = new MemoryStream())
                    {
                        using (var zlib = new DeflateStream(compressed, CompressionMode.Decompress))
                            zlib.CopyTo(decompressed);
                        decompressed.Position = 0;
                        using (var reader = new StreamReader(decompressed))
                            using (var jsonReader = new JsonTextReader(reader))
                            {
                                var msg = _serializer.Deserialize <SocketFrame>(jsonReader);
                                if (msg != null)
                                {
                                    await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false);
                                }
                            }
                    }
            };
            WebSocketClient.TextMessage += async text =>
            {
                using (var reader = new StringReader(text))
                    using (var jsonReader = new JsonTextReader(reader))
                    {
                        var msg = _serializer.Deserialize <SocketFrame>(jsonReader);
                        if (msg != null)
                        {
                            await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false);
                        }
                    }
            };
            WebSocketClient.Closed += async ex =>
            {
                await DisconnectAsync().ConfigureAwait(false);

                await _disconnectedEvent.InvokeAsync(ex).ConfigureAwait(false);
            };
        }
Beispiel #7
0
        public PoAHelper(string endpointPoA, CallbackHandler callback, string endpointCyprus = null)
        {
            this.callback = callback;

            // websocket connection
            connection = new WebSocketProvider(endpointPoA)
            {
                OnConnected    = OnConnected,
                OnDisconnected = OnDisconnected,
                OnReceived     = OnMessage
            };

            // cyprus helper
            if (!string.IsNullOrEmpty(endpointCyprus))
            {
                Cyprus = new CyprusHelper(endpointCyprus);
            }
        }
        internal DiscordVoiceAPIClient(ulong guildId, WebSocketProvider webSocketProvider, JsonSerializer serializer = null)
        {
            GuildId         = guildId;
            _connectionLock = new SemaphoreSlim(1, 1);
            _udp            = new UdpClient(new IPEndPoint(IPAddress.Any, 0));

            _webSocketClient = webSocketProvider();
            //_gatewayClient.SetHeader("user-agent", DiscordConfig.UserAgent); (Causes issues in .Net 4.6+)
            _webSocketClient.BinaryMessage += async(data, index, count) =>
            {
                using (var compressed = new MemoryStream(data, index + 2, count - 2))
                    using (var decompressed = new MemoryStream())
                    {
                        using (var zlib = new DeflateStream(compressed, CompressionMode.Decompress))
                            zlib.CopyTo(decompressed);
                        decompressed.Position = 0;
                        using (var reader = new StreamReader(decompressed))
                        {
                            var msg = JsonConvert.DeserializeObject <WebSocketMessage>(reader.ReadToEnd());
                            await _receivedEvent.InvokeAsync((VoiceOpCode)msg.Operation, msg.Payload).ConfigureAwait(false);
                        }
                    }
            };
            _webSocketClient.TextMessage += async text =>
            {
                var msg = JsonConvert.DeserializeObject <WebSocketMessage>(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()
            };
        }
Beispiel #9
0
        public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketProvider webSocketProvider, JsonSerializer serializer = null, RequestQueue requestQueue = null)
            : base(restClientProvider, serializer, requestQueue)
        {
            _gatewayClient = webSocketProvider();
            //_gatewayClient.SetHeader("user-agent", DiscordConfig.UserAgent); (Causes issues in .Net 4.6+)
            _gatewayClient.BinaryMessage += async(data, index, count) =>
            {
                using (var compressed = new MemoryStream(data, index + 2, count - 2))
                    using (var decompressed = new MemoryStream())
                    {
                        using (var zlib = new DeflateStream(compressed, CompressionMode.Decompress))
                            zlib.CopyTo(decompressed);
                        decompressed.Position = 0;
                        using (var reader = new StreamReader(decompressed))
                            using (var jsonReader = new JsonTextReader(reader))
                            {
                                var msg = _serializer.Deserialize <WebSocketMessage>(jsonReader);
                                await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false);
                            }
                    }
            };
            _gatewayClient.TextMessage += async text =>
            {
                using (var reader = new StringReader(text))
                    using (var jsonReader = new JsonTextReader(reader))
                    {
                        var msg = _serializer.Deserialize <WebSocketMessage>(jsonReader);
                        await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false);
                    }
            };
            _gatewayClient.Closed += async ex =>
            {
                await DisconnectAsync().ConfigureAwait(false);

                await _disconnectedEvent.InvokeAsync(ex).ConfigureAwait(false);
            };
        }
        public DiscordRpcApiClient(string clientId, string userAgent, string origin, RestClientProvider restClientProvider, WebSocketProvider webSocketProvider,
                                   RetryMode defaultRetryMode = RetryMode.AlwaysRetry, JsonSerializer serializer = null)
            : base(restClientProvider, userAgent, defaultRetryMode, serializer)
        {
            _connectionLock = new SemaphoreSlim(1, 1);
            _clientId       = clientId;
            _origin         = origin;

            _requests = new ConcurrentDictionary <Guid, RpcRequest>();

            _webSocketClient = webSocketProvider();
            //_webSocketClient.SetHeader("user-agent", DiscordConfig.UserAgent); (Causes issues in .Net 4.6+)
            _webSocketClient.SetHeader("origin", _origin);
            _webSocketClient.BinaryMessage += async(data, index, count) =>
            {
                using (var compressed = new MemoryStream(data, index + 2, count - 2))
                    using (var decompressed = new MemoryStream())
                    {
                        using (var zlib = new DeflateStream(compressed, CompressionMode.Decompress))
                            zlib.CopyTo(decompressed);
                        decompressed.Position = 0;
                        using (var reader = new StreamReader(decompressed))
                            using (var jsonReader = new JsonTextReader(reader))
                            {
                                var msg = _serializer.Deserialize <API.Rpc.RpcFrame>(jsonReader);
                                await _receivedRpcEvent.InvokeAsync(msg.Cmd, msg.Event, msg.Data).ConfigureAwait(false);

                                if (msg.Nonce.IsSpecified && msg.Nonce.Value.HasValue)
                                {
                                    ProcessMessage(msg);
                                }
                            }
                    }
            };
            _webSocketClient.TextMessage += async text =>
            {
                using (var reader = new StringReader(text))
                    using (var jsonReader = new JsonTextReader(reader))
                    {
                        var msg = _serializer.Deserialize <API.Rpc.RpcFrame>(jsonReader);
                        await _receivedRpcEvent.InvokeAsync(msg.Cmd, msg.Event, msg.Data).ConfigureAwait(false);

                        if (msg.Nonce.IsSpecified && msg.Nonce.Value.HasValue)
                        {
                            ProcessMessage(msg);
                        }
                    }
            };
            _webSocketClient.Closed += async ex =>
            {
                await DisconnectAsync().ConfigureAwait(false);

                await _disconnectedEvent.InvokeAsync(ex).ConfigureAwait(false);
            };
        }
Beispiel #11
0
        public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketProvider webSocketProvider, string userAgent,
                                      string url          = null, RetryMode defaultRetryMode = RetryMode.AlwaysRetry, JsonSerializer serializer = null,
                                      bool useSystemClock = true, Func <IRateLimitInfo, Task> defaultRatelimitCallback = null)
            : base(restClientProvider, userAgent, defaultRetryMode, serializer, useSystemClock, defaultRatelimitCallback)
        {
            _gatewayUrl = url;
            if (url != null)
            {
                _isExplicitUrl = true;
            }
            WebSocketClient = webSocketProvider();
            //WebSocketClient.SetHeader("user-agent", DiscordConfig.UserAgent); (Causes issues in .NET Framework 4.6+)

            WebSocketClient.BinaryMessage += async(data, index, count) =>
            {
                using (var decompressed = new MemoryStream())
                {
                    if (data[0] == 0x78)
                    {
                        //Strip the zlib header
                        _compressed.Write(data, index + 2, count - 2);
                        _compressed.SetLength(count - 2);
                    }
                    else
                    {
                        _compressed.Write(data, index, count);
                        _compressed.SetLength(count);
                    }

                    //Reset positions so we don't run out of memory
                    _compressed.Position = 0;
                    _decompressor.CopyTo(decompressed);
                    _compressed.Position  = 0;
                    decompressed.Position = 0;

                    using (var reader = new StreamReader(decompressed))
                        using (var jsonReader = new JsonTextReader(reader))
                        {
                            var msg = _serializer.Deserialize <SocketFrame>(jsonReader);

                            if (msg != null)
                            {
#if DEBUG_PACKETS
                                Console.WriteLine($"<- {(GatewayOpCode)msg.Operation} [{msg.Type ?? "none"}] : {(msg.Payload as Newtonsoft.Json.Linq.JToken)?.ToString().Length}");
#endif

                                await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false);
                            }
                        }
                }
            };
            WebSocketClient.TextMessage += async text =>
            {
                using (var reader = new StringReader(text))
                    using (var jsonReader = new JsonTextReader(reader))
                    {
                        var msg = _serializer.Deserialize <SocketFrame>(jsonReader);
                        if (msg != null)
                        {
#if DEBUG_PACKETS
                            Console.WriteLine($"<- {(GatewayOpCode)msg.Operation} [{msg.Type ?? "none"}] : {(msg.Payload as Newtonsoft.Json.Linq.JToken)?.ToString().Length}");
#endif

                            await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false);
                        }
                    }
            };
            WebSocketClient.Closed += async ex =>
            {
#if DEBUG_PACKETS
                Console.WriteLine(ex);
#endif

                await DisconnectAsync().ConfigureAwait(false);

                await _disconnectedEvent.InvokeAsync(ex).ConfigureAwait(false);
            };
        }