Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: Remove events dependency on gateway #725

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 16 additions & 25 deletions lib/nyxx.dart
Original file line number Diff line number Diff line change
Expand Up @@ -243,22 +243,13 @@ export 'src/models/voice/voice_state.dart' show VoiceState;
export 'src/models/voice/voice_region.dart' show VoiceRegion;
export 'src/models/role.dart' show PartialRole, Role, RoleTags, RoleFlags;
export 'src/models/gateway/gateway.dart' show GatewayBot, GatewayConfiguration, SessionStartLimit;
export 'src/models/gateway/event.dart'
show
DispatchEvent,
GatewayEvent,
HeartbeatAckEvent,
HeartbeatEvent,
HelloEvent,
InvalidSessionEvent,
RawDispatchEvent,
ReconnectEvent,
UnknownDispatchEvent;
export 'src/models/events/event.dart'
show DispatchEvent, Event, HeartbeatAckEvent, HeartbeatEvent, HelloEvent, InvalidSessionEvent, RawDispatchEvent, ReconnectEvent, UnknownDispatchEvent;
export 'src/models/gateway/opcode.dart' show Opcode;
export 'src/models/gateway/events/application_command.dart' show ApplicationCommandPermissionsUpdateEvent;
export 'src/models/gateway/events/auto_moderation.dart'
export 'src/models/events/application_command.dart' show ApplicationCommandPermissionsUpdateEvent;
export 'src/models/events/auto_moderation.dart'
show AutoModerationActionExecutionEvent, AutoModerationRuleCreateEvent, AutoModerationRuleDeleteEvent, AutoModerationRuleUpdateEvent;
export 'src/models/gateway/events/channel.dart'
export 'src/models/events/channel.dart'
show
ChannelCreateEvent,
ChannelDeleteEvent,
Expand All @@ -270,7 +261,7 @@ export 'src/models/gateway/events/channel.dart'
ThreadMemberUpdateEvent,
ThreadMembersUpdateEvent,
ThreadUpdateEvent;
export 'src/models/gateway/events/guild.dart'
export 'src/models/events/guild.dart'
show
GuildBanAddEvent,
GuildBanRemoveEvent,
Expand All @@ -294,10 +285,10 @@ export 'src/models/gateway/events/guild.dart'
GuildStickersUpdateEvent,
GuildUpdateEvent,
UnavailableGuildCreateEvent;
export 'src/models/gateway/events/integration.dart' show IntegrationCreateEvent, IntegrationDeleteEvent, IntegrationUpdateEvent;
export 'src/models/gateway/events/interaction.dart' show InteractionCreateEvent;
export 'src/models/gateway/events/invite.dart' show InviteCreateEvent, InviteDeleteEvent;
export 'src/models/gateway/events/message.dart'
export 'src/models/events/integration.dart' show IntegrationCreateEvent, IntegrationDeleteEvent, IntegrationUpdateEvent;
export 'src/models/events/interaction.dart' show InteractionCreateEvent;
export 'src/models/events/invite.dart' show InviteCreateEvent, InviteDeleteEvent;
export 'src/models/events/message.dart'
show
MessageBulkDeleteEvent,
MessageCreateEvent,
Expand All @@ -309,12 +300,12 @@ export 'src/models/gateway/events/message.dart'
MessageUpdateEvent,
MessagePollVoteAddEvent,
MessagePollVoteRemoveEvent;
export 'src/models/gateway/events/presence.dart' show PresenceUpdateEvent, TypingStartEvent, UserUpdateEvent;
export 'src/models/gateway/events/ready.dart' show ReadyEvent, ResumedEvent;
export 'src/models/gateway/events/stage_instance.dart' show StageInstanceCreateEvent, StageInstanceDeleteEvent, StageInstanceUpdateEvent;
export 'src/models/gateway/events/voice.dart' show VoiceServerUpdateEvent, VoiceStateUpdateEvent;
export 'src/models/gateway/events/webhook.dart' show WebhooksUpdateEvent;
export 'src/models/gateway/events/entitlement.dart' show EntitlementCreateEvent, EntitlementDeleteEvent, EntitlementUpdateEvent;
export 'src/models/events/presence.dart' show PresenceUpdateEvent, TypingStartEvent, UserUpdateEvent;
export 'src/models/events/ready.dart' show ReadyEvent, ResumedEvent;
export 'src/models/events/stage_instance.dart' show StageInstanceCreateEvent, StageInstanceDeleteEvent, StageInstanceUpdateEvent;
export 'src/models/events/voice.dart' show VoiceServerUpdateEvent, VoiceStateUpdateEvent;
export 'src/models/events/webhook.dart' show WebhooksUpdateEvent;
export 'src/models/events/entitlement.dart' show EntitlementCreateEvent, EntitlementDeleteEvent, EntitlementUpdateEvent;
export 'src/models/presence.dart'
show Activity, ActivityAssets, ActivityButton, ActivityFlags, ActivityParty, ActivitySecrets, ActivityTimestamps, ClientStatus, ActivityType, UserStatus;
export 'src/models/emoji.dart' show Emoji, GuildEmoji, PartialEmoji, TextEmoji;
Expand Down
2 changes: 1 addition & 1 deletion lib/src/builders/presence.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:nyxx/src/builders/builder.dart';
import 'package:nyxx/src/models/gateway/events/presence.dart';
import 'package:nyxx/src/models/events/presence.dart';
import 'package:nyxx/src/models/presence.dart';

