Skip to content

Commit

Permalink
Merge pull request #418 from ksiyuan/master
Browse files Browse the repository at this point in the history
#404 REPL :stop command fails for overly long segments
  • Loading branch information
daveyarwood committed Apr 17, 2022
2 parents 2ffdb23 + be5ed86 commit 8eb4fd6
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 4 deletions.
12 changes: 12 additions & 0 deletions client/repl/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,18 @@ arguments will save the updated score to the same file.`,
},
},

"stopall": {
helpSummary: "Stops all player process.",
run: func(client *Client, argsString string) error {
_, err := client.sendRequest(map[string]interface{}{"op": "stopall"})
if err != nil {
return err
}

return nil
},
},

"version": {
helpSummary: "Displays the version numbers of the Alda server and client.",
run: func(client *Client, argsString string) error {
Expand Down
10 changes: 7 additions & 3 deletions client/repl/player_management.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ func (server *Server) withTransmitter(
// For practical purposes, if Port is 0, then we can be reasonably certain that
// the server doesn't have a player to talk to.
func (server *Server) hasPlayer() bool {
return server.player.Port != 0
return server.player != system.PlayerState{}
}

// The `managePlayers` loop regularly checks to see if the player process that
Expand Down Expand Up @@ -142,7 +142,9 @@ func (server *Server) managePlayers() {
// TODO: Maybe UserFacingErrors could have an optional error code that we
// can depend on here?
if err == nil {
server.player = updatedState
if updatedState.Port != 0{
server.player = updatedState
}
} else if strings.HasPrefix(err.Error(), "No player was found") {
// If the state information tells us that the player process no longer
// exists, then we forget about that player process and a new one will be
Expand All @@ -162,7 +164,9 @@ func (server *Server) managePlayers() {
log.Warn().Err(err).Msg("No player processes available.")
} else {
log.Info().Interface("player", player).Msg("Found player process.")
server.player = player
if player.Port != 0{
server.player = player
}
}
}

Expand Down
22 changes: 22 additions & 0 deletions client/repl/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -513,6 +513,28 @@ var ops = map[string]func(*Server, nREPLRequest){
server.respondDone(req, map[string]interface{}{"text": server.input})
},

"stopall": func(server *Server, req nREPLRequest) {
players := []system.PlayerState{}
knownPlayers, _ := system.ReadPlayerStates()
players = append(players, knownPlayers...)

for _, player := range players {
transmitter := transmitter.OSCTransmitter{Port: player.Port}
if err := transmitter.TransmitStopMessage(); err != nil {
log.Warn().
Interface("player", player).
Err(err).
Msg("Failed to send \"stop\" message to player process.")
} else {
log.Info().
Interface("player", player).
Msg("Sent \"stop\" message to player process.")
}
}

server.respondDone(req, nil)
},

"stop": func(server *Server, req nREPLRequest) {
if err := server.withTransmitter(
func(transmitter transmitter.OSCTransmitter) error {
Expand Down
7 changes: 6 additions & 1 deletion client/system/process_management.go
Original file line number Diff line number Diff line change
Expand Up @@ -173,11 +173,12 @@ func ReadPlayerStates() ([]PlayerState, error) {
}

states := []PlayerState{}
var state PlayerState

if err := processFiles(
CachePath("state", "players", generated.ClientVersion),
func(filename string, contents []byte, readError error) {
var state PlayerState


if readError == nil {
err := json.Unmarshal(contents, &state)
Expand All @@ -195,6 +196,10 @@ func ReadPlayerStates() ([]PlayerState, error) {
return nil, err
}

if state.ReadError != nil{
return nil, state.ReadError
}

return states, nil
}

Expand Down

0 comments on commit 8eb4fd6

Please sign in to comment.