#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
, который имеет только ограниченное количество встроенных методов, к которым вы не можете добавить. Обратная трассировка ошибок должна подтвердить строку кода, из которой произошла ошибка.