github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/23_proto_actor/chat/server/main.go (about)

     1  package main
     2  
     3  import (
     4  	"log"
     5  
     6  	console "github.com/AsynkronIT/goconsole"
     7  	"github.com/AsynkronIT/protoactor-go/actor"
     8  	"github.com/AsynkronIT/protoactor-go/examples/chat/messages"
     9  	"github.com/AsynkronIT/protoactor-go/remote"
    10  	"github.com/emirpasic/gods/sets/hashset"
    11  )
    12  
    13  // define root context
    14  var rootContext = actor.EmptyRootContext
    15  
    16  func notifyAll(clients *hashset.Set, message interface{}) {
    17  	for _, tmp := range clients.Values() {
    18  		client := tmp.(*actor.PID)
    19  		rootContext.Send(client, message)
    20  	}
    21  }
    22  
    23  func main() {
    24  	remote.Start("127.0.0.1:8080")
    25  	clients := hashset.New()
    26  
    27  	props := actor.PropsFromFunc(func(context actor.Context) {
    28  		switch msg := context.Message().(type) {
    29  		case *messages.Connect:
    30  			log.Printf("Client %v connected", msg.Sender)
    31  			clients.Add(msg.Sender)
    32  			context.Send(msg.Sender, &messages.Connected{Message: "Welcome!"})
    33  		case *messages.SayRequest:
    34  			notifyAll(clients, &messages.SayResponse{
    35  				UserName: msg.UserName,
    36  				Message:  msg.Message,
    37  			})
    38  		case *messages.NickRequest:
    39  			notifyAll(clients, &messages.NickResponse{
    40  				OldUserName: msg.OldUserName,
    41  				NewUserName: msg.NewUserName,
    42  			})
    43  		}
    44  	})
    45  
    46  	rootContext.SpawnNamed(props, "chatserver")
    47  	console.ReadLine()
    48  }