initial commit
This commit is contained in:
parent
423f5de9a3
commit
415aad8bff
50
README.md
50
README.md
|
|
@ -1,29 +1,27 @@
|
||||||
# README #
|
# Generic Lottery game number checker #
|
||||||
|
Currently includes Powerball and Megamillions.
|
||||||
|
|
||||||
This README would normally document whatever steps are necessary to get your application up and running.
|
You add your picks to {game}/picks.py, and run `./play -g {gamename}` eg `.play.py -g powerball`
|
||||||
|
|
||||||
### What is this repository for? ###
|
The script will pull the current winning numbers from an rss feed, and compare them to each ticket you list in the picks.py file for that game.
|
||||||
|
|
||||||
* Quick summary
|
The output per ticket:
|
||||||
* Version
|
```text
|
||||||
* [Learn Markdown](https://bitbucket.org/tutorials/markdowndemo)
|
Winning Numbers: [2, 13, 32, 33, 48]
|
||||||
|
Winning Powerball: 22
|
||||||
### How do I get set up? ###
|
Your Numbers: (1, 2, 3, 4, 5)
|
||||||
|
Your Powerball: 9
|
||||||
* Summary of set up
|
Matched Numbers: [2]
|
||||||
* Configuration
|
Matched Powerball: False
|
||||||
* Dependencies
|
Not a Winner!
|
||||||
* Database configuration
|
```
|
||||||
* How to run tests
|
OR
|
||||||
* Deployment instructions
|
```text
|
||||||
|
Winning Numbers: [2, 13, 32, 33, 48]
|
||||||
### Contribution guidelines ###
|
Winning Powerball: 22
|
||||||
|
Your Numbers: (1, 2, 3, 4, 5)
|
||||||
* Writing tests
|
Your Powerball: 22
|
||||||
* Code review
|
Matched Numbers: [2]
|
||||||
* Other guidelines
|
Matched Powerball: True
|
||||||
|
Ticket is worth: 8
|
||||||
### Who do I talk to? ###
|
```
|
||||||
|
|
||||||
* Repo owner or admin
|
|
||||||
* Other community or team contact
|
|
||||||
36
lib/Feed.py
Normal file
36
lib/Feed.py
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
import feedparser
|
||||||
|
|
||||||
|
|
||||||
|
class Feed:
|
||||||
|
|
||||||
|
def __init__(self, feed):
|
||||||
|
self.feed = 'https://www.texaslottery.com/export/sites/lottery/rss/tlc_latest.xml'
|
||||||
|
self.parsed_feed = feedparser.parse(self.feed)
|
||||||
|
self.game_entries = feed
|
||||||
|
self.modifiers = {
|
||||||
|
'Billion': 1000000000,
|
||||||
|
'Million': 1000000
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_winning_numbers(self):
|
||||||
|
entry = self.game_entries
|
||||||
|
nums_pre = self.parsed_feed.entries[entry['winning_numbers']].summary
|
||||||
|
nums_pre = nums_pre.replace(entry['special_ball'], '-').replace(f' {entry["multiplier"]}', '-')
|
||||||
|
nums = nums_pre.split(' - ')
|
||||||
|
|
||||||
|
winning_numbers = nums[:5]
|
||||||
|
|
||||||
|
for idx, num in enumerate(nums[:5]):
|
||||||
|
winning_numbers[idx] = int(num)
|
||||||
|
|
||||||
|
special_ball = int(nums[5])
|
||||||
|
multiplier = int(nums[6])
|
||||||
|
return {'numbers': winning_numbers, 'special_ball': special_ball, 'multiplier': multiplier}
|
||||||
|
|
||||||
|
def get_jackpot(self):
|
||||||
|
entry = self.game_entries
|
||||||
|
jp_pre = self.parsed_feed.entries[entry['jackpot']].summary
|
||||||
|
jp_pre = jp_pre[jp_pre.index('Cash'):]
|
||||||
|
jp_pre = jp_pre[jp_pre.index(':') + 3:]
|
||||||
|
jp_data = jp_pre.split()
|
||||||
|
return float(jp_data[0]) * self.modifiers[jp_data[1]]
|
||||||
70
lib/Ticket.py
Normal file
70
lib/Ticket.py
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
class Ticket:
|
||||||
|
|
||||||
|
def __init__(self, my_picks, my_special_ball):
|
||||||
|
self.jackpot = 0
|
||||||
|
self.my_picks = my_picks
|
||||||
|
self.my_special_ball = my_special_ball
|
||||||
|
self.winning_numbers = []
|
||||||
|
self.special_ball = None
|
||||||
|
self.multiplier = None
|
||||||
|
self.matched_numbers = []
|
||||||
|
self.matched_special_ball = None
|
||||||
|
self.winnings = 0
|
||||||
|
self.feed = None
|
||||||
|
|
||||||
|
def get_jp_amount(self):
|
||||||
|
self.jackpot = self.feed.get_jackpot()
|
||||||
|
|
||||||
|
def get_winning_numbers(self):
|
||||||
|
winners = self.feed.get_winning_numbers()
|
||||||
|
self.winning_numbers = winners['numbers']
|
||||||
|
self.special_ball = winners['special_ball']
|
||||||
|
self.multiplier = winners['multiplier']
|
||||||
|
|
||||||
|
def process_ticket(self):
|
||||||
|
self.check_numbers()
|
||||||
|
self.check_special_ball()
|
||||||
|
self.get_jp_amount()
|
||||||
|
special_ball_wins = self.get_winnings_with_special_ball(self.jackpot)
|
||||||
|
non_special_ball_wins = self.get_winnings_without_special_ball()
|
||||||
|
self.process_winnings(special_ball_wins, non_special_ball_wins)
|
||||||
|
|
||||||
|
def check_numbers(self):
|
||||||
|
for num in self.my_picks:
|
||||||
|
if num in self.winning_numbers:
|
||||||
|
self.matched_numbers.append(num)
|
||||||
|
|
||||||
|
def check_special_ball(self):
|
||||||
|
self.matched_special_ball = False
|
||||||
|
|
||||||
|
if self.special_ball is not None and self.my_special_ball == self.special_ball:
|
||||||
|
self.matched_special_ball = True
|
||||||
|
|
||||||
|
def process_winnings(self, special_ball_wins, non_special_ball_wins):
|
||||||
|
wins = non_special_ball_wins
|
||||||
|
|
||||||
|
if self.matched_special_ball:
|
||||||
|
wins = special_ball_wins
|
||||||
|
|
||||||
|
self.winnings = wins[self.multiplier][len(self.matched_numbers)]
|
||||||
|
self.output_ticket()
|
||||||
|
|
||||||
|
def output_ticket(self):
|
||||||
|
special_ball = self.feed.game_entries["special_ball"]
|
||||||
|
print(f'Winning Numbers: {self.winning_numbers}')
|
||||||
|
print(f'Winning {special_ball}: {self.special_ball}')
|
||||||
|
print(f'Your Numbers: {self.my_picks}')
|
||||||
|
print(f'Your {special_ball}: {self.my_special_ball}')
|
||||||
|
print(f'Matched Numbers: {self.matched_numbers}')
|
||||||
|
print(f'Matched {special_ball}: {"True" if self.matched_special_ball else "False"}')
|
||||||
|
if self.winnings > 0:
|
||||||
|
print(f'Ticket is worth: {self.winnings}')
|
||||||
|
else:
|
||||||
|
print(f'Not a Winner!')
|
||||||
|
print()
|
||||||
|
|
||||||
|
def get_winnings_with_special_ball(self, jp):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_winnings_without_special_ball(self):
|
||||||
|
pass
|
||||||
18
megamillions/MegaMillions.py
Normal file
18
megamillions/MegaMillions.py
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
from lib.Ticket import Ticket
|
||||||
|
from lib.Feed import Feed
|
||||||
|
from .feed import feed
|
||||||
|
from .winning_structure import get_winnings_mb, get_winnings_no_mb
|
||||||
|
|
||||||
|
|
||||||
|
class MegaMillions(Ticket):
|
||||||
|
|
||||||
|
def __init__(self, my_picks, my_special_ball):
|
||||||
|
super().__init__(my_picks, my_special_ball)
|
||||||
|
self.feed = Feed(feed)
|
||||||
|
self.get_winning_numbers()
|
||||||
|
|
||||||
|
def get_winnings_with_special_ball(self, jp):
|
||||||
|
return get_winnings_mb(self.jackpot)
|
||||||
|
|
||||||
|
def get_winnings_without_special_ball(self):
|
||||||
|
return get_winnings_no_mb()
|
||||||
0
megamillions/__init__.py
Normal file
0
megamillions/__init__.py
Normal file
6
megamillions/feed.py
Normal file
6
megamillions/feed.py
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
feed = {
|
||||||
|
'winning_numbers': 2,
|
||||||
|
'jackpot': 3,
|
||||||
|
'special_ball': 'MegaBall',
|
||||||
|
'multiplier': 'Megaplier'
|
||||||
|
}
|
||||||
13
megamillions/game.py
Executable file
13
megamillions/game.py
Executable file
|
|
@ -0,0 +1,13 @@
|
||||||
|
#! /usr/bin/python3
|
||||||
|
|
||||||
|
from .picks import my_picks
|
||||||
|
from .MegaMillions import MegaMillions
|
||||||
|
|
||||||
|
cur_picks = []
|
||||||
|
cur_pb = 0
|
||||||
|
|
||||||
|
for idx, tkt in enumerate(my_picks):
|
||||||
|
cur_picks = tkt['picks']
|
||||||
|
cur_pb = tkt['mb']
|
||||||
|
pbtkt = MegaMillions(cur_picks, cur_pb)
|
||||||
|
pbtkt.process_ticket()
|
||||||
4
megamillions/picks.py
Normal file
4
megamillions/picks.py
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
my_picks = [
|
||||||
|
{'picks': (1, 2, 3, 4, 5), 'mb': 9},
|
||||||
|
{'picks': (2, 3, 4, 5, 6), 'mb': 19},
|
||||||
|
]
|
||||||
16
megamillions/winning_structure.py
Normal file
16
megamillions/winning_structure.py
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
def get_winnings_mb(jackpot_cash):
|
||||||
|
return {
|
||||||
|
2: [4, 8, 20, 400, 20_000, jackpot_cash],
|
||||||
|
3: [6, 12, 30, 600, 30_000, jackpot_cash],
|
||||||
|
4: [8, 16, 40, 800, 40_000, jackpot_cash],
|
||||||
|
5: [10, 20, 50, 1_000, 50_000, jackpot_cash]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_winnings_no_mb():
|
||||||
|
return {
|
||||||
|
2: [0, 0, 0, 20, 1_000, 2_000_000],
|
||||||
|
3: [0, 0, 0, 30, 1_500, 3_000_000],
|
||||||
|
4: [0, 0, 0, 40, 2_000, 4_000_000],
|
||||||
|
5: [0, 0, 0, 50, 2_500, 5_000_000]
|
||||||
|
}
|
||||||
27
play.py
Executable file
27
play.py
Executable file
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import getopt
|
||||||
|
import sys
|
||||||
|
import importlib
|
||||||
|
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
game = ''
|
||||||
|
usage = 'play.py -g <gamename>'
|
||||||
|
|
||||||
|
try:
|
||||||
|
opts, args = getopt.getopt(argv, "hg:", ["game="])
|
||||||
|
except getopt.GetoptError:
|
||||||
|
print(usage)
|
||||||
|
sys.exit(2)
|
||||||
|
for opt, arg in opts:
|
||||||
|
if opt == '-h':
|
||||||
|
print(usage)
|
||||||
|
sys.exit()
|
||||||
|
elif opt in ("-g", "--game"):
|
||||||
|
game = arg
|
||||||
|
importlib.import_module(f'{game}.game')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main(sys.argv[1:])
|
||||||
18
powerball/Powerball.py
Normal file
18
powerball/Powerball.py
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
from lib.Ticket import Ticket
|
||||||
|
from lib.Feed import Feed
|
||||||
|
from .feed import feed
|
||||||
|
from .winning_structure import get_winnings_pb, get_winnings_no_pb
|
||||||
|
|
||||||
|
|
||||||
|
class Powerball(Ticket):
|
||||||
|
|
||||||
|
def __init__(self, my_picks, my_special_ball):
|
||||||
|
super().__init__(my_picks, my_special_ball)
|
||||||
|
self.feed = Feed(feed)
|
||||||
|
self.get_winning_numbers()
|
||||||
|
|
||||||
|
def get_winnings_with_special_ball(self, jp):
|
||||||
|
return get_winnings_pb(self.jackpot)
|
||||||
|
|
||||||
|
def get_winnings_without_special_ball(self):
|
||||||
|
return get_winnings_no_pb()
|
||||||
0
powerball/__init__.py
Normal file
0
powerball/__init__.py
Normal file
6
powerball/feed.py
Normal file
6
powerball/feed.py
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
feed = {
|
||||||
|
'winning_numbers': 0,
|
||||||
|
'jackpot': 1,
|
||||||
|
'special_ball': 'Powerball',
|
||||||
|
'multiplier': 'Power Play'
|
||||||
|
}
|
||||||
13
powerball/game.py
Executable file
13
powerball/game.py
Executable file
|
|
@ -0,0 +1,13 @@
|
||||||
|
#! /usr/bin/python3
|
||||||
|
|
||||||
|
from .picks import my_picks
|
||||||
|
from .Powerball import Powerball
|
||||||
|
|
||||||
|
cur_picks = []
|
||||||
|
cur_pb = 0
|
||||||
|
|
||||||
|
for idx, tkt in enumerate(my_picks):
|
||||||
|
cur_picks = tkt['picks']
|
||||||
|
cur_pb = tkt['pb']
|
||||||
|
pbtkt = Powerball(cur_picks, cur_pb)
|
||||||
|
pbtkt.process_ticket()
|
||||||
4
powerball/picks.py
Normal file
4
powerball/picks.py
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
my_picks = [
|
||||||
|
{'picks': (1, 2, 3, 4, 5), 'pb': 22},
|
||||||
|
{'picks': (2, 3, 4, 5, 6), 'pb': 19},
|
||||||
|
]
|
||||||
20
powerball/winning_structure.py
Normal file
20
powerball/winning_structure.py
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
def get_winnings_pb(jackpot_cash):
|
||||||
|
return {
|
||||||
|
0: [4, 4, 7, 100, 50_000, jackpot_cash],
|
||||||
|
2: [8, 8, 14, 200, 100_000, jackpot_cash],
|
||||||
|
3: [12, 12, 21, 300, 150_000, jackpot_cash],
|
||||||
|
4: [16, 16, 28, 400, 200_000, jackpot_cash],
|
||||||
|
5: [20, 20, 35, 500, 250_000, jackpot_cash],
|
||||||
|
10: [40, 40, 70, 1_000, 500_000, jackpot_cash]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_winnings_no_pb():
|
||||||
|
return {
|
||||||
|
0: [0, 0, 0, 7, 100, 1_000_000],
|
||||||
|
2: [0, 0, 0, 14, 200, 2_000_000],
|
||||||
|
3: [0, 0, 0, 21, 300, 2_000_000],
|
||||||
|
4: [0, 0, 0, 28, 400, 2_000_000],
|
||||||
|
5: [0, 0, 0, 35, 500, 2_000_000],
|
||||||
|
10: [0, 0, 0, 70, 1_000, 2_000_000]
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue