Merge branch 'master' CFBScores

This commit is contained in:
oddluck 2019-12-05 09:45:44 +00:00
commit 906dab3862
8 changed files with 1158 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*.bak
__pycache__/

1
CFBScores/README.md Normal file
View File

@ -0,0 +1 @@
Fetches CFB scores

52
CFBScores/__init__.py Normal file
View File

@ -0,0 +1,52 @@
###
# Copyright (c) 2018, cottongin
# All rights reserved.
#
#
###
"""
CFBScores: Fetches College Football 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.Author('cottongin', 'cottongin',
'cottongin@cottongin.club')
__maintainer__ = getattr(supybot.authors, 'oddluck',
supybot.Author('oddluck', 'oddluck', 'oddluck@riseup.net'))
# 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__ = 'https://github.com/oddluck/limnoria-plugins/'
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:

546
CFBScores/abbrv.json Normal file
View File

@ -0,0 +1,546 @@
{
"chattanooga": [
"chatt"
],
"connecticut": [
"uconn",
"conn"
],
"louisiana monroe": [
"ulm"
],
"south alabama": [
"usa"
],
"air force": [
"airforce",
"usafa",
"usaf",
"af"
],
"akron": [
"akr"
],
"alabama": [
"ala",
"bama",
"gump",
"tide"
],
"appalachian state": [
"app st",
"app state"
],
"arizona": [
"zona"
],
"arizona state": [
"asu",
"azst",
"sparky"
],
"arkansas": [
"ark",
"arky",
"bert",
"razorbacks",
"ar"
],
"arkansas state": [
"arst",
"arkst",
"ark state"
],
"auburn": [
"aub",
"au",
"aubrun",
"war eagle",
"awburn",
"barners"
],
"baylor": [
"bay",
"baylol",
"baylour"
],
"big 12": [
"big12"
],
"big ten": [
"big10",
"b1g"
],
"boise state": [
"bsu",
"boise st",
"boisest",
"boise"
],
"boston college": [
"bc"
],
"bowling green": [
"bg",
"bgsu"
],
"byu": [
"mormons",
"lds"
],
"california": [
"cal"
],
"central michigan": [
"central mich",
"cmu"
],
"cincinatti": [
"cincy",
"cinci",
"cinc"
],
"clemson": [
"fuck",
"clem"
],
"colorado": [
"col",
"cu",
"co",
"buffs",
"buffaloes"
],
"colorado state": [
"csu"
],
"duke": [
"dook"
],
"east carolina": [
"ecu"
],
"eastern michigan": [
"emu"
],
"florida": [
"fla",
"gators",
"jorts",
"uf"
],
"florida atlantic": [
"fau "
],
"florida intl": [
"florida international",
"fiu"
],
"florida state": [
"flst",
"noles",
"crablegs",
"crab legs",
"seminoles",
"fl st",
"fsu"
],
"fresno state": [
"fresno",
"fresno st"
],
"georgia": [
"dwags",
"uga",
"dawgs",
"h8",
"hate",
"ugh",
"u(sic)ga"
],
"georgia southern": [
"gaso",
"gasouthern",
"gsu"
],
"georgia state": [
"state",
"gastate",
"gast"
],
"georgia tech": [
"nerds",
"buzz",
"bees",
"gt",
"gtech",
"gatech"
],
"houston": [
"hou",
"uh",
"coogs"
],
"illinois": [
"uiuc",
"ill"
],
"iowa": [
"hawkeyes"
],
"iowa state": [
"isu",
"iowa st"
],
"jacksonville": [
"jville"
],
"kansas": [
"ku",
"jayhawks"
],
"kansas state": [
"k-state",
"kstate",
"kst",
"ksu",
"ks",
"k state",
"wizard"
],
"kentucky": [
"uk"
],
"louisiana lafayette": [
"ull"
],
"louisiana tech": [
"latech"
],
"louisville": [
"lou",
"ul",
"lville",
"big papa",
"papa john",
"papa johns",
"go big papa"
],
"lsu": [
"corndogs",
"louisiana state",
"louisiana state university"
],
"maryland": [
"umd",
"md",
"terps",
"turtles"
],
"massachusetts": [
"umass",
"massachussets"
],
"memphis": [
"mem"
],
"miami": [
"canes",
"miami florida",
"miami fl",
"mia",
"hurricanes",
"umiami",
"miami",
"da u"
],
"miami (oh)": [
"mu",
"miamioh",
"miami oh",
"miami ohio"
],
"michigan": [
"mich",
"mich",
"umich",
"khakis",
"harbaugh",
"um"
],
"michigan state": [
"sparty",
"msu",
"michst",
"michigan st"
],
"middle tennessee": [
"mtsu",
"middle tennessee state"
],
"minnesota": [
"minn",
"minny",
"gophers",
"dillybars",
"dilly bar"
],
"mississippi state": [
"miss state",
"land mass state",
"ms st",
"msst",
"missst",
"misst",
"clanga",
"land mass st",
"miss st"
],
"missouri": [
"mizzou",
"miz",
"misery",
"mizz"
],
"nc state": [
"ncst",
"ncsu",
"wolfpack"
],
"nebraska": [
"neb",
"huskers",
"unl",
"corn"
],
"new mexico": [
"unm",
"bob davie"
],
"north carolina": [
"nc",
"unc"
],
"north dakota state": [
"ndsu"
],
"northern illinois": [
"niu"
],
"northwestern": [
"nu",
"nw"
],
"notre dame": [
"nd",
"noter dame",
"irish",
"domers"
],
"ohio state": [
"aosu",
"osu",
"tosu"
],
"oklahoma": [
"ou",
"ok"
],
"oklahoma state": [
"okst"
],
"old dominion": [
"odu"
],
"ole miss": [
"rebels",
"land mass",
"ole mass",
"ole"
],
"oregon": [
"ducks",
"ore",
"uo",
"quack"
],
"oregon state": [
"orst"
],
"osu": [
"buckeyes"
],
"penn state": [
"psu",
"penn st",
"ttsci"
],
"pittsburgh": [
"pitt"
],
"purdue": [
"purdont",
"boilermakers"
],
"rutgers": [
"rut",
"ru",
"buttgers"
],
"sam houston state": [
"shsu"
],
"san diego state": [
"sdsu",
"san diego st"
],
"san josé state": [
"san jose",
"sjsu",
"san jose state",
"san jose st"
],
"smu": [
"southern methodist",
"smoo"
],
"south carolina": [
"cocks",
"sakerlina",
"gamecocks",
"s car",
"carolina",
"usce",
"scar"
],
"south florida": [
"usf",
"bulls"
],
"southern utah": [
"suu"
],
"stanford": [
"stanny",
"trees",
"stan",
"furd"
],
"syracuse": [
"syr",
"cuse"
],
"tcu": [
"frogs"
],
"tennessee": [
"checkers",
"smokey",
"tenn",
"vols",
"ten"
],
"tennessee tech": [
"tenn tech",
"tntech",
"tn tech"
],
"tennessee-martin": [
"tenn martin",
"utm"
],
"texas": [
"texsa",
"taxes",
"tejas",
"tex",
"longhorns",
"hookem",
"ut",
"zerosa"
],
"texas a&m": [
"aggies",
"atm",
"a&m",
"tam",
"gigem",
"inthebag",
"tamu"
],
"texas san antonio": [
"utsa"
],
"texas tech": [
"tt",
"ttu",
"ttech",
"tortillas",
"sunglasses"
],
"the citadel": [
"citadel"
],
"usc": [
"uscw",
"southern cal"
],
"utah": [
"utes"
],
"utah state": [
"usu",
"utah st"
],
"utica college": [
"utica"
],
"vanderbilt": [
"vandy"
],
"virginia": [
"uva",
"va"
],
"virginia tech": [
"vatech",
"vt",
"vtech"
],
"wake forest": [
"wf",
"wake",
"wakef"
],
"washington": [
"uw",
"wash"
],
"washington state": [
"wazzu",
"wazzy",
"cougs",
"cuogs",
"wsu"
],
"west virginia": [
"wvu",
"wv",
"couches"
],
"western kentucky": [
"wku",
"hilltoppers"
],
"western michigan": [
"wmu",
"row the boat",
"rowtheboat",
"pj fleck"
],
"wisconsin": [
"wiscy",
"wis",
"wisc"
]
}

33
CFBScores/config.py Normal file
View File

@ -0,0 +1,33 @@
###
# Copyright (c) 2018, cottongin
# All rights reserved.
#
#
###
from supybot import conf, registry
try:
from supybot.i18n import PluginInternationalization
_ = PluginInternationalization('CFBScores')
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('CFBScores', True)
CFBScores = conf.registerPlugin('CFBScores')
# This is where your configuration variables (if any) should go. For example:
# conf.registerGlobalValue(CFBScores, 'someConfigVariableName',
# registry.Boolean(False, _("""Help for someConfigVariableName.""")))
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79:

506
CFBScores/plugin.py Normal file
View File

@ -0,0 +1,506 @@
# CFBScores
###
# Copyright (c) 2018, cottongin
# All rights reserved.
#
#
###
import requests
import pendulum
import json
import html
from bs4 import BeautifulSoup
import re
import os
from supybot import utils, plugins, ircutils, callbacks, schedule
from supybot.commands import *
try:
from supybot.i18n import PluginInternationalization
_ = PluginInternationalization('CFBScores')
except ImportError:
# Placeholder that allows to run the plugin on a bot
# without the i18n module
_ = lambda x: x
class CFBScores(callbacks.Plugin):
"""Fetches CFB scores"""
threaded = True
def __init__(self, irc):
self.__parent = super(CFBScores, self)
self.__parent.__init__(irc)
self.SCOREBOARD = ('http://site.api.espn.com/apis/site/v2/sports/'
'football/college-football/scoreboard')
self.FUZZY_DAYS = ['yesterday', 'tonight', 'today', 'tomorrow',
'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
self._current_week = 0
self._cfb_byes = {}
with open("{0}/abbrv.json".format(os.path.dirname(os.path.abspath(__file__))), 'r') as json_file:
self.abbrv = json.load(json_file)
if not self.abbrv:
self.abbrv = requests.get(
'https://raw.githubusercontent.com/diagonalfish/FootballBotX2/master/abbrv.json')
self.abbrv = self.abbrv.json()
def periodicCheckGames():
self.CFB_GAMES = self._fetchGames(None, '')
periodicCheckGames()
try: # check scores.
schedule.addPeriodicEvent(periodicCheckGames, 20, now=False, name='fetchCFBscores')
except AssertionError:
try:
schedule.removeEvent('fetchCFBscores')
except KeyError:
pass
schedule.addPeriodicEvent(periodicCheckGames, 20, now=False, name='fetchCFBscores')
@wrap
def cfbbyes(self, irc, msg, args):
"""Gets teams on bye week for current week"""
url = 'https://247sports.com/Article/Schedule-of-bye-weeks-for-college-footballs-top-2018-contenders-120880121/'
headers = {'User-Agent': 'Mozilla/5.0 (X11; CrOS x86_64 11151.4.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.8 Safari/537.36'}
if not self._cfb_byes:
data = requests.get(url, headers=headers)
soup = BeautifulSoup(data.content)
pattern = re.compile(r'Week')
section = soup.find('section', class_='article-body')
ps = section.find_all('p')
output = {}
for p in ps:
if p.text.startswith('Week'):
week = p.text.split(':')[0]
week = week.split('(')[0].strip()
byes = p.text.split(':')[1].strip()
if byes:
output[week] = byes
self._cfb_byes = output
try:
irc.reply(self._cfb_byes[self._current_week])
return
except:
irc.reply('No teams on bye this week')
return
@wrap([getopts({'week': 'positiveInt'}), optional('text')])
def cfbrankings(self, irc, msg, args, optlist, filter_team=None):
"""Fetches CFB Rankings"""
optlist = dict(optlist)
week = optlist.get('week')
url = 'http://site.api.espn.com/apis/site/v2/sports/football/college-football/rankings'
if week:
url += '?weeks={}'.format(week)
try:
data = requests.get(url)
data = data.json()
except:
irc.reply('Error fetching rankings')
return
if not week:
week = ' ' + data['latestWeek']['displayValue']
else:
if week > data['latestWeek']['number']:
irc.reply("Sorry, I cannot predict the future")
return
week = ' Week {}'.format(week)
rankings = data['rankings'][0]
self._current_week = week.strip()
title = data['rankings'][0]['name']
output = []
for team in rankings['ranks']:
tmp = '#{0}{3} {1} {2}'
if '+' in team['trend']:
trend = self._green(team['trend'])
elif '-' in team['trend'] and team['trend'] != '-':
trend = self._red(team['trend'])
else:
trend = team['trend']
tmp = tmp.format(
team['current'],
self._bold(team['team']['abbreviation']),
team['recordSummary'],
'({})'.format(trend) if trend != '-' else ''
)
if filter_team:
if filter_team.upper() == team['team']['abbreviation']:
tmp += ' :: {} points'.format(team['points'])
output.append(tmp)
break
else:
output.append(tmp)
if filter_team and len(output) == 1:
irc.reply('{}: {}'.format(title + week, output[0]))
elif filter_team and not output:
irc.reply('No results found for {}'.format(filter_team))
else:
irc.reply('{}: {}'.format(title + week, ' | '.join(team for team in output[:11])))
irc.reply('{}'.format(' | '.join(team for team in output[11:])))
@wrap([getopts({'week': 'positiveInt', 'conf': 'positiveInt'}), optional('text')])
def cfb(self, irc, msg, args, optlist, team=None):
"""[--conf #] [--week #] [<team>]
Fetches CFB Scores. Defaults to current week and AP Top 25 teams.
Use --conf # (ESPN league #) to fetch a specific conference.
Use --week # to look up a specific week.
"""
optlist = dict(optlist)
week = optlist.get('week')
conf = optlist.get('conf')
team = self._parseInput(team)
if (conf==80 or conf==81 or conf==35) and not team:
irc.reply('ERROR: You must provide a team')
return
# override games cache
if week or conf or team == 'today':
self.CFB_GAMES = self._fetchGames(team, conf, week)
if not self.CFB_GAMES:
self.CFB_GAMES = self._fetchGames(team, conf)
if not self.CFB_GAMES:
irc.reply('No games found')
return
games = self._parseGames(self.CFB_GAMES, team)
games = self._sortGames(games)
reply_string = self._replyAsString(team, games)
for string in reply_string:
irc.reply(string)
# reset games cache to current week
if week:
self.CFB_GAMES = self._fetchGames(team, conf)
elif conf:
self.CFB_GAMES = self._fetchGames(team, conf='')
def _parseInput(self, team):
if not team:
return None
else:
# tbd
return team
def _fetchGames(self, team, conf="80", week=None):
team = 'all' if not team else team.upper()
date = pendulum.now('US/Pacific')
conf = '' if not conf else conf
url = self.SCOREBOARD + '?groups={}'.format(conf)
if team != 'all' and team != 'TODAY' and team != 'INP':
url += '&limit=300'
if week:
url += '&week={}'.format(week)
games = requests.get(url)
games = games.json()
games = games['events']
if team != 'all' and team != 'TODAY' and team != 'INP':
ngames = []
# check abbreviation first
for game in games:
if team == game['competitions'][0]['competitors'][0]['team']['abbreviation'] \
or team == game['competitions'][0]['competitors'][1]['team']['abbreviation']:
ngames.append(game)
if not ngames:
if team == 'HAWAII':
team = "HAWAI'I"
for game in games:
if team == html.unescape(game['competitions'][0]['competitors'][0]['team']['location']).upper() \
or team == html.unescape(game['competitions'][0]['competitors'][1]['team']['location']).upper():
ngames.append(game)
return ngames
return games
def _parseGames(self, games, team=None):
new_games = []
if team:
if team.lower() != 'all' and team.lower() != 'today' and team.lower() != 'inp':
for idx, game in enumerate(games):
if team.upper() == game['competitions'][0]['competitors'][0]['team']['abbreviation'] \
or team.upper() == game['competitions'][0]['competitors'][1]['team']['abbreviation']:
games = [games.pop(idx)]
break
for game in games:
date = pendulum.parse(game['date']).in_tz('US/Pacific')
today = pendulum.today('US/Pacific')
new_game = {}
new_game['id'] = game['id']
new_game['time'] = pendulum.parse(game['date']).in_tz('US/Eastern').format('ddd h:mm A zz')
new_game['date'] = pendulum.parse(game['date']).in_tz('US/Eastern').format('dddd, MMMM Do, h:mm A zz')
new_game['home_full'] = game['competitions'][0]['competitors'][0]['team']['location']
new_game['home'] = game['competitions'][0]['competitors'][0]['team']['abbreviation']
new_game['home_id'] = game['competitions'][0]['competitors'][0]['team']['id']
new_game['away_full'] = game['competitions'][0]['competitors'][1]['team']['location']
new_game['away'] = game['competitions'][0]['competitors'][1]['team']['abbreviation']
new_game['away_id'] = game['competitions'][0]['competitors'][1]['team']['id']
new_game['status'] = game['status']['type']['state']
new_game['shortDetail'] = game['status']['type']['shortDetail']
new_game['final'] = game['status']['type']['completed']
new_game['in_progress'] = False
# Rankings
new_game['home_team_rank'] = game['competitions'][0]['competitors'][0]['curatedRank'].get('current')
new_game['away_team_rank'] = game['competitions'][0]['competitors'][1]['curatedRank'].get('current')
# Odds
try:
new_game['odds'] = '{} (O/U: {:.0f})'.format(game['competitions'][0]['odds'][0]['details'], game['competitions'][0]['odds'][0]['overUnder'])
except Exception as e:
new_game['odds'] = ''
print(e)
if new_game['status'] == 'in' and not new_game['final']:
new_game['in_progress'] = True
try:
new_game['last_play'] = game['competitions'][0]['situation']['lastPlay']['text']
except:
new_game['last_play'] = ''
new_game['pos'] = game['competitions'][0]['situation'].get('possession')
new_game['rz'] = game['competitions'][0]['situation'].get('isRedZone')
new_game['desc'] = game['competitions'][0]['situation'].get('downDistanceText')
new_game['clock'] = game['status']['type']['shortDetail']
try:
new_game['clock'] = new_game['clock'].split('-')[0].strip() + ' ' + self._green(new_game['clock'].split('-')[1].strip())
except:
new_game['clock'] = new_game['clock']
if 'Delayed' in new_game['clock']:
new_game['clock'] = self._orange('DLY')
if 'Halftime' in new_game['clock']:
new_game['clock'] = 'HT'
new_game['HT'] = True
else:
new_game['HT'] = False
elif new_game['status'] == 'post':
new_game['in_progress'] = False
new_game['broadcasts'] = '{}'.format(', '.join(item['media']['shortName'] for item in game['competitions'][0]['geoBroadcasts']))
new_game['h_score'] = int(game['competitions'][0]['competitors'][0]['score'])
new_game['a_score'] = int(game['competitions'][0]['competitors'][1]['score'])
if team == 'today':
if date.day == today.day:
new_games.append(new_game)
elif team == 'inp':
if new_game['in_progress']:
new_games.append(new_game)
else:
new_games.append(new_game)
return new_games
def _sortGames(self, games):
sorted_games = sorted(games, key=lambda k: k['final'])
return sorted_games
def _replyAsString(self, team, games):
reply_strings = []
tmp_strings = []
half_point = len(games)//2
def _parseScores(away, ascr, home, hscr, arnk, hrnk):
print(ascr, arnk, hscr, hrnk)
if ascr > hscr:
astr = '{} {}'.format(self._bold(away), self._bold(ascr))
hstr = '{} {}'.format(home, hscr)
if arnk > hrnk:
upset = True
else:
upset = False
elif ascr < hscr:
hstr = '{} {}'.format(self._bold(home), self._bold(hscr))
astr = '{} {}'.format(away, ascr)
if hrnk > arnk:
upset = True
else:
upset = False
else:
astr = '{} {}'.format(away, ascr)
hstr = '{} {}'.format(home, hscr)
upset = False
print(upset)
return astr, hstr, upset
if len(games) == 2:
if games[0]['away'] == games[1]['away']:
for idx, game in enumerate(games):
if game['shortDetail'] == 'Postponed':
games.pop(idx)
single = True if len(games) == 1 else False
for game in games:
string = ''
if single:
away = game['away_full']
home = game['home_full']
time = game['date']
else:
away = game['away']
home = game['home']
time = game['time']
if game['status'] == 'pre':
string = '{} @ {} - {}'.format(away, home, time)
if single:
string += ' - \x02TV:\x02 {}'.format(game['broadcasts'])
if game['odds']:
string += ' - \x02Odds:\x02 {}'.format(game['odds'])
tmp_strings.append(string)
elif game['in_progress']:
if not game['HT']:
if game['pos'] == game['away_id']:
if game['rz']:
away = self._red('<>{}'.format(away))
else:
away = '<>' + away
if game['pos'] == game['home_id']:
if game['rz']:
home = self._red('<>{}'.format(home))
else:
home = '<>' + home
away_str, home_str, upset = _parseScores(away, game['a_score'], home, game['h_score'], game['away_team_rank'], game['home_team_rank'])
if game['clock'] == 'HT':
if single:
game['clock'] = self._orange('Halftime')
else:
game['clock'] = self._orange(game['clock'])
if single:
game['clock'] = '({})'.format(game['clock'])
string = '{} @ {} {}'.format(away_str, home_str, game['clock'])
if upset:
if single:
string += ' :: {}'.format(self._orange('UPSET'))
string = self._ul(string)
if not game['HT'] and single:
if game['desc']:
desc = ' :: {}'.format(game['desc'])
else:
desc = ''
if game['last_play']:
string += '{} :: \x02Last Play:\x02 {}'.format(desc, game['last_play'])
if game['broadcasts']:
string += ' :: \x02TV:\x02 {}'.format(game['broadcasts'])
if game['odds']:
string += ' :: \x02Odds:\x02 {}'.format(game['odds'])
tmp_strings.append(string)
elif game['status'] == 'post':
if game['shortDetail'] != 'Final':
endCode = game['shortDetail']
if 'Postponed' in endCode:
if not single:
endCode = self._red('PPD')
else:
endCode = self._red(endCode)
elif 'Canceled' in endCode:
if not single:
endCode = self._red('C')
else:
endCode = self._red(endCode)
elif 'OT' in endCode:
if single:
endCode = self._red(endCode)
else:
endCode = self._red('F/OT')
elif 'OT' in game['shortDetail']:
if single:
endCode = self._red(endCode)
else:
endCode = self._red('F/OT')
else:
if single:
endCode = self._red('Final')
else:
endCode = self._red('F')
away_str, home_str, upset = _parseScores(away, game['a_score'], home, game['h_score'], game['away_team_rank'], game['home_team_rank'])
string = '{} @ {} {}'.format(away_str, home_str, endCode)
if upset and not single:
string = self._ul(string)
if single:
if upset:
string += ' :: {}'.format(self._orange('UPSET'))
tmp_strings.append(string)
print(len(tmp_strings), half_point)
if len(tmp_strings) > 1 and half_point >= 6:
reply_strings.append(' | '.join(string for string in tmp_strings[:half_point]))
reply_strings.append(' | '.join(string for string in tmp_strings[half_point:]))
else:
reply_strings.append(' | '.join(string for string in tmp_strings))
return reply_strings
def _red(self, string):
"""Returns a red string."""
return ircutils.mircColor(string, 'red')
def _yellow(self, string):
"""Returns a yellow string."""
return ircutils.mircColor(string, 'yellow')
def _orange(self, string):
return ircutils.mircColor(string, 'orange')
def _green(self, string):
"""Returns a green string."""
return ircutils.mircColor(string, 'green')
def _blue(self, string):
"""Returns a blue string."""
return ircutils.mircColor(string, 'blue')
def _bold(self, string):
"""Returns a bold string."""
return ircutils.bold(string)
def _ul(self, string):
"""Returns an underline string."""
return ircutils.underline(string)
def _bu(self, string):
"""Returns a bold/underline string."""
return ircutils.bold(ircutils.underline(string))
Class = CFBScores
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -0,0 +1,3 @@
requests
pendulum
beautifulsoup4

15
CFBScores/test.py Normal file
View File

@ -0,0 +1,15 @@
###
# Copyright (c) 2018, cottongin
# All rights reserved.
#
#
###
from supybot.test import *
class CFBScoresTestCase(PluginTestCase):
plugins = ('CFBScores',)
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: