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 }