Exemplo n.º 1
0
        private void HandleEvent(DiscordGatewayPayload payload)
        {
            //TODO: This doesn't need a try catch, as it should Invoke(), it should not throw
            try
            {
                messageCallback.Invoke(payload);

                //string messageType = payload.EventType;
                //switch (messageType)
                //{
                //    case "MESSAGE_CREATE":
                //        messageCallback.Invoke(payload.EventData);
                //        break;
                //    case "GUILD_CREATE":
                //        guildCreateCallback.Invoke(payload.EventData);
                //        break;
                //    default:
                //        break;
                //}
            }
            catch (Exception ex)
            {
                Logger.LogException(ex);
            }
            //string sender = payload["s"]
            //messageCallback.Invoke()
        }
Exemplo n.º 2
0
        private void Heartbeat(object sender, ElapsedEventArgs e)
        {
            Console.WriteLine("Sent Heartbeat!");
            var heartBeatPayload = new DiscordGatewayPayload <dynamic>
            {
                Op = 1,
                D  = Sequence
            };

            Send(heartBeatPayload);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Any payload received from Gateway.
        /// The type of payload is defined by the Opcode
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnMessage(object sender, MessageReceivedEventArgs e)
        {
            try
            {
                //JObject payload = JObject.Parse(e.Message);

                DiscordGatewayPayload gatewayPayload = JsonConvert.DeserializeObject <DiscordGatewayPayload>(e.Message);

                // Update the last sequence received, used when sending heartbeats
                lastHeartbeatSequence = gatewayPayload.Sequence;

                // Opcodes 2, 3, 4, 6, and 8 are Send only, so they don't need to be handled here
                switch ((OpCode)gatewayPayload.Opcode)
                {
                case OpCode.Dispatch:
                    HandleEvent(gatewayPayload);
                    break;

                case OpCode.Heartbeat:
                    break;

                case OpCode.Reconnect:
                    break;

                case OpCode.InvalidSession:
                    break;

                case OpCode.Hello:
                    OnHelloReceived(gatewayPayload);
                    break;

                case OpCode.HeartbeatAck:
                    heartbeatAcknowledged = true;
                    break;

                default:
                    break;
                }

                //DELETE: This is only for testing
                if (gatewayPayload?.EventData != null)
                {
                    Logger.LogInfo(gatewayPayload.EventData.ToString());
                }
            }
            catch (Exception ex)
            {
                Logger.LogException(ex);
            }
        }
Exemplo n.º 4
0
        void OnMessageCreate(DiscordGatewayPayload payload)
        {
            try
            {
                Message message = payload.EventData.ToObject <Message>();

                FullMessage fullMessage = new FullMessage(this, message);

                CommandHandler?.HandleMessage(fullMessage);
            }
            catch (Exception ex)
            {
                Logger.LogException(ex);
            }
        }
Exemplo n.º 5
0
        void HandleGatewayEvent(DiscordGatewayPayload payload)
        {
            switch (payload.EventType)
            {
            case "MESSAGE_CREATE":
                OnMessageCreate(payload);
                break;

            case "GUILD_CREATE":
                CreateGuild(payload.EventData);
                break;

            default:
                break;
            }
        }
Exemplo n.º 6
0
        private void OnHelloReceived(DiscordGatewayPayload helloPayload)
        {
            try
            {
                //TODO: Define a Hello event structure instead of using JSON LINQ
                int interval = helloPayload.EventData["heartbeat_interval"].ToObject <int>();

                if (interval == 0)
                {
                    // TEMP - in case interval was not set, use a default
                    interval = 10000;
                }

                StartHeartbeat(interval);
            }
            catch (Exception ex)
            {
                Logger.LogException(ex);
            }
        }
Exemplo n.º 7
0
        private async Task _onWsMessage(object sender, MessageEventArgs msg)
        {
            var serializedPayload = msg.Data;

            var deserializedPayload = JsonConvert.DeserializeObject <DiscordGatewayPayload <dynamic> >(serializedPayload,
                                                                                                       new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore
            });

            if (deserializedPayload.S != 0)
            {
                Sequence = deserializedPayload.S;
            }

            switch (deserializedPayload.Op)
            {
            case 0:
            {
                switch (deserializedPayload.T)
                {
                case "READY":
                {
                    var readyPayload =
                        JsonConvert.DeserializeObject <DiscordGatewayPayload <ReadyPayload> >(
                            JsonConvert.SerializeObject(deserializedPayload));

                    Client.ClientUser = new ClientUser
                    {
                        Avatar        = readyPayload.D.User.Avatar,
                        Bot           = readyPayload.D.User.Bot,
                        Discriminator = readyPayload.D.User.Discriminator,
                        Flags         = readyPayload.D.User.Flags,
                        Id            = readyPayload.D.User.Id,
                        Username      = readyPayload.D.User.Username
                    };

                    SessionId = readyPayload.D.SessionId;

                    HeartbeatTimer.Start();
                    HeartbeatTimer.Elapsed += Heartbeat;

                    InitialGuilds = readyPayload.D.UnavailableGuilds.Length;

                    break;
                }

                case "GUILD_CREATE":
                {
                    var guildPayload =
                        JsonConvert.DeserializeObject <DiscordGatewayPayload <GuildCreatePayload> >(
                            JsonConvert.SerializeObject(deserializedPayload));

                    if (guildPayload.D.Lazy)
                    {
                        InitialGuilds--;
                        await Client.Guilds.GetOrCreateAsync(guildPayload.D.Id,
                                                             async() => JsonConvert
                                                             .DeserializeObject <DiscordGatewayPayload <Guild> >(JsonConvert.SerializeObject(guildPayload)).D);

                        if (InitialGuilds == 0)
                        {
                            Client.ReadyEvent(EventArgs.Empty);
                        }
                    }
                    else
                    {
                        var seeIfGuildWasUnavailable = await Client.UnavailableGuilds.GetAsync(guildPayload.D.Id);

                        if (seeIfGuildWasUnavailable == null)
                        {
                            var guild = await Client.Guilds.GetOrCreateAsync(guildPayload.D.Id,
                                                                             async() => JsonConvert
                                                                             .DeserializeObject <DiscordGatewayPayload <Guild> >(JsonConvert.SerializeObject(guildPayload)).D);

                            Client.GuildCreateEvent(guild);
                        }
                        else
                        {
                            var guild = await Client.Guilds.GetOrCreateAsync(guildPayload.D.Id,
                                                                             async() => JsonConvert
                                                                             .DeserializeObject <DiscordGatewayPayload <Guild> >(JsonConvert.SerializeObject(guildPayload)).D);

                            await Client.UnavailableGuilds.DeleteAsync(guildPayload.D.Id);

                            Client.GuildAvailableEvent(guild);
                        }
                    }

                    break;
                }

                case "GUILD_UPDATE":
                {
                    var guildPayload =
                        JsonConvert.DeserializeObject <DiscordGatewayPayload <GuildUpdatePayload> >(
                            JsonConvert.SerializeObject(deserializedPayload));

                    var findGuild = await Client.Guilds.GetAsync(guildPayload.D.Id);

                    if (findGuild == null)
                    {
                        // TODO: Create the route struct so that i can get the guild and add it to cache.
                    }
                    else
                    {
                        var newGuild = await Client.Guilds.UpdateAsync(guildPayload.D.Id,
                                                                       JsonConvert.DeserializeObject <DiscordGatewayPayload <Guild> >(
                                                                           JsonConvert.SerializeObject(deserializedPayload)).D);

                        Client.GuildUpdateEvent(new GuildUpdateEventArgs
                                {
                                    NewGuild = newGuild,
                                    OldGuild = findGuild
                                });
                    }

                    break;
                }

                case "GUILD_DELETE":
                {
                    var guildPayload =
                        JsonConvert.DeserializeObject <DiscordGatewayPayload <GuildDeletePayload> >(
                            JsonConvert.SerializeObject(deserializedPayload));

                    var findGuild = await Client.Guilds.GetAsync(guildPayload.D.Id);

                    if (findGuild == null)
                    {
                        // TODO: Create the route struct/class so that i can get the guild and add it to cache.
                    }
                    else
                    {
                        await Client.Guilds.DeleteAsync(guildPayload.D.Id);

                        if (guildPayload.D.Unavailable)
                        {
                            var unavailableGuild =
                                await Client.UnavailableGuilds.GetOrCreateAsync(guildPayload.D.Id, async() => findGuild);

                            Client.GuildUnavailableEvent(unavailableGuild);
                        }
                        else
                        {
                            Client.GuildDeleteEvent(findGuild);
                        }
                    }

                    break;
                }
                }

                break;
            }

            case 10:
            {
                var helloPayload =
                    JsonConvert.DeserializeObject <DiscordGatewayPayload <HelloPayload> >(
                        JsonConvert.SerializeObject(deserializedPayload));

                if (HeartbeatTimer != null)
                {
                    HeartbeatTimer.Elapsed -= Heartbeat;
                    HeartbeatTimer.Stop();
                    HeartbeatTimer.Dispose();
                }

                HeartbeatTimer           = new Timer(helloPayload.D.HeartbeatInterval);
                HeartbeatTimer.AutoReset = true;

                var identifyPayload = new DiscordGatewayPayload <IdentifyPayload>
                {
                    Op = 2,
                    D  = new IdentifyPayload
                    {
                        Token      = Client.Token,
                        Properties = new IdentifyPropertiesPayload
                        {
                            Browser = "Disharp",
                            Device  = "Disharp",
                            Os      = Environment.OSVersion.Platform.ToString()
                        },
                        Compress       = false,
                        LargeThreshold = Client.ClientOptions.LargeThreshold,
                        Presence       = Client.ClientOptions.WsOptions.Presence,
                        Intents        = Client.ClientOptions.WsOptions.Intents
                    }
                };

                Send(identifyPayload);
                break;
            }
            }

            Console.WriteLine(JsonConvert.SerializeObject(deserializedPayload));
        }