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 } }); }
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); }
//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); }