Repository: hikari-py/hikari
Pull request #1103 (2022-03-25 21:29:21)

Allow passing multiple events to the @listen decorator
### Summary
<!-- Small summary of the merge request -->
This pull requests allows passing multiple events to the listen decorator.
Alternatively, a Union can be used in the type hint to achieve the same thing.

```py
@bot.listen(hikari.GuildAvailableEvent, hikari.GuildJoinEvent)
async def on_guild_available(event: ...) -> None:
    ...

@bot.listen()
async def on_start(event: hikari.StartingEvent | hikari.StartedEvent) -> None:
    ...
```

### Checklist
<!-- Make sure to tick all the following boxes by putting an `x` in between (like this `[x]`) -->
- [x] I have run `nox` and all the pipelines have passed.
- [x] I have made unittests according to the code I have added/modified/deleted.

Flake8 session is failing - but it was on master before I touched anything.


thesadru: Ideally, the origin of the annotation should be checked too in case a type with `__args__` is passed in. 
Note that in 3.9 there's only `typing.Union` but in 3.10 you must also check for `types.UnionType`
davfsa: > Ideally, the origin of the annotation should be checked too in case a type with `__args__` is passed in.
> Note that in 3.9 there's only `typing.Union` but in 3.10 you must also check for `types.UnionType`

This works with all python versions we support, as it never actually checks for the union. It just expands the arguments of the annotation using a typing function, which will support each python version
thesadru: Oops, I wanted to suggest also checking the origin for the edge cases when the passed-in type is not a union. Somehow managed to delete that part 😅
davfsa: > Oops, I wanted to suggest also checking the origin for the edge cases when the passed-in type is not a union. sweat_smile

In the case it is not a union, it will get expanded as far as it can go and then passed onto subscribe. Subscribe will then make the necessary checks and error accordingly
FasterSpeeding: Also this needs a changelog entry
FasterSpeeding: Linting is failing
davfsa: Lining failing due to https://github.com/psf/black/issues/2964

Will be fixed by updating black to the latest version, which I will open a PR for in a sec. Then this PR should be rebased

Patch:
diff --git a/.idea/fileTemplates/Python Module.py b/.idea/fileTemplates/Python Module.py
index 35c55ed4..5716791a 100644
--- a/.idea/fileTemplates/Python Module.py
+++ b/.idea/fileTemplates/Python Module.py
@@ -24,6 +24,6 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = []
+__all__: typing.Sequence[str] = ()
 
 import typing
diff --git a/changes/1103.feature.md b/changes/1103.feature.md
new file mode 100644
index 00000000..c5eae501
--- /dev/null
+++ b/changes/1103.feature.md
@@ -0,0 +1,2 @@
+Allow passing multiple event types to the listen decorator.
+Parse union type hints for events if listen decorator is empty.
diff --git a/hikari/api/cache.py b/hikari/api/cache.py
index 2cdfbf9a..02a0ca55 100644
--- a/hikari/api/cache.py
+++ b/hikari/api/cache.py
@@ -23,7 +23,7 @@
 """Core interface for a cache implementation."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["CacheView", "Cache", "MutableCache"]
+__all__: typing.Sequence[str] = ("CacheView", "Cache", "MutableCache")
 
 import abc
 import typing
diff --git a/hikari/api/config.py b/hikari/api/config.py
index 0854b5b9..839c5a1c 100644
--- a/hikari/api/config.py
+++ b/hikari/api/config.py
@@ -23,7 +23,7 @@
 """Core interface for Hikari's configuration dataclasses."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["CacheComponents"]
+__all__: typing.Sequence[str] = ("CacheComponents",)
 
 import abc
 import typing
diff --git a/hikari/api/entity_factory.py b/hikari/api/entity_factory.py
index de57bb1e..a09f7b4f 100644
--- a/hikari/api/entity_factory.py
+++ b/hikari/api/entity_factory.py
@@ -23,7 +23,7 @@
 """Core interface for an object that serializes/deserializes API objects."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["EntityFactory", "GatewayGuildDefinition"]
+__all__: typing.Sequence[str] = ("EntityFactory", "GatewayGuildDefinition")
 
 import abc
 import typing
diff --git a/hikari/api/event_factory.py b/hikari/api/event_factory.py
index 918149b8..91515b1b 100644
--- a/hikari/api/event_factory.py
+++ b/hikari/api/event_factory.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["EventFactory"]
+__all__: typing.Sequence[str] = ("EventFactory",)
 
 import abc
 import typing
diff --git a/hikari/api/event_manager.py b/hikari/api/event_manager.py
index 21116436..2711ae1c 100644
--- a/hikari/api/event_manager.py
+++ b/hikari/api/event_manager.py
@@ -23,7 +23,7 @@
 """Core interface for components that manage events in the library."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["EventManager", "EventStream"]
+__all__: typing.Sequence[str] = ("EventManager", "EventStream")
 
 import abc
 import asyncio
