40 lines
1.0 KiB
Go
40 lines
1.0 KiB
Go
package server
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/admin-else/strom/nbt"
|
|
"github.com/admin-else/strom/proto"
|
|
"github.com/admin-else/strom/proto_base"
|
|
"github.com/admin-else/strom/proto_generated/v1_21_8"
|
|
"github.com/admin-else/strom/text"
|
|
)
|
|
|
|
var (
|
|
NotClientErr = errors.New("not a servee")
|
|
CantKickInStateErr = errors.New("cant kick in this state")
|
|
)
|
|
|
|
func Kick(c *proto.Conn, reason *text.Component) (err error) {
|
|
if c.Actor != proto_base.Servee {
|
|
err = NotClientErr
|
|
return
|
|
}
|
|
switch c.State() {
|
|
case proto_base.Handshaking, proto_base.Status:
|
|
err = CantKickInStateErr
|
|
case proto_base.Login:
|
|
var b []byte
|
|
b, err = reason.MarshalJSON()
|
|
if err != nil {
|
|
return
|
|
}
|
|
err = c.Send(&v1_21_8.LoginToClientPacketDisconnect{Reason: string(b)})
|
|
case proto_base.Configuration:
|
|
err = c.Send(&v1_21_8.ConfigurationToClientPacketDisconnect{Reason: nbt.Anon{Value: reason.ToNBT()}})
|
|
case proto_base.Play:
|
|
err = c.Send(&v1_21_8.PlayToClientPacketKickDisconnect{Reason: nbt.Anon{Value: reason.ToNBT()}})
|
|
}
|
|
return
|
|
}
|