Skip to content

Commit

Permalink
scoreboard mostly completed
Browse files Browse the repository at this point in the history
  • Loading branch information
Rkomi98 committed Oct 13, 2024
1 parent 4d97b88 commit 92dee13
Show file tree
Hide file tree
Showing 3 changed files with 263 additions and 84 deletions.
160 changes: 160 additions & 0 deletions Scoreboard/AKADEMIA SANT'ANNA MESSI Vs CSI CLAI IMOLA - 0-0.dvw
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
[3DATAVOLLEYSCOUT]
FILEFORMAT: 2.0
GENERATOR-DAY: 13/10/2024 23.32.21
LASTCHANGE-DAY: 13/10/2024 23.32.21
[3MATCH]
13/10/2024;23.24.00;;amichevole;Andata;Interno;0;0;1;1;Z;0;
;;45578;;;;
[3TEAMS]
MES;AKADEMIA SANT'ANNA MESSINA;0;Bonafede Fabio;Ferrara Flavio;16777215;
IMO;CSI CLAI IMOLA;0;Caliendo Nello;Dominico Speek Odelvys;16777215;
[3MORE]
;0;0;;;;
;0;0;
[3COMMENTS]
no comments;no comments;no comments;no comments;
[3SET]
True;0-0;0-0;0-0;2-3;1;
True;;;;;;
True;;;;;;
True;;;;;;
True;;;;;;
[3PLAYERS-H]
0;1;1;1;;;;;CAB-LIN-04;Cabassa;Linda;;;2;False;;;
0;2;2;*;;;;;NOR-MAR-98;Norgini;Maria Chiara;;L;1;False;;;
0;3;3;2;;;;;OLI-ROS-91;Olivotto;Rossella;;;4;False;;;
0;4;4;3;;;;;CAR-GIU-94;Carraro;Giulia;;;5;False;;;
0;5;5;4;;;;;MOD-DAL-98;Modestino;Dalila;;;2;False;;;
0;9;6;5;;;;;ROL-ADA-99;Rollins;Adanna;;;4;False;;;
0;10;7;6;;;;;ROS-AUR-97;Rossetto;Aurora;;;3;False;;;
0;11;8;;;;;;MAS-CHI-00;Mason;Chiara;;;2;False;;;
0;13;9;;;;;;TRE-AMB-92;Trevisiol;Ambra;;;5;False;;;
0;14;10;;;;;;CAF-GIO-94;Caforio;Giorgia;;L;1;False;;;
0;16;11;;;;;;BAB-MAR-98;Babatunde;Maria Adelaide;;;4;False;;;
0;17;12;;;;;;GUZ-BIB-04;Guzin;Bibiana;;;4;False;;;
0;18;13;*;;;;;DIO-BIN-02;Diop;Binto;;;3;False;;;
[3PLAYERS-V]
1;1;14;1;;;;;POM-VAL-94;Pomili;Valentina;;;2;False;;;
1;3;15;2;;;;;BAC-BEA-03;Bacchilega;Beatrice;;;4;False;;;
1;4;16;3;;;;;PIN-MAT-04;Pinarello;Matilde;;;5;False;;;
1;5;17;4;;;;;CAV-SOF-98;Cavalli;Sofia;;;2;False;;;
1;6;18;5;;;;;MES-IRE-06;Mescoli;Irene;;;4;False;;;
1;7;19;6;;;;;RAV-EVA-99;Ravazzolo;Eva;;;3;False;;;
1;8;20;;;;;;ARC-CHI-08;Arcangeli;Chiara;;;4;False;;;
1;9;21;;;;;;MIG-SOF-01;Migliorini;Sofia;;;4;False;;;
1;10;22;*;;;;;MAX-ALX-91;Mastrilli;Alessia;;L;1;False;;;
1;11;23;;;;;;GAM-ARI-05;Gambini;Arianna;;L;1;False;;;
1;15;24;;;;;;VIS-ARI-06;Visentin;Arianna;;;2;False;;;
1;16;25;;;;;;MES-GLE-99;Messaggi;Glenda;;;3;False;;;
1;18;26;*;;;;;BUL-KAT-02;Bulovic;Katarina;;;2;False;;;
1;27;27;;;;;;STX-SAX-01;Stival;Sara;;;3;False;;;
[3ATTACKCOMBINATION]
X2;2;L;Q;Veloce dietro;;65280;4868;C;;
X1;3;R;Q;Veloce davanti;;65280;4956;C;;
XM;3;C;Q;Veloce in punto 3;;65280;4949;C;;
XG;3;R;Q;7-1 Gun;;65280;4946;C;;
XC;3;R;Q;Veloce spostata;;65280;4947;C;;
XD;3;R;Q;DoppiaC;;65280;4941;C;;
X7;4;R;Q;Sette Davanti;;65280;4932;C;;
XS;2;L;Q;Sette Dietro;;65280;4981;C;;
XO;2;L;Q;Veloce Dietro Opp.;;65280;4973;B;;
XF;2;L;Q;Fast Opposto;;65280;4976;B;;
PP;3;L;O;Pallonetto Alzatore;;16711680;4964;S;;
X9;4;R;M;Mezza davanti dopo 7;;16711680;4924;F;;
XT;4;R;M;Mezza da posto 4 (default 3R);;16711680;4950;F;;
X3;2;L;M;Mezza da posto 2 (default 2L);;16711680;4950;B;;
X4;2;L;M;Mezza dietro C.A.;;16711680;4976;B;;
XQ;2;L;M;Mezza Dietro C.D.;;16711680;4976;B;;
XB;8;C;M;Pipe spostata 6-1;;16711680;4163;P;1;
XP;8;C;M;Pipe;;16711680;4150;P;1;
XR;8;C;M;Pipe spostata 6-5;;16711680;4138;P;1;
X5;4;R;T;Spinta in posto 4;;16711680;4912;F;;
X0;7;C;T;Spinta in posto 5;;16711680;4114;F;1;
X6;2;L;T;Spinta in posto 2;;16711680;4988;B;;
X8;1;L;T;Spinta in posto 1 (default 9C);;16711680;4186;B;1;
CD;2;L;Q;Fast vicino al palleggiatore;;16711680;4970;C;;
CB;2;L;Q;Fast spostata dal palleggiatore;;16711680;4976;C;;
CF;2;L;Q;Fast lontano dal palleggiatore;;16711680;4986;C;;
C5;4;R;U;Super in posto 4;;0;4912;F;;
C0;7;C;U;Super in posto 5;;0;4114;F;1;
C6;2;L;U;Super in posto 2;;0;4988;B;;
C8;9;C;U;Super in posto 1;;0;4186;B;1;
V5;4;R;H;Alta in posto 4;;255;4912;F;;
V0;7;C;H;Alta in posto 5;;255;4114;F;1;
V6;2;L;H;Alta in posto 2;;255;4988;B;;
V8;9;C;H;Alta in posto 1;;255;4186;B;1;
VB;8;C;H;Pipe Alta spostata 6-1;;255;4163;P;1;
VP;8;C;H;Pipe Alta;;255;4150;P;1;
VR;8;C;H;Pipe Alta spostata 6-5;;255;4137;P;1;
V3;3;C;O;Alta in posto 3;;255;4950;-;;
P2;3;C;O;Secondo tocco di là;;255;4949;-;;
PR;3;C;O;Rigore;;255;4949;-;;
[3SETTERCALL]
K1;;Veloce Davanti;;16711680;3949;4454;4958;;;
K2;;Veloce Dietro;;16711680;3864;4278;4974;;;
K7;;Sette;;16711680;3923;4426;4930;;;
KC;;Veloce in punto 3;;16711680;3849;4449;5049;;;
KM;;Spostata in 2;;16711680;0000;0000;0000;4924,5524,5530,6332,6312,5012,5024,;12632256;
KP;;Spostata verso 4;;16711680;0000;0000;0000;5457,5057,5557,5552,6352,6364,5377,5077,5058,5058,;12632256;
KE;;No primo Tempo;;0;0000;0000;0000;5858,5826,6426,6458,6458,;12632256;
KF;;Base Fast;;255;4073;4188;4987;;255;
KU;;Veloce Davanti Spostata in 2-3;;16711680;3965;3965;4877;4924,5524,5530,6332,6312,5012,5024,;255;
KH;;Veloce Davanti Spostata in 4;;16711680;4028;4028;4928;5159,5181,6074,6173,6160,;255;
KB;;Veloce Dietro Spostata in 2;;16711680;3975;4290;4985;4924,5524,5530,6332,6312,5012,5024,;255;
KV;;Sette Spostata in 4;;16711680;3910;4512;4915;5159,5181,6074,6173,6160,;255;
KO;;Su Ricezione - Spostata in 2-1;;16711680;0000;0000;0000;6363,6337,7237,7263,7262,;255;
K4;;Su Ricezione - Spostata in 4-5;;16711680;0000;0000;0000;6363,6337,7237,7263,7262,;255;
KK;;Spostata in 2 Attacco in 3;;16711680;3965;3965;4877;4924,5524,5530,6332,6312,5012,5024,;255;
KD;;Veloce Dietro Spostata in 4;;16711680;3845;4536;4833;5159,5181,6074,6173,6160,;255;
KZ;;Doppia C;;16711680;3687;3560;4929;6249,6229,5023,5050,5050,;255;
[3WINNINGSYMBOLS]
=~~~#~~~=~~~~~~~=/~~#~~~=~~~#~~~=~~~~~~~=~~~~~~~=~~~~~~~
[3RESERVE]
[3SCOUT]
*P04>LUp;;;;;;;00.00.00;1;3;3;1;0;;;1;3;4;5;9;10;1;3;4;5;6;7;
*z3>LUp;;;;;;;00.00.00;1;3;3;1;0;;;1;3;4;5;9;10;1;3;4;5;6;7;
aP04>LUp;;;;;;;00.00.00;1;3;3;1;0;;;1;3;4;5;9;10;1;3;4;5;6;7;
az3>LUp;;;;;;;00.00.00;1;3;3;1;0;;1;3;4;5;9;10;1;3;4;5;6;7;
a01SM-~~~16;;;;;;;00.00.00;1;3;3;1;0;;1;3;4;5;9;10;1;3;4;5;6;7;
*02RM+~~~16~M2;;;;;;;00.00.00;1;3;3;1;0;;1;3;4;5;9;10;1;3;4;5;6;7;
*04EU#~~~~2;;;;;;;00.00.00;1;3;3;1;0;;1;3;4;5;9;10;1;3;4;5;6;7;
*10AU+C6~15~H2;;r;;4988;-1-1;8574;00.00.06;1;3;3;1;6;;1;3;4;5;9;10;1;3;4;5;6;7;
a04EM#~~~~2;;;;;;;00.00.07;1;3;3;1;7;;1;3;4;5;9;10;1;3;4;5;6;7;
a05AM#XT~41~H2;;p;;4950;-1-1;8319;00.00.09;1;3;3;1;9;;1;3;4;5;9;10;1;3;4;5;6;7;
*$$&H=;p;;;;;;00.00.09;1;3;3;1;9;;1;3;4;5;9;10;1;3;4;5;6;7;
ap00:01;;;;;;;00.00.12;1;3;3;1;12;;1;3;4;5;9;10;1;3;4;5;6;7;
a01SM-~~~16;;;;;;;00.00.13;1;3;3;1;13;;1;3;4;5;9;10;1;3;4;5;6;7;
*02RM+~~~16~M2;;;;;;;00.00.13;1;3;3;1;13;;1;3;4;5;9;10;1;3;4;5;6;7;
*04EU#~~~~2;;;;;;;00.00.13;1;3;3;1;13;;1;3;4;5;9;10;1;3;4;5;6;7;
*05AU#C5~41~H2;;r;;4912;-1-1;941;00.00.18;1;3;3;1;18;;1;3;4;5;9;10;1;3;4;5;6;7;
a$$&H=;s;;;;;;00.00.18;1;3;3;1;18;;1;3;4;5;9;10;1;3;4;5;6;7;
*p01:01;;;;;;;00.00.21;1;3;3;1;21;;1;3;4;5;9;10;1;3;4;5;6;7;
*z2;;;;;;;00.00.21;1;2;3;1;21;;3;4;5;9;10;1;1;3;4;5;6;7;
*03SM-~~~15;;;;;;;00.00.19;1;2;3;1;19;;3;4;5;9;10;1;1;3;4;5;6;7;
a05RM#~~~15~M2;;;;;;;00.00.19;1;2;3;1;19;;3;4;5;9;10;1;1;3;4;5;6;7;
a04EU#~~~~2;;;;;;;00.00.19;1;2;3;1;19;;3;4;5;9;10;1;1;3;4;5;6;7;
a05AU#C5~41~H2;;r;;4912;-1-1;8919;00.00.24;1;2;3;1;24;;3;4;5;9;10;1;1;3;4;5;6;7;
*$$&H=;s;;;;;;00.00.24;1;2;3;1;24;;3;4;5;9;10;1;1;3;4;5;6;7;
ap01:02;;;;;;;00.00.27;1;2;3;1;27;;3;4;5;9;10;1;1;3;4;5;6;7;
*T;;;;;;;00.00.29;1;2;2;1;29;;3;4;5;9;10;1;3;4;5;6;7;1;
az2;;;;;;;00.00.32;1;2;2;1;32;;3;4;5;9;10;1;3;4;5;6;7;1;
a03SM-~~~16;;;;;;;00.00.29;1;2;2;1;29;;3;4;5;9;10;1;3;4;5;6;7;1;
*01RM#~~~16~M2;;;;;;;00.00.29;1;2;2;1;29;;3;4;5;9;10;1;3;4;5;6;7;1;
*04EU#~~~~2;;;;;;;00.00.29;1;2;2;1;29;;3;4;5;9;10;1;3;4;5;6;7;1;
*10AU#C6~15~H2;;r;;4988;-1-1;8671;00.00.34;1;2;2;1;34;;3;4;5;9;10;1;3;4;5;6;7;1;
a$$&H=;s;;;;;;00.00.34;1;2;2;1;34;;3;4;5;9;10;1;3;4;5;6;7;1;
*p02:02;;;;;;;00.00.37;1;2;2;1;37;;3;4;5;9;10;1;3;4;5;6;7;1;
*P4;;;;;;;00.00.49;1;1;2;1;49;;4;5;9;10;1;3;3;4;5;6;7;1;
*z1;;;;;;;00.00.49;1;1;2;1;49;;4;5;9;10;1;3;3;4;5;6;7;1;
*c03:18;;;;;;;00.00.49;1;1;2;1;49;;4;5;9;10;1;3;3;4;5;6;7;1;
*z1;;;;;;;00.00.52;1;1;2;1;52;;4;5;9;10;1;18;3;4;5;6;7;1;
*04SM-~~~16;;;;;;;00.00.53;1;1;2;1;53;;4;5;9;10;1;18;3;4;5;6;7;1;
a01RM#~~~16~M2;;;;;;;00.00.53;1;1;2;1;53;;4;5;9;10;1;18;3;4;5;6;7;1;
a04ET#~~~~2;;;;;;;00.00.53;1;1;2;1;53;;4;5;9;10;1;18;3;4;5;6;7;1;
a05AT#X5~45~H2;;r;;4912;-1-1;8472;00.00.59;1;1;2;1;59;;4;5;9;10;1;18;3;4;5;6;7;1;
*$$&H=;;;;;;;00.00.59;1;1;2;1;59;;4;5;9;10;1;18;3;4;5;6;7;1;
ap02:03;;;;;;;00.01.02;1;1;2;1;62;;4;5;9;10;1;18;3;4;5;6;7;1;
aP4;;;;;;;00.01.08;1;1;1;1;0;;4;5;9;10;1;18;4;5;6;7;1;3;
az1;;;;;;;00.01.08;1;1;1;1;0;;4;5;9;10;1;18;4;5;6;7;1;3;
ac07:18;;;;;;;00.01.08;1;1;1;1;68;;4;5;9;10;1;18;4;5;6;7;1;3;
**1set;;;;;;;00.01.08;1;1;1;1;68;;;;;;;;;;;;;;
118 changes: 74 additions & 44 deletions Scoreboard/VolleyballScoreboardServer.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

