示例#1
0
        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;
            }
            }
        }
示例#2
0
        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;
            }
            }
        }