sshpong/internal/netwrk/netwrk.go

128 lines
2.4 KiB
Go
Raw Permalink Normal View History

2024-08-02 13:04:41 -06:00
package netwrk
import (
"log"
"net"
2024-08-26 10:02:05 -06:00
"sshpong/internal/pong"
"strings"
2024-08-15 20:08:23 -06:00
sync "sync"
2024-08-23 11:59:19 -06:00
"google.golang.org/protobuf/proto"
2024-08-02 13:04:41 -06:00
)
type Client struct {
2024-08-15 20:08:23 -06:00
Username string
Conn net.Conn
2024-08-02 13:04:41 -06:00
}
2024-08-15 20:08:23 -06:00
type ExternalMessage struct {
Target string
Message *LobbyMessage
2024-08-02 13:04:41 -06:00
}
2024-08-26 10:02:05 -06:00
type GameClients struct {
Client1 Client
Client2 Client
}
2024-08-15 20:08:23 -06:00
var externalMessageChan chan ExternalMessage
var lobbyMembers sync.Map
2024-08-26 10:02:05 -06:00
var games sync.Map
2024-08-15 20:08:23 -06:00
func init() {
externalMessageChan = make(chan ExternalMessage)
2024-08-02 13:04:41 -06:00
2024-08-15 20:08:23 -06:00
lobbyMembers = sync.Map{}
2024-08-26 10:02:05 -06:00
games = sync.Map{}
2024-08-23 11:59:19 -06:00
go func() {
for {
msg := <-externalMessageChan
player, ok := lobbyMembers.Load(msg.Target)
if !ok {
2024-08-24 16:09:12 -06:00
log.Println("failed to send to target", msg.Target)
2024-08-23 11:59:19 -06:00
continue
}
client, _ := player.(Client)
bytes, _ := proto.Marshal(msg.Message)
2024-08-24 16:09:12 -06:00
_, err := client.Conn.Write(bytes)
if err != nil {
log.Println("Could not write to target", msg.Target, err)
}
2024-08-23 11:59:19 -06:00
}
}()
2024-08-15 20:08:23 -06:00
}
2024-08-02 13:04:41 -06:00
2024-08-05 18:00:41 -06:00
// Starts listening on port 12345 for TCP connections
// Also creates client pool and game connection singletons
2024-08-15 20:08:23 -06:00
func LobbyListen() {
2024-08-02 13:04:41 -06:00
2024-08-14 23:33:05 -06:00
listener, err := net.Listen("tcp", "127.0.0.1:12345")
2024-08-02 13:04:41 -06:00
if err != nil {
log.Fatal(err)
}
defer listener.Close()
2024-08-15 20:08:23 -06:00
for {
conn, err := listener.Accept()
if err != nil {
log.Println(err)
continue
2024-08-06 09:58:43 -06:00
}
2024-08-15 20:08:23 -06:00
go handleLobbyConnection(conn)
2024-08-09 08:48:12 -06:00
}
2024-08-15 20:08:23 -06:00
}
func GamesListen() {
2024-08-14 23:33:05 -06:00
gameListener, err := net.Listen("tcp", "127.0.0.1:42069")
2024-08-14 17:26:51 -06:00
if err != nil {
log.Fatal(err)
}
defer gameListener.Close()
2024-08-14 23:33:05 -06:00
for {
conn, err := gameListener.Accept()
if err != nil {
log.Println(err)
continue
2024-08-08 18:08:55 -06:00
}
2024-08-26 10:02:05 -06:00
go func(conn net.Conn) {
messageBytes := make([]byte, 126)
n, err := conn.Read(messageBytes)
if err != nil {
log.Printf("Error reading game ID on connection %s", err)
}
gInfo := strings.SplitAfter(string(messageBytes[:n]), ":")
if err != nil {
log.Printf("Game id was not a string? %s", err)
}
game, ok := games.Load(gInfo[0])
if !ok {
games.Store(gInfo[0], GameClients{Client1: Client{
Username: gInfo[1],
Conn: conn,
}, Client2: Client{}})
} else {
gameclients, _ := game.(GameClients)
client2 := Client{
Username: gInfo[1],
Conn: conn,
}
games.Store(gInfo[0], GameClients{
Client1: gameclients.Client1,
Client2: client2})
go pong.StartGame(gameclients.Client1.Conn, client2.Conn, gameclients.Client1.Username, client2.Username)
}
}(conn)
2024-08-14 23:33:05 -06:00
}
2024-08-06 09:58:43 -06:00
}