Fix command compound
This commit is contained in:
@ -1,106 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
_ "embed"
|
|
||||||
"flag"
|
|
||||||
"image"
|
|
||||||
_ "image/png"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/Tnze/go-mc/chat"
|
|
||||||
"github.com/Tnze/go-mc/server"
|
|
||||||
"github.com/Tnze/go-mc/server/command"
|
|
||||||
)
|
|
||||||
|
|
||||||
var motd = chat.Message{Text: "A Minecraft Server ", Extra: []chat.Message{{Text: "Powered by go-mc", Color: "yellow"}}}
|
|
||||||
var addr = flag.String("Address", "127.0.0.1:25565", "Listening address")
|
|
||||||
var iconPath = flag.String("ServerIcon", "./server-icon.png", "The path to server icon")
|
|
||||||
var maxPlayer = flag.Int("MaxPlayer", 16384, "The maximum number of players")
|
|
||||||
var regionPath = flag.String("Regions", "./save/testdata/region/", "The region files")
|
|
||||||
var playerdataPath = flag.String("PlayerData", "./save/testdata/playerdata", "The player data files")
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
flag.Parse()
|
|
||||||
logger := Logger{log.Default()}
|
|
||||||
playerList := server.NewPlayerList(*maxPlayer)
|
|
||||||
serverInfo, err := server.NewPingInfo(playerList, server.ProtocolName, server.ProtocolVersion, motd, readIcon())
|
|
||||||
if err != nil {
|
|
||||||
logger.Fatalf("Set server info error: %v", err)
|
|
||||||
}
|
|
||||||
keepAlive := server.NewKeepAlive()
|
|
||||||
commands := command.NewGraph()
|
|
||||||
handleFunc := func(ctx context.Context, args []command.ParsedData) error {
|
|
||||||
logger.Printf("Command: args: %v", args)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
commands.AppendLiteral(commands.Literal("me").
|
|
||||||
AppendArgument(commands.Argument("action", command.StringParser(2)).
|
|
||||||
HandleFunc(handleFunc)).
|
|
||||||
Unhandle(),
|
|
||||||
).AppendLiteral(commands.Literal("help").
|
|
||||||
AppendArgument(commands.Argument("command", command.StringParser(0)).
|
|
||||||
HandleFunc(handleFunc)).
|
|
||||||
HandleFunc(handleFunc),
|
|
||||||
).AppendLiteral(commands.Literal("list").
|
|
||||||
AppendLiteral(commands.Literal("uuids").
|
|
||||||
HandleFunc(handleFunc)).
|
|
||||||
HandleFunc(handleFunc),
|
|
||||||
)
|
|
||||||
game := server.NewGame(
|
|
||||||
logger,
|
|
||||||
playerList,
|
|
||||||
keepAlive,
|
|
||||||
commands,
|
|
||||||
)
|
|
||||||
go game.Run(context.Background())
|
|
||||||
|
|
||||||
s := server.Server{
|
|
||||||
ListPingHandler: serverInfo,
|
|
||||||
LoginHandler: &server.MojangLoginHandler{
|
|
||||||
OnlineMode: true,
|
|
||||||
Threshold: 256,
|
|
||||||
LoginChecker: playerList,
|
|
||||||
},
|
|
||||||
GamePlay: game,
|
|
||||||
}
|
|
||||||
if err := s.Listen(*addr); err != nil {
|
|
||||||
log.Fatalf("Listen error: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func readIcon() image.Image {
|
|
||||||
f, err := os.Open(*iconPath)
|
|
||||||
// if the file doesn't exist, return nil
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
return nil
|
|
||||||
} else if err != nil {
|
|
||||||
log.Fatalf("Open icon file error: %v", err)
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
icon, _, err := image.Decode(f)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Decode image error: %v", err)
|
|
||||||
}
|
|
||||||
return icon
|
|
||||||
}
|
|
||||||
|
|
||||||
type Logger struct{ *log.Logger }
|
|
||||||
|
|
||||||
func (l Logger) Init(g *server.Game) {
|
|
||||||
l.Print("Server init")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l Logger) Run(ctx context.Context) {
|
|
||||||
l.Print("Server is running")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l Logger) ClientJoin(c *server.Client, p *server.Player) {
|
|
||||||
l.Printf("Player join [%s]%v from %v", p.Name, p.UUID, c.Socket.RemoteAddr())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l Logger) ClientLeft(c *server.Client, p *server.Player, reason error) {
|
|
||||||
l.Printf("Player left [%s]%v reason: %v", p.Name, p.UUID, reason)
|
|
||||||
}
|
|
@ -1,44 +1,17 @@
|
|||||||
package command
|
package command
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/Tnze/go-mc/data/packetid"
|
"github.com/Tnze/go-mc/data/packetid"
|
||||||
pk "github.com/Tnze/go-mc/net/packet"
|
pk "github.com/Tnze/go-mc/net/packet"
|
||||||
"github.com/Tnze/go-mc/server"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Init implement server.Component for Graph
|
type Client interface {
|
||||||
func (g *Graph) Init(game *server.Game) {
|
SendPacket(p pk.Packet)
|
||||||
game.AddHandler(&server.PacketHandler{
|
|
||||||
ID: packetid.ServerboundChat,
|
|
||||||
F: func(client *server.Client, player *server.Player, packet server.Packet758) error {
|
|
||||||
var msg pk.String
|
|
||||||
if err := pk.Packet(packet).Scan(&msg); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if cmd := string(msg); strings.HasPrefix(cmd, "/") {
|
|
||||||
ctx := context.WithValue(context.TODO(), "sender", player)
|
|
||||||
cmderr := g.Execute(ctx, strings.TrimPrefix(cmd, "/"))
|
|
||||||
if cmderr != nil {
|
|
||||||
// TODO: tell player that their command has error
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run implement server.Component for Graph
|
|
||||||
func (g *Graph) Run(ctx context.Context) {}
|
|
||||||
|
|
||||||
// ClientJoin implement server.Component for Graph
|
// ClientJoin implement server.Component for Graph
|
||||||
func (g *Graph) ClientJoin(client *server.Client, _ *server.Player) {
|
func (g *Graph) ClientJoin(client Client) {
|
||||||
client.WritePacket(server.Packet758(pk.Marshal(
|
client.SendPacket(pk.Marshal(
|
||||||
packetid.ClientboundCommands, g,
|
packetid.ClientboundCommands, g,
|
||||||
)))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClientLeft implement server.Component for Graph
|
|
||||||
func (g *Graph) ClientLeft(_ *server.Client, _ *server.Player, _ error) {}
|
|
||||||
|
Reference in New Issue
Block a user