76 lines
1.7 KiB
Go
76 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
_ "embed"
|
|
"log/slog"
|
|
"os"
|
|
|
|
enet "github.com/codecat/go-enet"
|
|
_ "github.com/mattn/go-sqlite3"
|
|
)
|
|
|
|
func main() {
|
|
port := uint16(8095)
|
|
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
|
|
slog.SetDefault(logger)
|
|
|
|
// Initialize enet
|
|
slog.Info("Initializing E-Net Server", "port", port)
|
|
enet.Initialize()
|
|
|
|
// Create a host listening on 0.0.0.0:8095
|
|
host, err := enet.NewHost(enet.NewListenAddress(port), 32, 1, 0, 0)
|
|
if err != nil {
|
|
slog.Error("Couldn't create host", "error", err)
|
|
return
|
|
}
|
|
slog.Info("Server started", "port", port)
|
|
|
|
// The event loop
|
|
for true {
|
|
// Wait until the next event
|
|
ev := host.Service(1000)
|
|
|
|
// Do nothing if we didn't get any event
|
|
if ev.GetType() == enet.EventNone {
|
|
continue
|
|
}
|
|
|
|
switch ev.GetType() {
|
|
case enet.EventConnect: // A new peer has connected
|
|
slog.Info("New peer connected", "address", ev.GetPeer().GetAddress())
|
|
|
|
case enet.EventDisconnect: // A connected peer has disconnected
|
|
slog.Info("Peer disconnected", "address", ev.GetPeer().GetAddress())
|
|
|
|
case enet.EventReceive: // A peer sent us some data
|
|
// Get the packet
|
|
packet := ev.GetPacket()
|
|
|
|
// We must destroy the packet when we're done with it
|
|
defer packet.Destroy()
|
|
|
|
// Get the bytes in the packet
|
|
packetBytes := packet.GetData()
|
|
|
|
// Respond "pong" to "ping"
|
|
if string(packetBytes) == "ping" {
|
|
ev.GetPeer().SendString("pong", ev.GetChannelID(), enet.PacketFlagReliable)
|
|
continue
|
|
}
|
|
|
|
// Disconnect the peer if they say "bye"
|
|
if string(packetBytes) == "bye" {
|
|
slog.Info("Peer sent bye, disconnecting")
|
|
ev.GetPeer().Disconnect(0)
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
|
|
// Destroy the host when we're done with it
|
|
host.Destroy()
|
|
|
|
// Uninitialize enet
|
|
enet.Deinitialize()
|
|
}
|