Skip to content
This repository was archived by the owner on May 19, 2019. It is now read-only.

Commit b695fd7

Browse files
nadyr-mgkorovkinand
authored and
korovkinand
committed
DetailedSurebet (#79)
* Added class DetailedSurebet, funcs _filter, _convert_to_detailed, convert_to_detailed. In bookmakers.py: replaced sign > to >=. * Updated main.py * Updated main.py * Updated main.py * Refactoring * Requested changes
1 parent ba7266e commit b695fd7

File tree

3 files changed

+107
-8
lines changed

3 files changed

+107
-8
lines changed

surebet/bookmakers.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ def wrapper():
198198
if not isinstance(err, KeyboardInterrupt):
199199
# if first error and current error occurred within forbidden interval
200200
if default_timer() - self.first_occurred < FORBIDDEN_INTERVAL:
201-
if self.error_cnt > MAX_ERR_CNT:
201+
if self.error_cnt >= MAX_ERR_CNT:
202202
raise
203203
else:
204204
self.error_cnt += 1

surebet/handling/detailed_surebets.py

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
from functools import cmp_to_key
2+
from surebet.handling.surebets import *
3+
4+
MIN_PROFIT = 2.5
5+
MAX_PROFIT = 10
6+
7+
MIN_LIFETIME = 10
8+
9+
10+
class DetailedSurebet:
11+
"""
12+
Contain all information about surebet: bookmakers between which surebet is occurred,
13+
teams for first and second event, part of event and wagers, profit, lifetime of surebet
14+
"""
15+
16+
def __init__(self, books: BookSurebets, sport: str, events: EventSurebets, part: PartSurebets,
17+
surebet: TimedSurebet):
18+
"""
19+
:param books: bookmakers between which surebet is occurred
20+
:param sport: name of sport
21+
:param events: events between which surebet is occurred
22+
:param part: common part of events
23+
"""
24+
self.book1, self.book2 = books.book1, books.book2
25+
self.sport = sport
26+
self.teams1, self.teams2 = events.teams1, events.teams2
27+
self.part = part.part
28+
self.w1, self.w2 = surebet.w1, surebet.w2
29+
self.profit = surebet.profit
30+
self.lifetime = surebet.get_lifetime()
31+
32+
def __str__(self):
33+
teams_sep = " vs "
34+
event_name1 = teams_sep.join(self.teams1)
35+
event_name2 = teams_sep.join(self.teams2)
36+
37+
common_pattern = "{sport:<6} | {book:<6} | {ev_name:<60} | part #{part} | {wager}"
38+
39+
str_form = "profit: {profit:<8} | ".format(profit=self.profit) + common_pattern.format(
40+
sport=self.sport, book=self.book1, ev_name=event_name1, part=self.part, wager=self.w1) + "\n"
41+
str_form += "lifetime: {time:<6} | ".format(time=self.lifetime) + common_pattern.format(
42+
sport=self.sport, book=self.book2, ev_name=event_name2, part=self.part, wager=self.w2)
43+
return str_form
44+
45+
46+
def convert_to_detailed(surebets: Surebets) -> list:
47+
"""Convert surebets to list of DetailedSurebet, filter that list and sort"""
48+
detailed_surebets = _convert_to_detailed(surebets)
49+
50+
detailed_surebets = _filter(detailed_surebets)
51+
52+
_sort_detailed(detailed_surebets)
53+
54+
return detailed_surebets
55+
56+
57+
def _filter(detailed_surebets) -> list:
58+
"""Filter detailed_surebets by profit's lower and upper limits and by lifetime's lower limit"""
59+
60+
def predicate(item):
61+
return MIN_PROFIT <= item.profit <= MAX_PROFIT and item.lifetime >= MIN_LIFETIME
62+
63+
return list(filter(predicate, detailed_surebets))
64+
65+
66+
def _convert_to_detailed(surebets: Surebets) -> list:
67+
"""Construct objects of class DetailedSurebet and put them in list detailed_surebets"""
68+
detailed_surebets = []
69+
for book in surebets.books_surebets:
70+
for sport_name, sport in book.attrs_dict().items():
71+
for event in sport:
72+
for part in event.parts:
73+
for surebet in part.surebets:
74+
detailed_surebets.append(DetailedSurebet(book, sport_name, event, part, surebet))
75+
return detailed_surebets
76+
77+
78+
def _sort_detailed(detailed_surebets):
79+
detailed_surebets.sort(key=cmp_to_key(_detailed_cmp), reverse=True)
80+
81+
82+
def _detailed_cmp(first: DetailedSurebet, second: DetailedSurebet):
83+
"""Custom comparator to sort detailed_surebets firstly by profit casted to int and secondly by lifetime"""
84+
first_profit, second_profit = int(first.profit), int(second.profit)
85+
if first_profit != second_profit:
86+
return first_profit - second_profit
87+
else:
88+
return first.lifetime - second.lifetime

surebet/main.py

+18-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from surebet.bookmakers import Posit, Fonbet, Marat, Olimp
2+
from surebet.handling.detailed_surebets import convert_to_detailed
23
from surebet.handling.excluding import exclude_posit
34
from surebet.handling.searching import find_surebets
5+
from surebet.handling.surebets import Surebets
46
from surebet.loading.selenium import SeleniumService
57
from surebet.parsing.bets import Bookmakers
68

@@ -11,15 +13,24 @@ def start_scanning():
1113
marat = Marat()
1214
olimp = Olimp()
1315

14-
bookmakers = Bookmakers()
15-
fonbet.load_events(bookmakers.fonbet)
16-
marat.load_events(bookmakers.marat)
17-
olimp.load_events(bookmakers.olimp)
16+
old_surebets = Surebets()
17+
for i in range(3):
18+
bookmakers = Bookmakers()
19+
fonbet.load_events(bookmakers.fonbet)
20+
marat.load_events(bookmakers.marat)
21+
olimp.load_events(bookmakers.olimp)
1822

19-
found_surebets = find_surebets(bookmakers)
20-
posit_surebets = posit.load_events()
23+
posit_surebets = posit.load_events()
24+
surebets = find_surebets(bookmakers)
2125

22-
exclude_posit(found_surebets, posit_surebets)
26+
exclude_posit(surebets, posit_surebets)
27+
28+
surebets.set_timestamps(old_surebets)
29+
old_surebets = surebets
30+
31+
detailed_surebets = convert_to_detailed(surebets)
32+
for detailed_surebet in detailed_surebets:
33+
print(detailed_surebet)
2334

2435
SeleniumService.quit()
2536

0 commit comments

Comments
 (0)