3 votes

statut de discord.py dans un cog

J'ai cherché cette question partout mais je n'ai pas trouvé de réponse.

Je viens de commencer à apprendre discord.py avec très peu de connaissances préalables en python, alors je m'excuse si cette question semble très simple, je fais cela depuis environ 12 heures en utilisant uniquement un tutoriel YouTube.

Ma question est donc la suivante : comment avoir un état mobile à l'intérieur d'un engrenage ? Je continue à obtenir une erreur qui dit "AttributeError : module 'discord.ext.commands' has no attribute 'event'".

Le code de l'engrenage est

import discord
import os
from discord.ext import commands
from itertools import cycle

status = cycle(['First status', 'Second status', 'Third status'])

class status(commands.Cog):

    def __init__(self, client):
        self.client = client

        @tasks.loop(seconds=3)
        async def change_status():
            await commands.change_presence(activity=discord.Game(next(status)))

        @commands.event
        async def on_ready():
            change_status.start()
            print('Bot ready')

def setup(client):
    client.add_cog(status(client))

Merci d'avance pour toute aide !

3voto

Aditya Tomar Points 827

Après quelques recherches, j'ai réussi à corriger l'erreur que vous obtenez. Cependant, je n'ai pas réussi à faire changer les statuts ; cela peut être dû au fait que je n'utilise pas la méthode d'évaluation de l'état de l'utilisateur. change_presence() correctement. Néanmoins, je peux au moins vous aider à vous débarrasser de l'erreur, et vous pouvez prendre le relais. Vous trouverez ci-dessous un amalgame des erreurs précédentes que j'ai relevées dans votre code, ainsi que le code qui vous permettra de vous débarrasser du message d'erreur.

import discord
import os
from discord.ext import commands, tasks
from itertools import cycle

class status(commands.Cog):

    def __init__(self, client):
        self.client = client
        self.status = cycle(['First status', 'Second status', 'Third status'])

        @tasks.loop(seconds=3.0)
        async def change_status(self):
            print('Changing status')
            await self.client.change_presence(activity=discord.Game(next(self.status)))

        @commands.Cog.listener()
        async def on_ready(self):
            self.change_status.start()

def setup(client):
    client.add_cog(status(client))

La cause de votre erreur était que @commands.event n'existe pas. Il faut plutôt utiliser @commands.Cog.listener() c'est pourquoi l'erreur était affichée 'discord.ext.commands' has no attribute 'event' . J'ai trouvé un forum reddit qui parle du même problème que vous, et la personne a réussi à le résoudre. Je vous suggère donc de le lire et de l'essayer par vous-même. Je vais supprimer mon ancienne réponse, car celle-ci contient tout ce que j'ai indiqué. J'apprécierais également que vous acceptiez cette réponse, car elle élimine l'erreur dont vous parliez.

1voto

Aditya Tomar Points 827

J'ai trouvé ! Voici le code final :

import discord
import os
from discord.ext import commands, tasks
from itertools import cycle

class status(commands.Cog):

    def __init__(self, client):
        self.client = client
        self.status = cycle(['First status', 'Second status', 'Third status'])
        print("cog loaded")

    @tasks.loop(seconds=3.0)
    async def change_status(self):
        await self.client.change_presence(activity=discord.Game(next(self.status)))

    @commands.Cog.listener()
    async def on_ready(self):
        await self.client.wait_until_ready()
        self.change_status.start()

def setup(client):
    client.add_cog(status(client))

J'ai changé deux choses par rapport à ma réponse précédente : premièrement, le change_status y on_ready les fonctions devaient être indentées vers l'arrière pour les retirer du bloc d'indentation du constructeur class status(commands.Cog) . Cela permettrait aux fonctions de fonctionner réellement lorsque la roue dentée est chargée. Deuxièmement, j'ai dû ajouter await self.client.wait_until_ready() au début de la on_ready pour que le chargement du cache soit terminé. Cela devrait maintenant fonctionner comme vous le souhaitiez. En outre, veuillez accepter cette réponse au lieu de la précédente, afin que les autres personnes qui voient ce message puissent voir cette réponse qui fonctionne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X