Discord bot

herman1921

Новичок
Пользователь
Июл 15, 2021
13
0
1
Всем привет!
Может кто сталкивался с ботами в Discord.
Прошу помогите с ошибками в коде:

Python:
import discord
from discord.ext import commands
from token_conf import token
import youtube_dl
import os

bot = commands.Bot(command_prefix='!')

@bot.event
async def on_ready():
    print('Bot online!')

server, server_id, name_channel = None, None, None

domains = ['https://www.youtube.com', 'http://www.youtube.com', 'https://youtu.be', 'http://youtu.be']
async def check_domains(link):
    for x in domains:
        if link.startswith(x):
            return True
    return False

@bot.command()
async def play(ctx, *, command = None): # Воспроизводит музыку
    global server, server_id, name_channel # Делаем переменные видимыми внутри функции
    author = ctx.author # Получаем информацию об авторе
    if command ==  None:
        server = ctx.guild # Получаем массив о сервере
        name_channel = author.voice.channel.name # Получаем имя канала
        voice_channel = discord.utils.get(server.voice_channels, name=name_channel) # Задаём условие по которому получаем объект из массива данных.
    params = command.slpit(' ')
    if len(params) == 1:
        sourse = params[0] # Если 1 аргумент, то обращаемся к params по ключу 0
        server = ctx.guild
        name_channel = author.voice.channel.name
        voice_channel = discord.utils.get(server.voice_channels, name=name_channel)
        print('param 1')
    elif len(params) == 3:
        server_id = params[0] # извлекаем данные
        voice_id = params[1]
        sourse = params[2]
        try:
            server_id = int(server_id)
            voice_id = int(voice_id)
        except:
            await ctx.channel.send(f'{author.mention}, id сервера или войса должно быть целым числом!')
            return
        print('param 3')
        server = bot.get_guild(server_id)
        voice_channel = discord.utils.get(server.voice_channels, id=voice_id)
    else:
        await ctx.channel.send(f'{author.mention}, команда не корректна!')
        return

    voice = discord.utils.get(bot.voice_clients, guild=server)
    if voice is None:
        await voice_channel.connect()
        voice = discord.utils.get(bot.voice_clients, guild=server)

    if sourse == None:
        pass
    elif sourse.startswith('http'): # если сайт после проверки находится в списке разрешенных domains, то запускаем, иначе завершение ф-ии
        if not await check_domains(sourse):
            await ctx.channel.send(f'{author.mention}, ссылка не является разрешенной!')
            return
        song_there = os.path.isfile('song.mp3')
        try: #  делаем проверку
            if song_there:
                os.remove('song.mp3')
        except PermissionError:
            await ctx.channel.send('Недостаточно прав для удаления файла!')
            return
        ydl_opts = {
            'format': 'bestaudio/best',
            'postprocessors': [
                {
                    'key': 'FFmpegExtractAudio',
                    'preferredcodec': 'mp3',
                    'preferredquality': '192',
                }
            ],
        }

        with youtube_dl.YoutubeDL(ydl_opts) as ydl: # обращаемся к библиотеке ютуб
            ydl.download([sourse]) # метод скачивания аудио и передаем массив sourse - нашу ссылку
        for file in os.listdir('./'):
            if file.endswith('.mp3'): # при условии окончания названия файла на mp3
                os.rename(file, 'song.mp3') # переименновываем файл скаченной музыки и задаём новое имя для удобства списка песен в одном файле
        voice.play(discord.FFmpegPCMAudio('song.mp3'))
    else:
        voice.play(discord.FFmpegPCMAudio(f'{sourse}'))

@bot.command()
async def leave(ctx): # команда выйти из voice
    global server, name_channel
    voice = discord.utils.get(bot.voice_clients, guild=server)
    if voice.is_connected():
        await voice.disconnect()
    else:
        await ctx.channel.send(f'{ctx.author.mention}, бот уже отключен!')

@bot.command()
async def pause(ctx): # функция паузы
    voice = discord.utils.get(bot.voice_clients, guild=server)
    if voice.is_playnig():
        voice.pause()
    else:
        await ctx.channel.send(f'{ctx.author.mention},Музыка не воспроизводится')

@bot.command()
async def resume(ctx): # фунцкия снятия паузы
    voice = discord.utils.get(bot.voice_clients, guild=server)
    if voice.is_paused():
        voice.resume()
    else:
        await ctx.channel.send(f'{ctx.author.mention},Музыка уже играет')

@bot.command()
async def stop(ctx):
    voice = discord.utils.get(bot.voice_clients, guild=server)
    voice.stop()

bot.run(token)

1628601395981.png
1628601415569.png
 

Форум IT Специалистов