From b002ae3ad25b694aa9973da87138434e46170d55 Mon Sep 17 00:00:00 2001 From: jager Date: Thu, 8 May 2025 10:27:30 +0800 Subject: [PATCH] tribally report logic --- internal/job/tribally_report/cron.go | 45 +++++++++++++++--- internal/model/nh_tribally_user_model.go | 8 ++-- internal/pkg/tribally/tribally.go | 60 ++++++++++++++++++++++++ internal/pkg/tribally/tribally_test.go | 25 ++++++++++ 4 files changed, 127 insertions(+), 11 deletions(-) create mode 100644 internal/pkg/tribally/tribally_test.go diff --git a/internal/job/tribally_report/cron.go b/internal/job/tribally_report/cron.go index 547318f..9f69c62 100644 --- a/internal/job/tribally_report/cron.go +++ b/internal/job/tribally_report/cron.go @@ -2,9 +2,11 @@ package tribally_report import ( "context" + "errors" "github.com/robfig/cron/v3" "github.com/zeromicro/go-zero/core/logx" "nova_task/internal/consts" + "nova_task/internal/model" "nova_task/internal/svc" "time" ) @@ -23,19 +25,48 @@ func (c *Cron) Spec() string { } func (c *Cron) Run() { - tr, err := c.svcCtx.GlobalDataModel.GetValue(c.ctx, consts.TriballyReportTime) - if err != nil { + tr, err := c.svcCtx.GlobalDataModel.FindOneByKey(c.ctx, consts.TriballyReportTime) + if err != nil && !errors.Is(err, model.ErrNotFound) { logx.Errorw("get tribally report time failed", logx.Field("err", err)) return } - var updateTime time.Time - if tr != "" { - updateTime, err = time.Parse(time.DateTime, tr) + if tr == nil { + tr = &model.NhGlobalData{ + Key: consts.TriballyReportTime, + } + } + var start time.Time + if tr.Value != "" { + start, err = time.Parse(time.DateTime, tr.Value) if err != nil { logx.Errorw("parse tribally report time failed", logx.Field("err", err)) return } } - - c.svcCtx.TriballyUserModel.FindUpdateTriballyUsers(c.ctx, updateTime, 100) + end := time.Now() + triballyUsers, err := c.svcCtx.TriballyUserModel.FindUpdateTriballyUsers(c.ctx, start, end, 100) + if err != nil { + logx.Errorw("find update tribally users failed", logx.Field("err", err)) + return + } + + tr.Value = end.Format(time.DateTime) + if tr.Id > 0 { + err = c.svcCtx.GlobalDataModel.Update(c.ctx, tr) + } else { + _, err = c.svcCtx.GlobalDataModel.Insert(c.ctx, tr) + } + if err != nil { + logx.Errorw("insert or update tribally report time failed", logx.Field("err", err)) + return + } + + if len(triballyUsers) == 0 { + logx.Infow("no tribally users", logx.Field("start", start), logx.Field("end", end)) + return + } + + //for _, u := range triballyUsers { + // + //} } diff --git a/internal/model/nh_tribally_user_model.go b/internal/model/nh_tribally_user_model.go index d7cdd78..2f64364 100755 --- a/internal/model/nh_tribally_user_model.go +++ b/internal/model/nh_tribally_user_model.go @@ -16,7 +16,7 @@ type ( NhTriballyUserModel interface { nhTriballyUserModel withSession(session sqlx.Session) NhTriballyUserModel - FindUpdateTriballyUsers(ctx context.Context, t time.Time, count int) ([]*TriballyUserChapter, error) + FindUpdateTriballyUsers(ctx context.Context, start, end time.Time, count int) ([]*TriballyUserChapter, error) } customNhTriballyUserModel struct { @@ -32,10 +32,10 @@ type ( } ) -func (m *customNhTriballyUserModel) FindUpdateTriballyUsers(ctx context.Context, t time.Time, count int) ([]*TriballyUserChapter, error) { - query := fmt.Sprintf("SELECT t.uid, t.chapter, MAX(g.chapter) as max_chapter, g.updated_at FROM nh_tribally_user t JOIN nh_game_report g ON t.uid = g.uid WHERE g.updated_at >= ? GROUP BY uid LIMIT ?") +func (m *customNhTriballyUserModel) FindUpdateTriballyUsers(ctx context.Context, start, end time.Time, count int) ([]*TriballyUserChapter, error) { + query := fmt.Sprintf("SELECT t.uid, t.chapter, MAX(g.chapter) as max_chapter, g.updated_at FROM nh_tribally_user t JOIN nh_game_report g ON t.uid = g.uid WHERE g.updated_at >= ? AND g.updated_at < ? AND g.chapter > t.chapter GROUP BY uid LIMIT ?") var result []*TriballyUserChapter - err := m.conn.QueryRowsCtx(ctx, &result, query, t, count) + err := m.conn.QueryRowsCtx(ctx, &result, query, start, end, count) if err != nil && !errors.Is(err, sqlx.ErrNotFound) { return nil, err } diff --git a/internal/pkg/tribally/tribally.go b/internal/pkg/tribally/tribally.go index 3d3befb..886df98 100644 --- a/internal/pkg/tribally/tribally.go +++ b/internal/pkg/tribally/tribally.go @@ -1,6 +1,7 @@ package tribally import ( + "bytes" "encoding/json" "errors" "fmt" @@ -8,6 +9,7 @@ import ( "io" "net/http" "strings" + "time" ) func BindTribally(apiKey, userId string) (string, error) { @@ -92,3 +94,61 @@ func VerifyTribally(token string) error { return nil } + +type UserChapter struct { + Email string `json:"email"` + Chapter int `json:"chapter"` +} + +func PostUserChapter(apiKey string, chapters ...UserChapter) error { + var players []map[string]any + for _, c := range chapters { + players = append(players, map[string]any{ + "playerId": c.Email, + "isWinner": true, + "chapter": c.Chapter, + }) + } + arg := map[string]any{ + "activityId": "abc1234", + "gameStartedAt": time.Now().Format(time.DateTime), + "players": players, + } + + body, err := json.Marshal(arg) + if err != nil { + return err + } + + url := "https://api.tribally.games/activity/create" + req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(body)) + if err != nil { + return err + } + req.Header.Add("Content-Type", "application/json") + req.Header.Add("Accept", "application/json") + req.Header.Add("x-api-key", apiKey) + res, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return errors.New(res.Status) + } + result := struct { + Error string `json:"error"` + Code string `json:"code"` + }{} + data, _ := io.ReadAll(res.Body) + fmt.Println(string(data)) + return nil + err = json.NewDecoder(res.Body).Decode(&result) + if err != nil { + return err + } + if result.Error != "" { + return fmt.Errorf("error: %s, code: %s", result.Error, result.Code) + } + return nil +} diff --git a/internal/pkg/tribally/tribally_test.go b/internal/pkg/tribally/tribally_test.go new file mode 100644 index 0000000..1464f98 --- /dev/null +++ b/internal/pkg/tribally/tribally_test.go @@ -0,0 +1,25 @@ +package tribally + +import ( + "fmt" + "github.com/stretchr/testify/require" + "testing" +) + +const ( + apiKey = "088847b7172bdffa1eb564a581bcf903" +) + +func TestBindTribally(t *testing.T) { + url, err := BindTribally(apiKey, "lhj168os@gmail.com") + require.Nil(t, err) + fmt.Println(url) +} + +func TestPostUserChapter(t *testing.T) { + err := PostUserChapter(apiKey, UserChapter{ + Email: "lhj168os@gmail.com", + Chapter: 3, + }) + require.Nil(t, err) +}