2024年1月17日发(作者:)
"strconv""time""strings""/spf13/viper""/topfreegames/pitaya""/topfreegames/pitaya/acceptor""/topfreegames/pitaya/component""/topfreegames/pitaya/config""/topfreegames/pitaya/groups""/topfreegames/pitaya/logger""/topfreegames/pitaya/serialize/json""/topfreegames/pitaya/timer")type (// Room represents a component that contains a bundle of room related handler// like Join/MessageRoom struct {mer *}// UserMessage represents a message that user sentUserMessage struct {Name string `json:"name"`Content string `json:"content"`}// NewUser message will be received when new user join roomNewUser struct {Content string `json:"content"`}// AllMembers contains all members uidAllMembers struct {Members []string `json:"members"`}// JoinResponse represents the result of joining room
JoinResponse struct {Code int `json:"code"`Result string `json:"result"`})// NewRoom returns a Handler Base implementationfunc NewRoom() *Room {return &Room{}}// AfterInit component lifetime callbackfunc (r *Room) AfterInit() { = er(, func() {count, err := ountMembers(ound(), "room")("UserCount: Time=> %s, Count=> %d, Error=> %q", ().String(), count, err)})}// Join roomfunc (r *Room) Join(ctx t, msg []byte) (*JoinResponse, error) {s := sionFromCtx(ctx)fakeUID := () // just use as uid
err := (ctx, (int(fakeUID))) // binding session uidif err != nil {return nil, (err, "RH-000", map[string]string{"failed": "bind"})}uids, err := embers(ctx, "room")if err != nil {return nil, err}("onMembers", &AllMembers{Members: uids})// notify roadcast(ctx, "chat", "room", "onNewUser", &NewUser{Content: f("New user: %s", ())})// new user join ddMember(ctx, "room", ()) // add session to group// on session close, remove it from group
e(func() {emoveMember(ctx, "room", ())})return &JoinResponse{Result: "success"}, nil}// Message sync last message to all membersfunc (r *Room) Message(ctx t, msg *UserMessage) {err := roadcast(ctx, "chat", "room", "onMessage", msg)if err != nil {n("error broadcasting message", err)}}func main() {defer wn()s := ializer()conf := configApp()ializer(s)gsi := oryGroupService(fig(conf))oups(gsi)err := reate(ound(), "room")if err != nil {panic(err)}// rewrite component and handler nameroom := NewRoom()er(room,me("room"),meFunc(r),)gs(ags | ile)("/web/", refix("/web/", rver(("web"))))go AndServe(":3251", nil)t := cceptor(":3250")eptor(t)
ure(true, "chat", r, map[string]string{}, conf)()}func configApp() * {conf := ()Prefix("chat") // allows using env vars in the CHAT_PITAYA_ ault("rocess", 15)("al", "15s")("es", 32)("ssion", false)return conf}


发布评论