summaryrefslogtreecommitdiff
path: root/server/player.go
diff options
context:
space:
mode:
authorraven <citrons@mondecitronne.com>2026-03-21 00:31:49 -0500
committerraven <citrons@mondecitronne.com>2026-03-21 00:31:49 -0500
commit3f6a61d993d6c50135c3cefe3cf362390c4027d5 (patch)
tree8232e80a845480e01a3769269e1d67156085ecba /server/player.go
parent22214f3fea9b2e201a9010ff1bf27bf52aeaf338 (diff)
chat commands
Diffstat (limited to 'server/player.go')
-rw-r--r--server/player.go53
1 files changed, 47 insertions, 6 deletions
diff --git a/server/player.go b/server/player.go
index bd0d915..4a562a7 100644
--- a/server/player.go
+++ b/server/player.go
@@ -18,17 +18,38 @@ type player struct {
level *level
}
+type authLevel int
+
type playerState struct {
LevelId levelId
Pos entityPos
Facing entityFacing
+ Auth authLevel
}
+const (
+ defaultAuth = iota
+ opAuth
+)
+
var playerNameRegex = regexp.MustCompile("^[.-_a-zA-Z0-9]*$")
+func loadPlayerData(
+ from phony.Actor, name string, loaded func(playerState, bool)) {
+ loadDataFile(from, "player/" + name, loaded)
+}
+
+func savePlayerData(
+ from phony.Actor, name string, state playerState, done func()) {
+ saveDataFile(from, "player/" + name, state)
+ if done != nil {
+ dataManager.Act(nil, done)
+ }
+}
+
func newPlayer(s *Server, cl *client, name string) *player {
pl := &player {client: cl, server: s, name: name}
- loadDataFile(pl, "player/" + name, func(state playerState, ok bool) {
+ loadPlayerData(pl, name, func(state playerState, ok bool) {
if ok {
pl.state = state
pl.ChangeLevel(pl, state.LevelId, state.Pos)
@@ -41,10 +62,7 @@ func newPlayer(s *Server, cl *client, name string) *player {
func (p *player) save(done func()) {
os.Mkdir("world/player", 0777)
- saveDataFile(p, "player/" + p.name, p.state)
- if done != nil {
- dataManager.Act(nil, done)
- }
+ savePlayerData(p, p.name, p.state, done)
}
func (p *player) kick(reason string) {
@@ -79,7 +97,16 @@ func (p *player) handlePacket(packet classic.Packet) {
}
p.level.SetBlock(p, pos, block)
case *classic.Message:
- p.server.OnPlayerMessage(p, p.name, classic.UnpadString(pck.Message))
+ message := classic.UnpadString(pck.Message)
+ isCmd, text := isCommand(message)
+ if text == "" {
+ break
+ }
+ if !isCmd {
+ p.server.OnPlayerMessage(p, p.name, text)
+ } else {
+ p.server.ExecuteCommand(p, p.state.Auth, text)
+ }
}
}
@@ -99,6 +126,12 @@ func (p *player) Kick(from phony.Actor, reason string) {
})
}
+func (p *player) SetAuthLevel(from phony.Actor, auth authLevel) {
+ p.Act(from, func() {
+ p.state.Auth = auth
+ })
+}
+
func (p *player) OnPacket(from phony.Actor, packet classic.Packet) {
p.Act(from, func() {
p.handlePacket(packet)
@@ -149,6 +182,14 @@ func (p *player) OnPlayerMessage(from *Server, name string, message string) {
p.SendMessage(from, fmt.Sprintf("&7<&b%s&7>&f %s", name, message))
}
+func (p *player) OnCommandOutput(from *Server, output string) {
+ p.SendMessage(from, "&e" + output)
+}
+
+func (p *player) OnCommandError(from *Server, err string) {
+ p.SendMessage(from, "&c" + err)
+}
+
func (p *player) OnLevelData(from *level, info levelInfo, data io.ReadCloser) {
p.Act(from, func() {
defer data.Close()