dpytest icon indicating copy to clipboard operation
dpytest copied to clipboard

_cur_config members is None

Open LeCuay opened this issue 3 years ago • 4 comments

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_memberworks 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?

LeCuay avatar Aug 09 '21 11:08 LeCuay

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.

itsTheFae avatar Aug 09 '21 14:08 itsTheFae

discord.py is version 1.7.3 dpytest is 0.5.3

LeCuay avatar Aug 09 '21 15:08 LeCuay

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

itsTheFae avatar Aug 09 '21 15:08 itsTheFae

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

LeCuay avatar Aug 09 '21 17:08 LeCuay