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