90 lines
2.9 KiB
Go
90 lines
2.9 KiB
Go
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
|
||
}
|