@@ -393,7 +393,7 @@ def get_listeners(
     @abc.abstractmethod
     def listen(
         self,
-        event_type: typing.Optional[typing.Type[EventT_co]] = None,
+        *event_types: typing.Type[EventT_co],
     ) -> typing.Callable[[CallbackT[EventT_co]], CallbackT[EventT_co]]:
         """Generate a decorator to subscribe a callback to an event type.
 
@@ -401,8 +401,8 @@ def listen(
 
         Parameters
         ----------
-        event_type : typing.Optional[typing.Type[T]]
-            The event type to subscribe to. The implementation may allow this
+        *event_types : typing.Optional[typing.Type[T]]
+            The event types to subscribe to. The implementation may allow this
             to be undefined. If this is the case, the event type will be inferred
             instead from the type hints on the function signature.
 
diff --git a/hikari/api/interaction_server.py b/hikari/api/interaction_server.py
index 4d59902b..f206a4a1 100644
--- a/hikari/api/interaction_server.py
+++ b/hikari/api/interaction_server.py
@@ -23,7 +23,7 @@
 """Provides an interface for Interaction REST server API implementations to follow."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["ListenerT", "Response", "InteractionServer"]
+__all__: typing.Sequence[str] = ("ListenerT", "Response", "InteractionServer")
 
 import abc
 import typing
diff --git a/hikari/api/rest.py b/hikari/api/rest.py
index 3502e1e8..683c5353 100644
--- a/hikari/api/rest.py
+++ b/hikari/api/rest.py
@@ -23,7 +23,7 @@
 """Provides an interface for REST API implementations to follow."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["RESTClient", "TokenStrategy"]
+__all__: typing.Sequence[str] = ("RESTClient", "TokenStrategy")
 
 import abc
 import typing
diff --git a/hikari/api/shard.py b/hikari/api/shard.py
index 7f4633c1..4f5fcffe 100644
--- a/hikari/api/shard.py
+++ b/hikari/api/shard.py
@@ -23,7 +23,7 @@
 """Provides an interface for gateway shard implementations to conform to."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["GatewayDataFormat", "GatewayCompression", "GatewayShard"]
+__all__: typing.Sequence[str] = ("GatewayDataFormat", "GatewayCompression", "GatewayShard")
 
 import abc
 import typing
diff --git a/hikari/api/special_endpoints.py b/hikari/api/special_endpoints.py
index 3777e52c..b75f1016 100644
--- a/hikari/api/special_endpoints.py
+++ b/hikari/api/special_endpoints.py
@@ -23,7 +23,7 @@
 """Special additional endpoints used by the REST API."""
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "ActionRowBuilder",
     "ButtonBuilder",
     "CommandBuilder",
@@ -40,7 +40,7 @@
     "LinkButtonBuilder",
     "SelectMenuBuilder",
     "SelectOptionBuilder",
-]
+)
 
 import abc
 import typing
diff --git a/hikari/api/voice.py b/hikari/api/voice.py
index 046e638c..93b4e169 100644
--- a/hikari/api/voice.py
+++ b/hikari/api/voice.py
@@ -23,7 +23,7 @@
 """Interfaces used to describe voice client implementations."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["VoiceComponent", "VoiceConnection"]
+__all__: typing.Sequence[str] = ("VoiceComponent", "VoiceConnection")
 
 import abc
 import typing
diff --git a/hikari/applications.py b/hikari/applications.py
index 69cb9b29..3a74ff49 100644
--- a/hikari/applications.py
+++ b/hikari/applications.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "InviteApplication",
     "Application",
     "ApplicationFlags",
@@ -42,7 +42,7 @@
     "TeamMembershipState",
     "TokenType",
     "get_token_id",
-]
+)
 
 import base64
 import typing
diff --git a/hikari/audit_logs.py b/hikari/audit_logs.py
index 7cb0723f..f39c888f 100644
--- a/hikari/audit_logs.py
+++ b/hikari/audit_logs.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "AuditLog",
     "AuditLogChange",
     "AuditLogChangeKey",
@@ -38,7 +38,7 @@
     "MessageBulkDeleteEntryInfo",
     "MessageDeleteEntryInfo",
     "MessagePinEntryInfo",
-]
+)
 
 import abc
 import typing
diff --git a/hikari/channels.py b/hikari/channels.py
index 238f9fe2..0188521e 100644
--- a/hikari/channels.py
+++ b/hikari/channels.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "ChannelType",
     "VideoQualityMode",
     "ChannelFollow",
@@ -44,7 +44,7 @@
     "GuildStageChannel",
     "WebhookChannelT",
     "WebhookChannelTypes",
-]
+)
 
 import typing
 
diff --git a/hikari/colors.py b/hikari/colors.py
index 3a8211e0..cbdb9317 100644
--- a/hikari/colors.py
+++ b/hikari/colors.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["Color", "Colorish"]
+__all__: typing.Sequence[str] = ("Color", "Colorish")
 
 import re
 import string
diff --git a/hikari/colours.py b/hikari/colours.py
index c5c0baaf..012be20f 100644
--- a/hikari/colours.py
+++ b/hikari/colours.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["Colour", "Colourish"]
+__all__: typing.Sequence[str] = ("Colour", "Colourish")
 
 import typing
 
diff --git a/hikari/commands.py b/hikari/commands.py
index 6fa77cb3..618a06ab 100644
--- a/hikari/commands.py
+++ b/hikari/commands.py
@@ -23,7 +23,7 @@
 """Models and enums used for application commands on Discord."""
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "PartialCommand",
     "ContextMenuCommand",
     "SlashCommand",
@@ -34,7 +34,7 @@
     "CommandType",
     "GuildCommandPermissions",
     "OptionType",
-]
+)
 
 import typing
 
diff --git a/hikari/embeds.py b/hikari/embeds.py
index 0b385cc8..24321c52 100644
--- a/hikari/embeds.py
+++ b/hikari/embeds.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "Embed",
     "EmbedResource",
     "EmbedResourceWithProxy",
@@ -34,7 +34,7 @@
     "EmbedAuthor",
     "EmbedFooter",
     "EmbedField",
-]
+)
 
 import textwrap
 import typing
diff --git a/hikari/emojis.py b/hikari/emojis.py
index 004c5431..53f4ccb7 100644
--- a/hikari/emojis.py
+++ b/hikari/emojis.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["Emoji", "UnicodeEmoji", "CustomEmoji", "KnownCustomEmoji"]
+__all__: typing.Sequence[str] = ("Emoji", "UnicodeEmoji", "CustomEmoji", "KnownCustomEmoji")
 
 import abc
 import re
diff --git a/hikari/errors.py b/hikari/errors.py
index 642ffd80..4273d489 100644
--- a/hikari/errors.py
+++ b/hikari/errors.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "HikariError",
     "HikariWarning",
     "HikariInterrupt",
@@ -48,7 +48,7 @@
     "MissingIntentError",
     "BulkDeleteError",
     "VoiceError",
-]
+)
 
 import http
 import typing
diff --git a/hikari/events/base_events.py b/hikari/events/base_events.py
index ccc068dc..d95bf8a4 100644
--- a/hikari/events/base_events.py
+++ b/hikari/events/base_events.py
@@ -23,14 +23,14 @@
 """Base types and functions for events in Hikari."""
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "Event",
     "ExceptionEvent",
     "is_no_recursive_throw_event",
     "no_recursive_throw",
     "get_required_intents_for",
     "requires_intents",
-]
+)
 
 import abc
 import inspect
diff --git a/hikari/events/channel_events.py b/hikari/events/channel_events.py
index d17af655..0f1dc039 100644
--- a/hikari/events/channel_events.py
+++ b/hikari/events/channel_events.py
@@ -27,7 +27,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "ChannelEvent",
     "GuildChannelEvent",
     "DMChannelEvent",
@@ -41,7 +41,7 @@
     "InviteCreateEvent",
     "InviteDeleteEvent",
     "WebhookUpdateEvent",
-]
+)
 
 import abc
 import typing
diff --git a/hikari/events/guild_events.py b/hikari/events/guild_events.py
index 887d87eb..2e8c5bd2 100644
--- a/hikari/events/guild_events.py
+++ b/hikari/events/guild_events.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "GuildEvent",
     "GuildVisibilityEvent",
     "GuildAvailableEvent",
@@ -41,7 +41,7 @@
     "IntegrationDeleteEvent",
     "IntegrationUpdateEvent",
     "PresenceUpdateEvent",
-]
+)
 
 import abc
 import typing
diff --git a/hikari/events/interaction_events.py b/hikari/events/interaction_events.py
index 2a2a2cc7..ae6786e4 100644
--- a/hikari/events/interaction_events.py
+++ b/hikari/events/interaction_events.py
@@ -23,7 +23,7 @@
 """Events fired for interaction related changes."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["InteractionCreateEvent"]
+__all__: typing.Sequence[str] = ("InteractionCreateEvent",)
 
 import typing
 
diff --git a/hikari/events/lifetime_events.py b/hikari/events/lifetime_events.py
index 7028bcfb..0f76a4be 100644
--- a/hikari/events/lifetime_events.py
+++ b/hikari/events/lifetime_events.py
@@ -28,7 +28,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["StartingEvent", "StartedEvent", "StoppingEvent", "StoppedEvent"]
+__all__: typing.Sequence[str] = ("StartingEvent", "StartedEvent", "StoppingEvent", "StoppedEvent")
 
 import typing
 
diff --git a/hikari/events/member_events.py b/hikari/events/member_events.py
index 067b8f40..8b91268e 100644
--- a/hikari/events/member_events.py
+++ b/hikari/events/member_events.py
@@ -23,7 +23,7 @@
 """Events concerning manipulation of members within guilds."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["MemberEvent", "MemberCreateEvent", "MemberUpdateEvent", "MemberDeleteEvent"]
+__all__: typing.Sequence[str] = ("MemberEvent", "MemberCreateEvent", "MemberUpdateEvent", "MemberDeleteEvent")
 
 import abc
 import typing
diff --git a/hikari/events/message_events.py b/hikari/events/message_events.py
index 8731fcd7..e108a82e 100644
--- a/hikari/events/message_events.py
+++ b/hikari/events/message_events.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "MessageEvent",
     "MessageCreateEvent",
     "MessageUpdateEvent",
@@ -36,7 +36,7 @@
     "DMMessageCreateEvent",
     "DMMessageUpdateEvent",
     "DMMessageDeleteEvent",
-]
+)
 
 import abc
 import typing
diff --git a/hikari/events/reaction_events.py b/hikari/events/reaction_events.py
index 2b598fa2..c9110c5c 100644
--- a/hikari/events/reaction_events.py
+++ b/hikari/events/reaction_events.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "ReactionEvent",
     "GuildReactionEvent",
     "DMReactionEvent",
@@ -40,7 +40,7 @@
     "DMReactionDeleteEvent",
     "DMReactionDeleteEmojiEvent",
     "DMReactionDeleteAllEvent",
-]
+)
 
 import abc
 import typing
diff --git a/hikari/events/role_events.py b/hikari/events/role_events.py
index ca71782c..e888f17a 100644
--- a/hikari/events/role_events.py
+++ b/hikari/events/role_events.py
@@ -23,7 +23,7 @@
 """Events pertaining to manipulation of roles within guilds."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["RoleEvent", "RoleCreateEvent", "RoleUpdateEvent", "RoleDeleteEvent"]
+__all__: typing.Sequence[str] = ("RoleEvent", "RoleCreateEvent", "RoleUpdateEvent", "RoleDeleteEvent")
 
 import abc
 import typing
diff --git a/hikari/events/scheduled_events.py b/hikari/events/scheduled_events.py
index 4e865fec..cd7d7d5f 100644
--- a/hikari/events/scheduled_events.py
+++ b/hikari/events/scheduled_events.py
@@ -23,14 +23,14 @@
 """Events fired for guild scheduled event related changes."""
 from __future__ import annotations
 
-__all__: typing.Sequence[str] = [
+__all__: typing.Sequence[str] = (
     "ScheduledEventEvent",
     "ScheduledEventCreateEvent",
     "ScheduledEventDeleteEvent",
     "ScheduledEventUpdateEvent",
     "ScheduledEventUserAddEvent",
     "ScheduledEventUserRemoveEvent",
-]
+)
 
 import abc
 import typing
diff --git a/hikari/events/shard_events.py b/hikari/events/shard_events.py
index 5bf6da1e..3e4440e8 100644
--- a/hikari/events/shard_events.py
+++ b/hikari/events/shard_events.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "ShardEvent",
     "ShardPayloadEvent",
     "ShardStateEvent",
@@ -33,7 +33,7 @@
     "ShardReadyEvent",
     "ShardResumedEvent",
     "MemberChunkEvent",
-]
+)
 
 import abc
 import typing
diff --git a/hikari/events/typing_events.py b/hikari/events/typing_events.py
index 6943939c..40756df7 100644
--- a/hikari/events/typing_events.py
+++ b/hikari/events/typing_events.py
@@ -23,7 +23,7 @@
 """Events fired when users begin typing in channels."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["TypingEvent", "GuildTypingEvent", "DMTypingEvent"]
+__all__: typing.Sequence[str] = ("TypingEvent", "GuildTypingEvent", "DMTypingEvent")
 
 import abc
 import typing
diff --git a/hikari/events/user_events.py b/hikari/events/user_events.py
index 86db887f..f332b0b4 100644
--- a/hikari/events/user_events.py
+++ b/hikari/events/user_events.py
@@ -23,7 +23,7 @@
 """Events fired when the account user is updated."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["OwnUserUpdateEvent"]
+__all__: typing.Sequence[str] = ("OwnUserUpdateEvent",)
 
 import typing
 
diff --git a/hikari/events/voice_events.py b/hikari/events/voice_events.py
index ba8089ac..23c7bec4 100644
--- a/hikari/events/voice_events.py
+++ b/hikari/events/voice_events.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["VoiceEvent", "VoiceStateUpdateEvent", "VoiceServerUpdateEvent"]
+__all__: typing.Sequence[str] = ("VoiceEvent", "VoiceStateUpdateEvent", "VoiceServerUpdateEvent")
 
 import abc
 import typing
diff --git a/hikari/files.py b/hikari/files.py
index 178d624e..80b896e8 100644
--- a/hikari/files.py
+++ b/hikari/files.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "ensure_path",
     "ensure_resource",
     "unwrap_bytes",
@@ -42,7 +42,7 @@
     "WebReader",
     "Bytes",
     "IteratorReader",
-]
+)
 
 import abc
 import asyncio
diff --git a/hikari/guilds.py b/hikari/guilds.py
index 0bdfc89b..7af497ec 100644
--- a/hikari/guilds.py
+++ b/hikari/guilds.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "Guild",
     "RESTGuild",
     "GatewayGuild",
@@ -52,7 +52,7 @@
     "PartialRole",
     "WelcomeScreen",
     "WelcomeChannel",
-]
+)
 
 import typing
 
diff --git a/hikari/impl/bot.py b/hikari/impl/bot.py
index fd3b8a15..244b8592 100644
--- a/hikari/impl/bot.py
+++ b/hikari/impl/bot.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["GatewayBot"]
+__all__: typing.Sequence[str] = ("GatewayBot",)
 
 import asyncio
 import datetime
