Как мне создать экземпляр моего класса в discord.py

#discord.py

Вопрос:

 import discord
from discord.ext import commands  

intents = discord.Intents(messages=True, guilds=True, reactions=True, members=True, presences=True,guild_messages = True)


client = commands.Bot(command_prefix="!dc ", intents=intents)

#I've created the below class so that every user can have their own number of saying swear words.

class handling_swearwords :

    def __init__(self,swearwords = 0):
        self.swearwords = swearwords
        
    def __del__(self):
        print("One user has left the server .")


@client.event  
async def on_ready():  
    print("I am ready!")

@client.event
async def on_member_join(member):   
    channel = discord.utils.get(member.guild.text_channels, name="welcome")
    await channel.send(f"{member.name},welcome to the server,mate.")
   
    member_instance = member.name
    member_instance = handling_swearwords()  #Creating instance to the class.



async def on_member_remove(member):
    channel = discord.utils.get(member.guild.text_channels, name="Lovely-people")
    await channel.send(f"{member.name},see you later mate :(")
    member_instance2 = member.name
    del member_instance2 #If someone leaves the server,their instance will be deleted(at least this is my thought)


@client.event
async def on_message(message):  

    if message.author == client.user:  
        await client.process_commands(message)

    else:
        with open("Badwords.txt", "r", encoding="utf-8") as f:
            word = f.read()
            badwords = word.split(",")
            msg = message.content
            for x in badwords:
                if x in msg:
                    await message.delete()
                    await message.channel.send("Please do not use that word ever")
                    
                    message.author.name.swearwords  = 1 #Whenever user use a swearword(s),their number of swearwords will be increased.  
            await client.process_commands(message) 


#I created the below function to check whether there is a attribute which is called 'swearwords' or not.



client.run(Token)
 

Всякий раз, когда кто-то пишет ругательства в чат, я получаю объект «str», у которого нет атрибута «ругательства», ошибка.Я не очень хорошо разбираюсь в ООП, поэтому не смог решить эту проблему.Итак, может ли кто-нибудь помочь мне решить эту проблему?Спасибо

PS:Я думаю, что получил эту ошибку из-за сообщения.автор.имя.ругательства = 1 строка кода(или не idk)

Ответ №1:

Похоже, вы ищете способ отслеживать, сколько ругательств использует каждый участник. Хотя для этого вы можете создать свой собственный класс и объект, это будет то же самое, что использовать словарь Python, но с дополнительными шагами.

Я рекомендую использовать идентификаторы участников вместо имен, потому что идентификаторы более надежны. Вам также не нужно читать из файла каждое сообщение; вы можете попросить программу прочитать его один раз при запуске бота.

Вот пример того, как вы могли бы все это сделать:

 import discord
from discord.ext import commands


intents = discord.Intents(messages=True, guilds=True, reactions=True, members=True, presences=True,guild_messages = True)
client = commands.Bot(command_prefix="!dc ", intents=intents)
swearword_count = dict()  # The keys are member IDs (ints), and each value is the number of swearwords that member used (also ints).


with open("Badwords.txt", "r", encoding="utf-8") as f:
    word = f.read()
    badwords = word.split(",")


@client.event  
async def on_ready():  
    print("I am ready!")


@client.event
async def on_member_join(member):   
    channel = discord.utils.get(member.guild.text_channels, name="welcome")
    await channel.send(f"{member.name},welcome to the server,mate.")
    global swearword_count
    swearword_count[member.id] = 0


async def on_member_remove(member):
    channel = discord.utils.get(member.guild.text_channels, name="Lovely-people")
    await channel.send(f"{member.name},see you later mate :(")
    global swearword_count
    del swearword_count[member.id]


@client.event
async def on_message(message):  
    if message.author.bot:
        return
    
    global swearword_count
    global badwords
    msg = message.content
    for x in badwords:
        if x in msg:
            await message.delete()
            await message.channel.send("Please do not use that word ever")
            swearword_count[message.author.id]  = 1 #Whenever user use a swearword(s),their number of swearwords will be increased.  
            return

    await client.process_commands(message)


client.run(Token)
 

p.s. — Причина message.author.name.swearwords , по которой вы допустили ошибку 'str' object has no attribute 'swearwords' , заключается в том, что message.author.name она имеет встроенный тип Python str , который имеет только ограниченное количество встроенных методов, к которым вы не можете добавить. Обратная трассировка ошибок должна подтвердить строку кода, из которой произошла ошибка.