mirror of
https://github.com/oddluck/limnoria-plugins.git
synced 2025-04-26 04:51:09 -05:00
229 lines
8.7 KiB
Python
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:
|