@@ -618,7 +618,8 @@ async def join(self, until_close: bool = True) -> None:
         await aio.first_completed(*awaitables)
 
     def listen(
-        self, event_type: typing.Optional[typing.Type[event_manager_.EventT_co]] = None
+        self,
+        *event_types: typing.Type[event_manager_.EventT_co],
     ) -> typing.Callable[
         [event_manager_.CallbackT[event_manager_.EventT_co]],
         event_manager_.CallbackT[event_manager_.EventT_co],
@@ -629,8 +630,8 @@ def listen(
 
         Parameters
         ----------
-        event_type : typing.Optional[typing.Type[T]]
-            The event type to subscribe to. The implementation may allow this
+        *event_types : typing.Optional[typing.Type[T]]
+            The event types to subscribe to. The implementation may allow this
             to be undefined. If this is the case, the event type will be inferred
             instead from the type hints on the function signature.
 
@@ -651,7 +652,7 @@ def listen(
         Unsubscribe: `hikari.impl.bot.GatewayBot.unsubscribe`
         Wait_for: `hikari.impl.bot.GatewayBot.wait_for`
         """
-        return self._event_manager.listen(event_type)
+        return self._event_manager.listen(*event_types)
 
     @staticmethod
     def print_banner(
diff --git a/hikari/impl/buckets.py b/hikari/impl/buckets.py
index a0441ffc..bc5848d8 100644
--- a/hikari/impl/buckets.py
+++ b/hikari/impl/buckets.py
@@ -184,7 +184,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["UNKNOWN_HASH", "RESTBucket", "RESTBucketManager"]
+__all__: typing.Sequence[str] = ("UNKNOWN_HASH", "RESTBucket", "RESTBucketManager")
 
 import asyncio
 import logging
diff --git a/hikari/impl/cache.py b/hikari/impl/cache.py
index 009f882f..393a9919 100644
--- a/hikari/impl/cache.py
+++ b/hikari/impl/cache.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["CacheImpl"]
+__all__: typing.Sequence[str] = ("CacheImpl",)
 
 import copy
 import logging
diff --git a/hikari/impl/config.py b/hikari/impl/config.py
index 4603b030..9fc03597 100644
--- a/hikari/impl/config.py
+++ b/hikari/impl/config.py
@@ -24,7 +24,13 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["BasicAuthHeader", "ProxySettings", "HTTPTimeoutSettings", "HTTPSettings", "CacheSettings"]
+__all__: typing.Sequence[str] = (
+    "BasicAuthHeader",
+    "ProxySettings",
+    "HTTPTimeoutSettings",
+    "HTTPSettings",
+    "CacheSettings",
+)
 
 import base64
 import ssl as ssl_
diff --git a/hikari/impl/entity_factory.py b/hikari/impl/entity_factory.py
index 28ced036..5d31777a 100644
--- a/hikari/impl/entity_factory.py
+++ b/hikari/impl/entity_factory.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["EntityFactoryImpl"]
+__all__: typing.Sequence[str] = ("EntityFactoryImpl",)
 
 import datetime
 import logging
diff --git a/hikari/impl/event_factory.py b/hikari/impl/event_factory.py
index 846c0ad7..49715d3b 100644
--- a/hikari/impl/event_factory.py
+++ b/hikari/impl/event_factory.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["EventFactoryImpl"]
+__all__: typing.Sequence[str] = ("EventFactoryImpl",)
 
 import datetime
 import types
diff --git a/hikari/impl/event_manager.py b/hikari/impl/event_manager.py
index 80154e3a..a9feacbf 100644
--- a/hikari/impl/event_manager.py
+++ b/hikari/impl/event_manager.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["EventManagerImpl"]
+__all__: typing.Sequence[str] = ("EventManagerImpl",)
 
 import asyncio
 import base64
diff --git a/hikari/impl/event_manager_base.py b/hikari/impl/event_manager_base.py
index 9735c6c6..68d3882a 100644
--- a/hikari/impl/event_manager_base.py
+++ b/hikari/impl/event_manager_base.py
@@ -24,12 +24,14 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["filtered", "EventManagerBase", "EventStream"]
+__all__: typing.Sequence[str] = ("filtered", "EventManagerBase", "EventStream")
 
 import asyncio
 import inspect
 import itertools
 import logging
+import sys
+import types
 import typing
 import warnings
 import weakref
@@ -48,8 +50,6 @@
 from hikari.internal import ux
 
 if typing.TYPE_CHECKING:
-    import types
-
     from hikari import intents as intents_
     from hikari.api import event_factory as event_factory_
     from hikari.api import shard as gateway_shard
@@ -76,6 +76,12 @@
 
 _LOGGER: typing.Final[logging.Logger] = logging.getLogger("hikari.event_manager")
 
+if sys.version_info >= (3, 10):
+    # We can use types.UnionType on 3.10+
+    UNIONS = frozenset((typing.Union, types.UnionType))
+else:
+    UNIONS = frozenset((typing.Union,))
+
 
 @typing.runtime_checkable
 class _FilteredMethodT(fast_protocol.FastProtocolChecking, typing.Protocol):
@@ -416,7 +422,12 @@ def subscribe(
         *,
         _nested: int = 0,
     ) -> None:
-        if not inspect.isclass(event_type) or not issubclass(event_type, base_events.Event):
+        try:
+            is_event = issubclass(event_type, base_events.Event)
+        except TypeError:
+            is_event = False
+
+        if not is_event:
             raise TypeError("Cannot subscribe to a non-Event type")
 
         if not inspect.iscoroutinefunction(callback):
@@ -499,32 +510,39 @@ def unsubscribe(
 
     def listen(
         self,
-        event_type: typing.Optional[typing.Type[event_manager_.EventT_co]] = None,
+        *event_types: typing.Type[event_manager_.EventT_co],
     ) -> typing.Callable[
         [event_manager_.CallbackT[event_manager_.EventT_co]], event_manager_.CallbackT[event_manager_.EventT_co]
     ]:
         def decorator(
             callback: event_manager_.CallbackT[event_manager_.EventT_co],
         ) -> event_manager_.CallbackT[event_manager_.EventT_co]:
-            nonlocal event_type
-
             # Avoid resolving forward references in the function's signature if
             # event_type was explicitly provided as this may lead to errors.
-            if event_type is not None:
+            if event_types:
                 _assert_is_listener(iter(inspect.signature(callback).parameters.values()))
+                resolved_types = event_types
 
             else:
                 signature = reflect.resolve_signature(callback)
                 params = signature.parameters.values()
                 _assert_is_listener(iter(params))
                 event_param = next(iter(params))
+                annotation = event_param.annotation
 
-                if event_param.annotation is event_param.empty:
+                if annotation is event_param.empty:
                     raise TypeError("Must provide the event type in the @listen decorator or as a type hint!")
 
-                event_type = event_param.annotation
+                if typing.get_origin(annotation) in UNIONS:
+                    # Resolve the types inside the union
+                    resolved_types = typing.get_args(annotation)
+                else:
+                    # Just pass back the annotation
+                    resolved_types = (annotation,)
+
+            for resolved_type in resolved_types:
+                self.subscribe(resolved_type, callback, _nested=1)
 
-            self.subscribe(event_type, callback, _nested=1)
             return callback
 
         return decorator
diff --git a/hikari/impl/interaction_server.py b/hikari/impl/interaction_server.py
index 77d1f7dd..fb850cda 100644
--- a/hikari/impl/interaction_server.py
+++ b/hikari/impl/interaction_server.py
@@ -23,7 +23,7 @@
 """Standard implementation of a REST based interactions server."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["InteractionServer"]
+__all__: typing.Sequence[str] = ("InteractionServer",)
 
 import asyncio
 import logging
diff --git a/hikari/impl/rate_limits.py b/hikari/impl/rate_limits.py
index 5818cce1..0ecd2c15 100644
--- a/hikari/impl/rate_limits.py
+++ b/hikari/impl/rate_limits.py
@@ -27,13 +27,13 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "BaseRateLimiter",
     "BurstRateLimiter",
     "ManualRateLimiter",
     "WindowedBurstRateLimiter",
     "ExponentialBackOff",
-]
+)
 
 import abc
 import asyncio
diff --git a/hikari/impl/rest.py b/hikari/impl/rest.py
index b3421104..a76ce8e0 100644
--- a/hikari/impl/rest.py
+++ b/hikari/impl/rest.py
@@ -28,7 +28,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["ClientCredentialsStrategy", "RESTApp", "RESTClientImpl"]
+__all__: typing.Sequence[str] = ("ClientCredentialsStrategy", "RESTApp", "RESTClientImpl")
 
 import asyncio
 import base64
diff --git a/hikari/impl/rest_bot.py b/hikari/impl/rest_bot.py
index 4afa51c7..efba07f5 100644
--- a/hikari/impl/rest_bot.py
+++ b/hikari/impl/rest_bot.py
@@ -23,7 +23,7 @@
 """Standard implementations of a Interaction based REST-only bot."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["RESTBot"]
+__all__: typing.Sequence[str] = ("RESTBot",)
 
 import asyncio
 import logging
diff --git a/hikari/impl/shard.py b/hikari/impl/shard.py
index 406ac586..8b7aa3b0 100644
--- a/hikari/impl/shard.py
+++ b/hikari/impl/shard.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["GatewayShardImpl"]
+__all__: typing.Sequence[str] = ("GatewayShardImpl",)
 
 import asyncio
 import contextlib
diff --git a/hikari/impl/special_endpoints.py b/hikari/impl/special_endpoints.py
index f4df4419..92605e26 100644
--- a/hikari/impl/special_endpoints.py
+++ b/hikari/impl/special_endpoints.py
@@ -26,7 +26,7 @@
 """
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "ActionRowBuilder",
     "CommandBuilder",
     "SlashCommandBuilder",
@@ -39,7 +39,7 @@
     "InteractiveButtonBuilder",
     "LinkButtonBuilder",
     "SelectMenuBuilder",
-]
+)
 
 import asyncio
 import typing
diff --git a/hikari/impl/voice.py b/hikari/impl/voice.py
index cd175c4f..92f2c17c 100644
--- a/hikari/impl/voice.py
+++ b/hikari/impl/voice.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["VoiceComponentImpl"]
+__all__: typing.Sequence[str] = ("VoiceComponentImpl",)
 
 import asyncio
 import logging
diff --git a/hikari/intents.py b/hikari/intents.py
index a737722e..b0b326f6 100644
--- a/hikari/intents.py
+++ b/hikari/intents.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["Intents"]
+__all__: typing.Sequence[str] = ("Intents",)
 
 import typing
 