# Assign path for DataVolley files
dvw_path_folder = "C:/Users/mirko/OneDrive - Politecnico di Milano/Altro/Volley/Conco2425/Olbia/"
#dvw_path_folder = "C:/Users/mirko/Documents/GitHub/CuneoWebsite.io/Scoreboard"
file_extension = ".dvw"

# Get a list of all files with the specified extension in the directory
Expand All @@ -29,22 +30,31 @@ def process_file(path):
print(f"Processing file: {file_name}") # Debugging line
combined_df = pd.concat([combined_df, process_file(file_name)], ignore_index=True)

# Summarize volleyball set and return data for rendering
def summarize_volleyball_set(plays):
teams = plays['team'].dropna().unique()
teams = plays['team'].dropna().unique() # Get the team names
home_team = plays['home_team'].iloc[0] # Home team name
away_team = plays['visiting_team'].iloc[0] # Away team name

summary_data = []
set_scores = {} # To keep track of set scores and winners
set_scores = [] # To keep track of set scores and winners
current_set = 1 # Start with set 1

# Variables to store current set stats
current_timeouts = {'home': 0, 'away': 0}
current_substitutions = {'home': 0, 'away': 0}
current_video_checks = {'home': 0, 'away': 0}

home_set_wins = 0
away_set_wins = 0

