154 lines
6 KiB
Python
154 lines
6 KiB
Python
# Polarobot is a discord bot designed mainly to play music
|
|
# Copyright (C) 2022 Louis Lacoste
|
|
|
|
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# Also add information on how to contact you by electronic and paper mail.
|
|
|
|
import os
|
|
import sys
|
|
import re
|
|
import random
|
|
import discord
|
|
from discord.ext import commands
|
|
from discord.utils import get
|
|
import youtube_dl
|
|
|
|
from dotenv import load_dotenv
|
|
load_dotenv()
|
|
TOKEN = os.getenv('DISCORD_TOKEN')
|
|
|
|
#intents = discord.Intents.default()
|
|
#intents.message_content = True
|
|
#intents.members = True
|
|
|
|
intents = discord.Intents().all()
|
|
client = discord.Client(intents=intents)
|
|
bot = commands.Bot(command_prefix="!p ", intents=intents)
|
|
|
|
# YT related code
|
|
youtubeUrlRegex = "https?:\/\/(www\.)?(youtu|youtube)\.(com|be)"
|
|
def is_a_youtube_url(url: str):
|
|
return bool(re.match(youtubeUrlRegex, url))
|
|
|
|
youtube_dl.utils.bug_reports_message = lambda: ''
|
|
|
|
ytdl_format_options = {
|
|
'format': 'bestaudio/best',
|
|
'restrictfilenames': True,
|
|
'noplaylist': True,
|
|
'nocheckcertificate': True,
|
|
'ignoreerrors': False,
|
|
'logtostderr': False,
|
|
'quiet': True,
|
|
'no_warnings': True,
|
|
'default_search': 'auto',
|
|
'source_address': '0.0.0.0' # bind to ipv4 since ipv6 addresses cause issues sometimes
|
|
}
|
|
|
|
ffmpeg_options = {
|
|
'options': '-vn'
|
|
}
|
|
|
|
ytdl = youtube_dl.YoutubeDL(ytdl_format_options)
|
|
|
|
class YTDLSource(discord.PCMVolumeTransformer):
|
|
def __init__(self, source, *, data, volume=0.5):
|
|
super().__init__(source, volume)
|
|
self.data = data
|
|
self.title = data.get('title')
|
|
self.url = ""
|
|
|
|
@classmethod
|
|
async def from_url(cls, url, *, loop=None, stream=False):
|
|
loop = loop or asyncio.get_event_loop()
|
|
data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url, download=not stream))
|
|
if 'entries' in data:
|
|
# take first item from a playlist
|
|
data = data['entries'][0]
|
|
filename = data['title'] if stream else ytdl.prepare_filename(data)
|
|
return filename
|
|
|
|
def random_playing_gif():
|
|
gifList = ["https://media.tenor.com/Ra6rkhDtYPwAAAAd/anime-dj.gif",
|
|
"https://media.tenor.com/7o_Y0qCQaJQAAAAM/howan-anime.gif",
|
|
"https://media.tenor.com/_OA-44hy1-4AAAAM/anime-music.gif",
|
|
"https://media.tenor.com/rJpCgvQJgsEAAAAj/music.gif",
|
|
"https://media.tenor.com/sEKdNnp9tmoAAAAM/music-dog.gif",
|
|
"https://media.tenor.com/6z00WD2k8foAAAAM/boombox-jamming.gif"]
|
|
return random.choice(gifList)
|
|
|
|
|
|
@bot.event
|
|
async def on_ready():
|
|
print("Starting")
|
|
await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.playing, name='PolaroBot | !p to call'))
|
|
|
|
|
|
def restart_bot():
|
|
os.execv(sys.executable, ['python'] + sys.argv)
|
|
|
|
|
|
@bot.command(aliases=['reboot'])
|
|
async def restart(ctx):
|
|
"""Reboot bot"""
|
|
bot.current_ctx = ctx
|
|
print("Rebooting...")
|
|
embedDeco = discord.Embed(title="🤖PolaroBot Statut",
|
|
description="PolaroBot redémarre : Patientez quelques secondes.. ", color=0xF1D50E)
|
|
await ctx.send(embed=embedDeco)
|
|
await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.playing, name='PolaroBot redémarre...'))
|
|
restart_bot()
|
|
|
|
|
|
@bot.command(aliases=['play_music'], pass_context=True)
|
|
async def play(ctx, url: str):
|
|
"""Playing a song"""
|
|
if is_a_youtube_url(url):
|
|
embedPlaying = discord.Embed(
|
|
title="🤖PolaroBot joue", description=f"Je sais pas encore jouer de musique mais tkt frère, vla ton URL mon reuf : {url}")
|
|
embedPlaying.set_image(url=random_playing_gif())
|
|
|
|
else:
|
|
embedPlaying = discord.Embed(title="🤖PolaroBot veut casser ta gueule",
|
|
description=f"FREROT ?! C'EST QUOI {url} ? C'EST DE LA MERDE 💩💩💩 ! ")
|
|
embedPlaying.set_image(
|
|
url="https://media.tenor.com/wQH1Lm24wLwAAAAM/de-la-merde-jean.gif")
|
|
await ctx.send(embed=embedPlaying)
|
|
|
|
|
|
@bot.command(name="join",help="Pour demander au bot de rejoindre le canal vocal")
|
|
async def join(ctx):
|
|
#print(f"Asked to join {channel.id}")
|
|
if not ctx.message.author.voice:
|
|
embedMessage = discord.Embed(
|
|
title="🤖PolaroBot ne peut pas se connecter", description=f"T'es dans canal vocal ?")
|
|
else:
|
|
channel = ctx.author.voice.channel
|
|
await channel.connect()
|
|
embedMessage = discord.Embed(
|
|
title="🤖PolaroBot connecté", description=f"PolaroBot connecté au canal de {ctx.author}")
|
|
await ctx.send(embed=embedMessage)
|
|
|
|
@bot.command(name="leave", help="Pour faire quitter le canal vocal au bot")
|
|
async def leave(ctx):
|
|
voice_client = ctx.message.guild.voice_client
|
|
if voice_client and voice_client.is_connected():
|
|
embedMessage = discord.Embed(title="🤖PolaroBot se barre", description="Salut mon srab, je m'envole vers d'autres cieux")
|
|
await voice_client.disconnect()
|
|
else:
|
|
embedMessage = discord.Embed(title="🤖PolaroBot n'est pas connecté", description="""Ben déso gros mais je suis pas là...
|
|
Faut consulter si tu me vois partout....""")
|
|
await ctx.send(embed=embedMessage)
|
|
|
|
|
|
@bot.event
|
|
async def on_command_error(ctx, error):
|
|
channel = ctx.message.channel
|
|
if isinstance(error, commands.MissingRequiredArgument):
|
|
await ctx.send("Missing required argument: {}".format(error.param))
|
|
elif isinstance(error, commands.BadArgument):
|
|
ctx.send(channel, "Could not parse commands argument.")
|
|
|
|
bot.run(TOKEN)
|