import json, os, sys
from bcdd.PBNFile import PBNFile
from jfrteamy.db import TeamyDB
def get_digits(t):
return int(''.join(i for i in t if i.isdigit()))
def clear():
os.system('cls' if os.name == 'nt' else 'clear')
with open(sys.argv[1]) as config_file:
config = json.load(config_file)
f = PBNFile('../Segment.pbn')
db = TeamyDB(config['mysql'])
clear()
if config['settings']['fetch_lineups'] > 0:
players = db.fetch_all('SELECT id, team, CONCAT(gname, " ", sname) FROM players')
rosters = {}
for player in players:
team = player[1]
if team not in rosters:
rosters[team] = {}
rosters[team][player[0]] = player[2]
tables = {}
for b in f.boards:
if b.has_field('Round'):
if b.get_field('Round') == str(config['settings']['pbn_round']):
table = b.get_field('Table')
if table not in tables:
tables[table] = {}
tables[table][b.get_field('Room')] = [
[b.get_field('North'), b.get_field('South')],
[b.get_field('East'), b.get_field('West')]
]
db_tables = db.fetch_all('SELECT tabl, homet, visit FROM segments WHERE rnd = %s AND segment = %s', (
config['settings']['teamy_round'],
config['settings']['teamy_segment']
))
round_lineup = {}
for dbt in db_tables:
round_lineup[dbt[0]] = dbt[1:]
for t, rooms in tables.items():
table = get_digits(t)
home_team = round_lineup[table][0]
away_team = round_lineup[table][1]
home_roster = rosters[home_team]
away_roster = rosters[away_team]
lineups = {}
positions = [['N', 'S'], ['E', 'W']]
for room, lineup in rooms.items():
room = room.lower().replace('closed', 'close')
for which_room in ['open', 'close']:
roster = home_roster if which_room == 'open' else away_roster
team = home_team if which_room == 'open' else away_team
for i in range(0, 2):
player = lineup[1 - (room == which_room)][i]
player_id = None
for roster_id, roster_pl in roster.items():
if player == roster_pl:
player_id = roster_id
position = room + positions[1 - (room == which_room)][i]
print('INFO: Player in lineup: Table %d, position %s, #%d %s' % (
table, position,
roster_id, roster_pl))
db.fetch(
'UPDATE segments SET '+position+' = %s WHERE rnd = %s AND segment = %s AND tabl = %s', (
player_id,
config['settings']['teamy_round'], config['settings']['teamy_segment'],
table
)
)
if player_id is None:
print('WARNING: Player %s not found in team %d', (player, team))
board_mapping = {}
for b in db.fetch_all('SELECT brd, bno FROM boards WHERE rnd = %s AND segment = %s', (
config['settings']['teamy_round'], config['settings']['teamy_segment'])):
board_mapping[b[1]] = b[0]
for b in f.boards:
if b.has_field('Round'):
if b.get_field('Round') == str(config['settings']['pbn_round']):
board = int(b.get_field('Board'))
if board not in board_mapping:
print('ERROR: board %d not meant to be played in segment %d-%d' % (
board, config['settings']['teamy_round'], config['settings']['teamy_segment']))
continue
board_no = board_mapping[board]
table = get_digits(b.get_field('Table'))
room = 1 if b.get_field('Room') == 'Open' else 2
while True:
current_score = db.fetch('SELECT declarer, contract, result, lead, score FROM scores ' +
'WHERE rnd = %s AND segment = %s AND tabl = %s AND room = %s AND board = %s', (
config['settings']['teamy_round'], config['settings']['teamy_segment'],
table, room, board_no))
if current_score:
break
print('INFO: record in scores table does not exist - creating')
db.fetch('INSERT INTO scores(rnd, segment, tabl, room, board, mecz, butler, processed, tims) VALUES(%s, %s, %s, %s, %s, 0, 0, 1, NOW())', (
config['settings']['teamy_round'], config['settings']['teamy_segment'],
table, room, board_no))
declarer = b.get_field('Declarer')
contract = b.get_field('Contract').replace('*', ' x').replace('x x', 'xx')
if contract[0].isdigit():
contract = contract[0] + ' ' + contract[1:]
result = int(b.get_field('Result')) - get_digits(contract) - 6
lead = '' # wtf?
score = int(b.get_field('Score').replace('NS ', '')) # co z pasami?
update_score = True
if current_score[4] is not None:
if not config['settings']['overwrite_scores']:
update_score = False
if score != current_score[4]:
print('WARNING: result in board %d, table %d-%d changed and is not going to be overwritten!' % (
board, table, room))
else:
print('INFO: not overwriting result in board %d, table %d-%d' % (
board, table, room))
if update_score:
params = (contract, declarer, result, lead, score)
print('INFO: updating result in board %d, table %d-%d: %s' % (
board, table, room, params))
db.fetch('UPDATE scores SET contract = %s, declarer = %s, result = %s, lead = %s, score = %s, '+
'tims = NOW(), processed = 0, mecz = 1, butler = 1 '+
'WHERE rnd = %s AND segment = %s AND board = %s AND tabl = %s AND room = %s', (
params + (config['settings']['teamy_round'], config['settings']['teamy_segment'], board_no, table, room)))
if not b.has_field('Auction'):
print('INFO: no bidding for board %d, table %d-%d' % (
board, table, room))
continue
bidding = b.get_auction()
dealer = bidding[0]
if dealer != b.get_field('Dealer'):
print('WARNING: bidding does not start from the dealer in board %d, table %d-%d' % (
board, table, room))
bidding = ' '.join(bidding[1:]).split(' ')
html_bidding = []
lin_bidding = []
for bid in bidding:
if bid == 'Pass':
lin_bidding.append('p')
html_bidding.append('pass')
continue
bid = bid.replace('NT', 'N')
html_bid = bid
for suit in ['C', 'D', 'H', 'S', 'N']:
html_bid = html_bid.replace(suit, "" % (suit))
html_bidding.append(html_bid)
lin_bidding.append(bid)
lin_bidding = 'mb|'.join([bid + '|' for bid in lin_bidding]) + 'pg||'
players = ['W', 'N', 'E', 'S']
html_bidding = [' '] * players.index(dealer) + html_bidding + [' '] * ((4 - players.index(dealer)) % 4)
html = "
W | N | E | S |
" html += html_bidding[i] html += " | " if i % 4 == 3: html += "