Есть ли способ найти, где был канал, и вернуть его в то же место?

#python #discord #discord.py-rewrite

#python #Discord #discord.py

Вопрос:

извините за другой вопрос, но есть ли способ найти, где был канал? Например, если бы я удалил канал под названием «мемы», он бы переделал себя и вернулся туда, где он был. В любом случае, чтобы это сделать? Любая помощь была бы отличной!

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

1. Не могли бы мы привести пример того, что вы пробовали до сих пор?

2. @MarkCook я просмотрел все документы, но я даже не знаю, с чего начать. похоже, никто никогда не задавал такого вопроса, хотя это возможно.

3. discordpy.readthedocs.io/en/latest/api.html#textchannel position Недвижимость, о которой идет textchannel речь, может стать хорошей отправной точкой. Короче говоря, чтобы прояснить, что я бы сделал, это создал файл .json, содержащий все текущие каналы и их позиции, в этот момент вы создаете задачу, которая проверяет все ваши каналы x за секунды или минуты и сравнивает существующие в настоящее время каналы с вашим файлом json каналов, которые должны существовать и иметьон переделывает и перемещает все отсутствующие каналы.

4. я новичок в discord.py , как бы я даже заставил его сохранить все каналы? @MarkCook

5. Сохранение каналов не является discord.py специфической функцией. Сохранение информации для сохранения — это то, что вы делаете с языком python. Библиотека предназначена не для того, чтобы делать все, она предназначена для помощи в конкретном аспекте вашего кода. Я предлагаю заглянуть в json библиотеку. Я печатаю пример, рабочий фрагмент, который может вам помочь.

Ответ №1:

Ниже приведен пример фрагмента, который примерно делает то, что вы хотите, чтобы он делал. Это не совсем рабочий скрипт, но я чувствую, что этого достаточно, чтобы указать вам правильное направление.

при on_guild_join этом бот создает список всех каналов, которые он может видеть. (Обратите внимание, что у этого бота, для моего тестирования, были административные разрешения, вам нужно будет изменить свои личные разрешения, чтобы заставить его работать на вас). Как только он очищает каналы, он сохраняет информацию в .файл json.

при включении on_guild_channel_delete on_guild_channel_update и on_guild_channel_create бот сравнивает канал, который был удален, и проверяет его по словарю «ожидаемых» каналов. Если он совпадает, канал / категория воссоздается и помещается в правильную категорию. Эта часть немного глючит, и у меня не было времени, чтобы заставить ее работать идеально, но это, вероятно, хорошее упражнение для вас, чтобы попробовать поиграть.

 import discord
from discord.utils import get
import json

client = discord.Client()
TOKEN = open('token.txt').read()

@client.event
async def on_guild_join(guild):
    """
    Called whenever our bot is invited into the server
    """

    # Create a dictionary to hold our channels
    guild_channels = {}

    # Get all the channels in the guild that was just joined
    for channel in guild.channels:

        # Determine if channel is a category or not
        if channel.category:
            # Store information in our dictionary (if in category)
            guild_channels[channel.name] = {
                                            'channel_name' : channel.name,
                                            'channel_type' : channel.type.name,
                                            'category': channel.category.name
                                          }
        else:
            # Store information in our dictionary (if is category)
            guild_channels[channel.name] = {
                                            'channel_name' : channel.name,
                                            'channel_type' : channel.type.name,
                                            'category': None
                                          }

    # Save our information to a JSON file for persistence
    with open('./{}_channels.json'.format(guild.id), 'w') as gFile:
        json.dump(guild_channels, gFile, indent=4)

@client.event
async def on_guild_channel_delete(channel):
    """
    Called whenever a channel is deleted
    """

    # Get a list of all expected channels
    with open('./{}_channels.json'.format(channel.guild.id), 'r') as gFile:
        expected_channels = json.load(gFile)
    
    # Check if channel was in expected_channels
    if channel.name in expected_channels:

        # If it's a category, remake the category
        if not expected_channels[channel.name]['category']:
            await channel.guild.create_category(expected_channels[channel.name]['channel_name'])

        # If it wasn't a category, make a channel and put it in the category it's supposed to have
        if channel.category:
            if expected_channels[channel.name]['channel_type'] == 'text':
                await channel.guild.create_text_channel(expected_channels[channel.name]['channel_name'], category=get(channel.guild.channels, name=expected_channels[channel.name]['category']))
            if expected_channels[channel.name]['channel_type'] == 'voice':
                await channel.guild.create_voice_channel(expected_channels[channel.name]['channel_name'], category=get(channel.guild.channels, name=expected_channels[channel.name]['category']))

@client.event
async def on_guild_channel_create(channel):
    
    # Get a list of all expected channels
    with open('./{}_channels.json'.format(channel.guild.id), 'r') as gFile:
        expected_channels = json.load(gFile)

    if channel.name in expected_channels:
        if channel.category != expected_channels[channel.name]['category']:
            await channel.edit(category=get(channel.guild.channels, name=expected_channels[channel.name]['category']))

@client.event
async def on_guild_channel_update(before,after):
    
    # Get a list of all expected channels
    with open('./{}_channels.json'.format(before.guild.id), 'r') as gFile:
        expected_channels = json.load(gFile)

    # Move channels to their respective categories
    if before.name in expected_channels:
        if before.category != expected_channels[before.name]['category']:
            await after.edit(category=get(before.guild.channels, name=expected_channels[before.name]['category']))

@client.event
async def on_ready():
    print("Ready")

client.run(TOKEN)