Skip to content

Commit ee8b547

Browse files
committed
add CLI
update README.md
1 parent 022e923 commit ee8b547

File tree

4 files changed

+190
-14
lines changed

4 files changed

+190
-14
lines changed

README.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,45 @@
66
Simple Go package for reading and writing Diablo 2 saves. Supports version 1.10 through Diablo II: Resurrected (1.15).
77
Supports reading both d2s (player saves) ~~and d2i (shared stash)~~ files.
88

9+
## Installation
10+
11+
To install the package, use the following:
12+
13+
```bash
14+
go get github.com/vitalick/d2s
15+
```
16+
17+
To install command line program, use the following:
18+
19+
```bash
20+
go install github.com/vitalick/d2s/d2s-conv@latest
21+
```
22+
23+
## Usage
24+
25+
### CLI
26+
27+
For convert JSON to .d2s, use the following:
28+
```bash
29+
d2s-conv -fromjson <input files>
30+
```
31+
32+
For convert .d2s to JSON, use the following:
33+
```bash
34+
d2s-conv -tojson <input files>
35+
```
36+
37+
To specify the path to the output folder, we use the following:
38+
```bash
39+
d2s-conv -fromjson -o <output folder> <input files>
40+
d2s-conv -tojson -o <output folder> <input files>
41+
```
42+
43+
### As package
44+
45+
Coming soon...
46+
47+
948
## Roadmap
1049

1150
<details>

d2s-conv/main.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"github.com/vitalick/d2s"
7+
"os"
8+
)
9+
10+
type flags struct {
11+
d2sToJSON bool
12+
jsonToD2s bool
13+
output string
14+
input []string
15+
}
16+
17+
var parsedFlags flags
18+
19+
func main() {
20+
parseArgs()
21+
22+
if parsedFlags.d2sToJSON {
23+
for _, f := range parsedFlags.input {
24+
c, err := d2s.Open(f)
25+
if err != nil {
26+
fmt.Fprintf(os.Stderr, "Error \"%v\" on open file \"%s\", skipped \n\n", err, f)
27+
continue
28+
}
29+
err = d2s.SaveJSON(c, parsedFlags.output)
30+
if err != nil {
31+
fmt.Fprintf(os.Stderr, "Error \"%v\" on save file \"%s\", skipped \n\n", err, f)
32+
continue
33+
}
34+
}
35+
}
36+
37+
if parsedFlags.jsonToD2s {
38+
for _, f := range parsedFlags.input {
39+
c, err := d2s.OpenJSON(f)
40+
if err != nil {
41+
fmt.Fprintf(os.Stderr, "Error \"%v\" on open file \"%s\", skipped \n\n", err, f)
42+
continue
43+
}
44+
err = d2s.Save(c, parsedFlags.output)
45+
if err != nil {
46+
fmt.Fprintf(os.Stderr, "Error \"%v\" on save file \"%s\", skipped \n\n", err, f)
47+
continue
48+
}
49+
}
50+
}
51+
}
52+
53+
func parseArgs() {
54+
flag.Usage = func() {
55+
fmt.Printf("Usage: %s [options] <input files>\n\n", os.Args[0])
56+
flag.PrintDefaults()
57+
}
58+
flag.BoolVar(&parsedFlags.d2sToJSON, "tojson", parsedFlags.d2sToJSON, "Convert d2s to json.")
59+
flag.BoolVar(&parsedFlags.jsonToD2s, "fromjson", parsedFlags.jsonToD2s, "Convert json to d2s.")
60+
flag.StringVar(&parsedFlags.output, "o", parsedFlags.output, "Optional path of the output folder.")
61+
62+
// Make sure we have input paths.
63+
if flag.NArg() == 0 {
64+
_, err := fmt.Fprintf(os.Stderr, "Missing <input files>\n\n")
65+
if err != nil {
66+
return
67+
}
68+
flag.Usage()
69+
os.Exit(1)
70+
}
71+
72+
// Create input configurations.
73+
parsedFlags.input = make([]string, flag.NArg())
74+
for i := range parsedFlags.input {
75+
parsedFlags.input[i] = flag.Arg(i)
76+
}
77+
}

d2s.go

Lines changed: 72 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,26 @@
11
package d2s
22

