Создание нумерованных каналов discord
Моя задача следующая:
Пользователь 1 создает канал - название канала должно быть 1.
После пользователь 2 создает канал - название канала должно быть 2.
После пользователь 1 выходит из своего канала и он удаляется.
Далее пользователь 3 создает канал и название канала должно быть 1 (То есть заполнило пропуск в последовательности. Всегда новый канал должен заполнять пропуск, если он есть)
Сейчас имею текущий код, пояснение ниже:
class App:
def __init__(self):
self.channels = self.generate_channels()
@staticmethod
def generate_channels():
return [i for i in range(0, 1)]
def append_channel(self, channel_to_add):
for channel in self.channels:
if channel is None:
self.channels[self.channels.index(channel)] = channel_to_add
break
else:
self.channels.append(channel_to_add)
def remove_channel(self, channel_to_remove):
for channel in self.channels:
if channel == channel_to_remove:
self.channels[self.channels.index(channel)] = None
break
else:
raise ValueError(f'Not Found {channel_to_remove}')
app = App()
@client.event
async def on_voice_state_update(member, before, after, app=app):
if before.channel is None and after.channel is not None:
get_vc_data = func.member_channel_data(member=member)
if get_vc_data[0] == '0':
category = discord.utils.get(guild.categories, name = 'voices')
#4 строчки ниже, это для красивых цифр, это можно просто пропустить
channel_num = ''
for char in app.channels:
if char is not None:
channel_num = indexes[char] or ""
app.append_channel(maximum(app.channels) + 1)
create_vc = await category.create_voice_channel(f"{channel_num}", overwrites=None, reason=None)
create_txt = await category.create_text_channel(f"{channel_num}", overwrites=None, reason=None)
elif get_vc_data[0] == '1':
try:
category = discord.utils.get(guild.categories, name = 'voices')
channel_num = ''
for char in app.channels:
channel_num = indexes[char] or ""
app.append_channel(maximum(app.channels) + 1)
create_vc = await category.create_voice_channel(f"{channel_num}", overwrites=None, reason=None)
create_txt = await category.create_text_channel(f"{channel_num}", overwrites=None, reason=None)
elif before.channel is not None and after.channel is None:
get_vc_data = func.member_channel_data(member=member)
await asyncio.sleep(5)
vc_to_delete = client.get_channel(int(get_vc_data[1]))
txt_to_delete = client.get_channel(int(get_vc_data[2]))
await vc_to_delete.delete()
await txt_to_delete.delete()
# back_indexes[vc_to_delete.name] - это штука, которая возвращает из красивых цифр - нормальные. Можно пропустить эту строчку и использовать обычные
num_del = back_indexes[vc_to_delete.name]
app.remove_channel(int(num_del))
def maximum(list_of_numbers: list) -> int:
number_i = 0
for i in list_of_numbers:
if i == None:
return number_i-1
break
else:
return max([i for i in list_of_numbers])
number_i = i
На данный момент оно создает каналы c последовательными цифрами, но не заполняет (а иногда и заполняет, но криво) пропуски.