private void SocketDataReceived(object sender, WebSocketSharp.MessageEventArgs result) { GatewayResponse payload = result.Data.Deserialize <GatewayResponse>(); Sequence = payload.Sequence; Task.Run(() => { switch (payload.Opcode) { case GatewayOpcode.Event: switch (payload.Title) { case "READY": LoggedIn = true; Login login = payload.Deserialize <Login>().SetJson(payload.Deserialize <JObject>()).SetClient(this); this.User = login.User; this.SessionId = login.SessionId; OnLoggedIn?.Invoke(this, new LoginEventArgs(login)); break; case "USER_SETTINGS_UPDATE": OnSettingsUpdated?.Invoke(this, new SettingsUpdatedEventArgs(payload.Deserialize <Settings>())); break; case "USER_UPDATE": User user = payload.Deserialize <User>().SetClient(this); if (user.Id == User.Id) { User.Update(user); } OnUserUpdated?.Invoke(this, new UserEventArgs(user)); break; case "GUILD_MEMBER_LIST_UPDATE": /* * var args = new GuildMembersEventArgs(payload.Deserialize<GatewayUserMemberQueryResponse>()); * * foreach (var member in args.Members) * { * member.SetClient(this); * member.GuildId = args.GuildId; * } * * OnGuildMembersReceived?.Invoke(this, args);*/ break; case "GUILD_CREATE": OnJoinedGuild?.Invoke(this, new SocketGuildEventArgs(payload.Deserialize <SocketGuild>().SetClient(this))); break; case "GUILD_UPDATE": OnGuildUpdated?.Invoke(this, new GuildEventArgs(payload.Deserialize <Guild>().SetClient(this))); break; case "GUILD_DELETE": OnLeftGuild?.Invoke(this, new GuildEventArgs(payload.Deserialize <Guild>().SetClient(this))); break; case "GUILD_MEMBER_ADD": OnUserJoinedGuild?.Invoke(this, new GuildMemberEventArgs(payload.Deserialize <GuildMemberUpdate>().SetClient(this).Member)); break; case "GUILD_MEMBER_REMOVE": OnUserLeftGuild?.Invoke(this, new GuildMemberEventArgs(payload.Deserialize <GuildMemberUpdate>().SetClient(this).Member)); break; case "GUILD_MEMBER_UPDATE": OnGuildMemberUpdated?.Invoke(this, new GuildMemberEventArgs(payload.Deserialize <GuildMember>().SetClient(this))); break; case "GUILD_MEMBERS_CHUNK": OnGuildMembersReceived?.Invoke(this, new GuildMembersEventArgs(payload.Deserialize <GuildMemberList>().SetClient(this))); break; case "PRESENCE_UPDATE": OnUserPresenceUpdated?.Invoke(this, new PresenceUpdatedEventArgs(payload.Deserialize <PresenceUpdate>())); break; case "VOICE_STATE_UPDATE": OnVoiceStateUpdated?.Invoke(this, new VoiceStateEventArgs(payload.Deserialize <DiscordVoiceState>().SetClient(this))); break; case "VOICE_SERVER_UPDATE": OnVoiceServer?.Invoke(this, payload.Deserialize <DiscordVoiceServer>()); break; case "GUILD_ROLE_CREATE": OnRoleCreated?.Invoke(this, new RoleEventArgs(payload.Deserialize <RoleContainer>().Role.SetClient(this))); break; case "GUILD_ROLE_UPDATE": OnRoleUpdated?.Invoke(this, new RoleEventArgs(payload.Deserialize <RoleContainer>().Role.SetClient(this))); break; case "GUILD_EMOJIS_UPDATE": OnEmojisUpdated?.Invoke(this, new EmojisUpdatedEventArgs(payload.Deserialize <EmojiContainer>().SetClient(this))); break; case "CHANNEL_CREATE": OnChannelCreated?.Invoke(this, new ChannelEventArgs(payload.Deserialize <GuildChannel>().SetClient(this))); break; case "CHANNEL_UPDATE": OnChannelUpdated?.Invoke(this, new ChannelEventArgs(payload.Deserialize <GuildChannel>().SetClient(this))); break; case "CHANNEL_DELETE": OnChannelDeleted?.Invoke(this, new ChannelEventArgs(payload.Deserialize <GuildChannel>().SetClient(this))); break; case "TYPING_START": OnUserTyping?.Invoke(this, new UserTypingEventArgs(payload.Deserialize <UserTyping>())); break; case "MESSAGE_CREATE": OnMessageReceived?.Invoke(this, new MessageEventArgs(payload.Deserialize <Message>().SetClient(this))); break; case "MESSAGE_UPDATE": OnMessageEdited?.Invoke(this, new MessageEventArgs(payload.Deserialize <Message>().SetClient(this))); break; case "MESSAGE_DELETE": OnMessageDeleted?.Invoke(this, new MessageDeletedEventArgs(payload.Deserialize <DeletedMessage>())); break; case "MESSAGE_REACTION_ADD": OnMessageReactionAdded?.Invoke(this, new ReactionEventArgs(payload.Deserialize <MessageReactionUpdate>().SetClient(this))); break; case "MESSAGE_REACTION_REMOVE": OnMessageReactionRemoved?.Invoke(this, new ReactionEventArgs(payload.Deserialize <MessageReactionUpdate>().SetClient(this))); break; case "GUILD_BAN_ADD": OnUserBanned?.Invoke(this, new BanUpdateEventArgs(payload.Deserialize <BanContainer>().SetClient(this))); break; case "GUILD_BAN_REMOVE": OnUserUnbanned?.Invoke(this, new BanUpdateEventArgs(payload.Deserialize <BanContainer>().SetClient(this))); break; case "RELATIONSHIP_ADD": OnRelationshipAdded?.Invoke(this, new RelationshipEventArgs(payload.Deserialize <Relationship>().SetClient(this))); break; case "RELATIONSHIP_REMOVE": OnRelationshipRemoved?.Invoke(this, new RelationshipEventArgs(payload.Deserialize <Relationship>().SetClient(this))); break; case "USER_CONNECTIONS_UPDATE": try { DiscordProfile profile = this.User.GetProfile(); OnProfileUpdated?.Invoke(this, new ProfileUpdatedEventArgs(profile)); } catch { } break; case "MESSAGE_ACK": // triggered whenever another person logged into the account acknowledges a message break; case "SESSIONS_REPLACE": OnSessionsUpdated?.Invoke(this, new DiscordSessionsEventArgs(payload.Deserialize <List <DiscordSession> >())); break; } break; case GatewayOpcode.InvalidSession: this.LoginToGateway(); break; case GatewayOpcode.Connected: if (!LoggedIn) { this.LoginToGateway(); } else { this.Resume(); } int interval = payload.Deserialize <JObject>().GetValue("heartbeat_interval").ToObject <int>(); try { while (true) { Socket.Send(GatewayOpcode.Heartbeat, this.Sequence); Thread.Sleep(interval); } } catch { } break; } }); }
private void SocketDataReceived(object sender, WebSocketSharp.MessageEventArgs result) { GatewayResponse payload = result.Data.Deserialize <GatewayResponse>(); Sequence = payload.Sequence; switch (payload.Opcode) { case GatewayOpcode.Event: switch (payload.Title) { case "READY": LoggedIn = true; Login login = payload.Deserialize <Login>().SetJson(payload.Deserialize <JObject>()).SetClient(this); this.User = login.User; this.SessionId = login.SessionId; OnLoggedIn?.Invoke(this, new LoginEventArgs(login)); break; case "USER_SETTINGS_UPDATE": OnSettingsUpdated?.Invoke(this, new SettingsUpdatedEventArgs(payload.Deserialize <Settings>())); break; case "USER_UPDATE": User user = payload.Deserialize <User>().SetClient(this); if (user.Id == User.Id) { User.Update(user); } OnUserUpdated?.Invoke(this, new UserEventArgs(user)); break; case "GUILD_CREATE": OnJoinedGuild?.Invoke(this, new GuildEventArgs(payload.Deserialize <Guild>().SetClient(this))); break; case "GUILD_UPDATE": OnGuildUpdated?.Invoke(this, new GuildEventArgs(payload.Deserialize <Guild>().SetClient(this))); break; case "GUILD_DELETE": OnLeftGuild?.Invoke(this, new GuildEventArgs(payload.Deserialize <Guild>().SetClient(this))); break; case "GUILD_MEMBER_ADD": OnUserJoinedGuild?.Invoke(this, new GuildMemberEventArgs(payload.Deserialize <GuildMemberUpdate>().SetClient(this).Member)); break; case "GUILD_MEMBER_REMOVE": OnUserLeftGuild?.Invoke(this, new GuildMemberEventArgs(payload.Deserialize <GuildMemberUpdate>().SetClient(this).Member)); break; case "GUILD_MEMBER_UPDATE": OnGuildMemberUpdated?.Invoke(this, new GuildMemberEventArgs(payload.Deserialize <GuildMember>().SetClient(this))); break; case "GUILD_MEMBERS_CHUNK": OnGuildMembersReceived?.Invoke(this, new GuildMembersEventArgs(payload.Deserialize <GuildMemberList>().SetClient(this))); break; case "PRESENCE_UPDATE": OnUserPresenceUpdated?.Invoke(this, new PresenceUpdatedEventArgs(payload.Deserialize <PresenceUpdate>())); break; case "VOICE_STATE_UPDATE": VoiceState state = payload.Deserialize <VoiceState>().SetClient(this); if (state.ChannelId != null) { OnUserJoinedVoiceChannel?.Invoke(this, new VoiceStateEventArgs(state)); } else { OnUserLeftVoiceChannel?.Invoke(this, new VoiceStateEventArgs(state)); } break; case "GUILD_ROLE_CREATE": OnRoleCreated?.Invoke(this, new RoleEventArgs(payload.Deserialize <RoleContainer>().Role.SetClient(this))); break; case "GUILD_ROLE_UPDATE": OnRoleUpdated?.Invoke(this, new RoleEventArgs(payload.Deserialize <RoleContainer>().Role.SetClient(this))); break; case "GUILD_EMOJIS_UPDATE": OnEmojisUpdated?.Invoke(this, new EmojisUpdatedEventArgs(payload.Deserialize <EmojiContainer>().SetClient(this))); break; case "CHANNEL_CREATE": OnChannelCreated?.Invoke(this, new ChannelEventArgs(payload.Deserialize <GuildChannel>().SetClient(this))); break; case "CHANNEL_UPDATE": OnChannelUpdated?.Invoke(this, new ChannelEventArgs(payload.Deserialize <GuildChannel>().SetClient(this))); break; case "CHANNEL_DELETE": OnChannelDeleted?.Invoke(this, new ChannelEventArgs(payload.Deserialize <GuildChannel>().SetClient(this))); break; case "TYPING_START": OnUserTyping?.Invoke(this, new UserTypingEventArgs(payload.Deserialize <UserTyping>())); break; case "MESSAGE_CREATE": OnMessageReceived?.Invoke(this, new MessageEventArgs(payload.Deserialize <Message>().SetClient(this))); break; case "MESSAGE_UPDATE": OnMessageEdited?.Invoke(this, new MessageEventArgs(payload.Deserialize <Message>().SetClient(this))); break; case "MESSAGE_DELETE": OnMessageDeleted?.Invoke(this, new MessageDeletedEventArgs(payload.Deserialize <DeletedMessage>())); break; case "MESSAGE_REACTION_ADD": OnMessageReactionAdded?.Invoke(this, new ReactionEventArgs(payload.Deserialize <MessageReactionUpdate>().SetClient(this))); break; case "MESSAGE_REACTION_REMOVE": OnMessageReactionRemoved?.Invoke(this, new ReactionEventArgs(payload.Deserialize <MessageReactionUpdate>().SetClient(this))); break; case "GUILD_BAN_ADD": OnUserBanned?.Invoke(this, new BanUpdateEventArgs(payload.Deserialize <BanContainer>().SetClient(this))); break; case "GUILD_BAN_REMOVE": OnUserUnbanned?.Invoke(this, new BanUpdateEventArgs(payload.Deserialize <BanContainer>().SetClient(this))); break; case "RELATIONSHIP_ADD": OnRelationshipAdded?.Invoke(this, new RelationshipEventArgs(payload.Deserialize <Relationship>().SetClient(this))); break; case "RELATIONSHIP_REMOVE": OnRelationshipRemoved?.Invoke(this, new RelationshipEventArgs(payload.Deserialize <Relationship>().SetClient(this))); break; case "USER_CONNECTIONS_UPDATE": Task.Run(() => { DiscordProfile profile = this.User.GetProfile(); OnProfileUpdated?.Invoke(this, new ProfileUpdatedEventArgs(profile)); }); break; } break; case GatewayOpcode.InvalidSession: this.LoginToGateway(); break; case GatewayOpcode.Connected: if (!LoggedIn) { this.LoginToGateway(); } else { this.Resume(); } this.StartHeartbeatHandlersAsync(payload.Deserialize <JObject>().GetValue("heartbeat_interval").ToObject <uint>()); break; } }
internal ProfileUpdatedEventArgs(DiscordProfile profile) { Profile = profile; }