diff --git a/hikari/interactions/base_interactions.py b/hikari/interactions/base_interactions.py
index 019547ad..f5e42f4f 100644
--- a/hikari/interactions/base_interactions.py
+++ b/hikari/interactions/base_interactions.py
@@ -23,7 +23,7 @@
 """Base classes and enums inherited and used throughout the interactions flow."""
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "DEFERRED_RESPONSE_TYPES",
     "DeferredResponseTypesT",
     "InteractionMember",
@@ -33,7 +33,7 @@
     "MessageResponseTypesT",
     "PartialInteraction",
     "ResponseType",
-]
+)
 
 import typing
 
diff --git a/hikari/interactions/command_interactions.py b/hikari/interactions/command_interactions.py
index 53182fa0..ddebb1cc 100644
--- a/hikari/interactions/command_interactions.py
+++ b/hikari/interactions/command_interactions.py
@@ -23,7 +23,7 @@
 """Models and enums used for Discord's Slash Commands interaction flow."""
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "AutocompleteInteraction",
     "BaseCommandInteraction",
     "CommandInteractionOption",
@@ -33,7 +33,7 @@
     "CommandResponseTypesT",
     "InteractionChannel",
     "ResolvedOptionData",
-]
+)
 
 import typing
 
diff --git a/hikari/interactions/component_interactions.py b/hikari/interactions/component_interactions.py
index ff82df61..98921844 100644
--- a/hikari/interactions/component_interactions.py
+++ b/hikari/interactions/component_interactions.py
@@ -23,7 +23,7 @@
 """Models and enums used for Discord's Components interaction flow."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["ComponentInteraction", "COMPONENT_RESPONSE_TYPES", "ComponentResponseTypesT"]
+__all__: typing.Sequence[str] = ("ComponentInteraction", "COMPONENT_RESPONSE_TYPES", "ComponentResponseTypesT")
 
 import typing
 
diff --git a/hikari/internal/aio.py b/hikari/internal/aio.py
index 57ff6aca..bcd0618c 100644
--- a/hikari/internal/aio.py
+++ b/hikari/internal/aio.py
@@ -24,14 +24,14 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "completed_future",
     "get_or_make_loop",
     "is_async_iterator",
     "is_async_iterable",
     "first_completed",
     "all_of",
-]
+)
 
 import asyncio
 import inspect
diff --git a/hikari/internal/attr_extensions.py b/hikari/internal/attr_extensions.py
index 28215bdb..82fa4743 100644
--- a/hikari/internal/attr_extensions.py
+++ b/hikari/internal/attr_extensions.py
@@ -23,13 +23,13 @@
 """Utility for extending and optimising the usage of `attr` models."""
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "with_copy",
     "copy_attrs",
     "deep_copy_attrs",
     "invalidate_deep_copy_cache",
     "invalidate_shallow_copy_cache",
-]
+)
 
 import copy as std_copy
 import logging
diff --git a/hikari/internal/cache.py b/hikari/internal/cache.py
index fe2a023d..d620728e 100644
--- a/hikari/internal/cache.py
+++ b/hikari/internal/cache.py
@@ -23,7 +23,7 @@
 """Various utilities that may be used in a cache-impl."""
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "CacheMappingView",
     "EmptyCacheView",
     "GuildRecord",
@@ -44,7 +44,7 @@
     "DataT",
     "KeyT",
     "ValueT",
-]
+)
 
 import abc
 import copy
diff --git a/hikari/internal/collections.py b/hikari/internal/collections.py
index 916a887b..db61827b 100644
--- a/hikari/internal/collections.py
+++ b/hikari/internal/collections.py
@@ -23,7 +23,7 @@
 """Custom data structures used within Hikari's core implementation."""
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "ExtendedMapT",
     "KeyT",
     "ValueT",
@@ -32,7 +32,7 @@
     "FreezableDict",
     "LimitedCapacityCacheMap",
     "get_index_or_slice",
-]
+)
 
 import abc
 import array
diff --git a/hikari/internal/data_binding.py b/hikari/internal/data_binding.py
index 619eb700..d0c22fe2 100644
--- a/hikari/internal/data_binding.py
+++ b/hikari/internal/data_binding.py
@@ -23,7 +23,7 @@
 """Data binding utilities."""
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "Headers",
     "Query",
     "JSONObject",
@@ -34,7 +34,7 @@
     "JSONDecodeError",
     "JSONObjectBuilder",
     "URLEncodedFormBuilder",
-]
+)
 
 import typing
 
diff --git a/hikari/internal/deprecation.py b/hikari/internal/deprecation.py
index 95efbe84..b328091a 100644
--- a/hikari/internal/deprecation.py
+++ b/hikari/internal/deprecation.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["deprecated", "warn_deprecated"]
+__all__: typing.Sequence[str] = ("deprecated", "warn_deprecated")
 
 import functools
 import inspect
diff --git a/hikari/internal/enums.py b/hikari/internal/enums.py
index 25746880..17429512 100644
--- a/hikari/internal/enums.py
+++ b/hikari/internal/enums.py
@@ -23,7 +23,7 @@
 """Implementation of parts of Python's `enum` protocol to be more performant."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["Enum", "Flag"]
+__all__: typing.Sequence[str] = ("Enum", "Flag")
 
 import functools
 import operator
diff --git a/hikari/internal/fast_protocol.py b/hikari/internal/fast_protocol.py
index 871d54d4..5cc27a5c 100644
--- a/hikari/internal/fast_protocol.py
+++ b/hikari/internal/fast_protocol.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["FastProtocolChecking"]
+__all__: typing.Sequence[str] = ("FastProtocolChecking",)
 
 import typing
 
diff --git a/hikari/internal/mentions.py b/hikari/internal/mentions.py
index 2915c350..964579cd 100644
--- a/hikari/internal/mentions.py
+++ b/hikari/internal/mentions.py
@@ -23,7 +23,7 @@
 """Utility functions used for managing mentions on Discord."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["generate_allowed_mentions"]
+__all__: typing.Sequence[str] = ("generate_allowed_mentions",)
 
 import typing
 
diff --git a/hikari/internal/net.py b/hikari/internal/net.py
index 57360b88..3024f513 100644
--- a/hikari/internal/net.py
+++ b/hikari/internal/net.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["generate_error_response", "create_client_session"]
+__all__: typing.Sequence[str] = ("generate_error_response", "create_client_session")
 
 import http
 import typing