def calculate_player_points(team):
team_plays = plays[plays['team'] == team]
player_points = {}
for _, row in team_plays.iterrows():
# Include 'Block' in addition to 'Attack' and 'Serve'
if row['skill'] in ['Attack', 'Serve', 'Block'] and row['evaluation_code'] == '#':
player = row['player_name']
if player not in player_points:
player_points[player] = {'Attack': 0, 'Serve': 0, 'Block': 0}
# Increment the appropriate skill (Attack, Serve, or Block)
player_points[player][row['skill']] += 1
return player_points

Expand All @@ -54,68 +64,88 @@ def get_team_summary(team):
team_total = 0

for player, points in player_points.items():
total_points = points['Attack'] + points['Serve'] + points['Block'] # Include Block in total
total_points = points['Attack'] + points['Serve'] + points['Block']
team_summary['players'].append({
'player_name': player,
'total_points': total_points,
'attack_points': points['Attack'],
'serve_points': points['Serve'],
'block_points': points['Block'], # Include Block points
'block_points': points['Block']
})
team_total += total_points

team_summary['team_total'] = team_total
return team_summary

# Count timeouts, substitutions, and video checks
timeouts_called = len(plays[plays['code'].str.contains('TO', na=False)])
substitutions_done = len(plays[plays['code'].str.contains('SUB', na=False)])
video_checks_called = len(plays[plays['code'].str.contains('VC', na=False)])

