Объект ‘TextChannel’ не поддается повторению | проверка канала не работает

#python-3.x #discord #discord.py #discord.py-rewrite

#python-3.x #Discord #discord.py

Вопрос:

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

 File "C:UsersUserDesktopBuild 1.0.2cogsmodmail.py", line 145, in on_message
if get(modmailchannel, name=f"{message.author.name.lower()}{message.author.discriminator}"):
File "C:UsersUserAppDataLocalProgramsPythonPython37libsite-packagesdiscordutils.py", line 271, in get
for elem in iterable:
TypeError: 'TextChannel' object is not iterable
enter code here
  

не уверен, почему или метод каким-то образом некорректен. Созданное имя канала — это имя пользователя и дискриминатор. Чего я пытаюсь добиться, так это того, что если этот канал уже существует, не создавайте другой канал / публикацию в том же канале.

Требуется справка

Вот код, с которым я работаю:

 @commands.Cog.listener()
async def on_message(self, message):
    if not isinstance(message.channel, discord.DMChannel) or message.author.id == self.bot.user.id:
        # not a DM, or it's just the bot itself
        return
    
    bucket = self._cd.get_bucket(message)
    retry_after = bucket.update_rate_limit()
    seconds = bucket.update_rate_limit()
    seconds = round(seconds, 2)
    hours, remainder = divmod(int(seconds), 3600)
    minutes, seconds = divmod(remainder, 60)
    if retry_after:
        pass
    else:
        channel = self.bot.get_channel(744311308509249610)
        if not channel:
            print("Mail channel not found! Reconfigure bot!")
        time = datetime.utcnow()
        guild = self.bot.get_guild(715288565877309521)
        member_role = get(guild.roles, name='Members')
        mod_role = get(guild.roles, name='Members')
        muted_role = get(guild.roles, name='Modmail Muted')
        user_id = message.author.id
        author = guild.get_member(user_id)
        
        content = message.clean_content
        
        if muted_role in author.roles:
            await message.channel.send("You're not allowed to use modmail.")
            return
        
        if len(message.content) < 0:
            await message.channel.send("Your message should be atleast 50 characters in length.")
            return
    
        if member_role in author.roles:
            emoji1 = '📨'
            emoji2 = '🗑️'
            message_confirm = "You're about to send a message to the mod team, react with :incoming_envelope: to confirm otherwise :wastebasket: to discard your message."
            embed = discord.Embed(description=message_confirm, colour=0x5539cc)
            embed.title = "Confirm Message"
            confirm = await message.channel.send(embed=embed)
            await confirm.add_reaction(emoji1)
            await confirm.add_reaction(emoji2)
            check = reaction_check(message=confirm, author=message.author, emoji=(emoji1, emoji2))
            try:
                reaction, user = await self.bot.wait_for('reaction_add', timeout=60.0, check=check)
                if reaction.emoji == emoji1:
                    embed = discord.Embed(title=f"Message Sent", description=f"Hello {message.author.display_name}! We have received your message and we will get back to you as soon as possible. You can send another message in **{minutes}m {seconds}s**.", timestamp=time, colour=0x5539cc)
                    await message.channel.send(embed=embed)
                elif reaction.emoji == emoji2:
                    embed = discord.Embed(title=f"Message Not Sent", description=f"Your message has not been sent. You can send another message in **{minutes}m {seconds}s**.", timestamp=time, colour=0x5539cc)
                    await message.channel.send(embed=embed)
                    return
            except asyncio.TimeoutError:
                await message.channel.send(f'Sorry, you took too long to confirm your message. Try again in **{minutes}m {seconds}s**.')
                return
            overwrites = {
                guild.default_role: discord.PermissionOverwrite(read_messages=False),
                guild.me: discord.PermissionOverwrite(read_messages=True),
                member_role: discord.PermissionOverwrite(read_messages=False),
                mod_role: discord.PermissionOverwrite(read_messages=True)}
            
            embed = discord.Embed(title=f"Modmail message request from — {message.author.name}#{message.author.discriminator}", colour=0xff8100)
            embed.add_field(name="Member:", value=f"{message.author.mention}" ,inline=True)
            embed.add_field(name="Reply ID:", value=f"{message.author.id}" ,inline=True)
            embed.add_field(name="Message:", value=content[:1000] or "blank", inline=False)
            embed.set_footer(text=f"Camp;P Command: !reply {message.author.id}")
            if message.attachments:
                embed.add_field(name="Attachments", value=", ".join([i.url for i in message.attachments]))
            if len(content[1000:]) > 0:
                embed.add_field(name="Message (continued):", value=content[1000:])
            modmailchannel = await guild.create_text_channel(f'{message.author.name}{message.author.discriminator}', overwrites=overwrites, category=self.bot.get_channel(744944688271720518))
            await modmailchannel.send(embed=embed)
            
            if get(modmailchannel, name=f"{message.author.name.lower()}{message.author.discriminator}"):
                 await modmailchannel.send(embed=embed)
            
        else:
            await message.channel.send("Only members can use modmail.")
  

Комментарии:

1. Не могли бы вы предоставить сообщение об ошибке целиком?

2. Только что добавлена полная ошибка, о которой идет речь.

3. Вы проверяете, есть ли modmailchannel.name определенное значение? Если это так, вам следует просто использовать modmailchannel.name==...

4. modmailchannel.name== В качестве проверки?

Ответ №1:

Вместо if get(modmailchannel, name=f"{message.author.name.lower()}{message.author.discriminator}"): используйте:

 if modmailchannel.name == f"{message.author.name.lower()}{message.author.discriminator}":
  

Комментарии:

1. Спасибо, я пробовал это, но я думаю, мне нужно разобраться, как я это делаю. Похоже, что он продолжает создавать каналы, а не проверяет, существует ли он уже. Должно быть, я делаю здесь что-то не так. Хотя спасибо за ваш ответ 🙂

2. @James где в коде вы проверяете, существует ли канал уже?

3. Я вижу, что, похоже, он отсутствует. * царапины в голове Мне нужно будет каким-то образом проверить, существует ли канал, прежде чем его создавать. Возможно ли это с modmailchannel = await guild.create_text_channel(f'{message.author.name}{message.author.discriminator}', overwrites=overwrites, category=self.bot.get_channel(744944688271720518)) await modmailchannel.send(embed=embed) , поскольку это всегда будет вызываться каждый раз, когда отправляется сообщение, создающее дублирующиеся каналы.

4. @James вы могли бы интегрировать простую проверку в код перед созданием канала channel_present = False for channel in guild.text_channels: if channel.name == f"{message.author.name.lower()}{message.author.discriminator}": channel_present = True Затем вы можете проверить, имеет ли значение channel_present значение False, а затем создать канал.