@@ -2,6 +2,7 @@ package main
22
33import (
44 "fmt"
5+ "net"
56 "os"
67 "os/exec"
78 "strings"
@@ -78,80 +79,71 @@ func runClient(url string, args []string, runtime string, typescript bool) error
7879 return fmt .Errorf ("Failed to run 'CG_GAME_URL=%s node %s'." , url , strings .Join (cmdArgs , " " ))
7980 }
8081 } else {
81- if _ , err := exec .LookPath ("npx" ); err != nil {
82- return fmt .Errorf ("'npx' ist not installed!" )
83- }
8482 var cmdArgs []string
8583 if runtime == "bundler" {
8684 cmdArgs = []string {"parcel" , "--watch-for-stdin" , "-p" , "5000" , "src/index.html" }
8785 } else {
8886 cmdArgs = []string {"serve" , "-n" , "--no-port-switching" , "-p" , "5000" , "." }
8987 }
90- cmd := exec .Command ("npx" , cmdArgs ... )
91- cmd .Stdin = os .Stdin
92- cmd .Stdout = os .Stdout
93- cmd .Stderr = os .Stderr
94-
95- err := cmd .Start ()
96- if err != nil {
97- return fmt .Errorf ("Failed to start '%s': %s" , strings .Join (cmdArgs , " " ), err )
98- }
99-
100- pflag .Usage = func () {
101- fmt .Fprintf (os .Stdout , "Usage: %s [options] [command]\n \n " , os .Args [0 ])
102- fmt .Fprintf (os .Stdout , "Options:\n " )
103- pflag .PrintDefaults ()
104- fmt .Fprintf (os .Stdout , "\n Commands:\n " )
105- fmt .Fprintf (os .Stdout , " create [options] <username> Create and join a new game.\n " )
106- fmt .Fprintf (os .Stdout , " join [options] <game_id> <username> [join_secret] Join an existing game.\n " )
107- fmt .Fprintf (os .Stdout , " reconnect [options] <username> Reconnect to a game using a saved session.\n " )
108- fmt .Fprintf (os .Stdout , " spectate [options] [game_id] Spectate a new or existing game.\n " )
109- }
11088
111- var queryParams string
112- var public bool
113- pflag .BoolVar (& public , "public" , false , "Make the created game protected." )
114- var protected bool
115- pflag .BoolVar (& public , "protected" , false , "Make the created game protected." )
116- pflag .CommandLine .Parse (args )
89+ done := make (chan struct {})
90+ runWhenUP ("localhost:5000" , func () {
91+ pflag .Usage = func () {
92+ fmt .Fprintf (os .Stdout , "Usage: %s [options] [command]\n \n " , os .Args [0 ])
93+ fmt .Fprintf (os .Stdout , "Options:\n " )
94+ pflag .PrintDefaults ()
95+ fmt .Fprintf (os .Stdout , "\n Commands:\n " )
96+ fmt .Fprintf (os .Stdout , " create [options] <username> Create and join a new game.\n " )
97+ fmt .Fprintf (os .Stdout , " join [options] <game_id> <username> [join_secret] Join an existing game.\n " )
98+ fmt .Fprintf (os .Stdout , " reconnect [options] <username> Reconnect to a game using a saved session.\n " )
99+ fmt .Fprintf (os .Stdout , " spectate [options] [game_id] Spectate a new or existing game.\n " )
100+ }
117101
118- var op string
119- if pflag .NArg () > 0 {
120- op = pflag .Arg (0 )
121- }
102+ var queryParams string
103+ var public bool
104+ pflag .BoolVar (& public , "public" , false , "Make the created game protected." )
105+ var protected bool
106+ pflag .BoolVar (& public , "protected" , false , "Make the created game protected." )
107+ pflag .CommandLine .Parse (args )
122108
123- switch op {
124- case "create" , "reconnect" :
125- if pflag .NArg () > 1 {
126- queryParams += "&username=" + pflag .Arg (1 )
127- }
128- case "join" :
129- if pflag .NArg () > 1 {
130- queryParams += "&game_id=" + pflag .Arg (1 )
109+ var op string
110+ if pflag .NArg () > 0 {
111+ op = pflag .Arg (0 )
131112 }
132- if pflag .NArg () > 2 {
133- queryParams += "&username=" + pflag .Arg (2 )
113+
114+ switch op {
115+ case "create" , "reconnect" :
116+ if pflag .NArg () > 1 {
117+ queryParams += "&username=" + pflag .Arg (1 )
118+ }
119+ case "join" :
120+ if pflag .NArg () > 1 {
121+ queryParams += "&game_id=" + pflag .Arg (1 )
122+ }
123+ if pflag .NArg () > 2 {
124+ queryParams += "&username=" + pflag .Arg (2 )
125+ }
126+ if pflag .NArg () > 3 {
127+ queryParams += "&join_secret=" + pflag .Arg (3 )
128+ }
129+ case "spectate" :
130+ if pflag .NArg () > 1 {
131+ queryParams += "&game_id=" + pflag .Arg (1 )
132+ }
134133 }
135- if pflag .NArg () > 3 {
136- queryParams += "&join_secret=" + pflag .Arg (3 )
134+
135+ if public {
136+ queryParams += "&public=true"
137137 }
138- case "spectate" :
139- if pflag .NArg () > 1 {
140- queryParams += "&game_id=" + pflag .Arg (1 )
138+ if protected {
139+ queryParams += "&protected=true"
141140 }
142- }
143-
144- if public {
145- queryParams += "&public=true"
146- }
147- if protected {
148- queryParams += "&protected=true"
149- }
150141
151- time .Sleep (2 * time .Second )
142+ cgExec .OpenBrowser (fmt .Sprintf ("http://localhost:5000?game_url=%s&op=%s%s" , url , op , queryParams ))
143+ }, done )
152144
153- cgExec .OpenBrowser ( fmt . Sprintf ( "http://localhost:5000?game_url=%s&op=%s%s " , url , op , queryParams ) )
154- err = cmd . Wait ( )
145+ _ , err := cgExec .Execute ( false , "npx " , cmdArgs ... )
146+ close ( done )
155147 if err != nil {
156148 return fmt .Errorf ("Failed to run '%s': %s" , strings .Join (cmdArgs , " " ), err )
157149 }
@@ -160,6 +152,25 @@ func runClient(url string, args []string, runtime string, typescript bool) error
160152 return nil
161153}
162154
155+ func runWhenUP (address string , fn func (), done <- chan struct {}) {
156+ go func () {
157+ for {
158+ select {
159+ case <- done :
160+ return
161+ default :
162+ }
163+ con , err := net .Dial ("tcp" , address )
164+ if err == nil {
165+ con .Close ()
166+ break
167+ }
168+ time .Sleep (100 * time .Millisecond )
169+ }
170+ fn ()
171+ }()
172+ }
173+
163174func runServer (args []string , typescript bool ) error {
164175 panic ("not implemented" )
165176 return nil
0 commit comments