Add voice, Change yml, Change media

This commit is contained in:
CramMK
2020-02-13 17:05:21 +01:00
parent 05d2829bae
commit 3ac095ec21
12 changed files with 122 additions and 64 deletions

3
.gitignore vendored
View File

@@ -1,5 +1,6 @@
# own config file # own config file
config/config.py config.py #deprecated
config.yml
# caches and build environment # caches and build environment
__pycache__/ __pycache__/

View File

@@ -1,11 +1,9 @@
FROM python:3.6 FROM python:3.6
MAINTAINER Marco Thomas
RUN mkdir /aquabot-docker RUN mkdir /aquabot-docker
WORKDIR /aquabot-docker WORKDIR /aquabot-docker
COPY . /aquabot-docker COPY . /aquabot-docker
RUN pip install --user -r requirements.txt RUN pip install --user -r requirements.txt
CMD ["python", "aquabot.py"] CMD ["python3", "aquabot.py"]

View File

@@ -9,7 +9,7 @@ AquaBot
This bot is my first personal project so expect some minor (or bigger) problems This bot is my first personal project so expect some minor (or bigger) problems
here and there. here and there.
Also note that this bot is still in its very early stages, so there is no Also note that this bot is still in its very early stages, so there is no
guaranty that all features work! guarantee that all features work!
Support and report requests are handled via Discord (Link above). Support and report requests are handled via Discord (Link above).
@@ -20,7 +20,7 @@ Installation - Docker
+ Clone this repository with `git clone https://github.com/CramMK/aquabot` + Clone this repository with `git clone https://github.com/CramMK/aquabot`
+ Create a `config/config.py`, using the `config/config_example.py` as a + Create a `config` file as described below
guideline guideline
+ Launch the Container + Launch the Container
@@ -35,10 +35,10 @@ Installation - pip
+ Use `pip install --user -r requirements.txt` to install all dependencies + Use `pip install --user -r requirements.txt` to install all dependencies
needed for the bot needed for the bot
+ Create a `config/config.py`, using the `config/config_example.py` as a + Create a `config` file as described below
guideline guideline
+ Finally, run `python aquabot` + Finally, run `python3 aquabot`
Commands Commands
------ ------
@@ -54,8 +54,8 @@ commands:
Config Config
------ ------
To use the bot you need to add a `config/config.py` file. For reference, see To use the bot you need to add a `config/config.yml` file. For reference, see
`config/config_example.py`. `config/config_example.yml`.
Requirements Requirements
------------ ------------

View File

@@ -49,7 +49,7 @@ async def activity():
status = f"{new_activity[1]} | {loadconfig.__prefix__}aquabot" status = f"{new_activity[1]} | {loadconfig.__prefix__}aquabot"
activity = discord.Activity(name=status, type=new_activity[0]) activity = discord.Activity(name=status, type=new_activity[0])
await bot.change_presence(activity=activity) await bot.change_presence(activity=activity)
await asyncio.sleep(15) # Time in minutes await asyncio.sleep(10) # Time in minutes
# BOT STARTING EVENT # BOT STARTING EVENT
@bot.event @bot.event

View File

