From d7df1d7076b7aadfcf84a4f1a399d4283aac4b59 Mon Sep 17 00:00:00 2001 From: Giovani Date: Thu, 29 Jul 2021 00:29:14 -0400 Subject: [PATCH] feat: seperate commands into cogs (categories) --- cogs/__init__.py | 0 cogs/finance.py | 60 ++++++++++++++++++++++++++++++++++++++++++++ cogs/python.py | 9 +++++++ pyvis.py | 65 +++++++++++------------------------------------- requirements.txt | 1 + 5 files changed, 84 insertions(+), 51 deletions(-) create mode 100644 cogs/__init__.py create mode 100644 cogs/finance.py create mode 100644 cogs/python.py diff --git a/cogs/__init__.py b/cogs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cogs/finance.py b/cogs/finance.py new file mode 100644 index 0000000..8ec9c7e --- /dev/null +++ b/cogs/finance.py @@ -0,0 +1,60 @@ +import os +import requests +import json +from discord.ext import commands + +LUNAR_CRUSH_API_KEY = os.getenv('LUNAR_CRUSH_API_KEY') +ALPHAVANTAGE_API_KEY = os.getenv('ALPHAVANTAGE_API_KEY') + +class Finance(commands.Cog): + """Commands to query stock and crypto prices""" + + @commands.command() + async def stock(ctx, *tickers): + """!stock [tickers] - example usage '!stock TSLA GOOG'""" + + if len(tickers) == 0: + tickers = ["AAPL", "GOOG", "MSFT", "AMZN"] + + # msg response setup + msg_response = "Stock prices for today!\n" + stock_found = False + + # make the call for stock prices + for ticker in tickers: + http_response = requests.get(f'https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol={ticker}&apikey={ALPHAVANTAGE_API_KEY}') + stock_data = json.loads(http_response.text) + + # check if stock exists + if 'Global Quote' not in stock_data: + continue + + # get the stock price + stock_price = stock_data['Global Quote']['05. price'] + msg_response += f'**{ticker}**: ${round(float(stock_price), 2)}\n' + stock_found = True + + + if not stock_found: + await ctx.send("No stock data found for given tickers!") + return + + await ctx.send(msg_response) + + @commands.command() + async def crypto(ctx, *tickers): + """!crypto [tickers] - example usage '!crypto BTC LTC'""" + + # default tickers + if len(tickers) == 0: + tickers = ["BTC", "ETH", "LTC"] + + # make the call for prices + http_response = requests.get(f"https://api.lunarcrush.com/v2?data=assets&key={LUNAR_CRUSH_API_KEY}&symbol={','.join(tickers)}") + data = json.loads(http_response.text) + + # extract prices and derive message response + msg_response = "Cryptocurrency prices for today!\n" + msg_response += "\n".join([f"**{item['symbol']}**: ${round(float(item['price']), 2)}" for item in data["data"]]) + + await ctx.send(msg_response) \ No newline at end of file diff --git a/cogs/python.py b/cogs/python.py new file mode 100644 index 0000000..583ab1f --- /dev/null +++ b/cogs/python.py @@ -0,0 +1,9 @@ +from discord.ext import commands + +class Python(commands.Cog): + """General commands about python programming""" + + @commands.command() + async def resources(self, ctx): + """!resources - resources for python programming""" + await ctx.send("Some resources for you here!") \ No newline at end of file diff --git a/pyvis.py b/pyvis.py index 7866393..d7c49ac 100644 --- a/pyvis.py +++ b/pyvis.py @@ -1,16 +1,16 @@ import discord -import requests -import json import os +from cogs.finance import Finance +from cogs.python import Python from discord.ext import commands from dotenv import load_dotenv +from pretty_help import DefaultMenu, PrettyHelp # load environment variables from .env file load_dotenv() + DISCORD_BOT_TOKEN = os.getenv('DISCORD_BOT_TOKEN') DISCORD_GUILD_NAME = os.getenv('DISCORD_GUILD_NAME') -LUNAR_CRUSH_API_KEY = os.getenv('LUNAR_CRUSH_API_KEY') -ALPHAVANTAGE_API_KEY = os.getenv('ALPHAVANTAGE_API_KEY') bot = commands.Bot(command_prefix='!') @@ -23,54 +23,17 @@ async def on_ready(): f'{guild.name}(id: {guild.id})' ) -@bot.command(name="resources") -async def resources(ctx): - await ctx.send("Some resources for you here!") +@bot.event +async def on_member_join(member): + pass # TODO -@bot.command(name="stock") -async def stock(ctx, *tickers): - if len(tickers) == 0: - tickers = ["AAPL", "GOOG", "MSFT", "AMZN"] +# override default help command +menu = DefaultMenu('◀️', '▶️', '❌') +bot.help_command = PrettyHelp(navigation=menu, color=discord.Colour.green()) - # msg response setup - msg_response = "Stock prices for today!\n" - stock_found = False - - # make the call for stock prices - for ticker in tickers: - http_response = requests.get(f'https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol={ticker}&apikey={ALPHAVANTAGE_API_KEY}') - stock_data = json.loads(http_response.text) - - # check if stock exists - if 'Global Quote' not in stock_data: - continue - - # get the stock price - stock_price = stock_data['Global Quote']['05. price'] - msg_response += f'**{ticker}**: ${round(float(stock_price), 2)}\n' - stock_found = True - - - if not stock_found: - await ctx.send("No stock data found for given tickers!") - return - - await ctx.send(msg_response) - -@bot.command(name="crypto") -async def crypto(ctx, *tickers): - # default tickers - if len(tickers) == 0: - tickers = ["BTC", "ETH", "LTC"] - - # make the call for prices - http_response = requests.get(f"https://api.lunarcrush.com/v2?data=assets&key={LUNAR_CRUSH_API_KEY}&symbol={','.join(tickers)}") - data = json.loads(http_response.text) - - # extract prices and derive message response - msg_response = "Cryptocurrency prices for today!\n" - msg_response += "\n".join([f"**{item['symbol']}**: ${round(float(item['price']), 2)}" for item in data["data"]]) - - await ctx.send(msg_response) +# commands by category a.k.a. cogs +bot.add_cog(Python()) +bot.add_cog(Finance()) +# start up bot bot.run(DISCORD_BOT_TOKEN) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index df177f8..c0d30c5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,6 +4,7 @@ attrs==21.2.0 certifi==2021.5.30 chardet==4.0.0 charset-normalizer==2.0.3 +discord-pretty-help==1.3.2 discord.py==1.7.3 idna==3.2 multidict==5.1.0