minewebgen - transfer_server.go
1 package main
2
3 import (
4 "archive/zip"
5 "errors"
6 "os"
7 "path"
8 "strings"
9
10 "vimagination.zapto.org/byteio"
11 "vimagination.zapto.org/minewebgen/internal/data"
12 )
13
14 func (t Transfer) server(name string, r *byteio.StickyLittleEndianReader, w *byteio.StickyLittleEndianWriter, f *os.File, size int64) error {
15 zr, err := zip.NewReader(f, size)
16 if err != nil {
17 return err
18 }
19 jars := make([]*zip.File, 0, 16)
20 for _, file := range zr.File {
21 if file.Name == "server.jar" {
22 jars = []*zip.File{file}
23 break
24 }
25 if strings.HasSuffix(file.Name, ".jar") {
26 jars = append(jars, file)
27 }
28 }
29 s := t.c.NewServer()
30 done := false
31 defer func() {
32 if !done {
33 t.c.RemoveServer(s.ID)
34 }
35 go t.c.Save()
36 }()
37 if s == nil {
38 return errors.New("error creating server")
39 }
40 s.Lock()
41 s.Name = name
42 d := s.Path
43 s.Unlock()
44 if len(jars) == 0 {
45 err = moveFile(f.Name(), path.Join(d, "server.jar"))
46 } else {
47 if len(jars) > 1 {
48 w.WriteUint8(1)
49 w.WriteInt16(int16(len(jars)))
50 for _, jar := range jars {
51 data.WriteString(w, jar.Name)
52 }
53 if w.Err != nil {
54 return w.Err
55 }
56 p := r.ReadInt16()
57 if r.Err != nil {
58 return r.Err
59 }
60 if int(p) >= len(jars) || p < 0 {
61 return errors.New("error selecting server jar")
62 }
63 jars[0] = jars[p]
64 }
65 if err == nil {
66 err = unzip(zr, d)
67 if err == nil {
68 err = os.Rename(path.Join(d, jars[0].Name), path.Join(d, "server.jar"))
69 }
70 }
71 }
72 if err != nil {
73 return err
74 }
75 serverProperties := DefaultServerSettings()
76 ps, err := os.OpenFile(path.Join(d, "properties.server"), os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0644)
77 defer ps.Close()
78 if err != nil {
79 if !os.IsExist(err) {
80 return err
81 }
82 } else {
83 err = serverProperties.WriteTo(ps)
84 if err != nil {
85 return err
86 }
87 }
88 done = true
89 return nil
90 }