dpytest
dpytest copied to clipboard
_cur_config members is None
So I was having an error:
def dict_from_user(user: discord.User) -> _types.JsonDict:
out = {
> 'id': user.id,
'username': user.name,
'discriminator': user.discriminator,
'avatar': user.avatar
}
E AttributeError: 'NoneType' object has no attribute 'id'
After a little debugging I think I've figured out where's the problem:
ipdb> _cur_config
RunnerConfig(client=<bot.bot.OilAndRopeBot object at 0x7fbe8b8cd040>, guilds=[<Guild id=874244393945661441 name='Test Guild 0' shard_id=None chunked=False member_count=4>], channels=[<TextChannel id=874244393945661442 name='Channel_0' position=1 nsfw=False news=False category_id=None>], members=[None, None])
ipdb> _cur_config.members
[None, None]
Seems like members are None
for some reason, so I've checked out how dpytest.configure
works.
So user
is correctly created but member
is None
:
> ****/discord/ext/test/runner.py(383)configure()
382 user = back.make_user(f"TestUser{str(num)}", f"{num+1:04}")
--> 383 member = back.make_member(user, guild, nick=user.name + f"_{str(num)}_nick")
384 members.append(member)
ipdb> user
<User id=874248080290086915 name='TestUser0' discriminator='0001' bot=False>
ipdb> n
> ****/discord/ext/test/runner.py(384)configure()
383 member = back.make_member(user, guild, nick=user.name + f"_{str(num)}_nick")
--> 384 members.append(member)
385 back.make_member(back.get_state().user, guild, nick=client.user.name + f"_nick")
ipdb> member
So checking out how back.make_member
works I found Member
class works perfectly but guild._add_member(member)
is not executed since self.member_cache_flags.joined
is False
.
> *****/discord/state.py(750)parse_guild_member_add()
749 member = Member(guild=guild, data=data, state=self)
--> 750 if self.member_cache_flags.joined:
751 guild._add_member(member)
ipdb> member
<Member id=874249207941300227 name='TestUser0' discriminator='0001' bot=False nick='TestUser0_0_nick' guild=<Guild id=874249183715000321 name='Test Guild 0' shard_id=None chunked=False member_count=1>>
ipdb> self.member_cache_flags.joined
False
If I manually execute guild._add_member(member)
then Member
is added.
So, any ideas why is this happening?
I would guess this is, yet again, the discord.py intents error.
After version 1.5 of discord.py, you need to specify "Intents" which tells discords API and discord.py you actually intend to use certain information/notices.
dpytest needs to have the Members intent specified or logic inside of discord.py will ignore data generated by dpytest.
Can't really say for sure without knowing what versions of discord.py and dpytest you run.
discord.py
is version 1.7.3 dpytest
is 0.5.3
Try adding the members intent to your bot and see if this error persists. Check here for more info on using intents in discord.py: https://discordpy.readthedocs.io/en/stable/intents.html
Okay, so setting up
@pytest.fixture
def bot(event_loop):
intents = discord.Intents.default()
intents.members = True
bot = Bot(loop=event_loop, intents=intents)
Works perfectly! Thanks!
Btw this should be documented