diff options
-rw-r--r-- | client_conn.go | 13 | ||||
-rw-r--r-- | config.go | 2 | ||||
-rw-r--r-- | connect.go | 8 | ||||
-rw-r--r-- | content.go | 82 | ||||
-rw-r--r-- | doc/config.md | 3 | ||||
-rw-r--r-- | main.go | 2 | ||||
-rw-r--r-- | server_conn.go | 34 |
7 files changed, 105 insertions, 39 deletions
diff --git a/client_conn.go b/client_conn.go index c1b62ad..77f1da9 100644 --- a/client_conn.go +++ b/client_conn.go @@ -37,6 +37,11 @@ type clientConn struct { lang string + major, minor, patch uint8 + reservedVer uint8 + versionStr string + formspecVer uint16 + itemDefs []mt.ItemDef aliases []struct{ Alias, Orig string } nodeDefs []mt.NodeDef @@ -464,6 +469,14 @@ func handleClt(cc *clientConn) { cc.sendMedia(cmd.Filenames) case *mt.ToSrvCltReady: cc.log("-->", "ready") + + cc.major = cmd.Major + cc.minor = cmd.Minor + cc.patch = cmd.Patch + cc.reservedVer = cmd.Reserved + cc.versionStr = cmd.Version + cc.formspecVer = cmd.Formspec + cc.state++ close(cc.initCh) } @@ -63,7 +63,7 @@ func loadConfig() error { defer f.Close() if fi, _ := f.Stat(); fi.Size() == 0 { - f.WriteString("{\n\n}\n") + f.WriteString("{\n\t\n}\n") f.Seek(0, os.SEEK_SET) } @@ -6,10 +6,12 @@ import ( "github.com/anon55555/mt" ) -func connect(conn net.Conn, cc *clientConn) *serverConn { +func connect(conn net.Conn, name string, cc *clientConn) *serverConn { sc := &serverConn{ - Peer: mt.Connect(conn), - clt: cc, + Peer: mt.Connect(conn), + initCh: make(chan struct{}), + clt: cc, + name: name, } sc.log("-->", "connect") cc.srv = sc @@ -268,23 +268,34 @@ func muxItemDefs(conns []*contentConn) ([]mt.ItemDef, []struct{ Alias, Orig stri for _, cc := range conns { wg.Add(1) + + prepend := func(s *string) { + if *s != "" { + *s = cc.name + "_" + *s + } + } + prependTexture := func(s *mt.Texture) { + if *s != "" { + *s = mt.Texture(cc.name) + "_" + *s + } + } + go func() { <-cc.done() for _, def := range cc.itemDefs { if def.Name == "" { - def.Name = cc.name + "_hand" - } else { - def.Name = cc.name + "_" + def.Name + def.Name = "hand" } - - def.InvImg = mt.Texture(cc.name) + "_" + def.InvImg - def.WieldImg = mt.Texture(cc.name) + "_" + def.WieldImg - def.PlacePredict = cc.name + "_" + def.PlacePredict - def.PlaceSnd.Name = cc.name + "_" + def.PlaceSnd.Name - def.PlaceFailSnd.Name = cc.name + "_" + def.PlaceFailSnd.Name - def.Palette = mt.Texture(cc.name) + "_" + def.Palette - def.InvOverlay = mt.Texture(cc.name) + "_" + def.InvOverlay - def.WieldOverlay = mt.Texture(cc.name) + "_" + def.WieldOverlay + prepend(&def.Name) + + prependTexture(&def.InvImg) + prependTexture(&def.WieldImg) + prepend(&def.PlacePredict) + prepend(&def.PlaceSnd.Name) + prepend(&def.PlaceFailSnd.Name) + prependTexture(&def.Palette) + prependTexture(&def.InvOverlay) + prependTexture(&def.WieldOverlay) itemDefs = append(itemDefs, def) } @@ -312,6 +323,18 @@ func muxNodeDefs(conns []*contentConn) (nodeDefs []mt.NodeDef, p0Map param0Map, for _, cc := range conns { wg.Add(1) + + prepend := func(s *string) { + if *s != "" { + *s = cc.name + "_" + *s + } + } + prependTexture := func(s *mt.Texture) { + if *s != "" { + *s = mt.Texture(cc.name) + "_" + *s + } + } + go func() { <-cc.done() for _, def := range cc.nodeDefs { @@ -329,25 +352,25 @@ func muxNodeDefs(conns []*contentConn) (nodeDefs []mt.NodeDef, p0Map param0Map, } def.Param0 = param0 - def.Name = cc.name + "_" + def.Name - def.Mesh = cc.name + "_" + def.Mesh - for k, v := range def.Tiles { - def.Tiles[k].Texture = mt.Texture(cc.name) + "_" + v.Texture + prepend(&def.Name) + prepend(&def.Mesh) + for i := range def.Tiles { + prependTexture(&def.Tiles[i].Texture) } - for k, v := range def.OverlayTiles { - def.OverlayTiles[k].Texture = mt.Texture(cc.name) + "_" + v.Texture + for i := range def.OverlayTiles { + prependTexture(&def.OverlayTiles[i].Texture) } - for k, v := range def.SpecialTiles { - def.SpecialTiles[k].Texture = mt.Texture(cc.name) + "_" + v.Texture + for i := range def.SpecialTiles { + prependTexture(&def.SpecialTiles[i].Texture) } - def.Palette = mt.Texture(cc.name) + "_" + def.Palette + prependTexture(&def.Palette) for k, v := range def.ConnectTo { def.ConnectTo[k] = p0Map[cc.name][v] } - def.FootstepSnd.Name = cc.name + "_" + def.FootstepSnd.Name - def.DiggingSnd.Name = cc.name + "_" + def.DiggingSnd.Name - def.DugSnd.Name = cc.name + "_" + def.DugSnd.Name - def.DigPredict = cc.name + "_" + def.DigPredict + prepend(&def.FootstepSnd.Name) + prepend(&def.DiggingSnd.Name) + prepend(&def.DugSnd.Name) + prepend(&def.DigPredict) nodeDefs = append(nodeDefs, def) param0++ @@ -370,10 +393,17 @@ func muxMedia(conns []*contentConn) []mediaFile { for _, cc := range conns { wg.Add(1) + + prepend := func(s *string) { + if *s != "" { + *s = cc.name + "_" + *s + } + } + go func() { <-cc.done() for _, f := range cc.media { - f.name = cc.name + "_" + f.name + prepend(&f.name) media = append(media, f) } diff --git a/doc/config.md b/doc/config.md index 46d65e0..39164ed 100644 --- a/doc/config.md +++ b/doc/config.md @@ -46,6 +46,9 @@ Description: The proxy will listen for new clients on this address. Type: []Server Default: []Server{} Description: The list of internal servers served by this proxy. +The first server is the default server new clients are connected to. +It also acts as a fallback server if a connection +to another server fails or closes. ``` > `Server.Name` @@ -150,7 +150,7 @@ func main() { return } - connect(conn, cc) + connect(conn, conf.Servers[0].Name, cc) }() } diff --git a/server_conn.go b/server_conn.go index 9a8e6f6..f50a079 100644 --- a/server_conn.go +++ b/server_conn.go @@ -31,7 +31,11 @@ func (sc *serverConn) client() *clientConn { return sc.clt } func (sc *serverConn) init() <-chan struct{} { return sc.initCh } func (sc *serverConn) log(dir, msg string) { - log.Printf("{←|⇶} %s {%s} %s", dir, sc.name, msg) + if sc.client() != nil { + sc.client().log("", fmt.Sprintf("%s {%s} %s", dir, sc.name, msg)) + } else { + log.Printf("{←|⇶} %s {%s} %s", dir, sc.name, msg) + } } func handleSrv(sc *serverConn) { @@ -139,14 +143,12 @@ func handleSrv(sc *serverConn) { }) case *mt.ToCltDisco: sc.log("<--", fmt.Sprintf("deny access %+v", cmd)) - if sc.client() != nil { - ack, _ := sc.client().SendCmd(cmd) + ack, _ := sc.client().SendCmd(cmd) - select { - case <-sc.client().Closed(): - case <-ack: - sc.client().Close() - } + select { + case <-sc.client().Closed(): + case <-ack: + sc.client().Close() } case *mt.ToCltAcceptAuth: sc.auth.method = 0 @@ -156,6 +158,22 @@ func handleSrv(sc *serverConn) { case *mt.ToCltAcceptSudoMode: sc.log("<--", "accept sudo") sc.state++ + case *mt.ToCltAnnounceMedia: + sc.SendCmd(&mt.ToSrvReqMedia{}) + case *mt.ToCltMedia: + if sc.state == csInit && cmd.I == cmd.N-1 { + sc.SendCmd(&mt.ToSrvCltReady{ + Major: sc.client().major, + Minor: sc.client().minor, + Patch: sc.client().patch, + Reserved: sc.client().reservedVer, + Version: sc.client().versionStr, + Formspec: sc.client().formspecVer, + }) + + sc.state++ + close(sc.initCh) + } } } } |