package grpc_server import ( "context" "encoding/json" "git.hlsq.asia/mmorpg/service-common/db/kafka" "git.hlsq.asia/mmorpg/service-common/proto/rs/grpc_pb" "git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/repository" "git.hlsq.asia/mmorpg/service-qgdzs/internal/timer" ) // 玩法 - 类目答题 // GetAllCategory 获取所有类目 func (s *Server) GetAllCategory(ctx context.Context, req *grpc_pb.GetAllCategoryReq) (*grpc_pb.GetAllCategoryResp, error) { categoryList, err := repository.NewCategoryDao(ctx, s.query).FindAll() if err != nil { return nil, utils.ErrorsWrap(err) } categories := make([]*grpc_pb.GetAllCategoryItem, 0) for _, category := range categoryList { categories = append(categories, &grpc_pb.GetAllCategoryItem{ Sn: category.Sn, Category: category.Category, }) } return &grpc_pb.GetAllCategoryResp{ Categories: categories, }, nil } // CategoryGetQuestion 获取题目 func (s *Server) CategoryGetQuestion(ctx context.Context, req *grpc_pb.CategoryGetQuestionReq) (*grpc_pb.CategoryGetQuestionResp, error) { question, err := repository.NewQuestionDao(ctx, s.query).FindByRandom(req.CategorySn) if err != nil { return nil, utils.ErrorsWrap(err) } options := make([]string, 0) if err = json.Unmarshal([]byte(question.Options), &options); err != nil { return nil, utils.ErrorsWrapF(err, "data: %v", question.Options) } category, _ := repository.NewCategoryDao(ctx, s.query).FindNameBySn(question.CategorySn) return &grpc_pb.CategoryGetQuestionResp{ Sn: question.Sn, Question: question.Question, Options: options, Category: category, Difficulty: question.Difficulty, }, nil } // CategoryAnswerQuestion 回答题目 func (s *Server) CategoryAnswerQuestion(ctx context.Context, req *grpc_pb.CategoryAnswerQuestionReq) (*grpc_pb.CategoryAnswerQuestionResp, error) { utils.ShouldBindUsn(ctx, &req.USN) question, err := repository.NewQuestionDao(ctx, s.query).FindBySn(req.Sn) if err != nil { return nil, utils.ErrorsWrap(err) } options := make([]string, 0) if err = json.Unmarshal([]byte(question.Options), &options); err != nil { return nil, utils.ErrorsWrapF(err, "data: %v", question.Options) } // 保存答题记录 if req.USN != 0 { kafka.NewProducer().Produce(ctx, &timer.TopicQuestionAnswer{ MessageSn: utils.SnowflakeInstance().Generate().Int64(), USN: req.USN, QuestionSn: question.Sn, QuestionAnswer: question.Answer, Answer: req.Answer, }) // 类目答题正确给5分,错误不得分 if req.Answer == question.Answer { kafka.NewProducer().Produce(ctx, &timer.TopicAddPoint{ MessageSn: utils.SnowflakeInstance().Generate().Int64(), Source: timer.AddPointSourceCategory, USN: req.USN, Point: 5, }) } } return &grpc_pb.CategoryAnswerQuestionResp{ Answer: question.Answer, Explanation: question.Explanation, }, nil }