2020-06-30 22:03:05 +00:00

229 lines
8.7 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 = ( # .format(trn[0])
"https://statdata.pgatour.com/r/current/schedule-v2.json"
)
# 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: