Exemple #1
0
func processConnection(s *Server, connection network.Connection, session string) {
	user, err := s.api.GetUser(session)
	if user == nil || err != nil {
		return
	}

	complete := false
	notify := make(chan bool, 2)
	output := make(chan protocol.Message, 3)
	go func() {
		log.Printf("write run for session: %s\n", session)
		for message := range output {
			if protocol.GameCompleteMessageType == message.GetType() {
				complete = true
				break
			}
			// rewrite empty
			message.SetSession(session)
			err := connection.WriteMessage(message)
			if err != nil && connection.IsCloseError(err) {
				break
			}
			if err != nil {
				log.Printf("websocket write: %v", err)
			}
		}
		log.Printf("write done for session: %s\n", session)
		notify <- true
	}()

	controller := NewGameController(user.Name, s, output)
	go func() {
		log.Printf("read run for session: %s\n", session)
		for {
			err := controller.process(connection, session)
			if complete {
				break
			}
			if controller.HaveLogicError() {
				break
			}
			if err != nil && connection.IsCloseError(err) {
				break
			}
			if err != nil {
				log.Printf("websocket read: %v", err)
			}
		}
		log.Printf("read done for session: %s\n", session)
		notify <- true

	}()

	<-notify

	controller.Clear()
	connection.Close()
	close(output)
}