class PresenceBuilder extends CreateBuilder<PresenceUpdateEvent> {
Expand Down
27 changes: 21 additions & 6 deletions lib/src/client.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'dart:async';

import 'package:async/async.dart';
import 'package:logging/logging.dart';
import 'package:meta/meta.dart';
import 'package:nyxx/src/builders/presence.dart';
Expand All @@ -15,6 +16,7 @@ import 'package:nyxx/src/intents.dart';
import 'package:nyxx/src/manager_mixin.dart';
import 'package:nyxx/src/api_options.dart';
import 'package:nyxx/src/models/application.dart';
import 'package:nyxx/src/models/events/event.dart';
import 'package:nyxx/src/models/guild/guild.dart';
import 'package:nyxx/src/models/snowflake.dart';
import 'package:nyxx/src/models/user/user.dart';
Expand Down Expand Up @@ -79,6 +81,9 @@ abstract class Nyxx {

Completer<void> get _initializedCompleter;

/// A [Stream] of gateway dispatch events received by this client.
Stream<DispatchEvent> get onEvent;

/// Create an instance of [NyxxRest] that can perform requests to the HTTP API and is
/// authenticated with a bot token.
static Future<NyxxRest> connectRest(String token, {RestClientOptions options = const RestClientOptions()}) =>
Expand All @@ -96,7 +101,8 @@ abstract class Nyxx {

return client
.._application = await client.applications.fetchCurrentApplication()
.._user = await client.users.fetchCurrentUser();
.._user = await client.users.fetchCurrentUser()
.._innerOnEvent = StreamGroup.mergeBroadcast(clientOptions.plugins.map((plugin) => plugin.provideEventProvider(client)));
}, clientOptions.plugins);
}

Expand All @@ -122,7 +128,8 @@ abstract class Nyxx {

return client
.._application = information.application
.._user = information.user ?? PartialUser(id: Snowflake.zero, manager: client.users);
.._user = information.user ?? PartialUser(id: Snowflake.zero, manager: client.users)
.._innerOnEvent = StreamGroup.mergeBroadcast(clientOptions.plugins.map((plugin) => plugin.provideEventProvider(client)));
}, clientOptions.plugins);
}

Expand Down Expand Up @@ -156,7 +163,9 @@ abstract class Nyxx {
final gatewayManager = GatewayManager(client);

final gatewayBot = await gatewayManager.fetchGatewayBot();
return client..gateway = await Gateway.connect(client, gatewayBot);
return client
..gateway = await Gateway.connect(client, gatewayBot)
.._innerOnEvent = StreamGroup.mergeBroadcast([client.gateway.events, ...clientOptions.plugins.map((plugin) => plugin.provideEventProvider(client))]);
}, clientOptions.plugins);
}

Expand All @@ -166,8 +175,14 @@ abstract class Nyxx {
Future<void> close();
}

