예제 #1
0
        protected void Heartbeat(HelloObject gatewayObject, CancellationTokenSource heartbeatCancelToken)
        {
            while (Client.State == WebSocketState.Open && !heartbeatCancelToken.IsCancellationRequested)
            {
                // Wait to send the heartbeat based on the heartbeat interval:
                heartbeatCancelToken.Token.WaitHandle.WaitOne(gatewayObject.EventData.HeartbeatInterval);

                // Check state again for thread safety:
                if (Client.State == WebSocketState.Open)
                {
                    // TODO: Cache sequence number:
                    string sequenceNumber = gatewayObject.SequenceNumber.ToString();
                    if (string.IsNullOrEmpty(sequenceNumber))
                    {
                        sequenceNumber = "null";
                    }

                    // Send heartbeat:
                    Heartbeat heartbeat = new Heartbeat();
                    heartbeat.EventData = sequenceNumber;

                    string message = serializer.Serialize(heartbeat);

                    try
                    {
                        SendAsync(message);
                    }
                    catch (Exception) { }
                }
            }
        }
        public static TheoryData <ValueObject?, ValueObject?, string> DifferentValueObjectsScenarios()
        {
            var valueObjectA = new BaseObject();
            var valueObjectB = new HelloObject();
            var valueObjectC = new ByeObject();

            var becauseMessage = "these objects are different";

            return(new TheoryData <ValueObject?, ValueObject?, string>
            {
                { null, valueObjectA, becauseMessage },
                { valueObjectA, null, becauseMessage },
                { valueObjectB, valueObjectC, becauseMessage }
            });
        }
예제 #3
0
        private async Task <bool> Hello()
        {
            // Receive the "Hello" payload:
            HelloObject response = await listener.ReceiveAsync <HelloObject>();

            // Spin up thread for heartbeat:
            if (response.OpCode == (int)OpCodes.Hello)
            {
                if (heartbeatCancelToken == null)
                {
                    heartbeatCancelToken = new CancellationTokenSource();
                }

                // If currently heartbeating, finish the current heartbeat and create a new one:
                if (HeartBeat != null)
                {
                    heartbeatCancelToken.Cancel();
                    HeartBeat.Wait();

                    heartbeatCancelToken.Dispose();
                    heartbeatCancelToken = new CancellationTokenSource();

                    HeartBeat.Dispose();
                }

                HeartBeat = new Task(() => Heartbeat(response, heartbeatCancelToken));
                HeartBeat.Start();

                return(true);
            }
            else
            {
                await Client.CloseAsync(WebSocketCloseStatus.Empty, "Did not receive a proper 'Hello' response from Discord's server.", CancellationToken.None);
            }

            return(false);
        }
예제 #4
0
        //private WorldObject getMoneyFromWord( )
        //{
        //    throw new NotImplementedException();
        //}

        //private WorldObject getLocationWord( )
        //{
        //    var res = new LocationObject(Text);
        //    return res;
        //}

        private WorldObject getHelloFromWord( )
        {
            var res = new HelloObject(Text);

            return(res);
        }