"""Gets stock information for a given stock."""
import sys
import dave.module
import dave.config
import pickle
from requests import get
from twisted.words.protocols.irc import assembleFormattedText, attributes as A
@dave.module.help("Syntax: stock [symbol].")
@dave.module.ratelimit(1, 1)
@dave.module.command(["stock"], "([a-zA-Z.]+)")
def stock(bot, args, sender, source):
try:
resp = yql(args[0])
except:
bot.reply(source, sender, "Couldn't get stock data: {}".format(sys.exc_info()[0]))
raise
if resp["count"] == 0:
bot.reply(source, sender, assembleFormattedText(
A.normal["Couldn't find the ticker symbol ", A.bold[args[0]]]
))
return
quote = resp["results"]["quote"]
if quote["LastTradePriceOnly"] is None:
bot.reply(source, sender, assembleFormattedText(
A.normal["Couldn't find the ticker symbol ", A.bold[args[0]]]
))
return
change = float(quote["Change"])
price = float(quote["LastTradePriceOnly"])
name = quote["Name"]
if price == 0 and change == 0:
bot.reply(source, sender, assembleFormattedText(
A.normal[A.bold[name], " is no longer trading."]
))
return
color = A.fg.gray
percent = (change / (price - change)) * 100
if change > 0:
color = A.fg.green
change = "+{}".format(change)
elif change < 0:
color = A.fg.lightRed
bot.reply(source, sender, assembleFormattedText(
A.normal[
A.bold[name], " (", A.bold[quote["Symbol"]], "): ",
str(price), " ", color["{} ({:.2f}%)".format(change, percent)]
]
))
def yql(symbol):
"""Get the response from YQL."""
if not dave.config.redis.exists("stock:{}".format(symbol)):
request = get("http://query.yahooapis.com/v1/public/yql", params={
"q": 'SELECT * FROM yahoo.finance.quote WHERE symbol="{}" LIMIT 1'.format(
symbol
),
"env": "store://datatables.org/alltableswithkeys",
"format": "json"
})
resp = request.json()["query"]
dave.config.redis.setex("stock:{}".format(symbol), 10, pickle.dumps(resp))
else:
resp = pickle.loads(dave.config.redis.get("stock:{}".format(symbol)))
return resp