AttributeError: 'NoneType' object has no attribute 'send' discord.py [Résolu]

Signaler
-
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021
-
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

Messages postés
16041
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 juin 2021
867
bonjour,
difficile sans voir l'ensemble du code.
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

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
Messages postés
16041
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 juin 2021
867
quelle version de discord.py utilises-tu? est-il possible qu'elle ait changé récemment?
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

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
Messages postés
16041
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 juin 2021
867
est-il possible que la version de discord.py ait changé récemment?
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

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.
Messages postés
16041
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 juin 2021
867
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?
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

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
Messages postés
16041
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 juin 2021
867
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.
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

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
Messages postés
16041
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 juin 2021
867
et en remplaçant default par all dans le premier essai?
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021
>
Messages postés
16041
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 juin 2021

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")

Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

Up
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.
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

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.
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 ?
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

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.
>
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

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.
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021
> 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'
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

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)?
Messages postés
16041
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 juin 2021
867
tu as bien donné les privilèges nécessaires au bot?
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021
>
Messages postés
16041
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 juin 2021

Le bot à en effet toutes les permissions grâce à son rôle.
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

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?
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.
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

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.
Messages postés
16041
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 juin 2021
867
Reste que le code est excessivement opaque.
>
Messages postés
16041
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 juin 2021

Pour moi tout est opaque dans cette bibliothèque :-D
Messages postés
16041
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 juin 2021
867 > Grimouare
ton code ne donne aucune possibilité d'observer ce qui se passe.
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.
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021
> Grimouare
Je l'ai dit au début: regarde mon premier message ( https://forums.commentcamarche.net/forum/affich-37240887-attributeerror-nonetype-object-has-no-attribute-send-discord-py#0 ).
Le lien que tu m'as donné ne parle pas de la même chose. Le fait est qu'ils utilise l'attribut member de payload qui n'existe pas, enfin de ce que j'ai compris.
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

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'
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

Up
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
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

Merci grimouare,
Je vais tester tout ça.
Messages postés
19
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
16 juin 2021

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