mixin CommonEventProvider implements Nyxx {
@override
Stream<DispatchEvent> get onEvent => _innerOnEvent;
late final Stream<DispatchEvent> _innerOnEvent;
}

/// A client that can make requests to the HTTP API and is authenticated with a bot token.
class NyxxRest with ManagerMixin implements Nyxx {
class NyxxRest with ManagerMixin, EventMixin, CommonEventProvider implements Nyxx {
@override
final RestApiOptions apiOptions;

Expand Down Expand Up @@ -221,7 +236,7 @@ class NyxxRest with ManagerMixin implements Nyxx {
}
}

class NyxxOAuth2 with ManagerMixin implements NyxxRest {
class NyxxOAuth2 with ManagerMixin, EventMixin, CommonEventProvider implements NyxxRest {
@override
final OAuth2ApiOptions apiOptions;

Expand Down Expand Up @@ -272,7 +287,7 @@ class NyxxOAuth2 with ManagerMixin implements NyxxRest {
}

/// A client that can make requests to the HTTP API, connects to the Gateway and is authenticated with a bot token.
class NyxxGateway with ManagerMixin, EventMixin implements NyxxRest {
class NyxxGateway with ManagerMixin, EventMixin, CommonEventProvider implements NyxxRest {
@override
final GatewayApiOptions apiOptions;

Expand Down
35 changes: 16 additions & 19 deletions lib/src/event_mixin.dart
Original file line number Diff line number Diff line change
@@ -1,30 +1,27 @@
import 'dart:async';

import 'package:nyxx/src/client.dart';
import 'package:nyxx/src/models/gateway/event.dart';
import 'package:nyxx/src/models/gateway/events/application_command.dart';
import 'package:nyxx/src/models/gateway/events/auto_moderation.dart';
import 'package:nyxx/src/models/gateway/events/channel.dart';
import 'package:nyxx/src/models/gateway/events/entitlement.dart';
import 'package:nyxx/src/models/gateway/events/guild.dart';
import 'package:nyxx/src/models/gateway/events/integration.dart';
import 'package:nyxx/src/models/gateway/events/interaction.dart';
import 'package:nyxx/src/models/gateway/events/invite.dart';
import 'package:nyxx/src/models/gateway/events/message.dart';
import 'package:nyxx/src/models/gateway/events/presence.dart';
import 'package:nyxx/src/models/gateway/events/ready.dart';
import 'package:nyxx/src/models/gateway/events/soundboard.dart';
import 'package:nyxx/src/models/gateway/events/stage_instance.dart';
import 'package:nyxx/src/models/gateway/events/voice.dart';
import 'package:nyxx/src/models/gateway/events/webhook.dart';
import 'package:nyxx/src/models/events/event.dart';
import 'package:nyxx/src/models/events/application_command.dart';
import 'package:nyxx/src/models/events/auto_moderation.dart';
import 'package:nyxx/src/models/events/channel.dart';
import 'package:nyxx/src/models/events/entitlement.dart';
import 'package:nyxx/src/models/events/guild.dart';
import 'package:nyxx/src/models/events/integration.dart';
import 'package:nyxx/src/models/events/interaction.dart';
import 'package:nyxx/src/models/events/invite.dart';
import 'package:nyxx/src/models/events/message.dart';
import 'package:nyxx/src/models/events/presence.dart';
import 'package:nyxx/src/models/events/ready.dart';
import 'package:nyxx/src/models/events/soundboard.dart';
import 'package:nyxx/src/models/events/stage_instance.dart';
import 'package:nyxx/src/models/events/voice.dart';
import 'package:nyxx/src/models/events/webhook.dart';
import 'package:nyxx/src/models/interaction.dart';
import 'package:nyxx/src/utils/iterable_extension.dart';

/// An internal mixin to add event streams to a NyxxGateway client.
mixin EventMixin implements Nyxx {
/// A [Stream] of gateway dispatch events received by this client.
Stream<DispatchEvent> get onEvent => (this as NyxxGateway).gateway.events;

/// A [Stream] of [DispatchEvent]s which are unknown to the current version of nyxx.
Stream<UnknownDispatchEvent> get onUnknownEvent => onEvent.whereType<UnknownDispatchEvent>();

Expand Down
Loading