AttributeError: 'NoneType' object has no attribute 'send' discord.py
Résolu/Fermé
Ymmj
-
6 juin 2021 à 17:25
Ymmj Messages postés 23 Date d'inscription dimanche 6 juin 2021 Statut Membre Dernière intervention 27 juin 2021 - 16 juin 2021 à 14:58
Ymmj Messages postés 23 Date d'inscription dimanche 6 juin 2021 Statut Membre Dernière intervention 27 juin 2021 - 16 juin 2021 à 14:58
Bonjour,
Je suis en train de coder un bot discord.
Quand j'ai commencé, pour envoyer des messages depuis la fonction
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
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
A voir également:
- Attributeerror: 'nonetype' object has no attribute 'send'
- No tftp response ✓ - Forum Mobile
- Local send - Télécharger - Divers Utilitaires
- Shockwave flash object - Télécharger - Divers Web & Internet
- Hajime no ippo vf - Forum Cinéma / Télé
- No boot disk has been detected or the disk has failed - Forum Disque dur / SSD
16 réponses
yg_be
Messages postés
23338
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 novembre 2024
Ambassadeur
1 551
6 juin 2021 à 19:15
6 juin 2021 à 19:15
bonjour,
difficile sans voir l'ensemble du code.
difficile sans voir l'ensemble du code.
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
8 juin 2021 à 14:31
8 juin 2021 à 14:31
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:
Sur discord, si je fait un message la réaction se met bien:
Mais quand je clic sur la réaction:
Voila. Je sais que cela viens du faite que
Merci d'avoir lu mon post,
Ymmj
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
yg_be
Messages postés
23338
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 novembre 2024
1 551
8 juin 2021 à 16:06
8 juin 2021 à 16:06
quelle version de discord.py utilises-tu? est-il possible qu'elle ait changé récemment?
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
8 juin 2021 à 16:10
8 juin 2021 à 16:10
Bonjour,
En faisant
Merci d'avoir lu mon post,
Ymmj
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
yg_be
Messages postés
23338
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 novembre 2024
1 551
8 juin 2021 à 17:53
8 juin 2021 à 17:53
est-il possible que la version de discord.py ait changé récemment?
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
8 juin 2021 à 19:17
8 juin 2021 à 19:17
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.
yg_be
Messages postés
23338
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 novembre 2024
1 551
8 juin 2021 à 19:47
8 juin 2021 à 19:47
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?
peut-être adapter le programme pour tester la condition et continuer sans envoyer dans le cas où get_user() etourne None?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
9 juin 2021 à 10:54
9 juin 2021 à 10:54
Bonjour,
Le problème, c'est que depuis une semaine et demi, tout le temps, et à chaque fois que j'appelle
Merci d'avoir lu mon post,
Ymmj
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
yg_be
Messages postés
23338
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 novembre 2024
1 551
9 juin 2021 à 11:20
9 juin 2021 à 11:20
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:
je ne vois pas en quoi cela s'applique pour un problème intermittent.
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.
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
9 juin 2021 à 12:00
9 juin 2021 à 12:00
Bonjour,
Si j'esseye d'exécuter ce code:
J'obtient toujours la même erreur quand je clique sur une réaction:
Si j'exécute ce code:
J'obtiens dés le début l'erreur:
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
yg_be
Messages postés
23338
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 novembre 2024
1 551
9 juin 2021 à 12:13
9 juin 2021 à 12:13
et en remplaçant default par all dans le premier essai?
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
>
yg_be
Messages postés
23338
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 novembre 2024
9 juin 2021 à 12:39
9 juin 2021 à 12:39
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")
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
10 juin 2021 à 13:33
10 juin 2021 à 13:33
Up
Bonjour.
Le problème avec cette erreur :
Vient d'ici non ?
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.
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.
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
10 juin 2021 à 17:05
10 juin 2021 à 17:05
Non,
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
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_userrenvoie.
Ah oui, je n'avais pas bien fait attention qu'il y avait quelque chose à la suite dans cette fonction...
Si
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 ?
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 ?
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
Modifié le 11 juin 2021 à 09:14
Modifié le 11 juin 2021 à 09:14
Voila un exemple de code qui ne marche pas:
- 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
Dans cette fonction, on a le droit d'utiliser payload dont certains de ses attributs sont très utiles. Par exemple,
Mais
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_idest 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.Memberqui serai l'utilisateur qui a envoyé la réaction. Ensuite, la métode send des objets
discord.Memberdevrai lui envoyer un message.
Mais
self.get_user(payload.user_id)renvoie None.
Grimouare
>
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
Modifié le 11 juin 2021 à 12:00
Modifié le 11 juin 2021 à 12:00
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.
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.
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
>
Grimouare
11 juin 2021 à 17:07
11 juin 2021 à 17:07
# 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'
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
11 juin 2021 à 17:50
11 juin 2021 à 17:50
Bonjour,
Je viens de me rendre compte que si je print
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)?
yg_be
Messages postés
23338
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 novembre 2024
1 551
11 juin 2021 à 20:57
11 juin 2021 à 20:57
tu as bien donné les privilèges nécessaires au bot?
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
>
yg_be
Messages postés
23338
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 novembre 2024
12 juin 2021 à 09:44
12 juin 2021 à 09:44
Le bot à en effet toutes les permissions grâce à son rôle.
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
12 juin 2021 à 09:59
12 juin 2021 à 09:59
Bonjour,
Quand j'exécute ce code que grimourae m'a donné:
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?
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?
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
13 juin 2021 à 11:03
13 juin 2021 à 11:03
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.
yg_be
Messages postés
23338
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 novembre 2024
1 551
13 juin 2021 à 11:32
13 juin 2021 à 11:32
Reste que le code est excessivement opaque.
Grimouare
>
yg_be
Messages postés
23338
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 novembre 2024
13 juin 2021 à 11:54
13 juin 2021 à 11:54
Pour moi tout est opaque dans cette bibliothèque :-D
yg_be
Messages postés
23338
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 novembre 2024
1 551
>
Grimouare
13 juin 2021 à 13:08
13 juin 2021 à 13:08
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
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/6981et bingo, pareil que toi, le mainteneur a en plus répondu et clos le sujet.
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
>
Grimouare
13 juin 2021 à 12:21
13 juin 2021 à 12:21
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.
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.
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
13 juin 2021 à 11:49
13 juin 2021 à 11:49
Voila le code le plus simple qui ne marche pas (bien que je ne pense pas que l'erreur vienne de là):
Quand j'ajoute une réaction sur discord:
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'
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
14 juin 2021 à 14:56
14 juin 2021 à 14:56
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.
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
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/5867et 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
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
16 juin 2021 à 14:27
16 juin 2021 à 14:27
Merci grimouare,
Je vais tester tout ça.
Je vais tester tout ça.
Ymmj
Messages postés
23
Date d'inscription
dimanche 6 juin 2021
Statut
Membre
Dernière intervention
27 juin 2021
2
16 juin 2021 à 14:58
16 juin 2021 à 14:58
J'ai réussi!
Merci a vous grimouare et yg_be!
Voila le code qui marche:
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
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