diff --git a/.gitignore b/.gitignore index 397b4a76..6ab38c85 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -*.log +.log diff --git a/README.md b/README.md index 071a2061..43161c08 100644 --- a/README.md +++ b/README.md @@ -1,3 +1 @@ # learn-pub-sub-starter (Peril) - -This is the starter code used in Boot.dev's [Learn Pub/Sub](https://learn.boot.dev/learn-pub-sub) course. diff --git a/cmd/server/main.go b/cmd/server/main.go index 58622c6a..9d1e016c 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -1,7 +1,45 @@ package main -import "fmt" +import ( + "fmt" + "log" + "os" + "os/signal" + + "github.com/imhasandl/pub-sub-starter/internal/pubsub" + "github.com/imhasandl/pub-sub-starter/internal/routing" + amqp "github.com/rabbitmq/amqp091-go" +) func main() { - fmt.Println("Starting Peril server...") + const rabbitmqConnection = "amqp://guest:guest@localhost:5672/" + + conn, err := amqp.Dial(rabbitmqConnection) + if err != nil { + log.Fatalf("could not connect to RabbitMQ: %v", err) + } + defer conn.Close() + fmt.Println("Peril game server connected to RabbitMQ!") + + signalChan := make(chan os.Signal, 1) + signal.Notify(signalChan, os.Interrupt) + <-signalChan + + publishCh, err := conn.Channel() + if err != nil { + log.Fatalf("could not create channel: %v", err) + } + + err = pubsub.PublishJSON( + publishCh, + routing.ExchangePerilDirect, + routing.PauseKey, + routing.PlayingState{ + IsPaused: true, + }, + ) + if err != nil { + log.Printf("could not publish time: %v", err) + } + fmt.Println("Pause message sent!") } diff --git a/go.mod b/go.mod index 6bfacb3f..7514e3d4 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ -module github.com/bootdotdev/learn-pub-sub-starter +module github.com/imhasandl/pub-sub-starter go 1.22.1 + +require github.com/rabbitmq/amqp091-go v1.10.0 diff --git a/go.sum b/go.sum index e69de29b..024eebe7 100644 --- a/go.sum +++ b/go.sum @@ -0,0 +1,4 @@ +github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw= +github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= diff --git a/internal/gamelogic/logs.go b/internal/gamelogic/logs.go index f9af79fc..4e69dbf3 100644 --- a/internal/gamelogic/logs.go +++ b/internal/gamelogic/logs.go @@ -6,7 +6,7 @@ import ( "os" "time" - "github.com/bootdotdev/learn-pub-sub-starter/internal/routing" + "github.com/imhasandl/pub-sub-starter/internal/routing" ) const logsFile = "game.log" diff --git a/internal/gamelogic/pause.go b/internal/gamelogic/pause.go index 5874f3c0..ebb8e186 100644 --- a/internal/gamelogic/pause.go +++ b/internal/gamelogic/pause.go @@ -3,7 +3,7 @@ package gamelogic import ( "fmt" - "github.com/bootdotdev/learn-pub-sub-starter/internal/routing" + "github.com/imhasandl/pub-sub-starter/internal/routing" ) func (gs *GameState) HandlePause(ps routing.PlayingState) { diff --git a/internal/pubsub/publish.go b/internal/pubsub/publish.go new file mode 100644 index 00000000..142ed2dc --- /dev/null +++ b/internal/pubsub/publish.go @@ -0,0 +1,30 @@ +package pubsub + +import ( + "context" + "encoding/json" + + amqp "github.com/rabbitmq/amqp091-go" +) + + +func PublishJSON[T any](ch *amqp.Channel, exchange, key string, val T) error { + dat, err := json.Marshal(val) + if err != nil { + return err + } + + err = ch.PublishWithContext( + context.Background(), + exchange, + key, + false, + false, + amqp.Publishing{ + ContentType: "application/json", + Body: dat, + }, + ) + + return err +} \ No newline at end of file