@@ -25,8 +25,8 @@ class Anime(commands.Cog):
Sends a random anime gif or pic Sends a random anime gif or pic
""" """
# Choose either a gif or a pic -> config/media.py # Choose either a gif or a pic -> config/media.py
media_type = random.choice(loadconfig.__anime_media__) media_type = random.choice(loadconfig.__media_anime__)
media = random.choice(media) media = random.choice(media_type)
await ctx.send(media) await ctx.send(media)
@commands.command(name="waifumedia") @commands.command(name="waifumedia")
@@ -34,10 +34,8 @@ class Anime(commands.Cog):
""" """
Sends a random pic of a waifu (list in config/media.py) Sends a random pic of a waifu (list in config/media.py)
""" """
# Dictionary
waifus = loadconfig.__waifu_media__
try: try:
media = random.choice(waifus.get(waifu)) media = random.choice(loadconfig.__media_waifu__[waifu])
await ctx.send(media) await ctx.send(media)
except KeyError as error: except KeyError as error:
text = ( text = (

View File

@@ -6,10 +6,13 @@ Some (more or less) handy utility:
https://discordpy.readthedocs.io/en/latest/ext/commands/cogs.html https://discordpy.readthedocs.io/en/latest/ext/commands/cogs.html
""" """
# IMPORTS # IMPORTS - external
import discord import discord
from discord.ext import commands from discord.ext import commands
# IMPORTS - internal
import loadconfig
# COG INIT # COG INIT
class Utility(commands.Cog): class Utility(commands.Cog):
def __init__(self, bot): def __init__(self, bot):
@@ -17,13 +20,34 @@ class Utility(commands.Cog):
# COG BODY # COG BODY
@commands.command(name="invitelink", aliases=["invite"]) @commands.command(name="invitelink", aliases=["invite"])
async def invite_link(self, ctx): async def invite_link(self, ctx, age: int, uses: int, unique: bool):
""" """
Sends the server's invitelink to chat Sends the server's invitelink to chat
""" """
# TODO fetch this from config so more servers are supported if age is None:
link = "Here is our invite link: https://discordapp.com/invite/HbYfyJT" age = 60
await ctx.send(link) if uses is None:
uses = 100
if unique is None:
unique = True
link = await bot.create_invite(
max_age = age,
max_uses = uses,
unique = uses,
reason = "Created by AquaBot")
link_embed = discord.Embed(color=discord.Colour.blue())
link_embed.add_field(
name="Here's and invite to our server:",
value=link,
inline=True)
link_embed.set_footer(
text=f"Age: {age}, Uses: {uses}, Unique: {unique}",
icon_url=loadconfig.__avater__
)
await ctx.send(embed=link_embed)
@commands.command(name="pat") @commands.command(name="pat")

View File

@@ -5,7 +5,7 @@ Make Aqua be able to join voice channel and play audio:
- play - play
https://discordpy.readthedocs.io/en/latest/ext/commands/cogs.html https://discordpy.readthedocs.io/en/latest/ext/commands/cogs.html
https://stackoverflow.com/questions/56031159/discord-py-rewrite-what-is-the-source-for-youtubedl-to-play-music https://stackoverflow.com/questions/56060614/how-to-make-a-discord-bot-play-youtube-audio
""" """
# IMPORTS # IMPORTS
@@ -59,38 +59,80 @@ class Voice(commands.Cog):
await ctx.send("I'm not connected to a channel!") await ctx.send("I'm not connected to a channel!")
# Begin of YouTube Player
youtube_dl.utils.bug_reports_message = lambda: ''
ytdl_format_options = {
'format': 'bestaudio/best',
'outtmpl': '%(extractor)s-%(id)s-%(title)s.%(ext)s',
'restrictfilenames': True,
'noplaylist': True,
'nocheckcertificate': True,
'ignoreerrors': False,
'logtostderr': False,
'quiet': True,
'no_warnings': True,
'default_search': 'auto',
'source_address': '0.0.0.0'
}
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 = data.get('url')
# Maybe i can make a fancy embed out of this?
self.uploader = data.get('uploader')
self.uploader_url = data.get('uploader_url')
date = data.get('upload_date')
self.upload_date = date[6:8] + '.' + date[4:6] + '.' + date[0:4]
self.title = data.get('title')
self.thumbnail = data.get('thumbnail')
self.description = data.get('description')
self.duration = self.parse_duration(int(data.get('duration')))
self.tags = data.get('tags')
self.url = data.get('webpage_url')
self.views = data.get('view_count')
self.likes = data.get('like_count')
self.dislikes = data.get('dislike_count')
self.stream_url = data.get('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['url'] if stream else ytdl.prepare_filename(data)
return cls(discord.FFmpegPCMAudio(filename, **ffmpeg_options), data=data)
@commands.command(name="play", aliases=["p"]) @commands.command(name="play", aliases=["p"])
@commands.guild_only() @commands.guild_only()
async def play(self, ctx, url: str): async def play(self, ctx, url: str):
""" """
Plays music from YT link specifies Plays music from YouTube
""" """
# TODO
try:
if os.path.isfile("song.mp3"):
os.remove("song.mp3")
except PermissionError:
await ctx.send("Wait for the current song to end or use the `stop`command")
return
voice = get(bot.voice_clients, guild=ctx.guild) voice = get(bot.voice_clients, guild=ctx.guild)
youtube_dl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}],
}
with youtube_dl.YouTubeDL(youtube_dl_opts) as ydl:
ydl.download([url])
for file in os.listdir("./"):
if file.endswith(".mp3"):
os.rename(file, "song.mp3")
voice.play(discord.FFmpegPCMAudio("song.mp3")) async with ctx.typing():
voice.volume=25 player = await YTDLSource.from_url(url, loop=self.bot.loop)
voice.is_playing() ctx.voice.play(
player,
after=lambda e: print('Player error: %s' % e) if e else None))
await ctx.send(f"Now playing: {player.title}")
# End of YouTube Player
# COG ENDING # COG ENDING

