Overview
| Comment: | Send SMS updates to players with phone numbers (closes [245ddedf96]) | 
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive | 
| Timelines: | family | ancestors | descendants | both | trunk | 
| Files: | files | file ages | folders | 
| SHA3-256: | 
341cdc9adcc2a27d7d7db8e69044e712 | 
| User & Date: | joel on 2018-11-22 22:26:42 | 
| Original Comment: | Send SMS updates to players with phone numbers (closes [30cde4e9a1]) | 
| Other Links: | manifest | tags | 
References
| 
   2018-11-22 
 | ||
| 22:28 | • Closed ticket [245dde]: Ability to send SMS to players with results of each round plus 4 other changes artifact: 7d4abe user: joel | |
Context
| 
   2018-11-23 
 | ||
| 20:29 | Ignore archive folder check-in: d0bc5a user: joel tags: trunk | |
| 
   2018-11-22 
 | ||
| 22:26 | Send SMS updates to players with phone numbers (closes [245ddedf96]) check-in: 341cdc user: joel tags: trunk | |
| 17:49 | Update ignore-glob check-in: a1e1f8 user: joel tags: trunk | |
Changes
Modified bunco.py from [bbae10] to [a97ef9].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18  | 
# Test
import csv, random, sqlite3
from statistics import median
teammate_lookup = { 0: 2, 1: 3, 2: 0, 3: 1 }
fuzzydie_holder = 'x'
def TurnInProgress():
    return -1
def roll_dice():
    dice = []
    for _ in range(3):
        dice.append(random.randint(1,6))
    return dice
class Player:
 | > > | >  | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  | 
# Test
import csv, random, sqlite3
from statistics import median
teammate_lookup = { 0: 2, 1: 3, 2: 0, 3: 1 }
fuzzydie_holder = 'x'
table_move_callback = None
def TurnInProgress():
    return -1
def roll_dice():
    dice = []
    for _ in range(3):
        dice.append(random.randint(1,6))
    return dice
class Player:
    def __init__(self, name, phone, dex, math, speed):
        self.name = name
        self.smsnumber = phone
        self.dex = dex
        self.math_comprehension = math
        self.roll_speed = speed
        self.max_streak = 0
        self.round_bunco_counts = [0]
        self.round_scores = [0]
        self.round_roll_counts = [0]
 | 
| ︙ | ︙ | |||
269 270 271 272 273 274 275  | 
def load_players(filename):
    players = []
    with open(filename) as tsvfile:
        tsvreader = csv.reader(tsvfile)
        for line in tsvreader:
 | |  | 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286  | 
def load_players(filename):
    players = []
    with open(filename) as tsvfile:
        tsvreader = csv.reader(tsvfile)
        for line in tsvreader:
            players.append(Player(line[0],line[1],0,0,0))
    
    return players
class Game:
    cur_tick = 1
    cur_round = 1
    
 | 
| ︙ | ︙ | |||
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371  | 
        
        return median(all_scores)
    def prep_next_round(self):
        # losers from head table move to next table
        headtable_losers = self.tables[0].losers()
        log_table_move(headtable_losers, "lost", self.tables[0], self.tables[1])
        round_winners = self.tables[1].swap_for_winners(headtable_losers)
        # winners from other tables move to next table
        for n in range(2, len(self.tables)):
            log_table_move(round_winners, "won", self.tables[n-1], self.tables[n])
            round_winners = self.tables[n].swap_for_winners(round_winners)
        
        # last set of winners moves to head table
        log_table_move(round_winners, "won", self.tables[-1], self.tables[0])
        self.tables[0].swap_for_losers(round_winners)
        for table in self.tables:
            table.prep_new_round()
        self.increment_round()
 | > > > > > > > > >  | 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383  | 
        
        return median(all_scores)
    def prep_next_round(self):
        # losers from head table move to next table
        headtable_losers = self.tables[0].losers()
        log_table_move(headtable_losers, "lost", self.tables[0], self.tables[1])
        if callable(table_move_callback):
            for player in headtable_losers:
                table_move_callback(player, "lost", self.tables[0], self.tables[1])
        round_winners = self.tables[1].swap_for_winners(headtable_losers)
        # winners from other tables move to next table
        for n in range(2, len(self.tables)):
            log_table_move(round_winners, "won", self.tables[n-1], self.tables[n])
            if callable(table_move_callback):
                for player in round_winners:
                    table_move_callback(player, "won", self.tables[n-1], self.tables[n])
            round_winners = self.tables[n].swap_for_winners(round_winners)
        
        # last set of winners moves to head table
        log_table_move(round_winners, "won", self.tables[-1], self.tables[0])
        if callable(table_move_callback):
            for player in round_winners:
                table_move_callback(player, "won", self.tables[-1], self.tables[0])
        self.tables[0].swap_for_losers(round_winners)
        for table in self.tables:
            table.prep_new_round()
        self.increment_round()
 | 
| ︙ | ︙ | 
Modified bunco_app.py from [36d781] to [4468a7].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21  | 
import bunco
import xlsxwriter
from blessings import Terminal
t = Terminal()
g = bunco.Game("players.csv")
def plural(str,n,suffix="s"):
    return str + suffix if n > 1 else str