# Identify set results from the code column
for index, row in plays.iterrows():
# Check if the code contains "set" (indicating a set completion)
if re.match(r'^\d+set$', row['code']):
set_number = int(row['code'][0]) # Extract the number before 'set'
winning_team = row['team']
print(winning_team)

# Look for the previous row to extract the score
if index > 0:
prev_row = plays.iloc[index - 1]
if '*p' in prev_row['code']:
score_str = prev_row['code']
# Extract scores
scores = score_str.split(':')[1] # "25:20" => "20"
home_score, away_score = map(int, scores.split(':'))
# Store set score results
set_scores[set_number] = {
'winning_team': winning_team,
'score': f"{home_score}-{away_score}"
}

# Get the last completed set number
last_set_number = max(set_scores.keys(), default=0)
# Handle missing values using pd.isna
home_score = 0 if pd.isna(row['home_team_score']) else row['home_team_score']
away_score = 0 if pd.isna(row['visiting_team_score']) else row['visiting_team_score']

# If either team reaches 25 or more points
if home_score >= 25 or away_score >= 25:
# Check if the next row has a reset to 0 (set end)
if index + 1 < len(plays):
next_row = plays.iloc[index + 1]
next_home_score = 0 if pd.isna(next_row['home_team_score']) else next_row['home_team_score']
next_away_score = 0 if pd.isna(next_row['visiting_team_score']) else next_row['visiting_team_score']

