AttributeError: 'NoneType' object has no attribute 'send' discord.py

Résolu
Ymmj -  
Ymmj Messages postés 23 Statut Membre -
Bonjour,

Je suis en train de coder un bot discord.
Quand j'ai commencé, pour envoyer des messages depuis la fonction
async def on_raw_reaction_add(self, payload):
ou depuis une task créer par moi même, j'utilisais
await self.get_user(id).send("Message")
. Certains jours, cette fonction en marchais pas, mais depuis une semaine, ça ne marche plus du tout et me renvoie l'erreur:
AttributeError: 'NoneType' object has no attribute 'send'


Je comprend que cette erreur viens du fait que self.get_user(id) renvoie un objet de type NoneType mais je comprend pas pourquoi il le fait. Je suis sûr que l'id est bon car ça marchait il y a quelques temps. J'ai rechercher partout et certaines personnes avait en effet eu la même erreur que moi (https://stackoverflow.com/questions/56914557/nonetype-object-has-no-attribute-send-when-work-with-discord-for-python et https://stackoverflow.com/questions/51867193/attributeerror-nonetype-object-has-no-attribute-send mais les réponses étaient d'une part très flou, et d'autre part en anglais.

Pourriez vous m'éclaircir?
Merci d'avance

Configuration: Linux / Firefox 89.0

16 réponses

Résumé de la discussion

Un développeur de bot Discord rencontre une erreur AttributeError: 'NoneType' object has no attribute 'send' lorsqu'il utilise on_raw_reaction_add et self.get_user(payload.user_id) pour envoyer un message, et self.get_user renvoie None. Plusieurs explications évoquées incluent une éventuelle modification de la version de discord.py, le fait que get_user retourne None si l'objet n'est pas en cache, et la nécessité de configurer les intents. D'autres corrections suggèrent de récupérer l'utilisateur via payload.user_id avec fetch_user ou d'utiliser des intents adéquats et d'activer l'intention 'guilds' et 'members' côté bot et serveur. Enfin, certains cas exigent de recourir à fetch_user pour obtenir l'objet utilisateur à partir de payload.user_id, plutôt que de s'appuyer sur le cache, et d'ajuster les intents en conséquence.

Bobot (l'IA à votre service)
  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    difficile sans voir l'ensemble du code.
    0
  2. Ymmj Messages postés 23 Statut Membre 2
     
    Bonjour,

    Si je n'ai pas mis le code, c'est qu'il est beaucoup trop long (+ de 5 000 lignes). Prenons un exemple de ce qui ne marche pas pour moi:
    import discord
    import random
    import time
    import sqlite3
    
    class Bot(discord.Client):
        def __init__(self):
            super().__init__()
    
        async def on_ready(self):
            print("--------------")
            print("-Logged in as-")
            print(self.user.name)
            print(self.user.id)
            print("--------------")
    
    
        async def on_message(self, message):
            if self.user == message.author:
                return
    
            await message.add_reaction("\u2705")#On rajoute une réaction a chaque message posté
    
        async def on_raw_reaction_add(self, payload):
            if self.user.id == payload.user_id:
                return
    
            await self.get_user(payload.user_id).send("Test")#Envoie d'un message à chaque réactions postés
    
    if __name__ == "__main__":
        bot = Bot()
        bot.run("token")
    


    Sur discord, si je fait un message la réaction se met bien:


    Mais quand je clic sur la réaction:
    Ignoring exception in on_raw_reaction_add
    Traceback (most recent call last):
    File "/home/lancelot/.local/lib/python3.8/site-packages/discord/client.py", line 343, in _run_event
    await coro(*args, **kwargs)
    File "exFormum.py", line 28, in on_raw_reaction_add
    await self.get_user(payload.user_id).send("Test")#Envoie d'un message à chaque réactions postés
    AttributeError: 'NoneType' object has no attribute 'send'


    Voila. Je sais que cela viens du faite que
    self.get_user(payload.user_id)
    ne marche pas et renvoie None mais je ne comprend pas pourquoi il fait cela.

    Merci d'avoir lu mon post,
    Ymmj
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      quelle version de discord.py utilises-tu? est-il possible qu'elle ait changé récemment?
      0
  3. Ymmj Messages postés 23 Statut Membre 2
     
    Bonjour,

    En faisant
    pip list
    , j’obtiens, à la ligne de discord.py et discord:
    discord                   1.0.1               
    discord.py 1.7.2


    Merci d'avoir lu mon post,
    Ymmj
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      est-il possible que la version de discord.py ait changé récemment?
      0
  4. Ymmj Messages postés 23 Statut Membre 2
     
    J'avais déjà eu ce problème au part avant, mais quand j'attendais plusieurs jours et sa remarchait, comme par magie. Je ne sais pas si la version de discord.py à changé, mais au vu de ce que je viens de dire, je ne penses pas que ce soit ça le problème.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      oups, magie et problème intermittent!

      peut-être adapter le programme pour tester la condition et continuer sans envoyer dans le cas où get_user() etourne None?
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Ymmj Messages postés 23 Statut Membre 2
     
    Bonjour,

    Le problème, c'est que depuis une semaine et demi, tout le temps, et à chaque fois que j'appelle
    self.get_user()
    , il me renvoie
    None
    . Cela fait que je ne peux plus envoyer de messages si je n'ai que l'id et pas l'objet de type discord.Member.

    Merci d'avoir lu mon post,
    Ymmj
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      je vois que certains recommandent d'utiliser intents pour donner au programme les privilèges nécessaires. il semble que les programmes n'obtiennent plus automatiquement tous les privilèges configurés.
      deux exemples:
      intents = discord.Intents.default()
      intents.members=True
      client = discord.Client(intents=intents)

      intents = discord.Intents().all()
      client = commands.Bot(command_prefix=',', intents=intents)

      je ne vois pas en quoi cela s'applique pour un problème intermittent.
      0
  7. Ymmj Messages postés 23 Statut Membre 2
     
    Bonjour,
    Si j'esseye d'exécuter ce code:
    import discord
    import random
    import time
    import sqlite3
    
    intents = discord.Intents.default()
    intents.members=True
    client = discord.Client(intents=intents)
    
    class Bot(discord.Client):
        def __init__(self):
            super().__init__()
    
        async def on_ready(self):
            print("--------------")
            print("-Logged in as-")
            print(self.user.name)
            print(self.user.id)
            print("--------------")
    
    
        async def on_message(self, message):
            if self.user == message.author:
                return
    
            await message.add_reaction("\u2705")#On rajoute une réaction a chaque message posté
    
        async def on_raw_reaction_add(self, payload):
            if self.user.id == payload.user_id:
                return
    
            await self.get_user(payload.user_id).send("Test")#Envoie d'un message à chaque réactions postés
    
    if __name__ == "__main__":
        bot = Bot()
        bot.run("token")
    

    J'obtient toujours la même erreur quand je clique sur une réaction:
    Ignoring exception in on_raw_reaction_add
    Traceback (most recent call last):
    File "/home/lancelot/.local/lib/python3.8/site-packages/discord/client.py", line 343, in _run_event
    await coro(*args, **kwargs)
    File "exFormum.py", line 32, in on_raw_reaction_add
    await self.get_user(payload.user_id).send("Test")#Envoie d'un message à chaque réactions postés
    AttributeError: 'NoneType' object has no attribute 'send'

    Si j'exécute ce code:
    import discord
    import random
    import time
    import sqlite3
    
    intents = discord.Intents().all()
    client = commands.Bot(command_prefix=',', intents=intents)
    
    class Bot(discord.Client):
        def __init__(self):
            super().__init__()
    
        async def on_ready(self):
            print("--------------")
            print("-Logged in as-")
            print(self.user.name)
            print(self.user.id)
            print("--------------")
    
    
        async def on_message(self, message):
            if self.user == message.author:
                return
    
            await message.add_reaction("\u2705")#On rajoute une réaction a chaque message posté
    
        async def on_raw_reaction_add(self, payload):
            if self.user.id == payload.user_id:
                return
    
            await self.get_user(payload.user_id).send("Test")#Envoie d'un message à chaque réactions postés
    
    if __name__ == "__main__":
        bot = Bot()
        bot.run("token")
    

    J'obtiens dés le début l'erreur:
    Traceback (most recent call last):
    File "exFormum.py", line 7, in <module>
    client = commands.Bot(command_prefix=',', intents=intents)
    NameError: name 'commands' is not defined
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      et en remplaçant default par all dans le premier essai?
      0
      1. Ymmj Messages postés 23 Statut Membre 2 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Toujours la même erreur quand je fait:
        import discord
        import random
        import time
        import sqlite3
        
        intents = discord.Intents.all()
        intents.members=True
        client = discord.Client(intents=intents)
        
        class Bot(discord.Client):
            def __init__(self):
                super().__init__()
        
            async def on_ready(self):
                print("--------------")
                print("-Logged in as-")
                print(self.user.name)
                print(self.user.id)
                print("--------------")
        
        
            async def on_message(self, message):
                if self.user == message.author:
                    return
        
                await message.add_reaction("\u2705")#On rajoute une réaction a chaque message posté
        
            async def on_raw_reaction_add(self, payload):
                if self.user.id == payload.user_id:
                    return
        
                await self.get_user(payload.user_id).send("Test")#Envoie d'un message à chaque réactions postés
        
        if __name__ == "__main__":
            bot = Bot()
            bot.run("token")
        
        
        0
  8. Ymmj Messages postés 23 Statut Membre 2
     
    Up
    0
  9. Grimouare
     
    Bonjour.

    Le problème avec cette erreur :

    Ignoring exception in on_raw_reaction_add
    Traceback (most recent call last):
      File "/home/lancelot/.local/lib/python3.8/site-packages/discord/client.py", line 343, in _run_event
        await coro(*args, **kwargs)
      File "exFormum.py", line 32, in on_raw_reaction_add
        await self.get_user(payload.user_id).send("Test")#Envoie d'un message à chaque réactions postés
    AttributeError: 'NoneType' object has no attribute 'send'


    Vient d'ici non ?

    async def on_raw_reaction_add(self, payload):
            if self.user.id == payload.user_id:
                return


    Tu retournes None si c'est toi-même qui « clique sur une réaction », je ne sais même pas ce que c'est, et la flemme d'aller chercher l'info sur leur site.
    Et de toute façon elle retourne aussi None si ce n'est pas le cas... Donc en l'état elle retourne toujours None !

    Maintenant, cette fonction doit renvoyer quelque chose de spécifique non ? Faut potasser leur doc ou tuto pour avoir des exemples à mon avis.
    0
    1. Ymmj Messages postés 23 Statut Membre 2
       
      Non,
      if self.user.id == payload.user_id:
         return
      

      permet juste de stopper l'exécution de la fonction si c'est le bot qui as mis une réaction pour pas créer de boucles gênantes. J'ai vérifié, même en enlevant ces lignes, sa ne marche pas. De plus, ces lignes ne sont as dans la fonction
      self.get_user
      . Elle ne devrai donc pas interférer dans ce que
      self.get_user
      renvoie.
      0
  10. Grimouare
     
    Ah oui, je n'avais pas bien fait attention qu'il y avait quelque chose à la suite dans cette fonction...

    Si
    self.get_user(payload.user_id)
    retourne None, faut déjà regarder ce que vaut payload.user_id, et si ok, pourquoi n'est-il pas référencé dans Client ? Déjà de ce point de vue, y a un truc qui me chiffonne, mais n'y connaissant rien en tout ce truc discord, c'est peut-être logique.

    Les questions qui sont à poser c'est :
    - Qu'est-ce que le Client ?
    - Que représente cet objet payload ?
    - Y a-t-il une quelconque relation entre les 2 ?
    0
    1. Ymmj Messages postés 23 Statut Membre 2
       
      Voila un exemple de code qui ne marche pas:
      import random
      import time
      import discord
      import sqlite3
      
      intents = discord.Intents.all()
      intents.members=True
      client = discord.Client(intents=intents)
      
      class Bot(discord.Client):
          def __init__(self):
              super().__init__()
      
          async def on_ready(self):
              print("--------------")
              print("-Logged in as-")
              print(self.user.name)
              print(self.user.id)
              print("--------------")
      
      
          async def on_message(self, message):
              if self.user == message.author:
                  return
      
              await message.add_reaction("\u2705")#On rajoute une réaction a chaque message posté
      
      
          async def on_raw_reaction_add(self, payload):
              await self.get_user(payload.user_id).send("Test")#Envoie d'un message à chaque réactions postés
      
      if __name__ == "__main__":
          bot = Bot()
          bot.run("TOKEN")
      

      - Qu'est-ce que le Client : Comme tu peux le voir, je n'utilise nul part Client à part pour faire hériter ma class Bot d'elle.

      Que représente cet objet payload : Je ne sais moi même pas totalement comment ça marche, mais ce qui faut savoir, c'est que la fonction
      async def on_raw_reaction_add(self, payload):
      est appelé à chaque fois qu'une réaction est ajouté sur discord.
      Dans cette fonction, on a le droit d'utiliser payload dont certains de ses attributs sont très utiles. Par exemple,
      payload.user_id
      est l'id de l'utilisateur qui a rajouté la réaction. La fonction
      self.get_user(payload.user_id)
      devrai donc renvoyer un objet de type
      discord.Member
      qui serai l'utilisateur qui a envoyé la réaction. Ensuite, la métode send des objets
      discord.Member
      devrai lui envoyer un message.
      Mais
      self.get_user(payload.user_id)
      renvoie None.
      0
      1. Grimouare > Ymmj Messages postés 23 Statut Membre
         
        Ok, si on regarde la doc de Client : https://discordpy.readthedocs.io/en/stable/api.html#discord.Client.get_user, il est bien stipulé que la fonction retourne None si non référencé.
        Tu peux même t'en assurer en regardant ce que contient users https://discordpy.readthedocs.io/en/stable/api.html#discord.Client.users

        on_raw_reaction_add est donc une fonction de callback, et payload est un objet on_raw_reaction_add https://discordpy.readthedocs.io/en/stable/api.html#discord.RawReactionActionEvent , maintenant pourquoi payload.user_id est inconnu au bataillon dans ta classe Client, c'est là qu'il faut chercher.

        En testant les exemples du github, celui-ci :
        https://github.com/Rapptz/discord.py/blob/v1.7.2/examples/reaction_roles.py , cela fonctionne ?

        Je ne peux plus t'aider, car pour tester, faudrait créer un compte et tout le tintouin, et pas vraiment envie.
        Il faudrait trouver un script simple et fonctionnel sur internet, et de greffer ton code dessus.
        0
      2. Ymmj Messages postés 23 Statut Membre 2 > Grimouare
         
        # This example requires the 'members' privileged intents
        
        import discord
        
        class MyClient(discord.Client):
            def __init__(self, *args, **kwargs):
                super().__init__(*args, **kwargs)
        
                self.role_message_id = 0 # ID of the message that can be reacted to to add/remove a role.
                self.emoji_to_role = {
                    discord.PartialEmoji(name='????'): 0, # ID of the role associated with unicode emoji '????'.
                    discord.PartialEmoji(name='????'): 0, # ID of the role associated with unicode emoji '????'.
                    discord.PartialEmoji(name='green', id=0): 0, # ID of the role associated with a partial emoji's ID.
                }
        
            async def on_raw_reaction_add(self, payload: discord.RawReactionActionEvent):
                """Gives a role based on a reaction emoji."""
                # Make sure that the message the user is reacting to is the one we care about.
                if payload.message_id != self.role_message_id:
                    return
        
                guild = self.get_guild(payload.guild_id)
                if guild is None:
                    # Check if we're still in the guild and it's cached.
                    return
        
                try:
                    role_id = self.emoji_to_role[payload.emoji]
                except KeyError:
                    # If the emoji isn't the one we care about then exit as well.
                    return
        
                role = guild.get_role(role_id)
                if role is None:
                    # Make sure the role still exists and is valid.
                    return
        
                try:
                    # Finally, add the role.
                    await payload.member.add_roles(role)
                except discord.HTTPException:
                    # If we want to do something in case of errors we'd do it here.
                    pass
        
            async def on_raw_reaction_remove(self, payload: discord.RawReactionActionEvent):
                """Removes a role based on a reaction emoji."""
                # Make sure that the message the user is reacting to is the one we care about.
                if payload.message_id != self.role_message_id:
                    return
        
                guild = self.get_guild(payload.guild_id)
                if guild is None:
                    # Check if we're still in the guild and it's cached.
                    return
        
                try:
                    role_id = self.emoji_to_role[payload.emoji]
                except KeyError:
                    # If the emoji isn't the one we care about then exit as well.
                    return
        
                role = guild.get_role(role_id)
                if role is None:
                    # Make sure the role still exists and is valid.
                    return
        
                # The payload for `on_raw_reaction_remove` does not provide `.member`
                # so we must get the member ourselves from the payload's `.user_id`.
                member = guild.get_member(payload.user_id)
                if member is None:
                    # Make sure the member still exists and is valid.
                    return
        
                try:
                    # Finally, remove the role.
                    await member.remove_roles(role)
                except discord.HTTPException:
                    # If we want to do something in case of errors we'd do it here.
                    pass
        
        intents = discord.Intents.default()
        intents.members = True
        
        client = MyClient(intents=intents)
        client.run('token')
        

        Cette exemple ne marche pas et renvoie l'erreur:
        Traceback (most recent call last):
        File "/home/lancelot/Documents/Ceci, est le projet de ma vie/botAventurePrin.py", line 5015, in <module>
        bot.run(os.getenv("TOKEN"))
        File "/home/lancelot/.local/lib/python3.8/site-packages/discord/client.py", line 723, in run
        return future.result()
        File "/home/lancelot/.local/lib/python3.8/site-packages/discord/client.py", line 702, in runner
        await self.start(*args, **kwargs)
        File "/home/lancelot/.local/lib/python3.8/site-packages/discord/client.py", line 665, in start
        await self.login(*args, bot=bot)
        File "/home/lancelot/.local/lib/python3.8/site-packages/discord/client.py", line 511, in login
        await self.http.static_login(token.strip(), bot=bot)
        AttributeError: 'NoneType' object has no attribute 'strip'
        0
  11. Ymmj Messages postés 23 Statut Membre 2
     
    Bonjour,

    Je viens de me rendre compte que si je print
    self.users
    , cela renvoie seulement
    [<ClientUser id=821725411062317067 name="Ceci, est l'aventure de ta vie!" discriminator='4457' bot=True verified=True mfa_enabled=False>]
    . Tout les autres utilisateurs ne sont pas détectés. Cela pourrait-t-il venir de la configuration or code du bot(sur le discord develloper portal)?
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      tu as bien donné les privilèges nécessaires au bot?
      0
      1. Ymmj Messages postés 23 Statut Membre 2 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Le bot à en effet toutes les permissions grâce à son rôle.
        0
  12. Ymmj Messages postés 23 Statut Membre 2
     
    Bonjour,

    Quand j'exécute ce code que grimourae m'a donné:
    # This example requires the 'members' privileged intents
    import dotenv
    import os
    from dotenv import load_dotenv
    import discord
    
    class MyClient(discord.Client):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
    
            self.role_message_id = 0 # ID of the message that can be reacted to to add/remove a role.
            self.emoji_to_role = {
                discord.PartialEmoji(name='????'): 0, # ID of the role associated with unicode emoji '????'.
                discord.PartialEmoji(name='????'): 0, # ID of the role associated with unicode emoji '????'.
                discord.PartialEmoji(name='green', id=0): 0, # ID of the role associated with a partial emoji's ID.
            }
    
        async def on_raw_reaction_add(self, payload: discord.RawReactionActionEvent):
            """Gives a role based on a reaction emoji."""
            # Make sure that the message the user is reacting to is the one we care about.
            if payload.message_id != self.role_message_id:
                return
    
            guild = self.get_guild(payload.guild_id)
            if guild is None:
                # Check if we're still in the guild and it's cached.
                return
    
            try:
                role_id = self.emoji_to_role[payload.emoji]
            except KeyError:
                # If the emoji isn't the one we care about then exit as well.
                return
    
            role = guild.get_role(role_id)
            if role is None:
                # Make sure the role still exists and is valid.
                return
    
            try:
                # Finally, add the role.
                await payload.member.add_roles(role)
            except discord.HTTPException:
                # If we want to do something in case of errors we'd do it here.
                pass
    
        async def on_raw_reaction_remove(self, payload: discord.RawReactionActionEvent):
            """Removes a role based on a reaction emoji."""
            # Make sure that the message the user is reacting to is the one we care about.
            if payload.message_id != self.role_message_id:
                return
    
            guild = self.get_guild(payload.guild_id)
            if guild is None:
                # Check if we're still in the guild and it's cached.
                return
    
            try:
                role_id = self.emoji_to_role[payload.emoji]
            except KeyError:
                # If the emoji isn't the one we care about then exit as well.
                return
    
            role = guild.get_role(role_id)
            if role is None:
                # Make sure the role still exists and is valid.
                return
    
            # The payload for `on_raw_reaction_remove` does not provide `.member`
            # so we must get the member ourselves from the payload's `.user_id`.
            member = guild.get_member(payload.user_id)
            if member is None:
                # Make sure the member still exists and is valid.
                return
    
            try:
                # Finally, remove the role.
                await member.remove_roles(role)
            except discord.HTTPException:
                # If we want to do something in case of errors we'd do it here.
                pass
    
    intents = discord.Intents.default()
    intents.members = True
    
    client = MyClient(intents=intents)
    load_dotenv(dotenv_path = "config")
    client.run(os.getenv("TOKEN"))
    


    Il n'y a plus d'erreurs comme au début mais il tourne dans le vide sans rien afficher même si je met une réaction sur discord. Avant, il faisait systématiquement un erreur. Pourtant, à part le système pour que le token ne soit pas visible, je n'ai quasiment rien changé. Je ne comprends rien à ce qui se passe!
    Pouriez vous m'aider?
    0
    1. Grimouare
       
      Bonsoir.

      Le problème de ce code est qu'il y a beaucoup de return sans rien indiquer d'autres, donc impossible de savoir ce qui ne va pas.

      Il faudrait ajouter des print juste avant chacun de ces return et pass afin d'avoir des indices.
      0
    2. Grimouare
       
      erreur...
      0
  13. Ymmj Messages postés 23 Statut Membre 2
     
    Je penses que le problème viens non pas du code, mais des configurations de mon bot, car, on n'as vu avant (en printant
    self.users
    ) qu'il ne détectait que lui. Le problème doit donc venir du discord develloper portal ou de discord directement. De plus, il y a quelque temps, le code marchait (le
    await self.get_user(payload.user_id).send("message")
    ). Je penses donc que c'est discord qui a changé quelque chose aux bot eux même et que le problème ne vient pas de discord.py.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Reste que le code est excessivement opaque.
      0
      1. Grimouare > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Pour moi tout est opaque dans cette bibliothèque :-D
        0
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Grimouare
         
        ton code ne donne aucune possibilité d'observer ce qui se passe.
        0
    2. Grimouare
       
      Bonjour.

      Il fallait le dire depuis le départ que ton code fonctionnait avant et plus depuis quoi en réalité ? Une mise à jour ?

      Avec un petit passage par github et les problèmes liés à cette bibliothèque, on tombe rapidement sur
      https://github.com/Rapptz/discord.py/discussions/6981
      et bingo, pareil que toi, le mainteneur a en plus répondu et clos le sujet.
      0
  14. Ymmj Messages postés 23 Statut Membre 2
     
    Voila le code le plus simple qui ne marche pas (bien que je ne pense pas que l'erreur vienne de là):
    import dotenv
    import os
    from dotenv import load_dotenv
    import discord
    
    class Bot(discord.Client):
        def __init__(self):
            super().__init__()
        async def on_raw_reaction_add(self, payload):
            await self.get_user(payload.user_id).send("test")
    
    bot = Bot()
    load_dotenv(dotenv_path = "config")
    bot.run(os.getenv("TOKEN"))
    

    Quand j'ajoute une réaction sur discord:
    Ignoring exception in on_raw_reaction_add
    Traceback (most recent call last):
    File "/home/lancelot/.local/lib/python3.8/site-packages/discord/client.py", line 343, in _run_event
    await coro(*args, **kwargs)
    File "exFormum.py", line 10, in on_raw_reaction_add
    await self.get_user(payload.user_id).send("test")
    AttributeError: 'NoneType' object has no attribute 'send'
    0
  15. grimouare
     
    Bonsoir.

    Je n'avais pas donné le bon lien en effet, mais c'est bien dans intent qu'il faut chercher comme cela a déjà été dit par yb.

    https://github.com/Rapptz/discord.py/issues/5867
    et de là, il faut bien lire ce que raconte intent et tester pour trouver la bonne configuration, et là, seul toi peut le faire.
    https://discordpy.readthedocs.io/en/latest/intents.html

    D'après cette page, il y aurait peut-être un truc aussi à régler côté server discord, tu l'as déjà fait ?

    Le code que tu exposes n'a aucune config de faite avec intent, et c'est vraiment là qu'il faut chercher, car la solution y est, pour ma part je ne peux tester, car comme déjà dit, ces trucs discord, c'est pas mon truc justement, je ne comprends même pas à quoi ça sert ^^

    Edit: encore ça sur github
    https://github.com/rosalogia/rucs24-bot/pull/86
    0
    1. Ymmj Messages postés 23 Statut Membre 2
       
      Merci grimouare,
      Je vais tester tout ça.
      0
  16. Ymmj Messages postés 23 Statut Membre 2
     
    J'ai réussi!
    Merci a vous grimouare et yg_be!
    Voila le code qui marche:
    import dotenv
    import os
    from dotenv import load_dotenv
    import discord
    
    intents = discord.Intents.all()
    
    class Bot(discord.Client):
        def __init__(self, intents):
            super().__init__(intents=intents)
        async def on_raw_reaction_add(self, payload):
            await self.get_user(payload.user_id).send("test")
    
    bot = Bot(intents=intents)
    load_dotenv(dotenv_path = "config")
    bot.run(os.getenv("TOKEN"))

    Le problème était que je définissait bien les intents mais que je ne les prenais pas en argument dans le constructeur de discord.Client!
    Je vous remercie encore une fois,
    Ymmj
    0