diff --git a/hikari/internal/reflect.py b/hikari/internal/reflect.py
index d8703980..d28af6c3 100644
--- a/hikari/internal/reflect.py
+++ b/hikari/internal/reflect.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["resolve_signature"]
+__all__: typing.Sequence[str] = ("resolve_signature",)
 
 import functools
 import inspect
diff --git a/hikari/internal/routes.py b/hikari/internal/routes.py
index 9ddb221e..c6da70ea 100644
--- a/hikari/internal/routes.py
+++ b/hikari/internal/routes.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["CompiledRoute", "Route", "CDNRoute"]
+__all__: typing.Sequence[str] = ("CompiledRoute", "Route", "CDNRoute")
 
 import math
 import re
diff --git a/hikari/internal/spel.py b/hikari/internal/spel.py
index 63146b09..4305f357 100644
--- a/hikari/internal/spel.py
+++ b/hikari/internal/spel.py
@@ -52,7 +52,7 @@
 """
 from __future__ import annotations
 
-__all__: typing.List[str] = ["AttrGetter"]
+__all__: typing.Sequence[str] = ("AttrGetter",)
 
 import operator
 import typing
diff --git a/hikari/internal/time.py b/hikari/internal/time.py
index 813e479b..f0149e38 100644
--- a/hikari/internal/time.py
+++ b/hikari/internal/time.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "DISCORD_EPOCH",
     "datetime_to_discord_epoch",
     "discord_epoch_to_datetime",
@@ -36,7 +36,7 @@
     "monotonic",
     "monotonic_ns",
     "uuid",
-]
+)
 
 import datetime
 import time
diff --git a/hikari/internal/ux.py b/hikari/internal/ux.py
index 0e66ab39..04217fc9 100644
--- a/hikari/internal/ux.py
+++ b/hikari/internal/ux.py
@@ -23,7 +23,7 @@
 """User-experience extensions and utilities."""
 from __future__ import annotations
 
-__all__: typing.List[str] = ["init_logging", "print_banner", "supports_color", "HikariVersion", "check_for_updates"]
+__all__: typing.Sequence[str] = ("init_logging", "print_banner", "supports_color", "HikariVersion", "check_for_updates")
 
 import importlib.resources
 import logging
diff --git a/hikari/invites.py b/hikari/invites.py
index df0584d8..9e9380ca 100644
--- a/hikari/invites.py
+++ b/hikari/invites.py
@@ -24,14 +24,14 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "TargetType",
     "VanityURL",
     "InviteGuild",
     "InviteCode",
     "Invite",
     "InviteWithMetadata",
-]
+)
 
 import abc
 import typing
diff --git a/hikari/iterators.py b/hikari/iterators.py
index 88a004f0..0aeeabe6 100644
--- a/hikari/iterators.py
+++ b/hikari/iterators.py
@@ -28,7 +28,7 @@
 """
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "LazyIterator",
     "FlatLazyIterator",
     "All",
@@ -36,7 +36,7 @@
     "BufferedLazyIterator",
     "ValueT",
     "AnotherValueT",
-]
+)
 
 import abc
 import asyncio
diff --git a/hikari/messages.py b/hikari/messages.py
index 9e4692a5..33b86802 100644
--- a/hikari/messages.py
+++ b/hikari/messages.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "MessageType",
     "MessageFlag",
     "MessageActivityType",
@@ -45,7 +45,7 @@
     "InteractiveButtonTypesT",
     "ComponentType",
     "PartialComponent",
-]
+)
 
 import typing
 
diff --git a/hikari/permissions.py b/hikari/permissions.py
index d1708e61..5e1f3588 100644
--- a/hikari/permissions.py
+++ b/hikari/permissions.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["Permissions"]
+__all__: typing.Sequence[str] = ("Permissions",)
 
 import functools
 import operator
diff --git a/hikari/presences.py b/hikari/presences.py
index 7a6248f4..fc8a68ea 100644
--- a/hikari/presences.py
+++ b/hikari/presences.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "Activity",
     "ActivityAssets",
     "ActivityFlag",
@@ -36,7 +36,7 @@
     "MemberPresence",
     "RichActivity",
     "Status",
-]
+)
 
 import typing
 
diff --git a/hikari/scheduled_events.py b/hikari/scheduled_events.py
index d4e37742..f6d9cd00 100644
--- a/hikari/scheduled_events.py
+++ b/hikari/scheduled_events.py
@@ -23,7 +23,7 @@
 """Application and entities that are used to describe guild scheduled events on Discord."""
 from __future__ import annotations
 
-__all__: typing.Sequence[str] = [
+__all__: typing.Sequence[str] = (
     "EventPrivacyLevel",
     "ScheduledEventType",
     "ScheduledEventStatus",
@@ -32,7 +32,7 @@
     "ScheduledStageEvent",
     "ScheduledVoiceEvent",
     "ScheduledEventUser",
-]
+)
 
 import typing
 
diff --git a/hikari/sessions.py b/hikari/sessions.py
index d5558ad1..25749a70 100644
--- a/hikari/sessions.py
+++ b/hikari/sessions.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["GatewayBotInfo", "SessionStartLimit"]
+__all__: typing.Sequence[str] = ("GatewayBotInfo", "SessionStartLimit")
 
 import typing
 
diff --git a/hikari/snowflakes.py b/hikari/snowflakes.py
index 6e97be91..b0f06576 100644
--- a/hikari/snowflakes.py
+++ b/hikari/snowflakes.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "Snowflake",
     "Unique",
     "calculate_shard_id",
@@ -34,7 +34,7 @@
     "SearchableSnowflakeishOr",
     "SnowflakeishIterable",
     "SnowflakeishSequence",
-]
+)
 
 import abc
 import typing
diff --git a/hikari/stickers.py b/hikari/stickers.py
index 741feb1e..753214b2 100644
--- a/hikari/stickers.py
+++ b/hikari/stickers.py
@@ -24,14 +24,14 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "StickerType",
     "StickerFormatType",
     "PartialSticker",
     "GuildSticker",
     "StandardSticker",
     "StickerPack",
-]
+)
 
 import typing
 
diff --git a/hikari/templates.py b/hikari/templates.py
index efbce520..616348fc 100644
--- a/hikari/templates.py
+++ b/hikari/templates.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["Template", "TemplateGuild", "TemplateRole"]
+__all__: typing.Sequence[str] = ("Template", "TemplateGuild", "TemplateRole")
 
 import typing
 
