initial commit
This commit is contained in:
commit
aab0c5bbe9
|
@ -0,0 +1,49 @@
|
|||
###
|
||||
# Copyright (c) 2018, cottongin
|
||||
# All rights reserved.
|
||||
#
|
||||
#
|
||||
###
|
||||
|
||||
"""
|
||||
GolfScores: Fetches golf scores
|
||||
"""
|
||||
|
||||
import sys
|
||||
import supybot
|
||||
from supybot import world
|
||||
|
||||
# Use this for the version of this plugin. You may wish to put a CVS keyword
|
||||
# in here if you're keeping the plugin in CVS or some similar system.
|
||||
__version__ = ""
|
||||
|
||||
# XXX Replace this with an appropriate author or supybot.Author instance.
|
||||
__author__ = supybot.authors.unknown
|
||||
|
||||
# This is a dictionary mapping supybot.Author instances to lists of
|
||||
# contributions.
|
||||
__contributors__ = {}
|
||||
|
||||
# This is a url where the most recent plugin package can be downloaded.
|
||||
__url__ = ''
|
||||
|
||||
from . import config
|
||||
from . import plugin
|
||||
if sys.version_info >= (3, 4):
|
||||
from importlib import reload
|
||||
else:
|
||||
from imp import reload
|
||||
# In case we're being reloaded.
|
||||
reload(config)
|
||||
reload(plugin)
|
||||
# Add more reloads here if you add third-party modules and want them to be
|
||||
# reloaded when this plugin is reloaded. Don't forget to import them as well!
|
||||
|
||||
if world.testing:
|
||||
from . import test
|
||||
|
||||
Class = plugin.Class
|
||||
configure = config.configure
|
||||
|
||||
|
||||
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79:
|
|
@ -0,0 +1,33 @@
|
|||
###
|
||||
# Copyright (c) 2018, cottongin
|
||||
# All rights reserved.
|
||||
#
|
||||
#
|
||||
###
|
||||
|
||||
from supybot import conf, registry
|
||||
try:
|
||||
from supybot.i18n import PluginInternationalization
|
||||
_ = PluginInternationalization('GolfScores')
|
||||
except:
|
||||
# Placeholder that allows to run the plugin on a bot
|
||||
# without the i18n module
|
||||
_ = lambda x: x
|
||||
|
||||
|
||||
def configure(advanced):
|
||||
# This will be called by supybot to configure this module. advanced is
|
||||
# a bool that specifies whether the user identified themself as an advanced
|
||||
# user or not. You should effect your configuration by manipulating the
|
||||
# registry as appropriate.
|
||||
from supybot.questions import expect, anything, something, yn
|
||||
conf.registerPlugin('GolfScores', True)
|
||||
|
||||
|
||||
GolfScores = conf.registerPlugin('GolfScores')
|
||||
# This is where your configuration variables (if any) should go. For example:
|
||||
# conf.registerGlobalValue(GolfScores, 'someConfigVariableName',
|
||||
# registry.Boolean(False, _("""Help for someConfigVariableName.""")))
|
||||
|
||||
|
||||
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79:
|
|
@ -0,0 +1,168 @@
|
|||
###
|
||||
# Copyright (c) 2018, cottongin
|
||||
# All rights reserved.
|
||||
#
|
||||
#
|
||||
###
|
||||
|
||||
import pendulum
|
||||
import requests
|
||||
|
||||
from supybot import utils, plugins, ircutils, callbacks
|
||||
from supybot.commands import *
|
||||
try:
|
||||
from supybot.i18n import PluginInternationalization
|
||||
_ = PluginInternationalization('GolfScores')
|
||||
except ImportError:
|
||||
# Placeholder that allows to run the plugin on a bot
|
||||
# without the i18n module
|
||||
_ = lambda x: x
|
||||
|
||||
CURRENT_URL = 'https://statdata.pgatour.com/{trn_type}/current/message.json'
|
||||
SCOREBOARD = 'https://statdata.pgatour.com/{trn_type}/{trn_id}/leaderboard-v2mini.json'
|
||||
|
||||
class GolfScores(callbacks.Plugin):
|
||||
"""Fetches golf scores"""
|
||||
threaded = True
|
||||
|
||||
def _fetchCurrent(self, type_='r'):
|
||||
tmp = None
|
||||
try:
|
||||
jdata = requests.get(CURRENT_URL.format(trn_type=type_)).json()
|
||||
tmp = jdata['tid']
|
||||
return [type_, tmp]
|
||||
except:
|
||||
return [type_, tmp]
|
||||
return [type_, tmp]
|
||||
|
||||
@wrap([getopts({'all': '', 'info': '', 'champions': ''}), optional('text')])
|
||||
def golf(self, irc, msg, args, options, search=None):
|
||||
""" [player name]
|
||||
Fetches leaderboard for active or previous tournament,
|
||||
optionally pass a name to find player in standings
|
||||
"""
|
||||
options = dict(options)
|
||||
type_is_champions = options.get('champions')
|
||||
|
||||
if type_is_champions:
|
||||
trn = self._fetchCurrent(type_='s')
|
||||
else:
|
||||
trn = self._fetchCurrent()
|
||||
if not trn[1]:
|
||||
irc.reply('Something went wrong getting the current/previous tournament')
|
||||
return
|
||||
|
||||
if options.get('info'):
|
||||
url = 'https://www.pgatour.com/bin/data/feeds/weather.json/{}{}'.format(
|
||||
trn[0], trn[1])
|
||||
print(url)
|
||||
idata = requests.get(url).json()
|
||||
url2 = 'https://statdata.pgatour.com/r/current/schedule-v2.json' #.format(trn[0])
|
||||
#print(url2)
|
||||
sdata = requests.get(url2).json()
|
||||
#print(sdata)
|
||||
|
||||
# now get the leaderboard json
|
||||
try:
|
||||
jdata = requests.get(SCOREBOARD.format(trn_type=trn[0], trn_id=trn[1]))
|
||||
print(jdata.url)
|
||||
jdata = jdata.json()
|
||||
except:
|
||||
irc.reply('Something went wrong fetching the leaderboard')
|
||||
return
|
||||
|
||||
leaderboard = jdata.get('leaderboard')
|
||||
if not leaderboard:
|
||||
irc.reply('No leaderboard found')
|
||||
return
|
||||
|
||||
name = ircutils.bold(leaderboard['tournament_name'])
|
||||
date = "{}-{}".format(
|
||||
pendulum.parse(leaderboard['start_date'], strict=False).format('MMMD'),
|
||||
pendulum.parse(leaderboard['end_date'], strict=False).format('MMMD'))
|
||||
|
||||
round_ = 'Round {}'.format(leaderboard['current_round'])
|
||||
if leaderboard['round_state']:
|
||||
round_ += ' ({})'.format(leaderboard['round_state'])
|
||||
|
||||
cut_line = leaderboard['cut_line'].get('cut_count') or len(leaderboard['players'])
|
||||
|
||||
positions = []
|
||||
if not options.get('info'):
|
||||
for idx, player in enumerate(leaderboard['players']):
|
||||
if player['player_bio']['short_name']:
|
||||
plyr_name = '{}.{}'.format(player['player_bio']['short_name'].replace('.', ''),
|
||||
player['player_bio']['last_name'])
|
||||
else:
|
||||
plyr_name = '{}'.format(player['player_bio']['last_name'])
|
||||
full_name = '{} {}'.format(player['player_bio']['first_name'],
|
||||
player['player_bio']['last_name'])
|
||||
if idx >= cut_line:
|
||||
if player['status'] == 'wd':
|
||||
rank = ircutils.mircColor('WD', 'orange')
|
||||
else:
|
||||
rank = ircutils.mircColor('CUT', 'red')
|
||||
else:
|
||||
rank = str(player['current_position'])
|
||||
if player['thru']:
|
||||
thru = ' {:+d} thru {} '.format(player['today'], ircutils.mircColor(str(player['thru']), 'green')) \
|
||||
if player['thru'] != 18 else ' {:+d}'.format(player['today']) + ircutils.bold(ircutils.mircColor(' F ', 'red'))
|
||||
else:
|
||||
thru = ' '
|
||||
score = '{:+d}'.format(player['total']) if player['total'] else '-'
|
||||
string = '{} {}{}({})'.format(
|
||||
ircutils.bold(ircutils.mircColor(rank, 'blue')),
|
||||
plyr_name,
|
||||
thru,
|
||||
score)
|
||||
if search:
|
||||
if search.lower() in full_name.lower():
|
||||
positions.append(string)
|
||||
else:
|
||||
positions.append(string)
|
||||
|
||||
if not positions:
|
||||
positions.append('Player not found')
|
||||
#return
|
||||
|
||||
if options.get('info'):
|
||||
loc = idata['current_observation']['display_location']['full']
|
||||
weather = idata['current_observation']['weather']
|
||||
try:
|
||||
temp = idata['current_observation']['temperature_string']
|
||||
wind = idata['current_observation']['wind_string']
|
||||
except:
|
||||
temp = "{}F".format(idata['current_observation']['temp_f'])
|
||||
wind = "{}mph {}".format(idata['current_observation']['wind_mph'], idata['current_observation']['wind_dir'])
|
||||
w_string = '{} :: {} - {} - Wind: {}'.format(loc, weather, temp, wind)
|
||||
year = sdata['currentYears'][trn[0]]
|
||||
for item in sdata['years']:
|
||||
if item['year'] == year:
|
||||
data = item['tours']
|
||||
for t in data:
|
||||
if t['tourCodeLc'] == trn[0]:
|
||||
tdata = t['trns']
|
||||
for tour in tdata:
|
||||
if tour['permNum'] == trn[1]:
|
||||
tmp = tour
|
||||
break
|
||||
course = tmp['courses'][0]['courseName']
|
||||
purse = tmp['Purse']
|
||||
winnerPrize = tmp['winnersShare']
|
||||
defending = '{} {}'.format(tmp['champions'][0]['playerName']['first'], tmp['champions'][0]['playerName']['last'])
|
||||
w_string += ' :: {} :: \x02Defending champion:\x02 {} :: \x02Purse:\x02 ${} (${} to winner)'.format(
|
||||
course, defending, purse, winnerPrize)
|
||||
positions.append(w_string)
|
||||
|
||||
trunc = 10 if not options.get('all') else len(positions)
|
||||
|
||||
irc.reply('{} ({}) :: {} :: {}'.format(name, date, round_,
|
||||
', '.join(p for p in positions[:trunc])))
|
||||
|
||||
return
|
||||
|
||||
|
||||
Class = GolfScores
|
||||
|
||||
|
||||
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:
|
Loading…
Reference in New Issue