def print_center(before, string, after):
    col = int((t.width - len(string)) / 2) - 1
    print(f"{t.move_x(col)}{before}{string}{after}")
def display_dashboard():
    print(t.clear,t.move(0,0))
    print_center(t.bold_red,"B U N C O   S I M U L A T O R", t.normal)
    print(f"{t.red}{'-'*t.width}{t.normal}\n")
    
    # Print column headings for rounds
    rounds = [str(n + 1).rjust(4) for n in range(g.current_round())]
 | > > > > > > > > > > > > > >  | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35  | 
import bunco
import xlsxwriter
import creds # local
from blessings import Terminal
from twilio.rest import Client
t = Terminal()
g = bunco.Game("players.csv")
enable_sms = False
last_status = 'Off to a great start!'
def plural(str,n,suffix="s"):
    return str + suffix if n > 1 else str
def print_center(before, string, after):
    col = int((t.width - len(string)) / 2) - 1
    print(f"{t.move_x(col)}{before}{string}{after}")
def status(text):
    global last_status
    row = 6 + (len(g.tables) * 5)
    print(t.move(row, 0), end='')
    print(t.clear_eol, end='')
    print_center(f"{t.bold_green}",f"[ {text} ]", t.normal)
    print(t.clear_eos)
    last_status = text
def display_dashboard():
    print(t.clear,t.move(0,0))
    print_center(t.bold_red,"B U N C O   S I M U L A T O R", t.normal)
    print(f"{t.red}{'-'*t.width}{t.normal}\n")
    
    # Print column headings for rounds
    rounds = [str(n + 1).rjust(4) for n in range(g.current_round())]
 | 
| ︙ | ︙ | |||
29 30 31 32 33 34 35 36  | 
            if player is bunco.fuzzydie_holder:
                print(f"🎲",end='')
            print(f"{t.move_x(3)}{t.cyan}{player}{t.normal}",end='')
            for n in range(g.current_round()):
                print(t.move_x(18+(4*n)),end='')
                print(str(player.round_scores[n]).rjust(4),end='')
            print('')
 | > > | > > > > > | | < | < > > > > >  | 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78  | 
            if player is bunco.fuzzydie_holder:
                print(f"🎲",end='')
            print(f"{t.move_x(3)}{t.cyan}{player}{t.normal}",end='')
            for n in range(g.current_round()):
                print(t.move_x(18+(4*n)),end='')
                print(str(player.round_scores[n]).rjust(4),end='')
            print('')
    status(last_status)
def do1():
    g.play_one_round()
    if enable_sms:
        status("Sending results by SMS to players…")
        for player in g.players:
            sms(player.smsnumber, summary_text(player))
    
    display_dashboard()
    status("Prepping for next round…")
    g.prep_next_round()
    status("Ready for another round!")
def summary(n):
    return summary_text(g.players[n])
def sms(number, message):
    if enable_sms and number:
        cli = Client(creds.SID, creds.token)
        cli.messages.create(to=number, from_=creds.sender, body=message)
def summary_text(player):
    for table in g.tables:
        if player in table.players:
            curtable = table
            break
    
    sitch = curtable.get_player_situation(player)
 | 
| ︙ | ︙ | |||
67 68 69 70 71 72 73 74 75 76 77 78 79 80  | 
    ts = [f"Round {g.current_round()} @ {curtable} with {sitch['teammate']}:",
          f"You made {player.round_roll_counts[g.current_round()-1]} rolls,",
          f"adding {player.personal_roll_scores[g.current_round()-1]} pts{buncos}",
          f"to your team score of {player.round_scores[g.current_round()-1]},",
          f"{winloss} {foe_names}’s score of {sitch['opponent_score']}."]
    return " ".join(ts)
def excel_sheet(title):
    wb = xlsxwriter.Workbook('bunco.xlsx')
    ws = wb.add_worksheet('Overview')
    style = {}
    col_heading = wb.add_format({'font_name': 'Back Issues BB', 
 | > > > > > > >  | 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111  | 
    ts = [f"Round {g.current_round()} @ {curtable} with {sitch['teammate']}:",
          f"You made {player.round_roll_counts[g.current_round()-1]} rolls,",
          f"adding {player.personal_roll_scores[g.current_round()-1]} pts{buncos}",
          f"to your team score of {player.round_scores[g.current_round()-1]},",
          f"{winloss} {foe_names}’s score of {sitch['opponent_score']}."]
    return " ".join(ts)
def sms_table_move(player, wonlost, table_from, table_to):
    if player.smsnumber:
        message = f"Having {wonlost} the last round, you move from {table_from} to {table_to}."
        sms(player.smsnumber, message)
bunco.table_move_callback = sms_table_move
def excel_sheet(title):
    wb = xlsxwriter.Workbook('bunco.xlsx')
    ws = wb.add_worksheet('Overview')
    style = {}
    col_heading = wb.add_format({'font_name': 'Back Issues BB', 
 | 
| ︙ | ︙ |