mirror of
https://github.com/oddluck/limnoria-plugins.git
synced 2025-04-26 04:51:09 -05:00
194 lines
8.3 KiB
Python
194 lines
8.3 KiB
Python
###
|
|
# Copyright (c) 2018, cottongin
|
|
# Copyright (c) 2020, oddluck <oddluck@riseup.net>
|
|
# All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions are met:
|
|
#
|
|
# * Redistributions of source code must retain the above copyright notice,
|
|
# this list of conditions, and the following disclaimer.
|
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
# this list of conditions, and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
# * Neither the name of the author of this software nor the name of
|
|
# contributors to this software may be used to endorse or promote products
|
|
# derived from this software without specific prior written consent.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
###
|
|
|
|
import pendulum
|
|
import requests
|
|
import json
|
|
from supybot import utils, plugins, ircutils, callbacks
|
|
from supybot.commands import *
|
|
try:
|
|
from supybot.i18n import PluginInternationalization
|
|
_ = PluginInternationalization('PGA')
|
|
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 PGA(callbacks.Plugin):
|
|
"""Fetches golf scores"""
|
|
threaded = True
|
|
|
|
def _fetchCurrent(self, type_='r'):
|
|
tmp = None
|
|
try:
|
|
jdata = requests.get(CURRENT_URL.format(trn_type=type_))
|
|
jdata = json.loads(jdata.content)
|
|
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, timeout=10)
|
|
idata = json.loads(idata.content)
|
|
url2 = 'https://statdata.pgatour.com/r/current/schedule-v2.json' #.format(trn[0])
|
|
#print(url2)
|
|
sdata = requests.get(url2, timeout=10)
|
|
sdata = json.loads(sdata.content)
|
|
#print(sdata)
|
|
|
|
# now get the leaderboard json
|
|
try:
|
|
jdata = requests.get(SCOREBOARD.format(trn_type=trn[0], trn_id=trn[1]), timeout=10)
|
|
jdata = json.loads(jdata.content)
|
|
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 = PGA
|
|
|
|
|
|
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:
|