33
import (
4+
"encoding/json"
45
"fmt"
5-
"log"
66
"os"
77
)
88

9-
//Open returns a new Character for editing and viewing
9+
func beforeSave(c *Character, folder *string) error {
10+
if len(c.Name) == 0 {
11+
return errorBlankName
12+
}
13+
if len(*folder) > 0 && (*folder)[len(*folder)-1:] != "/" {
14+
*folder = *folder + "/"
15+
}
16+
return nil
17+
}
18+
19+
//Open returns a new Character from .d2s file
1020
func Open(filepath string) (*Character, error) {
1121
file, err := os.Open(filepath)
1222
if err != nil {
13-
log.Println("Error while opening .d2s file")
23+
fmt.Fprintln(os.Stderr, "Error while opening .d2s file")
1424
return nil, err
1525
}
1626

@@ -19,32 +29,82 @@ func Open(filepath string) (*Character, error) {
1929
c, err := NewCharacter(file)
2030

2131
if err != nil {
22-
log.Println("Error while parsing .d2s file")
32+
fmt.Fprintln(os.Stderr, "Error while parsing .d2s file")
2333
return nil, err
2434
}
2535

2636
return c, nil
2737
}
2838

29-
//Save will create *.d2s file in folder with Character struct
39+
//Save will create .d2s file in folder with Character struct
3040
func Save(c *Character, folder string) error {
31-
if len(c.Name) == 0 {
32-
return ErrorBlankName
33-
}
34-
if len(folder) > 0 && folder[len(folder)-1:] != "/" {
35-
folder = folder + "/"
41+
if err := beforeSave(c, &folder); err != nil {
42+
fmt.Fprintln(os.Stderr, errorBlankName)
43+
return err
3644
}
3745
file, err := os.Create(fmt.Sprintf("%s%s.d2s", folder, c.Name))
3846
if err != nil {
39-
log.Fatalln("Error while creating .d2s file")
47+
fmt.Fprintln(os.Stderr, "Error while creating .d2s file")
4048
return err
4149
}
4250

4351
defer file.Close()
4452

4553
err = c.ToWriterCorrect(file)
4654
if err != nil {
47-
log.Fatalln("Error while writing buffer file")
55+
fmt.Fprintln(os.Stderr, "Error while writing buffer file")
56+
return err
57+
}
58+
return nil
59+
}
60+
61+
//OpenJSON returns a new Character from json file
62+
func OpenJSON(filepath string) (*Character, error) {
63+
file, err := os.Open(filepath)
64+
if err != nil {
65+
fmt.Fprintln(os.Stderr, "Error while opening json file")
66+
return nil, err
67+
}
68+
69+
defer file.Close()
70+
71+
c, err := NewEmptyCharacter(97)
72+
73+
if err != nil {
74+
fmt.Fprintln(os.Stderr, "Error while create empty Character")
75+
return nil, err
76+
}
77+
78+
d := json.NewDecoder(file)
79+
err = d.Decode(&c)
80+
81+
if err != nil {
82+
fmt.Fprintln(os.Stderr, "Error while parsing json file")
83+
return nil, err
84+
}
85+
86+
return c, nil
87+
}
88+
89+
//SaveJSON will create *.d2s file in folder with Character struct
90+
func SaveJSON(c *Character, folder string) error {
91+
if err := beforeSave(c, &folder); err != nil {
92+
fmt.Fprintln(os.Stderr, errorBlankName)
93+
return err
94+
}
95+
file, err := os.Create(fmt.Sprintf("%s%s.json", folder, c.Name))
96+
if err != nil {
97+
fmt.Fprintln(os.Stderr, "Error while creating json file")
98+
return err
99+
}
100+
101+
defer file.Close()
102+
103+
d := json.NewEncoder(file)
104+
err = d.Encode(&c)
105+
106+
if err != nil {
107+
fmt.Fprintln(os.Stderr, "Error while writing json file")
48108
return err
49109
}
50110
return nil

errors.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ package d2s
33
import "errors"
44

55
var (
6-
//ErrorBlankName it is error when save without character name
7-
ErrorBlankName = errors.New("blank name error")
6+
//errorBlankName it is error when save without character name
7+
errorBlankName = errors.New("blank name error")
88
)

0 commit comments

Comments
 (0)