aboutsummaryrefslogtreecommitdiffstats
path: root/bot/cogs
diff options
context:
space:
mode:
authorGravatar mathsman5133 <[email protected]>2018-10-12 10:29:11 +1100
committerGravatar mathsman5133 <[email protected]>2018-10-12 10:29:11 +1100
commit010cb21de026cd3021fa29fc38f838b754bd540c (patch)
tree73609ffc131e7aa76dc99dcd53286192696b86a2 /bot/cogs
parentFixed docstrings, add blank lines for readibility, method of finding last 10 ... (diff)
parentThe app was logging to the wrong directory. This is now fixed. Also silenced ... (diff)
Merge remote-tracking branch 'upstream/master' into candy-collection
Diffstat (limited to 'bot/cogs')
-rw-r--r--bot/cogs/hacktoberstats.py9
-rw-r--r--bot/cogs/halloweenify.py48
-rw-r--r--bot/cogs/movie.py136
-rw-r--r--bot/cogs/spookyreact.py31
-rw-r--r--bot/cogs/template.py5
5 files changed, 227 insertions, 2 deletions
diff --git a/bot/cogs/hacktoberstats.py b/bot/cogs/hacktoberstats.py
index 4e896ae9..ac81b887 100644
--- a/bot/cogs/hacktoberstats.py
+++ b/bot/cogs/hacktoberstats.py
@@ -95,7 +95,14 @@ class Stats:
is_query = f"public+author:{username}"
date_range = "2018-10-01..2018-10-31"
per_page = "300"
- query_url = f"{base_url}-label:{not_label}+type:{action_type}+is:{is_query}+created:{date_range}&per_page={per_page}"
+ query_url = (
+ f"{base_url}"
+ f"-label:{not_label}"
+ f"+type:{action_type}"
+ f"+is:{is_query}"
+ f"+created:{date_range}"
+ f"&per_page={per_page}"
+ )
headers = {"user-agent": "Discord Python Hactoberbot"}
async with aiohttp.ClientSession() as session:
diff --git a/bot/cogs/halloweenify.py b/bot/cogs/halloweenify.py
new file mode 100644
index 00000000..a5fe45ef
--- /dev/null
+++ b/bot/cogs/halloweenify.py
@@ -0,0 +1,48 @@
+from json import load
+from pathlib import Path
+from random import choice
+
+import discord
+from discord.ext import commands
+from discord.ext.commands.cooldowns import BucketType
+
+
+class Halloweenify:
+ """
+ A cog to change a invokers nickname to a spooky one!
+ """
+
+ def __init__(self, bot):
+ self.bot = bot
+
+ @commands.cooldown(1, 300, BucketType.user)
+ @commands.command()
+ async def halloweenify(self, ctx):
+ """
+ Change your nickname into a much spookier one!
+ """
+ with open(Path('./bot/resources', 'halloweenify.json'), 'r') as f:
+ data = load(f)
+
+ # Choose a random character from our list we loaded above and set apart the nickname and image url.
+ character = choice(data['characters'])
+ nickname = ''.join([nickname for nickname in character])
+ image = ''.join([character[nickname] for nickname in character])
+
+ # Build up a Embed
+ embed = discord.Embed()
+ embed.colour = discord.Colour.dark_orange()
+ embed.title = 'Not spooky enough?'
+ embed.description = (
+ f'**{ctx.author.display_name}** wasn\'t spooky enough for you? That\'s understandable, '
+ f'{ctx.author.display_name} isn\'t scary at all! Let me think of something better. Hmm... I got it!\n\n '
+ f'Your new nickname will be: \n :ghost: **{nickname}** :jack_o_lantern:'
+ )
+ embed.set_image(url=image)
+
+ await ctx.author.edit(nick=nickname)
+ await ctx.send(embed=embed)
+
+
+def setup(bot):
+ bot.add_cog(Halloweenify(bot))
diff --git a/bot/cogs/movie.py b/bot/cogs/movie.py
new file mode 100644
index 00000000..925f813f
--- /dev/null
+++ b/bot/cogs/movie.py
@@ -0,0 +1,136 @@
+import random
+from os import environ
+
+import aiohttp
+from discord import Embed
+from discord.ext import commands
+
+
+TMDB_API_KEY = environ.get('TMDB_API_KEY')
+TMDB_TOKEN = environ.get('TMDB_TOKEN')
+
+
+class Movie:
+ """
+ Selects a random scary movie and embeds info into discord chat
+ """
+
+ def __init__(self, bot):
+ self.bot = bot
+
+ @commands.command(name='movie', alias=['tmdb'])
+ async def random_movie(self, ctx):
+ """
+ Randomly select a scary movie and display information about it.
+ """
+ selection = await self.select_movie()
+ movie_details = await self.format_metadata(selection)
+
+ await ctx.send(embed=movie_details)
+
+ @staticmethod
+ async def select_movie():
+ """
+ Selects a random movie and returns a json of movie details from TMDb
+ """
+
+ url = 'https://api.themoviedb.org/4/discover/movie'
+ params = {
+ 'with_genres': '27',
+ 'vote_count.gte': '5'
+ }
+ headers = {
+ 'Authorization': 'Bearer ' + TMDB_TOKEN,
+ 'Content-Type': 'application/json;charset=utf-8'
+ }
+
+ # Get total page count of horror movies
+ async with aiohttp.ClientSession() as session:
+ response = await session.get(url=url, params=params, headers=headers)
+ total_pages = await response.json()
+ total_pages = total_pages.get('total_pages')
+
+ # Get movie details from one random result on a random page
+ params['page'] = random.randint(1, total_pages)
+ response = await session.get(url=url, params=params, headers=headers)
+ response = await response.json()
+ selection_id = random.choice(response.get('results')).get('id')
+
+ # Get full details and credits
+ selection = await session.get(
+ url='https://api.themoviedb.org/3/movie/' + str(selection_id),
+ params={'api_key': TMDB_API_KEY, 'append_to_response': 'credits'}
+ )
+
+ return await selection.json()
+
+ @staticmethod
+ async def format_metadata(movie):
+ """
+ Formats raw TMDb data to be embedded in discord chat
+ """
+
+ # Build the relevant URLs.
+ movie_id = movie.get("id")
+ poster_path = movie.get("poster_path")
+ tmdb_url = f'https://www.themoviedb.org/movie/{movie_id}' if movie_id else None
+ poster = f'https://image.tmdb.org/t/p/original{poster_path}' if poster_path else None
+
+ # Get cast names
+ cast = []
+ for actor in movie.get('credits', {}).get('cast', [])[:3]:
+ cast.append(actor.get('name'))
+
+ # Get director name
+ director = movie.get('credits', {}).get('crew', [])
+ if director:
+ director = director[0].get('name')
+
+ # Determine the spookiness rating
+ rating = ''
+ rating_count = movie.get('vote_average', 0)
+
+ if rating_count:
+ rating_count /= 2
+
+ for _ in range(int(rating_count)):
+ rating += ':skull:'
+ if (rating_count % 1) >= .5:
+ rating += ':bat:'
+
+ # Try to get year of release and runtime
+ year = movie.get('release_date', [])[:4]
+ runtime = movie.get('runtime')
+ runtime = f"{runtime} minutes" if runtime else None
+
+ # Not all these attributes will always be present
+ movie_attributes = {
+ "Directed by": director,
+ "Starring": ', '.join(cast),
+ "Running time": runtime,
+ "Release year": year,
+ "Spookiness rating": rating,
+ }
+
+ embed = Embed(
+ colour=0x01d277,
+ title='**' + movie.get('title') + '**',
+ url=tmdb_url,
+ description=movie.get('overview')
+ )
+
+ if poster:
+ embed.set_image(url=poster)
+
+ # Add the attributes that we actually have data for, but not the others.
+ for name, value in movie_attributes.items():
+ if value:
+ embed.add_field(name=name, value=value)
+
+ embed.set_footer(text='powered by themoviedb.org')
+
+ return embed
+
+
+def setup(bot):
+ bot.add_cog(Movie(bot))
diff --git a/bot/cogs/spookyreact.py b/bot/cogs/spookyreact.py
new file mode 100644
index 00000000..2652a60e
--- /dev/null
+++ b/bot/cogs/spookyreact.py
@@ -0,0 +1,31 @@
+SPOOKY_TRIGGERS = {
+ 'spooky': "\U0001F47B",
+ 'skeleton': "\U0001F480",
+ 'doot': "\U0001F480",
+ 'pumpkin': "\U0001F383",
+ 'halloween': "\U0001F383",
+ 'jack-o-lantern': "\U0001F383",
+ 'danger': "\U00002620"
+}
+
+
+class SpookyReact:
+
+ """
+ A cog that makes the bot react to message triggers.
+ """
+
+ def __init__(self, bot):
+ self.bot = bot
+
+ async def on_message(self, ctx):
+ """
+ A command to send the hacktoberbot github project
+ """
+ for trigger in SPOOKY_TRIGGERS.keys():
+ if trigger in ctx.content.lower():
+ await ctx.add_reaction(SPOOKY_TRIGGERS[trigger])
+
+
+def setup(bot):
+ bot.add_cog(SpookyReact(bot))
diff --git a/bot/cogs/template.py b/bot/cogs/template.py
index 89f12fe1..aa01432c 100644
--- a/bot/cogs/template.py
+++ b/bot/cogs/template.py
@@ -12,9 +12,12 @@ class Template:
@commands.command(name='repo', aliases=['repository', 'project'], brief='A link to the repository of this bot.')
async def repository(self, ctx):
+ """
+ A command to send the hacktoberbot github project
+ """
await ctx.send('https://github.com/discord-python/hacktoberbot')
- @commands.group(name='git', invoke_without_command=True)
+ @commands.group(name='git', invoke_without_command=True, brief="A link to resources for learning Git")
async def github(self, ctx):
"""
A command group with the name git. You can now create sub-commands such as git commit.