feat: seperate commands into cogs (categories)

This commit is contained in:
2021-07-29 00:29:14 -04:00
parent 59015ebf82
commit d7df1d7076
5 changed files with 84 additions and 51 deletions

0
cogs/__init__.py Normal file
View File

60
cogs/finance.py Normal file
View File

@@ -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)

9
cogs/python.py Normal file
View File

@@ -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!")

View File

@@ -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)

View File

@@ -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