Ejemplo n.º 1
0
        void OnMessage(object sender, MessageEventArgs e)
        {
            Constants.WSPayload payload = WS.Deserialize(e.Data);

            if (payload.s != null)
            {
                sequence = payload.s.Value;
            }

            switch (payload.op)
            {
            case Constants.OPCODE_DISPACH:
                Dispach(payload);
                break;

            case Constants.OPCODE_HELLO:
                TimeSpan delay = TimeSpan.FromMilliseconds(payload.d.Value <int>("heartbeat_interval"));
                if (heartbeatTask == null)
                {
                    heartbeatTask = Server.Background.QueueRepeat(Beat, null, delay);
                }
                else
                {
                    heartbeatTask.Delay = delay;
                }

                if (resetting)
                {
                    SendOP(Constants.OPCODE_RESUME);
                }
                else
                {
                    SendOP(Constants.OPCODE_IDENTIFY);
                }
                resetting = false;
                break;

            case Constants.OPCODE_ACK:
                beat = false;
                break;

            case Constants.OPCODE_INVALID_SESSION:
                Thread.Sleep(4000);                         // supposed to be a random number between 1 and 5 seconds. I swear I rolled the dice
                SendOP(Constants.OPCODE_IDENTIFY);
                break;

            case Constants.OPCODE_RECONNECT:
                Debug("Discord asked to reconnect");
                Reset();
                break;

            default:
                Debug("Unhandled opcode " + payload.op.ToString() + ": " + payload.d);
                break;
            }
        }
Ejemplo n.º 2
0
        void Dispach(Constants.WSPayload payload)
        {
            switch (payload.t)
            {
            case "READY":
                Constants.Ready ready = new Constants.Ready(payload.d);
                user       = ready.data.user;
                session_id = ready.data.session_id;

                MCGalaxy.Logger.Log(LogType.ConsoleMessage, "Logged in as " + user.username + "#" + user.discriminator);
                authenticated = true;
                break;

            case "MESSAGE_CREATE":
                Constants.Message msg = new Constants.Message(payload.d);
                if (msg.data.channel_id != channelID || msg.data.author.id == user.id)
                {
                    break;
                }

                string nick = msg.data.author.username;
                if (msg.data.member.nick != null)
                {
                    nick = msg.data.member.nick;
                }

                OnMessageReceivedEvent.Call(nick, msg.data.content);
                break;


            case "MESSAGE_UPDATE":
            case "CHANNEL_UPDATE":
                break;

            case "GUILD_CREATE":
                Constants.GuildCreate data = new Constants.GuildCreate(payload.d);
                foreach (Constants.Channel channel in data.data.channels)
                {
                    if (channel.id == channelID)
                    {
                        Debug("Successfully authenticated!");
                    }
                }
                break;

            case "RESUMED":
                authenticated = true;
                break;

            default:
                Debug("Unhandled dispach " + payload.t + ": " + payload.d);
                break;
            }
        }