diff --git a/hikari/traits.py b/hikari/traits.py
index 974fc56d..0778dc6b 100644
--- a/hikari/traits.py
+++ b/hikari/traits.py
@@ -23,7 +23,7 @@
 """Core app interface for application implementations."""
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "CacheAware",
     "EventManagerAware",
     "EntityFactoryAware",
@@ -38,7 +38,7 @@
     "InteractionServerAware",
     "ShardAware",
     "VoiceAware",
-]
+)
 
 import typing
 
diff --git a/hikari/undefined.py b/hikari/undefined.py
index 74bdb625..48536461 100644
--- a/hikari/undefined.py
+++ b/hikari/undefined.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "UNDEFINED",
     "UndefinedNoneOr",
     "UndefinedOr",
@@ -32,7 +32,7 @@
     "all_undefined",
     "any_undefined",
     "count",
-]
+)
 
 import typing
 
diff --git a/hikari/urls.py b/hikari/urls.py
index b58fbb5c..aa5c3369 100644
--- a/hikari/urls.py
+++ b/hikari/urls.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["BASE_URL", "REST_API_URL", "OAUTH2_API_URL", "CDN_URL"]
+__all__: typing.Sequence[str] = ("BASE_URL", "REST_API_URL", "OAUTH2_API_URL", "CDN_URL")
 
 import typing
 
diff --git a/hikari/users.py b/hikari/users.py
index 92bc21e7..35ce8100 100644
--- a/hikari/users.py
+++ b/hikari/users.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["PartialUser", "User", "OwnUser", "UserFlag", "PremiumType"]
+__all__: typing.Sequence[str] = ("PartialUser", "User", "OwnUser", "UserFlag", "PremiumType")
 
 import abc
 import typing
diff --git a/hikari/voices.py b/hikari/voices.py
index a2c3b70d..37196964 100644
--- a/hikari/voices.py
+++ b/hikari/voices.py
@@ -24,7 +24,7 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = ["VoiceRegion", "VoiceState"]
+__all__: typing.Sequence[str] = ("VoiceRegion", "VoiceState")
 
 import typing
 
diff --git a/hikari/webhooks.py b/hikari/webhooks.py
index e7217833..9eeb4ed4 100644
--- a/hikari/webhooks.py
+++ b/hikari/webhooks.py
@@ -24,14 +24,14 @@
 
 from __future__ import annotations
 
-__all__: typing.List[str] = [
+__all__: typing.Sequence[str] = (
     "ApplicationWebhook",
     "ChannelFollowerWebhook",
     "ExecutableWebhook",
     "PartialWebhook",
     "WebhookType",
     "IncomingWebhook",
-]
+)
 
 import abc
 import typing


Test patch:
diff --git a/tests/hikari/impl/test_event_manager_base.py b/tests/hikari/impl/test_event_manager_base.py
index afe76b71..6f068b89 100644
--- a/tests/hikari/impl/test_event_manager_base.py
+++ b/tests/hikari/impl/test_event_manager_base.py
@@ -19,9 +19,13 @@
 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
+from __future__ import annotations
+
 import asyncio
 import contextlib
 import logging
+import sys
+import typing
 import unittest
 import warnings
 import weakref
@@ -849,6 +853,27 @@ async def test(event):
         resolve_signature.assert_not_called()
         subscribe.assert_called_once_with(member_events.MemberCreateEvent, test, _nested=1)
 
+    def test_listen_when_multiple_params_provided_in_decorator(self, event_manager):
+        stack = contextlib.ExitStack()
+
+        subscribe = stack.enter_context(mock.patch.object(event_manager_base.EventManagerBase, "subscribe"))
+        resolve_signature = stack.enter_context(mock.patch.object(reflect, "resolve_signature"))
+
+        with stack:
+
+            @event_manager.listen(member_events.MemberCreateEvent, member_events.MemberDeleteEvent)
+            async def test(event):
+                ...
+
+        assert subscribe.call_count == 2
+        resolve_signature.assert_not_called()
+        subscribe.assert_has_calls(
+            [
+                mock.call(member_events.MemberCreateEvent, test, _nested=1),
+                mock.call(member_events.MemberDeleteEvent, test, _nested=1),
+            ]
+        )
+
     def test_listen_when_param_provided_in_typehint(self, event_manager):
         with mock.patch.object(event_manager_base.EventManagerBase, "subscribe") as subscribe:
 
@@ -857,3 +882,41 @@ async def test(event: member_events.MemberCreateEvent):
                 ...
 
         subscribe.assert_called_once_with(member_events.MemberCreateEvent, test, _nested=1)
+
+    def test_listen_when_multiple_params_provided_as_typing_union_in_typehint(self, event_manager):
+        with mock.patch.object(event_manager_base.EventManagerBase, "subscribe") as subscribe:
+
+            @event_manager.listen()
+            async def test(event: typing.Union[member_events.MemberCreateEvent, member_events.MemberDeleteEvent]):
+                ...
+
+        assert subscribe.call_count == 2
+        subscribe.assert_has_calls(
+            [
+                mock.call(member_events.MemberCreateEvent, test, _nested=1),
+                mock.call(member_events.MemberDeleteEvent, test, _nested=1),
+            ]
+        )
+
+    @pytest.mark.skipif(sys.version_info < (3, 10), reason="Bitwise union only available on 3.10+")
+    def test_listen_when_multiple_params_provided_as_bitwise_union_in_typehint(self, event_manager):
+        with mock.patch.object(event_manager_base.EventManagerBase, "subscribe") as subscribe:
+
+            @event_manager.listen()
+            async def test(event: member_events.MemberCreateEvent | member_events.MemberDeleteEvent):
+                ...
+
+        assert subscribe.call_count == 2
+        subscribe.assert_has_calls(
+            [
+                mock.call(member_events.MemberCreateEvent, test, _nested=1),
+                mock.call(member_events.MemberDeleteEvent, test, _nested=1),
+            ]
+        )
+
+    def test_listen_when_incorrect_type_in_typehint(self, event_manager):
+        with pytest.raises(TypeError):
+
+            @event_manager.listen()
+            async def test(event: list[member_events.MemberUpdateEvent]):
+                ...