Skip to content

DiscordClient.ConnectAsync throws System.ArgumentNullException if the bot is owned by a team #2432

@FloatingMilkshake

Description

@FloatingMilkshake

Summary

If a bot is owned by a team, DiscordClient.ConnectAsync will throw an ArgumentNullException when trying to construct a DiscordApplication for the bot. Somewhere in ConnectAsync, DSharpPlus requests information about the team which owns the bot (/api/v9/teams/:team_id), and it gets back an object like this https://docs.discord.com/developers/topics/teams#data-models-team-member-object

It seems like DSharpPlus expects a permissions field instead of a role field, judging by this code https://github.com/DSharpPlus/DSharpPlus/blob/28294b9/DSharpPlus/Net/Abstractions/Transport/TransportTeam.cs#L31, and the exception is thrown when it fails to deserialize the response to a TransportTeam with a permissions field

What version of the library are you using?

v5.0.0-nightly (make sure you are using the latest nightly!)

What .NET version are you using? Make sure to use the latest patch release for your major version.

.NET 10.0

Operating System

No response

Reproduction Steps

  1. Make sure you are using a bot which is owned by a team. User-owned bots are unaffected
  2. Obviously have DiscordClient.ConnectAsync somewhere in your startup code
  3. Attempt to start your bot, an ArgumentNullException will be thrown

Trace Logs

[2026-04-14 02:46:21 +00:00] [DSharpPlus.Net.RestClient] [Trace] Request ID:01KP4Y3YDY8Z3ZBMKPQFDCD3HJ: Route has no known hash: oauth2/applications/:application_id.
[2026-04-14 02:46:21 +00:00] [DSharpPlus.Net.RestClient] [Trace] Request ID:01KP4Y3YDY8Z3ZBMKPQFDCD3HJ - Initial bucket capacity: 1000
[2026-04-14 02:46:21 +00:00] [DSharpPlus.Net.RestClient] [Trace] Request 01KP4Y3YDY8Z3ZBMKPQFDCD3HJ: {"id":"893586764881600512","name":"MechanicalMilkshake Dev","icon":"6c2c1f70c136829d0afa7a640c4ebe34","description":"Development version of MechanicalMilkshake! This bot may have features not yet pushed to the public repository at https://github.com/FloatingMilkshake/MechanicalMilkshake.","type":null,"bot":{"id":"893586764881600512","username":"MechanicalMilkshake Dev","avatar":"6c2c1f70c136829d0afa7a640c4ebe34","discriminator":"1067","public_flags":0,"flags":0,"bot":true,"banner":null,"accent_color":null,"global_name":null,"avatar_decoration_data":null,"collectibles":null,"display_name_styles":null,"banner_color":null,"clan":null,"primary_guild":null},"summary":"","is_monetized":false,"is_verified":false,"is_discoverable":false,"bot_public":false,"bot_require_code_grant":false,"integration_types_config":{"0":{},"1":{}},"verify_key":"a35e2b39d2c1310ca382bc01dacf9ddfb724dab7f2eec256f7a0546f912ecae1","flags":27787264,"hook":true,"storefront_available":false,"redirect_uris":[],"interactions_endpoint_url":null,"role_connections_verification_url":null,"owner":{"id":"1487534434482782348","username":"team1487534434482782348","avatar":null,"discriminator":"0000","public_flags":1024,"flags":1024,"banner":null,"accent_color":null,"global_name":null,"avatar_decoration_data":null,"collectibles":null,"display_name_styles":null,"banner_color":null,"clan":null,"primary_guild":null},"approximate_guild_count":1,"approximate_user_install_count":0,"approximate_user_authorization_count":0,"interactions_event_types":[],"interactions_version":1,"explicit_content_filter":0,"rpc_application_state":0,"store_application_state":1,"verification_state":1,"integration_public":false,"integration_require_code_grant":false,"discoverability_state":1,"discovery_eligibility_flags":2500,"monetization_state":1,"verification_eligibility_flags":125726,"monetization_eligibility_flags":247526,"bot_approximate_guild_count":1,"team":{"id":"1487534434482782348","icon":"88f369d3645e48fa114dee5af839aaee","name":"FloatingMilkshake","owner_user_id":"455432936339144705","members":[{"user":{"id":"455432936339144705","username":"floatingmilkshake","avatar":"5095e82a9e7d2e0f25476173bc693bff","discriminator":"0","public_flags":256,"flags":256,"banner":null,"accent_color":null,"global_name":"FloatingMilkshake","avatar_decoration_data":null,"collectibles":null,"display_name_styles":null,"banner_color":null,"clan":null,"primary_guild":null},"team_id":"1487534434482782348","membership_state":2,"role":"admin"}]},"internal_guild_restriction":2,"approved_consoles":[],"pricing_localization_strategy":"localized_price_sets"}

Exceptions or other error messages

Unhandled exception. System.ArgumentNullException: Value cannot be null. (Parameter 'collection')
   at System.Collections.Generic.HashSet`1..ctor(IEnumerable`1 collection, IEqualityComparer`1 comparer)
   at DSharpPlus.Entities.DiscordTeamMember..ctor(TransportTeamMember ttm) in C:\Users\milkshake\git\DSharpPlus\DSharpPlus\Entities\DiscordTeam.cs:line 111
   at DSharpPlus.Entities.DiscordApplication.<>c__DisplayClass113_0.<.ctor>b__0(TransportTeamMember x) in C:\Users\milkshake\git\DSharpPlus\DSharpPlus\Entities\Application\DiscordApplication.cs:line 225
   at System.Linq.Enumerable.ListSelectIterator`2.Fill(ReadOnlySpan`1 source, Span`1 destination, Func`2 func)
   at System.Linq.Enumerable.ListSelectIterator`2.ToArray()
   at DSharpPlus.Entities.DiscordApplication..ctor(TransportApplication transportApplication, BaseDiscordClient baseDiscordClient) in C:\Users\milkshake\git\DSharpPlus\DSharpPlus\Entities\Application\DiscordApplication.cs:line 224
   at DSharpPlus.BaseDiscordClient.GetCurrentApplicationAsync() in C:\Users\milkshake\git\DSharpPlus\DSharpPlus\Clients\BaseDiscordClient.cs:line 109
   at DSharpPlus.BaseDiscordClient.InitializeAsync() in C:\Users\milkshake\git\DSharpPlus\DSharpPlus\Clients\BaseDiscordClient.cs:line 135
   at DSharpPlus.DiscordClient.ConnectAsync(DiscordActivity activity, Nullable`1 status, Nullable`1 idlesince) in C:\Users\milkshake\git\DSharpPlus\DSharpPlus\Clients\DiscordClient.cs:line 155
   at MechanicalMilkshake.Program.Main() in C:\Users\milkshake\git\MechanicalMilkshake\Program.cs:line 103
   at MechanicalMilkshake.Program.<Main>()

Anything else you'd like to share

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions