private void WS_OnMessage(string messageString) { // TODO: Debugging // Console.WriteLine($"WS Received => {messageString}"); GatewayMessage <dynamic> message = JsonConvert.DeserializeObject <GatewayMessage <dynamic> >(messageString); Console.WriteLine($"WS Handling message with OPCODE '{message.OpCode}'"); switch (message.OpCode) { case OpCode.Hello: { GatewayHelloMessage helloMessage = (GatewayHelloMessage)JsonConvert.DeserializeObject <GatewayHelloMessage>(JsonConvert.SerializeObject(message.Data)); Console.WriteLine($"WS Acknowledged heartbeat at {helloMessage.heartbeatInterval}ms interval"); // TODO: To know when to stop, pass CONNECTED or similar BY REFERENCE Utils.SetInterval(() => { this.Send(OpCode.Heartbeat, new ClientHeartbeatMessage(1, this.heartbeatLastSequence)); }, TimeSpan.FromMilliseconds(helloMessage.heartbeatInterval)); var dat = new ClientIdentifyMessage( this.client.GetToken(), new ClientIdentifyMessageProperties( "Linux", "disco", "disco" ), false, 250, // TODO: Hard-coded new int[] { 0, 1 }, // TODO: Also hard-coded new ClientPresence( new ClientPresenceGame("Sometg", 0), "dnd", 91879201, false ) ); this.Send(OpCode.Identify, dat); break; } case OpCode.Dispatch: { Console.WriteLine($" => '{message.Type}'"); switch (message.Type) { // General events case "READY": { // Fire event this.OnReady?.Invoke(this, null); break; } // Message Events case "MESSAGE_CREATE": { // Fire event this.OnMessageCreate?.Invoke(this, this.ConvertMessage <Structures.Message>(message)); break; } case "MESSAGE_DELETE": { // Fire event this.OnMessageDelete?.Invoke(this, this.ConvertMessage <MessageDeleteEvent>(message)); break; } // Guild Events case "GUILD_CREATE": { // Fire event this.OnGuildCreate?.Invoke(this, this.ConvertMessage <Guild>(message)); break; } case "GUILD_UPDATE": { // Fire event this.OnGuildUpdate?.Invoke(this, this.ConvertMessage <Guild>(message)); break; } case "GUILD_DELETE": { // Fire event this.OnGuildDelete?.Invoke(this, this.ConvertMessage <UnavailableGuild>(message)); break; } // User Events case "PRESENCE_UPDATE": { // Fire event this.OnPresenceUpdate?.Invoke(this, this.ConvertMessage <PresenceUpdateEvent>(message)); break; } default: { Console.WriteLine($"Unknown dispatch message type: {message.Type}"); break; } } break; } default: { Console.WriteLine($"WS Unable to handle message with OPCODE '{message.OpCode}' (Not implemented)"); break; } } }
private void WS_OnMessage(string messageString) { // TODO: Debugging // Console.WriteLine($"WS Received => {messageString}"); GatewayMessage <JObject> message = JsonConvert.DeserializeObject <GatewayMessage <JObject> >(messageString); Console.WriteLine($"WS Handling message with OPCODE '{message.OpCode}'"); switch (message.OpCode) { case OpCode.Hello: { GatewayHelloMessage helloMessage = this.ConvertMessage <GatewayHelloMessage>(message); Console.WriteLine($"WS Acknowledged heartbeat at {helloMessage.heartbeatInterval}ms interval"); // TODO: To know when to stop, pass CONNECTED or similar BY REFERENCE Utils.SetInterval(() => { this.Send(OpCode.Heartbeat, new ClientHeartbeatMessage(1, this.heartbeatLastSequence)); }, TimeSpan.FromMilliseconds(helloMessage.heartbeatInterval)); var dat = new ClientIdentifyMessage( this.client.GetToken(), new ClientIdentifyMessageProperties( "Linux", "disco", "disco" ), false, 250, // TODO: Hard-coded new int[] { 0, 1 }, // TODO: Also hard-coded new ClientPresence( new ClientPresenceGame("Sometg", 0), "dnd", 91879201, false ) ); this.Send(OpCode.Identify, dat); break; } case OpCode.Dispatch: { Console.WriteLine($" => '{message.Type}'"); switch (message.Type) { // General events case "READY": { // Fire event // this.OnReady?.Invoke(this, null); this.OnReady?.Invoke(this, this.ConvertMessage <ReadyEvent>(message)); break; } // Message Events case "MESSAGE_CREATE": { // Fire event this.OnMessageCreate?.Invoke(this, this.ConvertInjectableMessage <Structures.Message>(message)); break; } case "MESSAGE_UPDATE": { // Fire event // TODO: Message is partial, see (https://discordapp.com/developers/docs/topics/gateway#message-update) this.OnMessageUpdate?.Invoke(this, this.ConvertInjectableMessage <Structures.Message>(message)); break; } case "MESSAGE_DELETE": { // Fire event // TODO: Send message instead of event?? this.OnMessageDelete?.Invoke(this, this.ConvertMessage <MessageDeleteEvent>(message)); break; } case "MESSAGE_DELETE_BULK": { // Fire event this.OnMessageDeleteBulk?.Invoke(this, this.ConvertMessage <MessageDeleteBulkEvent>(message)); break; } case "MESSAGE_REACTION_ADD": { // Fire event this.OnMessageReactionAdd?.Invoke(this, this.ConvertMessage <MessageReactionEvent>(message)); break; } case "MESSAGE_REACTION_REMOVE": { // Fire event this.OnMessageReactionRemove?.Invoke(this, this.ConvertMessage <MessageReactionEvent>(message)); break; } case "MESSAGE_REACTION_REMOVE_ALL": { // Fire event this.OnMessageReactionRemoveAll?.Invoke(this, this.ConvertMessage <MessageReactionRemoveAllEvent>(message)); break; } // Guild Events case "GUILD_CREATE": { // Fire event this.OnGuildCreate?.Invoke(this, this.ConvertInjectableMessage <Guild>(message)); break; } case "GUILD_UPDATE": { // Fire event this.OnGuildUpdate?.Invoke(this, this.ConvertInjectableMessage <Guild>(message)); break; } case "GUILD_DELETE": { // Fire event this.OnGuildDelete?.Invoke(this, this.ConvertMessage <UnavailableGuild>(message)); break; } // User Events case "PRESENCE_UPDATE": { // Fire event this.OnPresenceUpdate?.Invoke(this, this.ConvertMessage <PresenceUpdateEvent>(message)); break; } case "TYPING_START": { // Fire event this.OnTypingStart?.Invoke(this, this.ConvertMessage <TypingStartEvent>(message)); break; } case "USER_UPDATE": { User updatedUser = this.ConvertMessage <User>(message); User?oldUser = null; if (this.client.users.ContainsKey(updatedUser.Id)) { oldUser = this.client.users[updatedUser.Id]; } this.OnUserUpdate?.Invoke(this, new UserUpdateEvent() { OldUser = oldUser, UpdatedUser = updatedUser }); break; } default: { Console.WriteLine($"Unknown dispatch message type: {message.Type}"); break; } } break; } default: { Console.WriteLine($"WS Unable to handle message with OPCODE '{message.OpCode}' (Not implemented)"); break; } } }