code: func (r *Room) Join(ctx context.Context, msg []byte) (*JoinResponse, error) {
  	s := pitaya.GetSessionFromCtx(ctx)
  	fakeUID := s.ID()                              // just use s.ID as uid !!!
  	err := s.Bind(ctx, strconv.Itoa(int(fakeUID))) // binding session uid
  
  	if err != nil {
  		return nil, pitaya.Error(err, "RH-000", map[string]string{"failed": "bind"})
  	}
  
  	uids, err := pitaya.GroupMembers(ctx, "room")
  	if err != nil {
  		return nil, err
  	}
  	s.Push("onMembers", &AllMembers{Members: uids})
  	// notify others
  	pitaya.GroupBroadcast(ctx, "chat", "room", "onNewUser", &NewUser{Content: fmt.Sprintf("New user: %s", s.UID())})
  	// new user join group
  	pitaya.GroupAddMember(ctx, "room", s.UID()) // add session to group
  
  	// on session close, remove it from group
  	s.OnClose(func() {
  		pitaya.GroupRemoveMember(ctx, "room", s.UID())
  	})
  
  	return &JoinResponse{Result: "success"}, nil
  }
docs: // Join room