Skip to content

Commit 204fa0a

Browse files
refactor connection handling
1 parent e1ba260 commit 204fa0a

File tree

8 files changed

+310
-212
lines changed

8 files changed

+310
-212
lines changed

client_handler.go

Lines changed: 0 additions & 200 deletions
This file was deleted.

commandclient/client.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,18 @@ func (c *CommandClient) AddListener(ch chan commands.Command) {
6161
c.listeners = append(c.listeners, ch)
6262
}
6363

64+
func (c *CommandClient) RemoveListener(ch chan commands.Command) {
65+
c.listener_lock.Lock()
66+
defer c.listener_lock.Unlock()
67+
newlisteners := make([]chan commands.Command, 0)
68+
for _, l := range c.listeners {
69+
if l != ch {
70+
newlisteners = append(newlisteners, l)
71+
}
72+
}
73+
c.listeners = newlisteners
74+
}
75+
6476
func (c *CommandClient) emitCommand(cmd commands.Command) {
6577
c.listener_lock.RLock()
6678
defer c.listener_lock.RUnlock()

commandclient/clientready.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package commandclient
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
7+
"github.com/minetest-go/minetest_client/commands"
8+
)
9+
10+
func ClientReady(cc *CommandClient) error {
11+
ch := make(chan commands.Command, 100)
12+
cc.AddListener(ch)
13+
defer cc.RemoveListener(ch)
14+
15+
for o := range ch {
16+
switch o.(type) {
17+
case *commands.ServerCSMRestrictionFlags:
18+
fmt.Println("Server sends csm restriction flags")
19+
20+
fmt.Println("Sending CLIENT_READY")
21+
err := cc.SendCommand(commands.NewClientReady(5, 5, 5, "mt-bot", 4))
22+
if err != nil {
23+
return err
24+
}
25+
26+
fmt.Println("Sending PLAYERPOS")
27+
ppos := commands.NewClientPlayerPos()
28+
err = cc.SendCommand(ppos)
29+
return err
30+
}
31+
}
32+
33+
return errors.New("channel closed")
34+
}

commandclient/debughandler.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package commandclient
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"time"
7+
8+
"github.com/minetest-go/minetest_client/commands"
9+
)
10+
11+
func DebugHandler(cc *CommandClient) error {
12+
ch := make(chan commands.Command, 100)
13+
cc.AddListener(ch)
14+
defer cc.RemoveListener(ch)
15+
16+
for o := range ch {
17+
switch cmd := o.(type) {
18+
case *commands.ServerBlockData:
19+
gotblocks := commands.NewClientGotBlocks()
20+
gotblocks.AddBlock(cmd.Pos)
21+
22+
err := cc.SendCommand(gotblocks)
23+
if err != nil {
24+
return err
25+
}
26+
case *commands.ServerTimeOfDay:
27+
fmt.Printf("Time of day: %d\n", cmd.TimeOfDay)
28+
case *commands.ServerChatMessage:
29+
fmt.Printf("Chat: %s\n", cmd)
30+
case *commands.ServerMovePlayer:
31+
fmt.Printf("Move player: '%s'\n", cmd)
32+
33+
time.Sleep(time.Second * 2)
34+
fmt.Printf("Sending player pos command\n")
35+
ppos := commands.NewClientPlayerPos()
36+
ppos.PosX = uint32(cmd.X)
37+
ppos.PosY = uint32(cmd.Y) + 50
38+
ppos.PosZ = uint32(cmd.Z) + 50
39+
ppos.FOV = 149
40+
ppos.RequestViewRange = 13
41+
err := cc.SendOriginalCommand(ppos)
42+
if err != nil {
43+
return err
44+
}
45+
}
46+
}
47+
48+
return errors.New("channel closed")
49+
}

commandclient/fetchmedia.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package commandclient
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"os"
7+
8+
"github.com/minetest-go/minetest_client/commands"
9+
)
10+
11+
func FetchMedia(cc *CommandClient) error {
12+
ch := make(chan commands.Command, 1000)
13+
cc.AddListener(ch)
14+
defer cc.RemoveListener(ch)
15+
received_count := 0
16+
expected_count := 0
17+
18+
for o := range ch {
19+
switch cmd := o.(type) {
20+
21+
case *commands.ServerAnnounceMedia:
22+
fmt.Printf("Server announces media: %d assets\n", cmd.FileCount)
23+
24+
_, err := os.Stat("media")
25+
if os.IsNotExist(err) {
26+
err := os.Mkdir("media", 0755)
27+
if err != nil {
28+
return err
29+
}
30+
}
31+
32+
fmt.Printf("Sending REQUEST_MEDIA len=%d\n", len(cmd.Hashes))
33+
files := make([]string, 0)
34+
for name := range cmd.Hashes {
35+
//fmt.Printf("Name: '%s'\n", name)
36+
37+
_, err := os.Stat("media/" + name)
38+
if os.IsNotExist(err) {
39+
files = append(files, name)
40+
expected_count++
41+
}
42+
43+
}
44+
45+
if len(files) > 0 {
46+
reqmedia_cmd := commands.NewClientRequestMedia(files)
47+
err = cc.SendCommand(reqmedia_cmd)
48+
if err != nil {
49+
return err
50+
}
51+
} else {
52+
// nothing to fetch
53+
return nil
54+
}
55+
56+
case *commands.ServerMedia:
57+
fmt.Printf("Server media: %s\n", cmd)
58+
received_count += int(cmd.NumFiles)
59+
60+
for name, data := range cmd.Files {
61+
_, err := os.Stat("media/" + name)
62+
if os.IsNotExist(err) {
63+
err = os.WriteFile("media/"+name, data, 0644)
64+
if err != nil {
65+
return err
66+
}
67+
}
68+
}
69+
70+
fmt.Printf("Media status: received=%d, expected=%d\n", received_count, expected_count)
71+
if received_count >= expected_count {
72+
fmt.Println("Received all media files")
73+
return nil
74+
}
75+
}
76+
}
77+
78+
return errors.New("channel closed")
79+
}

0 commit comments

Comments
 (0)