public override void Bind(DefaultGatewayDispatcher value) { base.Bind(value); // Gets or adds the map of events for the given dispatcher instance. _events = _eventsByDispatcher.GetOrAdd(Dispatcher, dispatcher => { var dictionary = new Dictionary <Type, AsynchronousEvent>(_eventsProperties.Length); for (var i = 0; i < _eventsProperties.Length; i++) { var property = _eventsProperties[i]; dictionary.Add(property.PropertyType.GenericTypeArguments[0], (AsynchronousEvent)property.GetValue(dispatcher)); } return(dictionary); }); // Some dispatches won't map to events (e.g. READY) or will map to multiple ones (e.g. GUILD_CREATE maps to GuildAvailable and JoinedGuild). if (typeof(TEventArgs) == typeof(EventArgs)) { return; } if (!_events.TryGetValue(typeof(TEventArgs), out var @event)) { throw new ArgumentException($"No {nameof(DefaultGatewayDispatcher)} event found matching the type of {nameof(TEventArgs)}."); } Event = (AsynchronousEvent <TEventArgs>)@event; }
internal DiscordClientBase(RestDiscordClient restClient, DiscordClientBaseConfiguration configuration) { if (restClient == null) { throw new ArgumentNullException(nameof(restClient)); } if (!restClient.HasAuthorization) { throw new ArgumentException("Clients without authorization are not supported.", nameof(restClient)); } RestClient = restClient; State = new DiscordClientState(this, configuration.MessageCache.GetValueOrDefault(() => new DefaultMessageCache(100))); Logger = configuration.Logger.GetValueOrDefault() ?? restClient.Logger; Serializer = configuration.Serializer.GetValueOrDefault() ?? restClient.Serializer; _extensions = new LockedDictionary <Type, DiscordClientExtension>(); _ready = new AsynchronousEvent <ReadyEventArgs>(); _channelCreated = new AsynchronousEvent <ChannelCreatedEventArgs>(); _channelUpdated = new AsynchronousEvent <ChannelUpdatedEventArgs>(); _channelDeleted = new AsynchronousEvent <ChannelDeletedEventArgs>(); _channelPinsUpdated = new AsynchronousEvent <ChannelPinsUpdatedEventArgs>(); _guildAvailable = new AsynchronousEvent <GuildAvailableEventArgs>(); _guildUnavailable = new AsynchronousEvent <GuildUnavailableEventArgs>(); _joinedGuild = new AsynchronousEvent <JoinedGuildEventArgs>(); _guildUpdated = new AsynchronousEvent <GuildUpdatedEventArgs>(); _leftGuild = new AsynchronousEvent <LeftGuildEventArgs>(); _roleCreated = new AsynchronousEvent <RoleCreatedEventArgs>(); _roleUpdated = new AsynchronousEvent <RoleUpdatedEventArgs>(); _roleDeleted = new AsynchronousEvent <RoleDeletedEventArgs>(); _inviteCreated = new AsynchronousEvent <InviteCreatedEventArgs>(); _inviteDeleted = new AsynchronousEvent <InviteDeletedEventArgs>(); _memberBanned = new AsynchronousEvent <MemberBannedEventArgs>(); _memberUnbanned = new AsynchronousEvent <MemberUnbannedEventArgs>(); _guildEmojisUpdated = new AsynchronousEvent <GuildEmojisUpdatedEventArgs>(); _memberJoined = new AsynchronousEvent <MemberJoinedEventArgs>(); _memberLeft = new AsynchronousEvent <MemberLeftEventArgs>(); _memberUpdated = new AsynchronousEvent <MemberUpdatedEventArgs>(); _messageReceived = new AsynchronousEvent <MessageReceivedEventArgs>(); _messageDeleted = new AsynchronousEvent <MessageDeletedEventArgs>(); _messagesBulkDeleted = new AsynchronousEvent <MessagesBulkDeletedEventArgs>(); _messageUpdated = new AsynchronousEvent <MessageUpdatedEventArgs>(); _reactionAdded = new AsynchronousEvent <ReactionAddedEventArgs>(); _reactionRemoved = new AsynchronousEvent <ReactionRemovedEventArgs>(); _reactionsCleared = new AsynchronousEvent <ReactionsClearedEventArgs>(); _emojiReactionsCleared = new AsynchronousEvent <EmojiReactionsClearedEventArgs>(); _presenceUpdated = new AsynchronousEvent <PresenceUpdatedEventArgs>(); _typingStarted = new AsynchronousEvent <TypingStartedEventArgs>(); _userUpdated = new AsynchronousEvent <UserUpdatedEventArgs>(); _voiceStateUpdated = new AsynchronousEvent <VoiceStateUpdatedEventArgs>(); _voiceServerUpdated = new AsynchronousEvent <VoiceServerUpdatedEventArgs>(); _webhooksUpdated = new AsynchronousEvent <WebhooksUpdatedEventArgs>(); if (this is IDiscordSharder sharder) { sharder._shardReady = new AsynchronousEvent <ShardReadyEventArgs>(); } }
public void SendAsynchronous(AsynchronousEvent send) { send?.AddControlFinishWork(); }