@@ -5,11 +5,13 @@ import (
55 "os"
66 "os/exec"
77 "strings"
8+ "time"
89
910 "github.com/code-game-project/go-utils/cgfile"
1011 cgExec "github.com/code-game-project/go-utils/exec"
1112 "github.com/code-game-project/go-utils/external"
1213 "github.com/code-game-project/go-utils/modules"
14+ "github.com/spf13/pflag"
1315)
1416
1517func Run () error {
@@ -27,10 +29,6 @@ func Run() error {
2729 runtime := config .LangConfig ["runtime" ]
2830 node := runtime == "node"
2931
30- if ! node {
31- panic ("not implemented" )
32- }
33-
3432 url := external .TrimURL (config .URL )
3533
3634 switch config .Type {
@@ -51,31 +49,107 @@ func runClient(url string, args []string, typescript, node bool) error {
5149 }
5250 }
5351
54- path := "app.js"
55- if typescript {
56- path = "dist/index.js"
57- }
52+ if node {
53+ path := "index.js"
54+ if typescript {
55+ path = "dist/index.js"
56+ }
5857
59- cmdArgs := []string {path }
60- cmdArgs = append (cmdArgs , args ... )
58+ cmdArgs := []string {path }
59+ cmdArgs = append (cmdArgs , args ... )
6160
62- env := []string {"CG_GAME_URL=" + url }
63- env = append (env , os .Environ ()... )
61+ env := []string {"CG_GAME_URL=" + url }
62+ env = append (env , os .Environ ()... )
6463
65- if _ , err := exec .LookPath ("node" ); err != nil {
66- return fmt .Errorf ("'node' ist not installed!" )
67- }
64+ if _ , err := exec .LookPath ("node" ); err != nil {
65+ return fmt .Errorf ("'node' ist not installed!" )
66+ }
6867
69- cmd := exec .Command ("node" , cmdArgs ... )
70- cmd .Stdin = os .Stdin
71- cmd .Stdout = os .Stdout
72- cmd .Stderr = os .Stderr
73- cmd .Env = env
68+ cmd := exec .Command ("node" , cmdArgs ... )
69+ cmd .Stdin = os .Stdin
70+ cmd .Stdout = os .Stdout
71+ cmd .Stderr = os .Stderr
72+ cmd .Env = env
7473
75- err := cmd .Run ()
76- if err != nil {
77- return fmt .Errorf ("Failed to run 'CG_GAME_URL=%s node %s'" , url , strings .Join (cmdArgs , " " ))
74+ err := cmd .Run ()
75+ if err != nil {
76+ return fmt .Errorf ("Failed to run 'CG_GAME_URL=%s node %s'." , url , strings .Join (cmdArgs , " " ))
77+ }
78+ } else {
79+ if _ , err := exec .LookPath ("npx" ); err != nil {
80+ return fmt .Errorf ("'npx' ist not installed!" )
81+ }
82+
83+ cmd := exec .Command ("npx" , "serve" , "-n" , "--no-port-switching" , "-l" , "5000" , "." )
84+ cmd .Stdin = os .Stdin
85+ cmd .Stdout = os .Stdout
86+ cmd .Stderr = os .Stderr
87+
88+ err := cmd .Start ()
89+ if err != nil {
90+ return fmt .Errorf ("Failed to start 'npx serve': %s" , err )
91+ }
92+
93+ pflag .Usage = func () {
94+ fmt .Fprintf (os .Stdout , "Usage: %s [options] [command]\n \n " , os .Args [0 ])
95+ fmt .Fprintf (os .Stdout , "Options:\n " )
96+ pflag .PrintDefaults ()
97+ fmt .Fprintf (os .Stdout , "\n Commands:\n " )
98+ fmt .Fprintf (os .Stdout , " create [options] <username> Create and join a new game.\n " )
99+ fmt .Fprintf (os .Stdout , " join [options] <game_id> <username> [join_secret] Join an existing game.\n " )
100+ fmt .Fprintf (os .Stdout , " reconnect [options] <username> Reconnect to a game using a saved session.\n " )
101+ fmt .Fprintf (os .Stdout , " spectate [options] [game_id] Spectate a new or existing game.\n " )
102+ }
103+
104+ var queryParams string
105+ var public bool
106+ pflag .BoolVar (& public , "public" , false , "Make the created game protected." )
107+ var protected bool
108+ pflag .BoolVar (& public , "protected" , false , "Make the created game protected." )
109+ pflag .CommandLine .Parse (args )
110+
111+ var op string
112+ if pflag .NArg () > 0 {
113+ op = pflag .Arg (0 )
114+ }
115+
116+ switch op {
117+ case "create" , "reconnect" :
118+ if pflag .NArg () > 1 {
119+ queryParams += "&username=" + pflag .Arg (1 )
120+ }
121+ case "join" :
122+ if pflag .NArg () > 1 {
123+ queryParams += "&game_id=" + pflag .Arg (1 )
124+ }
125+ if pflag .NArg () > 2 {
126+ queryParams += "&username=" + pflag .Arg (2 )
127+ }
128+ if pflag .NArg () > 3 {
129+ queryParams += "&join_secret=" + pflag .Arg (3 )
130+ }
131+ case "spectate" :
132+ if pflag .NArg () > 1 {
133+ queryParams += "&game_id=" + pflag .Arg (1 )
134+ }
135+ }
136+
137+ if public {
138+ queryParams += "&public=true"
139+ }
140+ if protected {
141+ queryParams += "&protected=true"
142+ }
143+
144+ time .Sleep (2 * time .Second )
145+
146+ cgExec .OpenBrowser (fmt .Sprintf ("http://localhost:5000?game_url=%s&op=%s%s" , url , op , queryParams ))
147+ err = cmd .Wait ()
148+ if err != nil {
149+ return fmt .Errorf ("Failed to run 'npx serve -n --no-port-switching -l 5000 .': %s" , err )
150+ }
78151 }
152+
79153 return nil
80154}
81155
0 commit comments