Commit e7e42a26b9fd15b01456c4000ddcb1ab65445267
1 parent
35c0874e
Exists in
master
and in
1 other branch
feat✨:星星商店活动切换自动兑换
Showing
9 changed files
with
191 additions
and
29 deletions
Show diff stats
controllers/cardholder.go
| @@ -57,3 +57,15 @@ func (c *CardHolderController) ShopExchange() { | @@ -57,3 +57,15 @@ func (c *CardHolderController) ShopExchange() { | ||
| 57 | 57 | ||
| 58 | c.RetRspCodeData(code, rsp) | 58 | c.RetRspCodeData(code, rsp) |
| 59 | } | 59 | } |
| 60 | + | ||
| 61 | +// AutoExchangeInfo 上期剩余星星自动兑换信息 | ||
| 62 | +func (c *CardHolderController) AutoExchangeInfo() { | ||
| 63 | + req := new(models.ReqAutoExchangeInfo) | ||
| 64 | + if !c.GetPostData(req) { | ||
| 65 | + return | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + code, rsp := cardholder.HandleAutoExchangeInfo(req) | ||
| 69 | + | ||
| 70 | + c.RetRspCodeData(code, rsp) | ||
| 71 | +} |
dto/cardholder.go
| @@ -26,6 +26,8 @@ type CardHolderDataDetails struct { | @@ -26,6 +26,8 @@ type CardHolderDataDetails struct { | ||
| 26 | CardSequenceScales map[string]int // 卡牌序列刻度 k=ID_用户序列_用户分组 v=刻度 | 26 | CardSequenceScales map[string]int // 卡牌序列刻度 k=ID_用户序列_用户分组 v=刻度 |
| 27 | Round int // 卡册当前轮次 | 27 | Round int // 卡册当前轮次 |
| 28 | StarCount int // 星星点数 | 28 | StarCount int // 星星点数 |
| 29 | + LastStarCount int // 上期活动剩余星星点数 | ||
| 30 | + AutoExchangeHolder []int // 活动切换时自动兑换的卡包列表 | ||
| 29 | } | 31 | } |
| 30 | 32 | ||
| 31 | func NewCardHolderData(uid int64) *CardHolderData { | 33 | func NewCardHolderData(uid int64) *CardHolderData { |
| @@ -44,6 +46,8 @@ func NewCardHolderDataDetails() *CardHolderDataDetails { | @@ -44,6 +46,8 @@ func NewCardHolderDataDetails() *CardHolderDataDetails { | ||
| 44 | StarSequenceScales: make(map[string]int), | 46 | StarSequenceScales: make(map[string]int), |
| 45 | CardSequenceScales: make(map[string]int), | 47 | CardSequenceScales: make(map[string]int), |
| 46 | Round: 1, | 48 | Round: 1, |
| 49 | + StarCount: 0, | ||
| 50 | + AutoExchangeHolder: make([]int, 0), | ||
| 47 | } | 51 | } |
| 48 | } | 52 | } |
| 49 | 53 |
go.mod
| @@ -9,6 +9,7 @@ require ( | @@ -9,6 +9,7 @@ require ( | ||
| 9 | github.com/garyburd/redigo v1.6.4 | 9 | github.com/garyburd/redigo v1.6.4 |
| 10 | github.com/go-sql-driver/mysql v1.7.0 | 10 | github.com/go-sql-driver/mysql v1.7.0 |
| 11 | github.com/lixu-any/go-tools v0.0.0-20221128094643-07d54c69e9bf | 11 | github.com/lixu-any/go-tools v0.0.0-20221128094643-07d54c69e9bf |
| 12 | + github.com/samber/lo v1.39.0 | ||
| 12 | gorm.io/driver/mysql v1.5.6 | 13 | gorm.io/driver/mysql v1.5.6 |
| 13 | gorm.io/gorm v1.25.9 | 14 | gorm.io/gorm v1.25.9 |
| 14 | ) | 15 | ) |
| @@ -34,11 +35,12 @@ require ( | @@ -34,11 +35,12 @@ require ( | ||
| 34 | github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect | 35 | github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect |
| 35 | go.uber.org/atomic v1.5.0 // indirect | 36 | go.uber.org/atomic v1.5.0 // indirect |
| 36 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect | 37 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect |
| 38 | + golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect | ||
| 37 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de // indirect | 39 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de // indirect |
| 38 | - golang.org/x/net v0.0.0-20201021035429-f5854403a974 // indirect | ||
| 39 | - golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f // indirect | ||
| 40 | - golang.org/x/text v0.3.3 // indirect | ||
| 41 | - golang.org/x/tools v0.0.0-20210106214847-113979e3529a // indirect | 40 | + golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect |
| 41 | + golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 // indirect | ||
| 42 | + golang.org/x/text v0.3.7 // indirect | ||
| 43 | + golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023 // indirect | ||
| 42 | google.golang.org/protobuf v1.25.0 // indirect | 44 | google.golang.org/protobuf v1.25.0 // indirect |
| 43 | gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect | 45 | gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect |
| 44 | gopkg.in/yaml.v2 v2.2.8 // indirect | 46 | gopkg.in/yaml.v2 v2.2.8 // indirect |
go.sum
| @@ -333,6 +333,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So | @@ -333,6 +333,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So | ||
| 333 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | 333 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= |
| 334 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= | 334 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= |
| 335 | github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= | 335 | github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= |
| 336 | +github.com/samber/lo v1.39.0 h1:4gTz1wUhNYLhFSKl6O+8peW0v2F4BCY034GRpU9WnuA= | ||
| 337 | +github.com/samber/lo v1.39.0/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= | ||
| 336 | github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= | 338 | github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= |
| 337 | github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= | 339 | github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= |
| 338 | github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo= | 340 | github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo= |
| @@ -400,6 +402,8 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh | @@ -400,6 +402,8 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh | ||
| 400 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= | 402 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= |
| 401 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | 403 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= |
| 402 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | 404 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= |
| 405 | +golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM= | ||
| 406 | +golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= | ||
| 403 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | 407 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= |
| 404 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= | 408 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= |
| 405 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | 409 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= |
| @@ -428,8 +432,9 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL | @@ -428,8 +432,9 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL | ||
| 428 | golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | 432 | golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= |
| 429 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | 433 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= |
| 430 | golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= | 434 | golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= |
| 431 | -golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= | ||
| 432 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | 435 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= |
| 436 | +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= | ||
| 437 | +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||
| 433 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | 438 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= |
| 434 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | 439 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= |
| 435 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | 440 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= |
| @@ -460,12 +465,14 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w | @@ -460,12 +465,14 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w | ||
| 460 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | 465 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
| 461 | golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | 466 | golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
| 462 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | 467 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
| 463 | -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= | ||
| 464 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | 468 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
| 469 | +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0= | ||
| 470 | +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||
| 465 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | 471 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= |
| 466 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | 472 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= |
| 467 | -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= | ||
| 468 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | 473 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= |
| 474 | +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= | ||
| 475 | +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | ||
| 469 | golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | 476 | golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= |
| 470 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | 477 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= |
| 471 | golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | 478 | golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= |
| @@ -484,8 +491,9 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn | @@ -484,8 +491,9 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn | ||
| 484 | golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | 491 | golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= |
| 485 | golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | 492 | golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= |
| 486 | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | 493 | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= |
| 487 | -golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ= | ||
| 488 | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | 494 | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= |
| 495 | +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023 h1:0c3L82FDQ5rt1bjTBlchS8t6RQ6299/+5bWMnRLh+uI= | ||
| 496 | +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= | ||
| 489 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | 497 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |
| 490 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | 498 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |
| 491 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | 499 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |
models/cardholder.go
| @@ -66,3 +66,19 @@ type RspStarShopExchange struct { | @@ -66,3 +66,19 @@ type RspStarShopExchange struct { | ||
| 66 | AwardAlbum map[int]string `form:"award_album" json:"award_album"` // 触发的卡组奖励列表 k=出发的卡组ID v=对应奖励 | 66 | AwardAlbum map[int]string `form:"award_album" json:"award_album"` // 触发的卡组奖励列表 k=出发的卡组ID v=对应奖励 |
| 67 | AwardRound string `form:"award_round" json:"award_round"` // 触发的轮次奖励列表 空字符串未触发 | 67 | AwardRound string `form:"award_round" json:"award_round"` // 触发的轮次奖励列表 空字符串未触发 |
| 68 | } | 68 | } |
| 69 | + | ||
| 70 | +// ReqAutoExchangeInfo 请求 上期剩余星星自动兑换信息 | ||
| 71 | +type ReqAutoExchangeInfo struct { | ||
| 72 | + BaseLoginInfo | ||
| 73 | + BaseSign | ||
| 74 | +} | ||
| 75 | + | ||
| 76 | +// RspAutoExchangeInfo 返回 上期剩余星星自动兑换信息 | ||
| 77 | +type RspAutoExchangeInfo struct { | ||
| 78 | + CardHolderInfo | ||
| 79 | + NewCards []int `form:"new_cards" json:"new_cards"` // 新获得的卡牌列表 | ||
| 80 | + AwardAlbum map[int]string `form:"award_album" json:"award_album"` // 触发的卡组奖励列表 k=出发的卡组ID v=对应奖励 | ||
| 81 | + AwardRound string `form:"award_round" json:"award_round"` // 触发的轮次奖励列表 空字符串未触发 | ||
| 82 | + LastStarCount int `form:"last_star_count" json:"last_star_count"` // 上期活动剩余星星点数 | ||
| 83 | + AutoExchangeHolder []int `form:"auto_exchange_holder" json:"auto_exchange_holder"` // 活动切换时自动兑换的卡包列表 | ||
| 84 | +} |
routers/router.go
| @@ -17,8 +17,10 @@ func init() { | @@ -17,8 +17,10 @@ func init() { | ||
| 17 | beego.Router(prefix+"/cardholder/info", &controllers.CardHolderController{}, "post:Info") | 17 | beego.Router(prefix+"/cardholder/info", &controllers.CardHolderController{}, "post:Info") |
| 18 | // 卡包打开 | 18 | // 卡包打开 |
| 19 | beego.Router(prefix+"/cardholder/open", &controllers.CardHolderController{}, "post:Open") | 19 | beego.Router(prefix+"/cardholder/open", &controllers.CardHolderController{}, "post:Open") |
| 20 | - // 卡包打开 | 20 | + // 星星商店兑换 |
| 21 | beego.Router(prefix+"/cardholder/shopexchange", &controllers.CardHolderController{}, "post:ShopExchange") | 21 | beego.Router(prefix+"/cardholder/shopexchange", &controllers.CardHolderController{}, "post:ShopExchange") |
| 22 | + // 上期剩余星星自动兑换信息 | ||
| 23 | + beego.Router(prefix+"/cardholder/autoexchangeinfo", &controllers.CardHolderController{}, "post:AutoExchangeInfo") | ||
| 22 | 24 | ||
| 23 | beego.ErrorController(&controllers.ErrorController{}) | 25 | beego.ErrorController(&controllers.ErrorController{}) |
| 24 | } | 26 | } |
service/cardholder/handle.go
| @@ -47,7 +47,7 @@ func HandleInfo(req *models.ReqCardHolderInfo) (code string, rsp models.RspCardH | @@ -47,7 +47,7 @@ func HandleInfo(req *models.ReqCardHolderInfo) (code string, rsp models.RspCardH | ||
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | // 读取游戏数据 | 49 | // 读取游戏数据 |
| 50 | - gameData := LoadData(req.GameID, req.UID, config.Id) | 50 | + gameData := LoadData(req.GameID, req.UID, config) |
| 51 | 51 | ||
| 52 | rsp.CardHolderInfo = GetInfo(gameData, config) | 52 | rsp.CardHolderInfo = GetInfo(gameData, config) |
| 53 | 53 | ||
| @@ -84,7 +84,7 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH | @@ -84,7 +84,7 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH | ||
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | // 读取游戏数据 | 86 | // 读取游戏数据 |
| 87 | - gameData := LoadData(req.GameID, req.UID, config.Id) | 87 | + gameData := LoadData(req.GameID, req.UID, config) |
| 88 | // 检查游戏数据 轮次等 | 88 | // 检查游戏数据 轮次等 |
| 89 | code = CheckGameData(gameData, config) | 89 | code = CheckGameData(gameData, config) |
| 90 | if code != constd.RECODE_OK { | 90 | if code != constd.RECODE_OK { |
| @@ -93,7 +93,7 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH | @@ -93,7 +93,7 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH | ||
| 93 | 93 | ||
| 94 | // 开始处理抽卡 | 94 | // 开始处理抽卡 |
| 95 | openMode := 0 | 95 | openMode := 0 |
| 96 | - sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID) | 96 | + sequenceId, cohort := GetUserSequenceIdAndCohort(gameData.Uid) |
| 97 | allNewCards := make([]int, 0) | 97 | allNewCards := make([]int, 0) |
| 98 | for _, idCardholder := range req.Ids { | 98 | for _, idCardholder := range req.Ids { |
| 99 | confCardholder, _ := config.CardholderConfig[strconv.Itoa(idCardholder)] | 99 | confCardholder, _ := config.CardholderConfig[strconv.Itoa(idCardholder)] |
| @@ -157,7 +157,7 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model | @@ -157,7 +157,7 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model | ||
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | // 读取游戏数据 | 159 | // 读取游戏数据 |
| 160 | - gameData := LoadData(req.GameID, req.UID, config.Id) | 160 | + gameData := LoadData(req.GameID, req.UID, config) |
| 161 | // 检查游戏数据 轮次等 | 161 | // 检查游戏数据 轮次等 |
| 162 | code = CheckGameData(gameData, config) | 162 | code = CheckGameData(gameData, config) |
| 163 | if code != constd.RECODE_OK { | 163 | if code != constd.RECODE_OK { |
| @@ -201,7 +201,7 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model | @@ -201,7 +201,7 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model | ||
| 201 | 201 | ||
| 202 | // 开始处理抽卡 | 202 | // 开始处理抽卡 |
| 203 | openMode := 1 | 203 | openMode := 1 |
| 204 | - sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID) | 204 | + sequenceId, cohort := GetUserSequenceIdAndCohort(gameData.Uid) |
| 205 | for i := 0; i < cardholderCount; i++ { | 205 | for i := 0; i < cardholderCount; i++ { |
| 206 | newCards := DoOpen(req.GameID, | 206 | newCards := DoOpen(req.GameID, |
| 207 | gameData, config, | 207 | gameData, config, |
| @@ -233,3 +233,62 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model | @@ -233,3 +233,62 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model | ||
| 233 | 233 | ||
| 234 | return | 234 | return |
| 235 | } | 235 | } |
| 236 | + | ||
| 237 | +// HandleAutoExchangeInfo 上期剩余星星自动兑换信息 | ||
| 238 | +func HandleAutoExchangeInfo(req *models.ReqAutoExchangeInfo) (code string, rsp models.RspAutoExchangeInfo) { | ||
| 239 | + rsp = models.RspAutoExchangeInfo{ | ||
| 240 | + NewCards: make([]int, 0), | ||
| 241 | + AwardAlbum: make(map[int]string), | ||
| 242 | + AutoExchangeHolder: make([]int, 0), | ||
| 243 | + } | ||
| 244 | + code = constd.RECODE_OK | ||
| 245 | + | ||
| 246 | + // 尝试更新配置 | ||
| 247 | + config, hasConfig := TryUpdateConfig(req.GameID) | ||
| 248 | + if !hasConfig { | ||
| 249 | + code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR | ||
| 250 | + return | ||
| 251 | + } | ||
| 252 | + | ||
| 253 | + // 检查活动状态 | ||
| 254 | + code = CheckStatus(config) | ||
| 255 | + if code != constd.RECODE_OK { | ||
| 256 | + return | ||
| 257 | + } | ||
| 258 | + | ||
| 259 | + // 读取游戏数据 | ||
| 260 | + gameData := LoadData(req.GameID, req.UID, config) | ||
| 261 | + // 检查游戏数据 轮次等 | ||
| 262 | + code = CheckGameData(gameData, config) | ||
| 263 | + if code != constd.RECODE_OK { | ||
| 264 | + return | ||
| 265 | + } | ||
| 266 | + | ||
| 267 | + if gameData.Details.LastStarCount <= 0 { | ||
| 268 | + code = constd.RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR | ||
| 269 | + return | ||
| 270 | + } | ||
| 271 | + | ||
| 272 | + rsp.LastStarCount = gameData.Details.LastStarCount | ||
| 273 | + for _, i2 := range gameData.Details.AutoExchangeHolder { | ||
| 274 | + rsp.AutoExchangeHolder = append(rsp.AutoExchangeHolder, i2) | ||
| 275 | + } | ||
| 276 | + // 把当前的卡包内数据放在新卡数据里给客户端 | ||
| 277 | + for i1, i2 := range gameData.Details.Cards { | ||
| 278 | + for i := 0; i < i2; i++ { | ||
| 279 | + rsp.NewCards = append(rsp.NewCards, i1) | ||
| 280 | + } | ||
| 281 | + } | ||
| 282 | + | ||
| 283 | + gameData.Details.LastStarCount = 0 | ||
| 284 | + gameData.Details.AutoExchangeHolder = make([]int, 0) | ||
| 285 | + // 存档 | ||
| 286 | + SaveData(req.GameID, gameData) | ||
| 287 | + | ||
| 288 | + utslice.Shuffle(rsp.NewCards) | ||
| 289 | + | ||
| 290 | + // 返回信息 | ||
| 291 | + rsp.CardHolderInfo = GetInfo(gameData, config) | ||
| 292 | + | ||
| 293 | + return | ||
| 294 | +} |
service/cardholder/logic.go
| @@ -9,6 +9,9 @@ import ( | @@ -9,6 +9,9 @@ import ( | ||
| 9 | "apigame/util/utjson" | 9 | "apigame/util/utjson" |
| 10 | "apigame/util/utslice" | 10 | "apigame/util/utslice" |
| 11 | "apigame/util/utstring" | 11 | "apigame/util/utstring" |
| 12 | + "github.com/samber/lo" | ||
| 13 | + "sort" | ||
| 14 | + "strconv" | ||
| 12 | ) | 15 | ) |
| 13 | 16 | ||
| 14 | // SaveData 存储数据 | 17 | // SaveData 存储数据 |
| @@ -35,13 +38,23 @@ func _LoadData(gameId string, uid int64) (d *dto.CardHolderData) { | @@ -35,13 +38,23 @@ func _LoadData(gameId string, uid int64) (d *dto.CardHolderData) { | ||
| 35 | } | 38 | } |
| 36 | 39 | ||
| 37 | // LoadData 获取数据 外部接口 | 40 | // LoadData 获取数据 外部接口 |
| 38 | -func LoadData(gameId string, uid int64, configId int64) (d *dto.CardHolderData) { | 41 | +func LoadData(gameId string, uid int64, config *CardActivityConfig) (d *dto.CardHolderData) { |
| 42 | + configId := config.Id | ||
| 39 | d = _LoadData(gameId, uid) | 43 | d = _LoadData(gameId, uid) |
| 40 | // 如果当前有上线活动(活动ID不为0),且活动ID和玩家数据不同,说明活动已切换 需更新 | 44 | // 如果当前有上线活动(活动ID不为0),且活动ID和玩家数据不同,说明活动已切换 需更新 |
| 41 | if configId != 0 && | 45 | if configId != 0 && |
| 42 | configId != d.ActivityId { | 46 | configId != d.ActivityId { |
| 47 | + | ||
| 48 | + // 剩余的星星数 | ||
| 49 | + starCount := d.Details.StarCount | ||
| 50 | + | ||
| 43 | d.ActivityId = configId | 51 | d.ActivityId = configId |
| 44 | d.Details = dto.NewCardHolderDataDetails() | 52 | d.Details = dto.NewCardHolderDataDetails() |
| 53 | + | ||
| 54 | + // 使用剩余的星星数来自动兑换卡包 | ||
| 55 | + d.Details.LastStarCount = starCount | ||
| 56 | + NextActivityAutoExchange(gameId, d, config) | ||
| 57 | + | ||
| 45 | SaveData(gameId, d) | 58 | SaveData(gameId, d) |
| 46 | } | 59 | } |
| 47 | return | 60 | return |
| @@ -388,3 +401,47 @@ func GetStarCardList(gameData *dto.CardHolderData, config *CardActivityConfig, n | @@ -388,3 +401,47 @@ func GetStarCardList(gameData *dto.CardHolderData, config *CardActivityConfig, n | ||
| 388 | 401 | ||
| 389 | return | 402 | return |
| 390 | } | 403 | } |
| 404 | + | ||
| 405 | +// NextActivityAutoExchange 活动切换时自动兑换卡包 | ||
| 406 | +func NextActivityAutoExchange(gameId string, gameData *dto.CardHolderData, config *CardActivityConfig) { | ||
| 407 | + starCount := gameData.Details.LastStarCount | ||
| 408 | + // 把星星的配置按照需要的星星数降序排列 | ||
| 409 | + list := lo.Values[int, StarShopConfig](config.StarShopConfig) | ||
| 410 | + sort.Slice(list, func(i, j int) bool { | ||
| 411 | + return list[i].NeedStarNumber < list[j].NeedStarNumber | ||
| 412 | + }) | ||
| 413 | + list = lo.Reverse(list) | ||
| 414 | + // 遍历 | ||
| 415 | + for _, config := range list { | ||
| 416 | + for starCount >= config.NeedStarNumber { | ||
| 417 | + gameData.Details.AutoExchangeHolder = append(gameData.Details.AutoExchangeHolder, config.Id) | ||
| 418 | + starCount -= config.NeedStarNumber | ||
| 419 | + } | ||
| 420 | + } | ||
| 421 | + | ||
| 422 | + // 开始处理抽卡 | ||
| 423 | + openMode := 2 | ||
| 424 | + sequenceId, cohort := GetUserSequenceIdAndCohort(gameData.Uid) | ||
| 425 | + allNewCards := make([]int, 0) | ||
| 426 | + for _, idCardholder := range gameData.Details.AutoExchangeHolder { | ||
| 427 | + confCardholder, _ := config.CardholderConfig[strconv.Itoa(idCardholder)] | ||
| 428 | + newCards := DoOpen(gameId, | ||
| 429 | + gameData, config, | ||
| 430 | + confCardholder, | ||
| 431 | + sequenceId, cohort, | ||
| 432 | + openMode) | ||
| 433 | + // 打乱顺序 | ||
| 434 | + utslice.Shuffle(newCards) | ||
| 435 | + for _, i3 := range newCards { | ||
| 436 | + allNewCards = append(allNewCards, i3) | ||
| 437 | + } | ||
| 438 | + } | ||
| 439 | + _, _ = DoOpenCheckAward(gameId, | ||
| 440 | + gameData, config, | ||
| 441 | + sequenceId, cohort, | ||
| 442 | + allNewCards, | ||
| 443 | + openMode) | ||
| 444 | + | ||
| 445 | + // 计算星星点数 | ||
| 446 | + CalculateStarCount(gameData, config) | ||
| 447 | +} |
service/constd/code-msg.go
| @@ -40,13 +40,14 @@ const ( | @@ -40,13 +40,14 @@ const ( | ||
| 40 | RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR = "2051" | 40 | RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR = "2051" |
| 41 | RECODE_MERGE_QINGXIANGMTXZ_ERROR = "2052" | 41 | RECODE_MERGE_QINGXIANGMTXZ_ERROR = "2052" |
| 42 | 42 | ||
| 43 | - RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR = "2100" | ||
| 44 | - RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR = "2101" | ||
| 45 | - RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR = "2102" | ||
| 46 | - RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR = "2103" | ||
| 47 | - RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR = "2104" | ||
| 48 | - RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR = "2105" | ||
| 49 | - RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR = "2106" | 43 | + RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR = "2100" |
| 44 | + RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR = "2101" | ||
| 45 | + RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR = "2102" | ||
| 46 | + RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR = "2103" | ||
| 47 | + RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR = "2104" | ||
| 48 | + RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR = "2105" | ||
| 49 | + RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR = "2106" | ||
| 50 | + RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR = "2107" | ||
| 50 | ) | 51 | ) |
| 51 | 52 | ||
| 52 | var recodeText = map[string]string{ | 53 | var recodeText = map[string]string{ |
| @@ -87,13 +88,14 @@ var recodeText = map[string]string{ | @@ -87,13 +88,14 @@ var recodeText = map[string]string{ | ||
| 87 | RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR: "通行证不存在", | 88 | RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR: "通行证不存在", |
| 88 | RECODE_MERGE_QINGXIANGMTXZ_ERROR: "请先购买通行证", | 89 | RECODE_MERGE_QINGXIANGMTXZ_ERROR: "请先购买通行证", |
| 89 | 90 | ||
| 90 | - RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR: "活动未开放", | ||
| 91 | - RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR: "活动未开始", | ||
| 92 | - RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR: "活动已结束", | ||
| 93 | - RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR: "活动轮次已全部完成", | ||
| 94 | - RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR: "卡包ID错误", | ||
| 95 | - RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR: "商店ID错误", | ||
| 96 | - RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR: "星星商店星星不足", | 91 | + RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR: "活动未开放", |
| 92 | + RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR: "活动未开始", | ||
| 93 | + RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR: "活动已结束", | ||
| 94 | + RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR: "活动轮次已全部完成", | ||
| 95 | + RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR: "卡包ID错误", | ||
| 96 | + RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR: "商店ID错误", | ||
| 97 | + RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR: "星星商店星星不足", | ||
| 98 | + RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR: "没有星星商店自动兑换信息", | ||
| 97 | } | 99 | } |
| 98 | 100 | ||
| 99 | func RecodeText(code string) string { | 101 | func RecodeText(code string) string { |