sshpong/internal/netwrk/netwrk.go
2024-08-24 16:09:12 -06:00

95 lines
1.6 KiB
Go

package netwrk
import (
"log"
"net"
sync "sync"
"google.golang.org/protobuf/proto"
)
type Client struct {
Username string
Conn net.Conn
}
type LobbyPlayersMessage struct {
Type string
Username string
IsAvailable chan bool
}
type ExternalMessage struct {
Target string
Message *LobbyMessage
}
var lobbyListener chan LobbyPlayersMessage
var externalMessageChan chan ExternalMessage
var lobbyMembers sync.Map
func init() {
lobbyListener = make(chan LobbyPlayersMessage)
externalMessageChan = make(chan ExternalMessage)
lobbyMembers = sync.Map{}
go func() {
for {
msg := <-externalMessageChan
player, ok := lobbyMembers.Load(msg.Target)
if !ok {
log.Println("failed to send to target", msg.Target)
continue
}
client, _ := player.(Client)
bytes, _ := proto.Marshal(msg.Message)
_, err := client.Conn.Write(bytes)
if err != nil {
log.Println("Could not write to target", msg.Target, err)
}
}
}()
}
// Starts listening on port 12345 for TCP connections
// Also creates client pool and game connection singletons
func LobbyListen() {
listener, err := net.Listen("tcp", "127.0.0.1:12345")
if err != nil {
log.Fatal(err)
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
log.Println(err)
continue
}
go handleLobbyConnection(conn)
}
}
func GamesListen() {
gameListener, err := net.Listen("tcp", "127.0.0.1:42069")
if err != nil {
log.Fatal(err)
}
defer gameListener.Close()
for {
conn, err := gameListener.Accept()
if err != nil {
log.Println(err)
continue
}
handleGameConnection(conn)
}
}