View File

@@ -26,7 +26,7 @@ class Welcome(commands.Cog):
text = f"Welcome {member.mention} to our useless Discord!" text = f"Welcome {member.mention} to our useless Discord!"
if channel is not None: if channel is not None:
await channel.send(text) await channel.send(text)
await message.add_reaction("\N{THUMBS UP SIGN}")
@commands.command(name="hello") @commands.command(name="hello")
async def hello(self, ctx): async def hello(self, ctx):

View File

@@ -1,4 +0,0 @@
# This is a sample file for how a config file looks like
__token__ = "Discord Auth Token"
__prefix__ = "Command Prefix"

View File

@@ -3,9 +3,9 @@ Media, which can be accessed from the bot.
""" """
# Exports # Exports
__anime_media__ = [anime_gifs, anime_pics] __media_anime__ = [gifs_anime, pics_anime]
__waifu_media__ = { __media_waifu__ = {
"aqua": waifu_aqua, "aqua": waifu_aqua,
"meugmin": waifu_megumin, "meugmin": waifu_megumin,
"akeno": waifu_akeno, "akeno": waifu_akeno,
@@ -13,9 +13,9 @@ __waifu_media__ = {
} }
# Internal lists # Internal lists
anime_gifs = [] gifs_anime = []
anime_pics = [ pics_anime = [
"https://i.imgur.com/4xnJN9x.png", "https://i.imgur.com/4xnJN9x.png",
] ]

View File

@@ -12,4 +12,3 @@ __activity__ = [
(discord.ActivityType.streaming, "Hentai") (discord.ActivityType.streaming, "Hentai")
(discord.ActivityType.custom, "mizu") (discord.ActivityType.custom, "mizu")
] ]
}

View File

@@ -14,16 +14,16 @@ __avatar__ = "https://i.imgur.com/mskM9dH.png"
try: try:
with open("config/config.yml") as file: with open("config/config.yml") as file:
config = yaml.safe_load(file) config = yaml.safe_load(file)
for yml_entry in config:
__token__ = config[yml_entry]['token'] __token__ = config['token']
__prefix__ = config[yml_entry]['prefix'] __prefix__ = config['prefix']
except yaml.YAMLError as error: except yaml.YAMLError as error:
print(f"Error while parsing: {error}") print(f"Error while parsing: {error}")
try: try:
from config.config import __token__, __prefix__
from config.cogs import __cogs__ from config.cogs import __cogs__
from config.status import __activity__ from config.status import __activity__
from config.media import __anime_media__, __waifu_media__ from config.media import __media_anime__, __media_waifu__
except ImportError as error: except ImportError as error:
print(f"Error while importing: {error}") print(f"Error while importing: {error}")