if next_home_score == 0 or next_away_score == 0:
# The set is complete
set_result = f"{home_score} - {away_score}"
set_scores.append(set_result)

# Increment set count for the winning team
if home_score > away_score:
home_set_wins += 1
else:
away_set_wins += 1

current_set += 1 # Increment the set number

# Reset the stats for the next set
current_timeouts = {'home': 0, 'away': 0}
current_substitutions = {'home': 0, 'away': 0}
current_video_checks = {'home': 0, 'away': 0}

# Track stats for the current set
if row['code'].startswith('*T'): # Home timeout
current_timeouts['home'] += 1
elif row['code'].startswith('aT'): # Away timeout
current_timeouts['away'] += 1
elif 'VC' in row['code']: # Video check
if row['team'] == plays['home_team'].iloc[0]:
current_video_checks['home'] += 1
else:
current_video_checks['away'] += 1
if row['code'].startswith('*c'): # Home timeout
current_substitutions['home'] += 1
elif row['code'].startswith('ac'): # Away timeout
current_substitutions['away'] += 1

# Get last non-NaN score for home and away team
home_score = plays['home_team_score'].dropna().tail(1).values[0] if not plays['home_team_score'].dropna().empty else 0
away_score = plays['visiting_team_score'].dropna().tail(1).values[0] if not plays['visiting_team_score'].dropna().empty else 0
final_home_score = plays['home_team_score'].dropna().tail(1).values[0] if not plays['home_team_score'].dropna().empty else 0
print(final_home_score)
final_away_score = plays['visiting_team_score'].dropna().tail(1).values[0] if not plays['visiting_team_score'].dropna().empty else 0

for team in teams:
summary_data.append(get_team_summary(team))

# Include set scores and other details in the summary
# Include current set, past set scores, and stats for the dashboard
summary_data.append({
'set_score': f"{home_score} - {away_score}", # Match score
'last_set_number': last_set_number, # Last set number played
'timeouts_called': timeouts_called,
'substitutions_done': substitutions_done,
'video_checks_called': video_checks_called,
'set_scores': set_scores # Store all set scores
'current_set': current_set,
'team_set_wins': f"{home_team}: {home_set_wins} - {away_set_wins} {away_team}", # Set wins string
'timeouts': current_timeouts,
'substitutions': current_substitutions,
'video_checks': current_video_checks,
'past_set_scores': set_scores,
'set_score': f"{final_home_score} - {final_away_score}"
})

return summary_data



def print_team_summary(team_summary):
print(f"\n{team_summary['team_name']} Team:")
for player in team_summary['players']:
Expand Down
Loading

0 comments on commit 92dee13

Please sign in to comment.