init
commit
e7f61a6c6e
@ -0,0 +1,34 @@
|
|||||||
|
FROM golang:1.20-alpine as build
|
||||||
|
|
||||||
|
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
|
||||||
|
|
||||||
|
RUN apk --no-cache add tzdata \
|
||||||
|
&& apk --no-cache add ca-certificates \
|
||||||
|
&& update-ca-certificates
|
||||||
|
|
||||||
|
#设置 GO 环境变量
|
||||||
|
ENV CGO_ENABLED=0
|
||||||
|
ENV GO111MODULE=on
|
||||||
|
ENV GOPROXY=https://mirrors.aliyun.com/goproxy/
|
||||||
|
ENV GOPRIVATE=gits.branchcn.com/backend
|
||||||
|
|
||||||
|
WORKDIR /joybuywork
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN go build -o joybuywork ./cmd/joybuywork/joybuywork.go
|
||||||
|
|
||||||
|
FROM scratch as final
|
||||||
|
|
||||||
|
# 设置时区为上海
|
||||||
|
COPY --from=build /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai
|
||||||
|
ENV TZ=Asia/Shanghai
|
||||||
|
|
||||||
|
COPY --from=build /joybuywork/joybuywork /
|
||||||
|
COPY --from=build /joybuywork/asset/ /asset/
|
||||||
|
COPY --from=build /joybuywork/etc/ /etc/
|
||||||
|
COPY --from=build /joybuywork/tmp/ /tmp/
|
||||||
|
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
|
||||||
|
|
||||||
|
ENTRYPOINT [ "/joybuywork", "-env" ]
|
||||||
|
CMD ["prod"]
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
# 构建
|
||||||
|
FROM go_base_image:latest as build
|
||||||
|
|
||||||
|
# 设置工作目录
|
||||||
|
WORKDIR /joybuywork
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN go build -o joybuywork ./cmd/joybuywork/joybuywork.go
|
||||||
|
|
||||||
|
FROM scratch as final
|
||||||
|
|
||||||
|
# 设置时区为上海
|
||||||
|
COPY --from=build /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai
|
||||||
|
ENV TZ=Asia/Shanghai
|
||||||
|
|
||||||
|
COPY --from=build /joybuywork/joybuywork /
|
||||||
|
COPY --from=build /joybuywork/asset/ /asset/
|
||||||
|
COPY --from=build /joybuywork/etc/ /etc/
|
||||||
|
COPY --from=build /joybuywork/tmp/ /tmp/
|
||||||
|
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
|
||||||
|
|
||||||
|
ENTRYPOINT [ "/joybuywork", "-env" ]
|
||||||
|
CMD ["prod"]
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
gopath:=$(shell go env gopath)
|
||||||
|
|
||||||
|
.phony: all
|
||||||
|
all:
|
||||||
|
@echo "hello world!"
|
||||||
|
|
||||||
|
.phony: microg
|
||||||
|
microg:
|
||||||
|
go install gits.branchcn.com/backend/microcode/microg@upgrade
|
||||||
|
|
||||||
|
#启动环境
|
||||||
|
.phony: run
|
||||||
|
run:
|
||||||
|
@go run cmd/joybuywork/joybuywork.go -env=dev
|
||||||
|
|
||||||
|
#启动环境
|
||||||
|
.phony: build
|
||||||
|
build:
|
||||||
|
@go build -o main ./cmd/joybuywork/joybuywork.go
|
||||||
|
|
||||||
|
#启动环境
|
||||||
|
.phony: vet
|
||||||
|
vet:
|
||||||
|
@go vet cmd/joybuywork/joybuywork.go
|
||||||
|
|
||||||
|
.phony: docker-run
|
||||||
|
docker-run:
|
||||||
|
docker build -f dockerfile-local -t joybuywork/v1 . && docker run --name joybuywork -d joybuywork/v1
|
||||||
|
|
||||||
|
.phony: pkg
|
||||||
|
pkg:
|
||||||
|
@go get gits.branchcn.com/backend/microcode/plugins
|
||||||
|
|
||||||
|
.phony: deeplink
|
||||||
|
deeplink:
|
||||||
|
@go get gits.branchcn.com/backend/deeplink/proto/go_proto
|
||||||
|
|
||||||
|
.phony: ct
|
||||||
|
ct:
|
||||||
|
@go get gits.branchcn.com/backend/certified/proto/go_proto
|
||||||
|
|
||||||
|
.phony: bi
|
||||||
|
bi:
|
||||||
|
@echo go get gits.branchcn.com/backend/fissionbi/proto/go_proto
|
||||||
|
@go get gits.branchcn.com/backend/fissionbi/proto/go_proto
|
||||||
|
|
||||||
|
.phony: bq
|
||||||
|
bq:
|
||||||
|
@echo go run tools/bqueue/main.go -t=$(t) -k=$(k)
|
||||||
|
@go run tools/bqueue/main.go -t=$(t) -k=$(k)
|
||||||
|
|
||||||
|
.phony: op
|
||||||
|
op:
|
||||||
|
go get gits.branchcn.com/backend/oplatform/proto/go_proto
|
||||||
|
|
||||||
|
.phony: ai
|
||||||
|
ai:
|
||||||
|
@go get gits.branchcn.com/backend/deepai/proto/go_proto
|
||||||
|
|
||||||
|
.phony: tc
|
||||||
|
tc:
|
||||||
|
go get gits.branchcn.com/backend/taskcenter/proto/go_proto
|
||||||
@ -0,0 +1,892 @@
|
|||||||
|
{
|
||||||
|
"accounts": {
|
||||||
|
"test": "ca-pub-2821871715805907",
|
||||||
|
"prod": "ca-pub-2821871715805907"
|
||||||
|
},
|
||||||
|
"webs": [
|
||||||
|
{
|
||||||
|
"host": "https://moads-test.allapp.link",
|
||||||
|
"uris": [
|
||||||
|
{
|
||||||
|
"uri": "/article/bloober-team-reveals-how-long-it-will-take-to-beat-silent-hill-2-remake"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/dc-chronicles-black-canarys-toughest-battle-ever-in-best-of-the-best"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/disney-tweets-then-deletes-video-featuring-first-looks-at-daredevil-red-hulk-ironheart-and-more"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/exclusive-amazon-games-boss-says-lord-of-the-rings-mmo-still-early-calls-tomb-raider-a-huge-huge-task"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/former-zelda-directorled-open-world-dress-up-rpg-infinity-nikki-hits-12-million-preregistrations"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/george-rr-martin-asked-what-hed-change-about-game-of-thrones-books-id-have-them-finished"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/guillermo-del-toro-is-livetweeting-his-beef-with-a-ghost-in-a-haunted-hotel-in-scotland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/how-datamining-has-changed-the-landscape-of-video-game-puzzle-and-secret-design"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/how-teenage-mutant-ninja-turtles-x-naruto-combines-two-legendary-ninja-universes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/how-the-lord-of-the-rings-the-war-of-the-rohirrim-connects-to-the-other-movies"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/how-to-follow-the-complete-dragon-age-timeline"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/ign-plus-games-claim-a-free-weapon-of-choice-dx-steam-key"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/in-black-myth-wukong-you-can-summon-one-boss-to-beat-another-boss-while-basically-doing-nothing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/jack-black-and-paul-rudd-in-talks-to-star-in-a-new-anaconda-movie-report"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/joker-director-todd-phillips-says-hulk-hogan-biopic-with-chris-hemsworth-no-longer-happening"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/legacy-of-kain-soul-reaver-the-dead-shall-rise-reveals-official-trailer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/microsoft-announces-october-release-date-for-alldigital-xbox-series-x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/microsoft-expands-on-xbox-adaptive-controller-with-new-joystick-peripheral"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/new-tomb-raider-statue-captures-lara-croft-in-action"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/power-rangers-prime-is-a-new-beginning-for-the-franchise"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/sid-meiers-civilization-7-heres-what-comes-in-each-edition"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/the-art-of-dragon-age-the-veilguard-revealed-by-dark-horse"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/the-deathadder-v3-hyperspeed-proves-why-razers-flagship-mouse-still-rules"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/the-golem-of-venice-beach-unites-superstar-comic-book-artists-for-explosive-finale"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/article/the-lord-of-the-rings-the-war-of-the-rohirrim-animated-movie-reveals-first-trailer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/amazon-games-ceo-thinks-genai-can-help-make-better-ideas-for-games"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/animal-crossing-pocket-camp-is-shutting-down-in-november-then-reopening-as-a-paid-game"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/atari-ceo-wants-infogrames-to-become-the-ultimate-preservationist-publisher"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/backyard-sports-is-back-after-an-extended-offseason-via-playground-productions"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/behind-the-gdc-scenes-with-beth-elderkin-and-sam-warnke-game-developer-podcast-ep-43"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/black-myth-wukong-has-sold-10-million-copies-worldwide"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/black-myth-wukong-opens-to-22-million-steam-players"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/cma-closes-yearslong-investigation-into-apples-inapp-payments"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/call-of-duty-uncouples-warzone-from-annual-schedule-with-platform-overhaul"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/cyberpunk-and-phantom-liberty-remain-big-drivers-behind-cd-projekts-revenue-growth"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/embracer-appoints-thomas-kœgler-as-the-ceo-of-asmodee"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/embracer-boss-says-volatile-pc-and-console-business-is-the-bad-guy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/helldivers-2-and-dead-island-2-support-studio-toadman-interactive-confirms-layoffs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/how-to-build-a-team-and-start-developing-a-game-by-being-a-simple-manager"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/hunt-showdown-sees-new-concurrent-player-high-with-1896-update"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/iron-galaxy-coceo-adam-boyes-to-exit-after-8year-stint"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/kwalee-releases-arabic-version-of-mobile-game-platform-for-mena-devs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/mad-crusader-puts-30-million-toward-doublea-games-reopens-transmedia-incubation-program"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/mental-health-in-games-charity-take-this-is-facing-extinction"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/microsoft-really-wants-you-to-know-day-one-releases-no-longer-standard-on-xbox-game-pass"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/new-steam-tweaks-let-devs-highlight-related-games-and-dlc-on-store-pages"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/nightmare-porting-process-drove-haak-developer-blingame-to-cancel-xbox-version"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/nintendo-ends-new-3ds-repair-support-after-draining-parts-supply"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/north-beach-games-opens-prague-studio-to-support-itself-and-smaller-devs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/obituary-atsuko-tanaka-game-and-anime-voice-actor-dies-at-age-61"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/pantaloon-helps-out-indie-devs-with-free-resource-hub"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/patch-notes-1-dispatches-from-amaze-sheffield"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/patch-notes-2-how-does-the-game-industry-survive-beyond-2025"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/phil-spencer-indiana-jones-ps5-jump-good-for-xboxs-health"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/physical-games-can-help-drive-digital-sales-says-maximum-entertainment-ceo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/playstation-launches-incubator-project-for-mena-developers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/quantic-dream-writer-adam-williams-departs-to-start-up-his-own-studio"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/randy-pitchford-borderlands-4s-steam-release-isnt-the-end-of-the-pc-store-wars"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/reforged-studios-does-a-double-acquisition-buys-ground-shatter-and-extra-mile"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/reikon-games-ruiner-to-receive-film-adaptation-by-universal-pictures"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/remedy-partners-with-annapurna-to-finance-control-2-and-develop-transmedia-projects"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/report-bungie-fired-veteran-director-after-misconduct-allegations"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/report-netease-cutting-jobs-at-ouka-studios-ahead-of-potential-closure"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/report-until-dawn-remake-developer-ballistic-moon-is-making-layoffs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/roblox-will-let-creators-list-item-bundles-to-grow-their-earnings"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/rogue-snail-decouples-freetoplay-mechanics-from-relic-hunters-legend-after-gearbox-split"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/square-enix-eyes-bigger-xbox-focus-after-pretty-good-final-fantasy-xiv-response"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/steam-reviews-now-reflect-if-a-game-was-played-on-steam-deck"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/survey-spotty-preservation-efforts-risk-significant-loss-for-australian-game-industry"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/survey-reveals-devs-consider-genai-doubleedged-sword-in-game-development"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/the-epic-games-store-debuts-on-altstore-android-and-ios-devices"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/turns-out-dying-light-the-beast-started-out-as-leaked-dying-light-2-dlc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/ubisoft-cuts-45-jobs-across-cary-and-san-francisco-teams"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/virtuos-acquires-codeveloper-third-kind-studios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/visual-concepts-lays-off-staff-at-lego-2k-drive-south-studio"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/a-rising-tide-floats-all-boats-xbox-on-the-universal-benefits-of-accessible-design"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/astro-bot-makes-the-tech-demo-mascot-into-leading-bot-material"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/better-together-making-sense-of-the-frenetic-floating-fleets-in-flock"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/book-excerpt-animal-crossing-tracks-the-rise-of-the-original-cozy-life-sim"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/bridging-history-and-gameplay-lessons-from-historiographical-video-game-design"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/call-for-submissions-lets-talk-about-photography-games"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/categories-of-games-by-player-numbers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/classic-postmortem-the-development-of-the-original-psychonauts-was-a-fraught-experience"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/conjuring-a-gestural-spellcasting-system-for-vr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/deprioritizing-skillbased-matchmaking-turned-call-of-duty-into-the-bad-place"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/exploring-ancient-mexica-culture-through-cooking-in-cacao-cafe"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/firaxis-big-swing-with-civilization-vii-convincing-players-to-actually-finish-their-games"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/from-monopolies-to-tiny-tools-by-solo-devs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/game-ui-database-relaunches-with-new-features-video-support-and-over-55000-screenshots"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/getting-under-the-hood-of-racing-games"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/how-the-team-behind-reus-2-nurtured-a-studio-and-ip-back-to-life"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/humor-is-all-weve-really-got-championing-absurdity-in-thank-goodness-youre-here"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/igf-2024-winners-on-creating-venba-rhythm-doctor-and-more"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/jordan-mechner-recounts-the-tale-of-creating-karateka-from-home"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/leading-the-charge-what-makes-nikkes-titular-gals-narratively-and-mechanically-compelling"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/lessons-on-small-scale-strategy-with-the-xcom-files"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/lets-compare-the-narrative-design-of-tactical-breach-wizards-and-into-the-breach"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/letting-apex-legends-players-go-guns-akimbo-was-harder-than-you-might-think"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/making-a-splash-how-wuthering-waves-characters-draw-players-into-its-world"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/making-the-bloodborne-kart-racer-come-to-life-with-nightmare-kart"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/player-stunts-in-breath-of-the-wild-gave-nintendo-confidence-to-push-boundaries-in-tears-of-the-kingdom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/preserving-the-past-with-charles-cecil-game-developer-podcast-ep-46"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/ranked-four-tiny-screens-to-power-your-tiny-alt-ctrl-dreams"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/road-to-the-igf-2024-with-joel-couture-game-developer-podcast-ep-41"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/star-wars-outlaws-creative-director-says-swedish-pride-in-craftsmanship-was-key-to-development-progress"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/studio-imugi-is-ditching-oatmeal-narrative-design-with-bonapartea-mechanized-revolution"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/supporting-game-design-with-evolutionary-algorithms"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/tactical-breach-wizards-shows-how-strategy-games-can-tickle-the-funny-bone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/the-garden-paths-savviest-design-decision-connecting-to-the-cosmos"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/the-unrealized-potential-of-cooking-in-games"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/the-concerns-of-covering-gacha-games"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/touch-can-bring-people-together-like-nothing-else-sparking-connections-through-video-game-intimacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/training-the-game-designers-of-tomorrow-part-3-of-5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/upcoming-acmi-interactive-exhibition-welcomes-back-a-horrible-goose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/vampire-survivors-development-sounds-like-an-open-sourcefueled-fever-dream"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/war-never-changes-why-innovation-in-game-development-is-still-vital"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/were-currently-choking-to-death-glow-golf-developer-alex-johansson-says-the-industry-must-engage-new-audiences"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/what-makes-the-survival-of-survival-horror-the-difference-between-scares-and-shooting"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/what-exactly-is-a-gamer-and-why-does-it-matter"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/why-fuck-around-and-find-out-became-the-backbone-of-arcos-combat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/design/why-is-black-hair-so-difficult-for-video-games-to-get-right-this-3d-artist-explains"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/as-strength-training-gets-more-popular-peloton-and-planet-fitness-shift-focus"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/bitcoin-rally-helps-create-more-than-84000-new-crypto-millionaires-in-a-year"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/boeing-starliner-returning-empty-as-nasa-turns-to-spacex-to-bring-astronauts-back-from-iss"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/bronfmans-paramount-bid-could-keep-shari-redstone-involved-at-the-company"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/cava-earnings-beat-estimates-as-restaurant-traffic-climbs-nearly-10"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/classic-car-sales-stall-in-monterey-auctions-as-new-generation-takes-charge"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/delta-chief-operations-officer-departing-for-another-company-after-just-over-a-year-on-the-job"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/eli-lilly-releases-new-form-of-weight-loss-drug-zepbound-for-half-the-price-to-boost-access-supply"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/fda-approves-updated-pfizer-moderna-covid-vaccines-as-virus-surges-shots-to-be-available-within-days"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/foot-locker-shares-drop-10-despite-first-comparable-sales-growth-in-six-quarters"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/ford-delays-new-ev-plant-cancels-electric-threerow-suv-as-it-shifts-strategy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/ford-joins-list-of-companies-walking-back-dei-policies"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/home-prices-hit-record-high-in-june-on-sp-caseshiller-index"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/home-sales-rose-in-july-for-the-first-time-in-five-months"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/lego-revenue-jumps-13-in-first-half-of-2024-boosted-by-lego-fortnite-and-diverse-brick-sets"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/macys-cuts-sales-forecast-as-department-stores-struggle-to-draw-shoppers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/mavericks-pelicans-games-are-leaving-their-local-sports-networks-ahead-of-nba-season"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/nfl-owners-vote-in-favor-of-private-equity-investment-select-firms-commit-12-billion"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/nfl-wants-a-cut-of-private-equity-investment-profits"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/nwsl-eliminates-draft-grants-unrestricted-free-agency-to-players"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/nordstrom-shares-climb-5-as-earnings-top-estimates-but-retailer-issues-cautious-guidance"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/nvidia-announces-50-billion-stock-buyback"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/nvidia-reports-122-revenue-growth-on-surging-demand-for-data-center-chips"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/nvidias-earnings-report-shows-the-problem-of-being-priced-for-perfection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/paramount-special-committee-extends-skydance-go-shop-period-as-it-reviews-bronfman-offer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/peloton-shares-soar-35-as-turnaround-plan-takes-hold-losses-shrink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/peloton-to-start-charging-subscribers-with-used-equipment-95-activation-fee"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/restaurants-fight-back-against-the-ftc-crackdown-on-junk-fees-as-diners-balk-at-new-charges"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/shares-of-abercrombie-fitch-plunge-15-after-ceo-warns-of-increasingly-uncertain-environment"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/tj-maxx-owner-raises-fullyear-guidance-posts-56-sales-gain-for-the-most-recent-quarter"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/target-ceo-addresses-price-gouging-accusations-in-retail"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/target-shares-spike-as-profits-rise-despite-cautious-sales-outlook"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/us-will-again-offer-free-athome-covid-tests-starting-in-late-september"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/walmart-adds-a-burger-king-benefit-to-its-membership-program"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/washington-commanders-strike-stadium-naming-rights-deal-with-northwest-federal-credit-union"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/why-ford-believes-its-19-billion-shift-in-ev-strategy-is-the-right-choice-for-the-company-investors"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/yes-network-msg-networks-to-launch-combined-new-york-regional-sports-app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/news/borderlands-4-announced-with-teaser-trailer-at-opening-night-live-gamescom-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/news/civilization-7-interview-firaxis-answers-all-of-our-questions-about-the-anticipated-sequel-gamescom-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/news/crimson-desert-is-like-god-of-war-and-dragons-dogma-had-a-baby-gamescom-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/news/ign-uk-podcast-762-the-best-of-gamescom-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/news/indiana-jones-and-the-great-circle-finally-gets-a-release-date-for-xboxand-playstation-gamescom-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/news/secret-level-every-video-game-in-the-new-gamescom-trailer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/book-excerpt-game-ai-uncovered-volume-one"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/chipwits-the-game-that-taught-a-generation-how-to-code-is-back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/creating-a-spatial-query-system"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/deep-dive-conquering-hardware-hurdles-to-port-kingdom-come-deliverance-to-switch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/deep-dive-console-crossplay-and-how-we-made-it-work-in-insurgency"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/deep-dive-cooking-up-a-palatable-food-prep-experience-in-fruitbus"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/deep-dive-how-owlchemy-adapted-its-vr-titles-for-the-apple-vision-pro"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/deep-dive-the-design-and-implementation-of-object-pools"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/demystifying-3d-character-rigging-for-games"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/finding-a-new-balance-between-ai-and-beneficial-bugs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/how-nintendo-did-the-impossible-with-tears-of-the-kingdoms-physics-system"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/how-to-implement-ai-workflows-that-your-artists-will-actually-want-to-use"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/how-to-get-better-fps-on-pc-while-porting-games-to-consoles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/populating-the-citybuilder-of-the-future-a-deep-dive-into-character-diversity-in-cities-skylines-ii"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/square-enix-is-testing-aidriven-fictional-language-generation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/the-rise-of-generative-ai-in-revolutionizing-game-development"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/unity-sees-webgpu-as-a-growing-market-for-game-development"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/what-is-game-programming-and-how-do-you-become-a-game-programmer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/what-to-do-about-game-engines-with-rez-graham-and-bryant-francis-game-developer-podcast-ep-42"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/5-ways-star-wars-outlaws-connects-to-the-larger-franchise"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/amd-ryzen-9-9900x-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/amd-ryzen-9-9950x-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/adam-sandler-love-you-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/afraid-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/alien-romulus-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/asus-rog-ally-x-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/asus-zenbook-s-16-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/atomfall-isnt-british-fallout-its-something-much-more-interesting"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/avowed-has-big-stealth-archer-potential"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/bad-monkey-season-1-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/baldurs-gate-3-patch-7-arrives-this-week"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/batman-caped-crusader-season-1-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/batman-wont-appear-in-the-penguin-spinoff-show"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/beetlejuice-beetlejuice-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/best-gsync-monitors-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/best-ipad-accessories-2024-what-should-you-pair-with-your-tablet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/black-myth-wukong-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/black-state-inceptioninspired-bullettime-action"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/blink-twice-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/borderlands-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/cascadero-board-game-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/clair-obscur-expedition-33-the-first-preview"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/concord-is-estimated-to-have-sold-only-25000-units-heres-why-analysts-think-its-failing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/concord-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/cuckoo-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/dark-and-darker-mobile-combines-genres-to-give-players-a-unique-experience"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/ducktales-returns-in-new-comic-book-series-from-dynamite-entertainment"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/dustborn-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/everything-we-know-about-the-iphone-16-so-far"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/fallout-london-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/famed-dragons-dogma-and-devil-may-cry-director-hideaki-itsuno-leaves-capcom-after-30-years"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/final-fantasy-creator-reveals-which-entry-he-thinks-is-most-complete-and-its-not-final-fantasy-7"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/final-fantasy-xiv-ttrpg-starter-set-board-game-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/gandalf-to-appear-in-lord-of-the-rings-the-hunt-for-gollum-ian-mckellen-asked-to-return"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/gigabyte-aorus-16x-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/gigabyte-gs27q-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/google-pixel-9-pro-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/google-pixel-9-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/hisense-u8n-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/house-of-the-dragon-season-2-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/industry-season-3-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/is-avengers-doomsday-secretly-an-avengers-vs-xmen-movie"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/jackpot-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/kaos-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/labor-day-2024-the-best-sales-weve-found-today"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/madden-nfl-25-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/manny-jacinto-says-making-star-wars-the-acolyte-season-2-is-his-life-goal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/melgeek-made68-pro-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/metaphor-refantazio-is-a-brilliant-evolution-of-persona-and-smt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/monster-jam-showdown-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/nintendo-suggests-breath-of-the-wild-and-tears-of-the-kingdom-are-part-of-a-new-zelda-timeline"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/one-year-later-larian-reflects-on-baldurs-gate-3s-success-future-plans-and-canceling-dlc-ever-since-weve-felt-better"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/oneplus-pad-2-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/only-murders-in-the-building-season-4-episodes-17-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/pachinko-season-2-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/reddit-is-currently-down-platform-says-issue-is-being-investigated-update"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/rick-and-morty-the-anime-episodes-12-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/rick-and-morty-the-anime-review-episodes-12-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/rocksteady-reportedly-lays-off-staff-following-suicide-squad-kill-the-justice-league-flop"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/samsung-galaxy-z-fold-6-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/save-on-hit-manga-box-sets-at-amazon-this-weekend-for-labor-day"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/save-on-mario-switch-games-at-walmart-for-labor-day-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/scuf-nomad-mobile-controller-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/see-pinocchio-completely-reimagined-by-hellboy-creator-mike-mignola"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/skin-police-preview-the-hyperviolent-scifi-dystopia-from-oni-press"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/skincare-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/slay-the-spire-the-board-game-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/squirrel-with-a-gun-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/star-wars-outlaws-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/steamworld-heist-2-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/stormgate-early-access-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/tactical-breach-wizards-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/tales-of-the-teenage-mutant-ninja-turtles-episodes-16-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/terminator-zero-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-10-best-bluetooth-record-players-for-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-best-apple-watch-deals-right-now-september-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-best-nintendo-game-youve-never-heard-of-and-its-2024-sequel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-crow-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-deliverance-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-instigators-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-killer-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-lg-g4-is-as-close-to-perfect-as-a-tv-can-be-in-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-lord-of-the-rings-the-rings-of-power-season-2-premiere-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-lord-of-the-rings-the-rings-of-power-season-2-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-scott-pilgrim-20th-anniversary-hardcover-box-set-gets-a-big-discount"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-secretlab-black-friday-in-august-sale-kicks-off-up-to-100-off-gaming-chairs-and-desks"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-sims-4-review-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-umbrella-academy-season-4-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-union-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/the-victrix-gambit-prime-is-a-prostyle-controller-worth-considering"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/until-dawn-remake-developer-ballistic-moon-lays-off-several-staff"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/visions-of-mana-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/voice-acting-legend-jennifer-hale-on-video-game-strikes-ai-is-coming-for-all-of-us"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/volgarr-the-viking-2-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/wwe-fans-mourn-sid-vicious-after-wrestling-legend-dies-at-63-following-battle-with-cancer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/watchmen-chapter-1-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/we-build-lego-great-deku-tree-the-first-legend-of-zelda-set-in-lego-history"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/review/wolfs-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/tech/amazon-games-boss-says-label-will-put-games-on-nintendo-switch-2-praises-switch-as-a-great-device"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/tech/best-240hz-gaming-monitor-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/tech/best-gaming-monitors-for-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/tech/best-racing-wheels-2024-top-steering-wheels-for-gaming"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/tech/gaming-headsets-dont-get-much-better-than-the-beyerdynamic-mmx-300-pro"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/tech/samsung-galaxy-z-fold-6-review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/tech/the-asus-rog-tessen-is-a-peak-for-mobile-gaming-controllers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/tech/the-best-apple-watch-deals-right-now-august-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/tech/the-best-budget-gaming-monitors-for-all-gamer-types"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/tech/the-best-ipad-deals-today-august-2024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/tech/the-lg-g4-is-as-close-to-perfect-as-a-tv-can-be-in-2024"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"accounts": {
|
||||||
|
"test": "ca-pub-2821871715805907",
|
||||||
|
"prod": "ca-pub-2821871715805907"
|
||||||
|
},
|
||||||
|
"webs": [
|
||||||
|
{
|
||||||
|
"host": "https://moads-prod.allapp.link",
|
||||||
|
"uris": [
|
||||||
|
{
|
||||||
|
"uri": "/business/new-steam-tweaks-let-devs-highlight-related-games-and-dlc-on-store-pages/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/book-excerpt-game-ai-uncovered-volume-one/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/programming/the-rise-of-generative-ai-in-revolutionizing-game-development/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1 @@
|
|||||||
|
{"deduct":"Odečíst","quiz_correct":"Správně","quiz_correct_count":"Správně jste odpověděli na [[{{num}}]] z [[{{x}}]]!","quiz_home":"Domů","quiz_next":"Další","quiz_question_progress":"Otázka [[{{num}}]] z [[{{x}}]]","quiz_round_complete":"Kolo dokončeno","quiz_chances":"Pokusy v kvízu","claim_it_now":"Získejte to hned!"}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{"deduct":"Abziehen","quiz_correct":"Richtig","quiz_correct_count":"Du hast [[{{num}}]] von [[{{x}}]] richtig!","quiz_home":"Startseite","quiz_next":"Weiter","quiz_question_progress":"Frage [[{{num}}]] von [[{{x}}]]","quiz_round_complete":"Runde abgeschlossen","quiz_chances":"Quiz-Versuche","claim_it_now":"Jetzt abholen!"}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{"deduct":"Deducir","quiz_correct":"Correcto","quiz_correct_count":"¡Acertaste [[{{num}}]] de [[{{x}}]]!","quiz_home":"Inicio","quiz_next":"Siguiente","quiz_question_progress":"Pregunta [[{{num}}]] de [[{{x}}]]","quiz_round_complete":"Ronda completada","quiz_chances":"Intentos de cuestionario","claim_it_now":"¡Reclámalo ahora!"}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{"deduct":"Déduire","quiz_correct":"Correct","quiz_correct_count":"Vous avez [[{{num}}]] bonnes réponses sur [[{{x}}]] !","quiz_home":"Accueil","quiz_next":"Suivant","quiz_question_progress":"Question [[{{num}}]] sur [[{{x}}]]","quiz_round_complete":"Manche terminée","quiz_chances":"Tentatives de quiz","claim_it_now":"Récupérez-le maintenant !"}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{"deduct":"Levon","quiz_correct":"Helyes","quiz_correct_count":"[[{{num}}]] helyes válaszod lett [[{{x}}]] kérdésből!","quiz_home":"Kezdőlap","quiz_next":"Következő","quiz_question_progress":"[[{{num}}]]. kérdés, összesen [[{{x}}]]","quiz_round_complete":"A forduló befejeződött","quiz_chances":"Kvízlehetőségek","claim_it_now":"Szerezd meg most!"}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{"deduct":"Kurangi","quiz_correct":"Benar","quiz_correct_count":"Kamu menjawab benar [[{{num}}]] dari [[{{x}}]]!","quiz_home":"Beranda","quiz_next":"Berikutnya","quiz_question_progress":"Pertanyaan [[{{num}}]] dari [[{{x}}]]","quiz_round_complete":"Ronde selesai","quiz_chances":"Kesempatan kuis","claim_it_now":"Klaim sekarang!"}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{"deduct":"Dedurre","quiz_correct":"Corretto","quiz_correct_count":"Hai risposto correttamente a [[{{num}}]] domande su [[{{x}}]]!","quiz_home":"Home","quiz_next":"Avanti","quiz_question_progress":"Domanda [[{{num}}]] di [[{{x}}]]","quiz_round_complete":"Round completato","quiz_chances":"Tentativi del quiz","claim_it_now":"Richiedilo ora!"}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{"deduct":"控除","quiz_correct":"正解","quiz_correct_count":"[[{{x}}]]問中[[{{num}}]]問正解しました!","quiz_home":"ホーム","quiz_next":"次へ","quiz_question_progress":"第[[{{num}}]]問(全[[{{x}}]]問)","quiz_round_complete":"ラウンド完了","quiz_chances":"クイズ挑戦回数","claim_it_now":"今すぐ受け取る"}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{"deduct":"차감","quiz_correct":"정답","quiz_correct_count":"[[{{x}}]]문제 중 [[{{num}}]]문제를 맞혔습니다!","quiz_home":"홈","quiz_next":"다음","quiz_question_progress":"총 [[{{x}}]]문제 중 [[{{num}}]]번","quiz_round_complete":"라운드 완료","quiz_chances":"퀴즈 기회","claim_it_now":"지금 받기"}
|
||||||
@ -0,0 +1,761 @@
|
|||||||
|
{
|
||||||
|
"close": "Sluiten",
|
||||||
|
"invite_share_text": "Doe mee om beloningen te winnen",
|
||||||
|
"copy_link": "Verwijzing kopiëren",
|
||||||
|
"copy_success": "Kopiëren succesvol",
|
||||||
|
"invite_friend": "Raadpleging",
|
||||||
|
"invite_friend_": "DELEN",
|
||||||
|
"total_get": "Beloning",
|
||||||
|
"can_get": "Beloning",
|
||||||
|
"my_invite": "Uitnodiging",
|
||||||
|
"invite_record": "Uitnodigingsrecords",
|
||||||
|
"need_invite": "Volgende niveau",
|
||||||
|
"bonus_rules": "Beloningsregels",
|
||||||
|
"activity_rules": "Regels",
|
||||||
|
"invite_no_record": "Nog geen uitnodigingsdossiers",
|
||||||
|
"invite_time": "Datum",
|
||||||
|
"user_id": "Gebruikers-ID",
|
||||||
|
"reward_cond": "Regels",
|
||||||
|
"target_receive_prizes": "Neem contact met ons op om uw beloning te claimen",
|
||||||
|
"receive_prizes": "Wijze van verzameling van de prijzen",
|
||||||
|
"copy": "Kopiëren",
|
||||||
|
"bonus_content": "Beloning",
|
||||||
|
"prize_details": "Beloningen",
|
||||||
|
"end_time": "END:",
|
||||||
|
"start_time": "START:",
|
||||||
|
"activity_time": "Gebeurtenistijd",
|
||||||
|
"extra_prizes": "Extra",
|
||||||
|
"quantity": "Aantal",
|
||||||
|
"prize": "Beloning",
|
||||||
|
"download_for_each_friend": "Elke {{num}} installatie",
|
||||||
|
"accumulate_friend_downloads": "Cumulatieve {{num}} installatie",
|
||||||
|
"max_invite_friend": "Elke gebruiker kan maximale {{num}} vriend(s) verwijzen",
|
||||||
|
"register_for_each_friend": "Elke {{num}} Registreer",
|
||||||
|
"accumulate_friend_register": "Cumulatieve {{num}}-register",
|
||||||
|
"my_task": "Mijn taken",
|
||||||
|
"fans": "Refee",
|
||||||
|
"target_fans": "Bereikt",
|
||||||
|
"install_and_finish_all_cond": "Je downline moet alle taken downloaden en voltooien om in aanmerking te komen.",
|
||||||
|
"install_and_finish_one_cond": "Je downline moet een taak downloaden en voltooien om in aanmerking te komen.",
|
||||||
|
"completed": "Klaar",
|
||||||
|
"undone": "te doen",
|
||||||
|
"friend_record": "Uitnodigingsrecords",
|
||||||
|
"task_1": "Taak 1",
|
||||||
|
"task_2": "Taak 2",
|
||||||
|
"task_3": "Taak 3",
|
||||||
|
"invite_friends_to_register": "Elke {{num}} Registreer",
|
||||||
|
"invite_friends_to_install": "Elke {{num}} installatie",
|
||||||
|
"no_record": "Nog geen record",
|
||||||
|
"invite_friends_to_target": "Nodig {{num}} vriend(s) uit om de taak te voltooien",
|
||||||
|
"target_for_each_friend": "Elke {{num}} referral(s) voltooit de taak",
|
||||||
|
"accumulate_friend_target": "Cumulatieve {{num}} verwijzingen voltooien de taak",
|
||||||
|
"prize_list": "Beloninglijst",
|
||||||
|
"regular_rewards": "Regelmatig",
|
||||||
|
"extra_rewards": "Extra",
|
||||||
|
"activity_end_text": "Dit evenement is afgelopen@Bedankt voor uw komst naar ons@Hope tot ziens!",
|
||||||
|
"receive": "Inwisselen",
|
||||||
|
"contact_customer_service": "Neem contact op met de klantenservice om op te halen",
|
||||||
|
"lottery": "Draaien",
|
||||||
|
"draws_num": "Draaiingen",
|
||||||
|
"better_luck_next_time": "Probeer je geluk de volgende keer.",
|
||||||
|
"no_winning_record": "Nog geen record",
|
||||||
|
"prize_name": "Beloning",
|
||||||
|
"lottery_service_err": "Servicefout, probeer het later opnieuw",
|
||||||
|
"draws_none": "De loterij is op.",
|
||||||
|
"confirm": "OK",
|
||||||
|
"try_your_luck": "Feel lucky",
|
||||||
|
"get_prize_to_app": "Download de app om nu uw prijs te claimen",
|
||||||
|
"target_cond_1": "Taak 1",
|
||||||
|
"target_cond_2": "Taak 2",
|
||||||
|
"target_cond_3": "Taak 3",
|
||||||
|
"all_tasks_to_draw": "Uw downline moet alle taken downloaden en voltooien om {{num}} draw(s) te ontvangen",
|
||||||
|
"one_tasks_to_draw": "Uw downline moet een taak downloaden en voltooien om {{num}} draw(s) te ontvangen",
|
||||||
|
"draws_obtained": "Mijn Draw(s):",
|
||||||
|
"reward_record": "Reward records",
|
||||||
|
"to_complete": "Ga.",
|
||||||
|
"completed_times": "Voltooid",
|
||||||
|
"winning_record": "Reward records",
|
||||||
|
"Winning_time": "Datum",
|
||||||
|
"thank": "Volgende tijd",
|
||||||
|
"no_receive_record": "Nog geen record",
|
||||||
|
"week_0": "Zon",
|
||||||
|
"week_1": "Ma",
|
||||||
|
"week_2": "Di",
|
||||||
|
"week_3": "wo",
|
||||||
|
"week_4": "do",
|
||||||
|
"week_5": "Vr",
|
||||||
|
"week_6": "Zat",
|
||||||
|
"invite_friend_install_get_sign": "Nodig {{num}} vriend(s) uit om de app te downloaden en je ontvangt één make-upkaart.",
|
||||||
|
"invite_num": "Verwijzingen: {{num}}",
|
||||||
|
"sign_day_num": "Check in {{num}} day(s)",
|
||||||
|
"continue_day_num": "Achter elkaar ingecheckt voor {{num}} Day(s)",
|
||||||
|
"day": "Dag",
|
||||||
|
"sign_card": "Maak een gemiste dag goed",
|
||||||
|
"invite_friend_get_sign_card_text": "Een dag gemist? Nodig vrienden uit om een make-upkaart te downloaden en te verdienen!",
|
||||||
|
"obtain": "Get",
|
||||||
|
"use_sign_card": "Gebruik een make-up kaart",
|
||||||
|
"confirm_use_sign_card": "Weet u zeker dat u het gebruikt op {{m}}/{{d}}?",
|
||||||
|
"sign_success": "Ingecheckt",
|
||||||
|
"you_got": "Je hebt",
|
||||||
|
"i_see": "Begrepen.",
|
||||||
|
"done_sign_day_num": "Gecheckt in {{num}} dag(s)",
|
||||||
|
"done_continue_day_num": "Achter elkaar ingecheckt voor {{num}} day(s)",
|
||||||
|
"sign_ok": "Ingecheckt",
|
||||||
|
"card_sign_ok": "Make-up succes",
|
||||||
|
"continue_sign_ok": "Ingecheckt",
|
||||||
|
"continue_sign_get_reward_text": "Hit the Streak om beloningen te winnen",
|
||||||
|
"sign_get_reward_text": "Check-in dagelijks om beloningen te winnen!",
|
||||||
|
"sign_card_lack": "Gebrek aan make-up kaart",
|
||||||
|
"sign_fail": "Inchecken mislukt, gelieve de pagina te vernieuwen",
|
||||||
|
"best_fan": "Topfans",
|
||||||
|
"top_fans": "Topfans",
|
||||||
|
"invite_num_title": "Raadpleging",
|
||||||
|
"no_rank_record": "Nog geen record",
|
||||||
|
"vote_none": "De stemming is voorbij.",
|
||||||
|
"vote_service_err": "Servicefout, probeer het later opnieuw",
|
||||||
|
"hour": "h",
|
||||||
|
"minute": "min",
|
||||||
|
"second": "s",
|
||||||
|
"hour_f": "UUR",
|
||||||
|
"minute_f": "MINUUT",
|
||||||
|
"second_f": "TWEEDE",
|
||||||
|
"vote_num": "Er zijn momenteel {{num}} stemmen beschikbaar",
|
||||||
|
"here_is_the_quiz_title": "De quiz titel wordt hier getoond",
|
||||||
|
"option": "optie",
|
||||||
|
"countdown": "Aantal",
|
||||||
|
"end": "Einde",
|
||||||
|
"click_image_select": "Klik op de afbeelding om te selecteren",
|
||||||
|
"wait_reward_reward": "Kom later terug voor resultaten.",
|
||||||
|
"sure": "OK",
|
||||||
|
"submit": "INDIENEN",
|
||||||
|
"next_qa": "Volgende",
|
||||||
|
"right": "JUIST",
|
||||||
|
"error": "Fout",
|
||||||
|
"right_answer": "Correct antwoord:",
|
||||||
|
"explain": "Toelichting",
|
||||||
|
"home": "Thuis",
|
||||||
|
"share": "Delen",
|
||||||
|
"download_app_qa": "Download app om mee te doen aan de quiz",
|
||||||
|
"qa_service_err": "Servicefout, probeer het later opnieuw",
|
||||||
|
"qa_none": "Je hebt nog geen antwoordmogelijkheden. @Please nodig vrienden uit om meer kansen te krijgen.",
|
||||||
|
"start": "START",
|
||||||
|
"challenge_failed": "NIET VERMIST",
|
||||||
|
"qa_right": "Correct",
|
||||||
|
"keep_try": "Blijf proberen.",
|
||||||
|
"congratulation": "Gefeliciteerd.",
|
||||||
|
"please_choose": "SELECTIE",
|
||||||
|
"qa_loading": "laden...",
|
||||||
|
"grow_big": "{{name}} is opgegroeid",
|
||||||
|
"click_receive": "ONTVANG",
|
||||||
|
"after_receive": "om te krijgen",
|
||||||
|
"tree_grow_can_get": "Plant de boom en je ontvangt hem.",
|
||||||
|
"fertilize_standard_text": "Pas {{num}}% meer meststof toe, en je zult het doel bereiken!",
|
||||||
|
"fertilize": "Mest",
|
||||||
|
"fertilizer": "Meststof",
|
||||||
|
"need_nutrients_will_die": "Ik heb {{num}}g meststof nodig om me gezond te houden.",
|
||||||
|
"get_new_tree": "Haal een nieuw sapling.",
|
||||||
|
"tree_grow_max_text": "Je boom is gegroeid, hier is een cadeautje voor je.",
|
||||||
|
"little_tree": "mijn boom",
|
||||||
|
"fertilize_num": "Bemest {{num}}g",
|
||||||
|
"some_withered": "{{name}} is verwelkt",
|
||||||
|
"some_revive": "{{name}} is weer tot leven gekomen.",
|
||||||
|
"grow_big_and_get_reward": "{{name}} is volwassen geworden, je krijgt gewoon {{beloning titel}",
|
||||||
|
"get_grow": "{{name}} ophalen",
|
||||||
|
"props_lack": "Niet genoeg rekwisieten.",
|
||||||
|
"cannot_lv_up": "Je hebt het hoogste niveau bereikt.",
|
||||||
|
"invite_friend_install_get_fertilizer": "Nodig {{num}} vriend uit om App te downloaden, u ontvangt {{grow_num}} meststof.",
|
||||||
|
"received_sapling": "Je hebt een sapling gekregen.",
|
||||||
|
"pick_name": "Kies een naam",
|
||||||
|
"growth_manual": "Groeigids",
|
||||||
|
"get_nourishment": "Krijg kunstmest",
|
||||||
|
"plant_new_tree": "Plant een boom",
|
||||||
|
"tree_revive": "Bewaar je boom",
|
||||||
|
"timeout_tree_die": "Door een gebrek aan bevruchting voor een lange tijd, uw boom is verdord",
|
||||||
|
"invite_friend_install_revive_tree": "Nodig {{num}} vrienden uit om de app te downloaden en u kunt uw boom opslaan",
|
||||||
|
"dog_grow_can_get": "Verhoog de puppy en je zult het ontvangen",
|
||||||
|
"feed_standard_text": "Voer gewoon {{num}}% meer om het doel te bereiken!",
|
||||||
|
"feed": "Feed",
|
||||||
|
"dog_food": "Hondenvoer",
|
||||||
|
"need_dog_food_will_leave": "Ik heb {{num}}g eten nodig, of ik moet misschien op avontuur buiten ons gezellige huis. Woef!",
|
||||||
|
"get_new_dog": "Een puppy goedkeuren",
|
||||||
|
"dog_grow_max_text": "Je puppy is volwassen geworden, hier is een cadeautje voor je.",
|
||||||
|
"little_dog": "Puppy",
|
||||||
|
"feed_num": "{{num}}g-voeding voeren",
|
||||||
|
"some_leave": "{{name}} is vertrokken",
|
||||||
|
"some_come": "{{name}} is terug",
|
||||||
|
"invite_friend_install_get_dog_food": "Nodig {{num}} vriend(s) uit om App te downloaden, u ontvangt {{grow_num}}g voedsel",
|
||||||
|
"received_dog": "Je adopteert een puppy",
|
||||||
|
"get_dog_food": "Haal voedsel.",
|
||||||
|
"plant_new_dog": "Adopteer een hond",
|
||||||
|
"rescue_puppy": "De puppy opslaan",
|
||||||
|
"timeout_dog_go": "Omdat het al lang geen liefde en voedsel meer heeft gevoeld, is je puppy weggelopen van huis.",
|
||||||
|
"invite_friend_install_rescue_puppy": "Nodig {{num}} vriend(s) uit om de app te downloaden en je kunt je puppy opslaan.",
|
||||||
|
"get_collect_num": "U heeft 1 stuk {{reward_title}} ontvangen.",
|
||||||
|
"fixed_point": "Gespecificeerd aantal",
|
||||||
|
"this_props_lack": "Je hebt dit item nog niet.",
|
||||||
|
"help_record": "Uitnodigingsrecords",
|
||||||
|
"no_help_record": "Nog geen record",
|
||||||
|
"install_help_record": "Een vriend downloadde de app",
|
||||||
|
"open_help_record": "Een vriend opende de app",
|
||||||
|
"click_help_record": "Een vriend klikte op de link",
|
||||||
|
"service_err": "Servicefout, probeer het later opnieuw",
|
||||||
|
"select_reward": "Selecteer Beloning",
|
||||||
|
"view_help_rule": "Controleregels",
|
||||||
|
"help_rule": "Regels uitnodigen",
|
||||||
|
"install_help": "App naar Boost downloaden",
|
||||||
|
"install_help_text": "Elke vriend downloadde de app, voortgang [[+{{num}}%]]",
|
||||||
|
"open_help": "App openen om te versterken",
|
||||||
|
"open_help_text": "Elke vriend opende de app, voortgang [[+{{num}}%]], tot {{limit_num}}%",
|
||||||
|
"click_help": "Klik op Link naar Boost",
|
||||||
|
"click_help_text": "Elke vriend klikte op de uitnodigingslink, voortgang [[+{{num}}%]], tot {{limit_num}}%",
|
||||||
|
"invite_friends_receive_free_gifts": "Nodig vrienden uit om gratis beloningen te krijgen!",
|
||||||
|
"get_prizes": "Krijg deze beloning",
|
||||||
|
"help_success": "SUCCES",
|
||||||
|
"also_get_free": "U kunt het ook gratis krijgen",
|
||||||
|
"install_get_free_reward": "Download de app om gratis beloningen te krijgen",
|
||||||
|
"install_get_reward": "Haal de App, ontgrendel prijzen",
|
||||||
|
"received_success": "succes",
|
||||||
|
"ballot_record": "HERHALING",
|
||||||
|
"no_ballot_record": "Nog geen record",
|
||||||
|
"ballot_none": "Je hebt nog geen kansen. Nodig vrienden uit om meer kansen te krijgen.",
|
||||||
|
"share_good_luck": "Deel het geluk",
|
||||||
|
"ballot": "Hebbes.",
|
||||||
|
"answer_record": "HERHALING",
|
||||||
|
"challenge_results": "WEERGAVE",
|
||||||
|
"challenge_time": "DATUM",
|
||||||
|
"no_answer_record": "Nog geen record",
|
||||||
|
"answer_none": "De quiz is op.",
|
||||||
|
"please_choose_answer": "Selecteer een antwoord",
|
||||||
|
"answer_countdown": "Aantal",
|
||||||
|
"got_prizes": "GEWONNEN:",
|
||||||
|
"continue_free_get": "Doorsnijden",
|
||||||
|
"finish_help": "Voltooid",
|
||||||
|
"reward_send_your_account": "De beloning is naar uw account gestuurd",
|
||||||
|
"no_reward_record": "Nog geen record",
|
||||||
|
"download_app_ballot": "Download de app om mee te doen aan de campagne",
|
||||||
|
"yesterday": "Gisteren",
|
||||||
|
"today": "Vandaag",
|
||||||
|
"prize_record": "HERHALING",
|
||||||
|
"get_reward_time": "DATUM",
|
||||||
|
"no_sign_card": "Ik heb nog geen vervangende kaart getekend.",
|
||||||
|
"get_more_knowledge": "Probeer je geluk volgende keer.",
|
||||||
|
"qa_very_hard": "Wie is de slimme man?",
|
||||||
|
"num": "QUIZ",
|
||||||
|
"contact_customer_service_var": "Neem contact op ({{contact}})",
|
||||||
|
"like_share_people_lucky": "Gedeelde mensen hebben meer geluk. Deel nu!",
|
||||||
|
"my_reward": "Mijn prijs",
|
||||||
|
"no_install_prompt": "Dat social media platform is niet geïnstalleerd.",
|
||||||
|
"please_login": "Aanmelden",
|
||||||
|
"got_num": "(Gebeurde {{num}} keer)",
|
||||||
|
"completed_num": "(Gedaan aan {{num}})",
|
||||||
|
"fixed_roll_none": "Je hebt nog geen geluk. Nodig {{num}} vriend(s) uit om de app te downloaden en krijg 1 geluks dobbelsteen.",
|
||||||
|
"fixed_roll_none_limit": "Nog geen geluk. Nodig {{num}} vriend(s) uit om de App te downloaden om 1 geluks dobbelsteen te krijgen, tot een maximum van {{limit}} lucky dobbelstenen(s).",
|
||||||
|
"invite_friend_install_get_roll_chance": "Nodig {{num}}-vriend(s) uit om de app te downloaden en {{chance}}-gelukkige dobbelstenen te krijgen.",
|
||||||
|
"invite_friend_install_get_roll_chance_limit": "Nodig {{num}} vriend(s) uit om de App te downloaden en {{chance}} dobbelstenen(s), tot een maximum van {{limit}} dobbelstenen(s).",
|
||||||
|
"invite_friend_register_get_roll_chance": "Nodig {{num}} vriend(s) uit om de registratie te voltooien om {{chance}} dobbelstenen te ontvangen.",
|
||||||
|
"invite_friend_register_get_roll_chance_limit": "Nodig {{num}} vriend(s) uit om de registratie te voltooien om {{chance}} dobbelstenen(s te ontvangen), tot een maximum van {{limit}} dobbelstenen(s).",
|
||||||
|
"dice_task_finish": "Compleet om {{chance}} dobbelstenen te ontvangen",
|
||||||
|
"dice_task_finish_limit": "Voltooid om {{chance}} dobbelstenen te ontvangen, tot {{limit}} voltooiing(s).",
|
||||||
|
"dice_task_num": "Totale dobbelstenen verkregen uit taken:",
|
||||||
|
"dice_task_cond_one": "Voltooi elke taak om meer dobbelstenen te krijgen.",
|
||||||
|
"dice_task_cond_all": "Voltooi alle taken om {{chance}} dobbelstenen(s).",
|
||||||
|
"dice_task_cond_all_limit": "Voltooi alle taken om {{chance}} dobbelstenen(s), tot een maximum van {{limit}} tijd(s). U heeft {{num}} time(s) tot nu toe verkregen.",
|
||||||
|
"spin_now": "Draai nu",
|
||||||
|
"spinning": "Draaien",
|
||||||
|
"expires_in": "Verloopt in",
|
||||||
|
"records": "Gegevens",
|
||||||
|
"luck_you": "Geluksvogel.",
|
||||||
|
"get_extra_reward": "Extra bonus voor u!",
|
||||||
|
"share_get": "Delen om uw",
|
||||||
|
"upgrade_reward": "upgrade beloning",
|
||||||
|
"super_upgrade": "Verrassing! Super upgrade!",
|
||||||
|
"preparation": "Per spin",
|
||||||
|
"invite_get_energy": "Uitnodigen om energie te krijgen",
|
||||||
|
"invite_friend_get_energy": "Nodig vrienden uit om energie te krijgen",
|
||||||
|
"up_to": "Tot",
|
||||||
|
"spin": "Draaien",
|
||||||
|
"away": "{{num}} weg",
|
||||||
|
"win_left_energy": "{{cash}} winnen met slechts {{num}} spin",
|
||||||
|
"enjoy_credit": "Geniet van je krediet",
|
||||||
|
"invite_no_record_reward": "Je hebt nog niemand uitgenodigd, Nodig vrienden uit om beloningen te ontvangen!",
|
||||||
|
"spin_reward": "Spin beloning",
|
||||||
|
"share_reward": "Gedeelde beloning",
|
||||||
|
"start_reward": "Startstimulans",
|
||||||
|
"left_cash_get_reward": "Alleen {{left}} nog over om {{cash}} beloning te krijgen",
|
||||||
|
"auto_spin": "Spin automatisch in [[{{second}}]] s",
|
||||||
|
"guarantee_to": "Garantie om te winnen {{cash}} met slechts 1 spin!",
|
||||||
|
"auto_select": "Selecteer automatisch in [[{{second}}]] s",
|
||||||
|
"open": "Open",
|
||||||
|
"select_box": "Kies 1 geschenkdoos om te zien hoeveel geld Beloning krijgt u",
|
||||||
|
"money_reward": "Geldbeloning",
|
||||||
|
"jackpot_best_prize": "Jackpot! Beste prijs",
|
||||||
|
"best_prize": "Best&&Prize",
|
||||||
|
"almost_reward": "Bijna tot de beloning!",
|
||||||
|
"claimed_reward": "Over [[10000+]] hebben mensen beloond",
|
||||||
|
"pass_on_energy": "Ze gaven Energie aan jou door!",
|
||||||
|
"victory_tip": "de overwinning ligt binnen jullie bereik, [[neem het]]",
|
||||||
|
"min_won_barrage": "{{name}} Won [[{{cash}}]] {{min}} mins ago Great!",
|
||||||
|
"closer_to_prize": "je komt dichter bij de grote prijs",
|
||||||
|
"shine_arrived": "je moment om te schitteren hash arrived pak het",
|
||||||
|
"get_money_reward": "Krijgen geld Beloning",
|
||||||
|
"won_barrage": "[[{{name}}]] heeft beweerd [[{{cash}}]]",
|
||||||
|
"surprise_for_you": "Verrassing voor jou",
|
||||||
|
"last_spin_win": "Slechts een laatste draai om te winnen!",
|
||||||
|
"energy": "Energie",
|
||||||
|
"token": "Token",
|
||||||
|
"your_reward": "UW GELD",
|
||||||
|
"go_to": "Te gebruiken",
|
||||||
|
"click_contact": "Contacteer Klantenservice",
|
||||||
|
"click_contact_tip": "Contactinformatie is gekopieerd\nNeem contact met ons op",
|
||||||
|
"see_reward": "Prijzen bekijken",
|
||||||
|
"prize_gone": "De prijzen zijn weg.",
|
||||||
|
"no_reward_get": "Je bent te laat, alle prijzen zijn uitgedeeld!",
|
||||||
|
"no_more_record": "Geen platen meer.",
|
||||||
|
"help_fail": "NIET VERMIST",
|
||||||
|
"grand_opening": "Grote opening",
|
||||||
|
"get_reward_after_play": "Iedereen krijgt een beloning na het spelen van het spel!",
|
||||||
|
"play_and_get_prize": "Speel om je prijs te krijgen!",
|
||||||
|
"won_free_gift": "Je hebt het gratis geschenk gewonnen!",
|
||||||
|
"download_app_get_gift": "Download App om uw prijs te krijgen!",
|
||||||
|
"download": "Downloaden",
|
||||||
|
"jackpot": "JACKPOT",
|
||||||
|
"play": "Afspelen",
|
||||||
|
"install_ineligible": "Niet in aanmerking komende (niet nieuwe installatie)",
|
||||||
|
"unlock_your_luck": "Ontgrendel je geluk",
|
||||||
|
"spin_and_win": "Spin en Win",
|
||||||
|
"play_to_win_prize": "Speel om een prijs te winnen!",
|
||||||
|
"you_got_the_best_prize": "Je hebt de beste prijs.",
|
||||||
|
"play_and_win": "Spelen en winnen",
|
||||||
|
"download_to_get": "downloaden om op te halen",
|
||||||
|
"best_prize_!": "Beste prijs!",
|
||||||
|
"roll_dice_number": "Rol dobbelstenen, nummer {{point}}",
|
||||||
|
"lucky_dice_number": "Gebruik geluks dobbelstenen, nummer {{point}}",
|
||||||
|
"day_sign": "Dagelijks inchecken",
|
||||||
|
"dice_record": "Gegevens",
|
||||||
|
"finish_friend_register": "Volledige vriend registratie taak",
|
||||||
|
"finish_friend_install": "Voltooi de aanbevolen app download taak",
|
||||||
|
"finish_lucky_dice_task": "Voltooi de gelukkige dobbelsteen taak",
|
||||||
|
"fragment": "Fragment",
|
||||||
|
"click": "klik",
|
||||||
|
"collect_fragment_compare_reward": "Verzamel {{num}} fragmenten om de prijs te maken",
|
||||||
|
"craft_fragments": "Fragmenten voor ambachten",
|
||||||
|
"reward_lack_contact_customer_service": "Uit voorraad. Neem contact op met de klantenservice voor assistentie.",
|
||||||
|
"join_in_campaign": "Deelnemen aan campagne",
|
||||||
|
"contact": "Contactpersoon",
|
||||||
|
"all": "Alles",
|
||||||
|
"contact_information": "Contactinformatie",
|
||||||
|
"no_more_dice": "Geen dobbelstenen meer",
|
||||||
|
"try_your_luck_first_upper": "Probeer je geluk.",
|
||||||
|
"fill_in": "Invullen",
|
||||||
|
"submit_success": "Succes",
|
||||||
|
"please_do_not_submit_repeatedly": "Gelieve niet herhaaldelijk in te dienen",
|
||||||
|
"submitted": "Overgedragen",
|
||||||
|
"please_complete_the_form": "Vul het formulier in",
|
||||||
|
"welcome_gifts": "Welkomstgeschenken",
|
||||||
|
"spin_to_win": "Draai om te winnen",
|
||||||
|
"view": "weergave",
|
||||||
|
"use": "Gebruik",
|
||||||
|
"get_and_use": "Claim en gebruik",
|
||||||
|
"invite_friend_install_get_lottery_chance": "Nodig {{num}} vriend(s) uit om de App te downloaden, en je krijgt {{chance}} kans(s).",
|
||||||
|
"invite_friend_install_get_lottery_chance_limit": "Nodig {{num}} vriend(s) uit om de App te downloaden, en je krijgt {{chance}} kans(s), tot een maximum van {{limit}} kans(s).",
|
||||||
|
"invite_friend_register_get_lottery_chance": "Nodig {{num}} vriend(s) uit om de registratie te voltooien, en je krijgt {{chance}} kans(s).",
|
||||||
|
"invite_friend_register_get_lottery_chance_limit": "Nodig {{num}} vriend(s) uit om de registratie te voltooien, en je krijgt {{chance}} kans(s), tot een maximum van {{limit}} kans(s).",
|
||||||
|
"lottery_task_finish": "Je krijgt {{chance}} kans(s) na voltooiing",
|
||||||
|
"lottery_task_finish_limit": "U krijgt {{chance}} kans(s) na voltooiing, tot een maximum van {{limit}} tijd(s)",
|
||||||
|
"lottery_task_num": "De totale kansen van de taken",
|
||||||
|
"lottery_task_cond_one": "Volledige taken om kansen te krijgen",
|
||||||
|
"lottery_task_cond_all": "Het voltooien van alle taken kan resulteren in het verkrijgen van {{chance}} kans(s)",
|
||||||
|
"lottery_task_cond_all_limit": "Het voltooien van alle taken kan resulteren in het verkrijgen van {{chance}} kans(s), tot een maximum van {{limit}} tijd(s), en {{num}} tijd(s) zijn verkregen.",
|
||||||
|
"raffle_chances": "Kans",
|
||||||
|
"quiz_chances": "Quiz-kans",
|
||||||
|
"get_lottery_chances": "Get Loterij Kansen",
|
||||||
|
"remaining_raffle_chances": "Resterende kansen",
|
||||||
|
"lottery_again": "Opnieuw",
|
||||||
|
"use_immediately": "Nu gebruiken",
|
||||||
|
"wow_you_got": "Wow! Je hebt",
|
||||||
|
"next_time": "Volgende keer",
|
||||||
|
"finish_all_task": "Taken voltooid",
|
||||||
|
"finish_one_task": "Taak voltooid",
|
||||||
|
"sign_in_every_day_can_get_dice": "Meld je aan elke dag , kunt u {{num}} dobbelstenen(s).",
|
||||||
|
"do_task_get_dice": "Doe taken en haal dobbelstenen",
|
||||||
|
"do_task_get_lottery": "Taken uitvoeren en kans krijgen",
|
||||||
|
"refresh_tomorrow": "Morgen vernieuwen",
|
||||||
|
"click_icon": "Klik op pictogram",
|
||||||
|
"paste_to_media": "Plakken naar media",
|
||||||
|
"get_prize": "Prijzen krijgen",
|
||||||
|
"copy_success_paste_to_media": "Gecopieerd succes, gelieve te plakken op social media",
|
||||||
|
"invite_friend_install_get_grow": "Nodig {{num}} vriend(s) uit om de App te downloaden en {{chance}} groei items te ontvangen.",
|
||||||
|
"invite_friend_install_get_grow_limit": "Nodig {{num}} vriend(s) uit om de App te downloaden en {{chance}} groei items te ontvangen, tot een maximum van {{limit}} groei items.",
|
||||||
|
"invite_friend_register_get_grow": "Nodig {{num}} vriend(s) uit om de registratie te voltooien en {{chance}} groei items te ontvangen.",
|
||||||
|
"invite_friend_register_get_grow_limit": "Nodig {{num}} vriend(s) uit om de registratie te voltooien en {{chance}} groei items te ontvangen, tot een maximum van {{limit}} groei items.",
|
||||||
|
"grow_task_finish": "Voltooien om {{chance}} groei items",
|
||||||
|
"grow_task_finish_limit": "Complete om {{chance}} groei items, voltooien tot {{limit}} tijd(s)",
|
||||||
|
"grow_task_cond_one": "Voltooi elke taak om groei items",
|
||||||
|
"grow_task_cond_all": "Voltooi alle taken om {{chance}} groei items",
|
||||||
|
"grow_task_cond_all_limit": "Voltooi alle taken om {{chance}} groei items, tot {{limit}} tijd(s), al kreeg {{num}} tijd(s)",
|
||||||
|
"do_task_get_grow": "Complete taken om groeipunten te krijgen",
|
||||||
|
"easy_mode": "Gemakkelijke modus",
|
||||||
|
"mins_ago": "{{min}} minuten geleden",
|
||||||
|
"barrage_got_reward": "heeft [[{{title}}]] door het spelen van lucky draw.",
|
||||||
|
"sold_out": "uitverkocht",
|
||||||
|
"task_done": "Taak voltooid",
|
||||||
|
"click_copy_link": "Klik op \"Copy Link\"",
|
||||||
|
"select_card": "Selecteer een kaart",
|
||||||
|
"raffle_chances_lack": "Niet genoeg mogelijkheden",
|
||||||
|
"raffle_chances_lack_tip": "Je hebt niet genoeg kansen voor de gelukstrekking. Ga naar de onderkant van de pagina om taken te voltooien en meer kansen te verdienen.",
|
||||||
|
"get_more_chance": "Meer kansen krijgen",
|
||||||
|
"flip_now": "Nu spiegelen",
|
||||||
|
"raffle_num": "Kans",
|
||||||
|
"win": "Win",
|
||||||
|
"next_week_do": "Volgende week",
|
||||||
|
"week_do_1": "Verversen op ma",
|
||||||
|
"week_do_2": "Verversen op di",
|
||||||
|
"week_do_3": "Verversen op wo",
|
||||||
|
"week_do_4": "Op do verversen",
|
||||||
|
"week_do_5": "Verversen op vr",
|
||||||
|
"week_do_6": "Verversen op za",
|
||||||
|
"week_do_7": "Verversen op de zon",
|
||||||
|
"to_flip": "Ga een kaart tekenen",
|
||||||
|
"won_get": "Gefeliciteerd.",
|
||||||
|
"invite_friend_download": "Nodig {{num}} vriend(s) uit om de App te downloaden",
|
||||||
|
"invite_friend_register": "Nodig {{num}} vriend(s) uit om te registreren",
|
||||||
|
"fixed_roll_none_register": "Nog geen geluk. Nodig {{num}} vriend(s) om te registreren en krijgen 1 geluk dobbelstenen.",
|
||||||
|
"fixed_roll_none_register_limit": "Nog geen geluk. Nodig {{num}} vriend(s) uit om te registreren en krijg 1 geluks dobbelsteen, tot een maximum van {{limit}} lucky dobbelstenen(s).",
|
||||||
|
"sign_in_every_day_can_get_lottery": "Meld je elke dag aan om {{num}} kans(s) te krijgen om een prijs te winnen.",
|
||||||
|
"finish_newcomer_task": "[[Nieuwkomer]] volledige taken te verdienen [[{{reward_title}}]]",
|
||||||
|
"done_newcomer_task": "Nieuwkomertaken",
|
||||||
|
"register_help_record": "Een vriend heeft de registratie voltooid.",
|
||||||
|
"register_help_text": "Elke vriend heeft de registratie voltooid, voortgang [[+{{num}}%]]",
|
||||||
|
"register_help": "Registratie Boost",
|
||||||
|
"invite_friend_install_get_qa": "Nodig {{num}} vrienden uit om de App te downloaden en krijg {{chance}} kansen om vragen te beantwoorden.",
|
||||||
|
"invite_friend_install_get_qa_limit": "Nodig {{num}} vrienden uit om de App te downloaden en krijg {{chance}} kansen om vragen te beantwoorden, met een maximum van {{limit}} kansen.",
|
||||||
|
"invite_friend_register_get_qa": "Nodig {{num}} vrienden uit om de registratie te voltooien en krijg {{chance}} kansen om vragen te beantwoorden.",
|
||||||
|
"invite_friend_register_get_qa_limit": "Nodig {{num}} vrienden uit om de registratie te voltooien en krijg {{chance}} kansen om vragen te beantwoorden, met een maximum van {{limit}} kansen.",
|
||||||
|
"qa_task_finish": "Het voltooien van het zal verdienen u {{chance}} kansen om vragen te beantwoorden.",
|
||||||
|
"qa_task_finish_limit": "Het voltooien van het zal verdienen u {{chance}} kansen om vragen te beantwoorden, met een maximum van {{limit}} voltooiingen.",
|
||||||
|
"qa_task_cond_one": "Het voltooien van elke taak zal u een kans om vragen te beantwoorden verdienen",
|
||||||
|
"qa_task_cond_all": "Het voltooien van alle taken zal verdienen u {{chance}} kansen om vragen te beantwoorden",
|
||||||
|
"qa_task_cond_all_limit": "Het voltooien van alle taken zal verdienen je {{chance}} kansen om vragen te beantwoorden, met een maximum van {{limit}} kansen, en je hebt al {{num}} kansen ontvangen",
|
||||||
|
"sign_in_every_day_can_get_qa": "Elke dag ontvangt u {{num}} kansen om vragen te beantwoorden.",
|
||||||
|
"do_task_get_qa": "Volledige taken om kansen te verdienen om vragen te beantwoorden",
|
||||||
|
"help_install": "[[{{name}}]] ontvangen [[installatiesteun]]",
|
||||||
|
"help_register": "[[{{name}}]] ontvangen [[registratiesteun]]",
|
||||||
|
"help_open": "[[{{name}}]] ontvangen [[dagelijks bezoek boost]]",
|
||||||
|
"help_click": "[[{{name}}]] ontvangen [[klik op ondersteuning]]",
|
||||||
|
"finish_help_get_reward": "[[{{name}}]] de ondersteunende taak voltooid en ontvangen [[{{reward_title}}]]",
|
||||||
|
"a_gift_to_you": "Een geschenk voor jou",
|
||||||
|
"choose_it": "Kies het",
|
||||||
|
"nice_choice": "Mooie keuze.",
|
||||||
|
"tip": "Tip",
|
||||||
|
"left_percent_get_reward": "Alleen [[{{left}}%]] over om beloning te krijgen",
|
||||||
|
"ensure_select_reward": "Selectie bevestigen [[{{reward_title}}]]?",
|
||||||
|
"reward_obtained": "Beloning verkregen",
|
||||||
|
"lucky": "Lucky",
|
||||||
|
"percent_progress_for_you": "Je hebt een gratis [[{{percent}}%]] boost!",
|
||||||
|
"invite": "Uitnodigen",
|
||||||
|
"help_task": "Taak versterken",
|
||||||
|
"finish_all_task_help_parent": "Voltooi alle volgende taken om uw vriend boost",
|
||||||
|
"finish_one_task_help_parent": "Voltooi een van de volgende taken om uw vriend boost",
|
||||||
|
"task_index": "Taak {{index}}",
|
||||||
|
"raise_pet_to_get_free_gift": "Verhoog uw huisdier om gratis geschenken te krijgen",
|
||||||
|
"step": "STAP",
|
||||||
|
"pick_item": "Kies item",
|
||||||
|
"raise_pet": "Huisdier verhogen",
|
||||||
|
"get_free_gift": "Krijg gratis geschenk",
|
||||||
|
"has_got": "{{name}} heeft {{reward_title}}",
|
||||||
|
"more_unexpected_gifts": "Meer onverwachte geschenken tijdens het opvoeden van uw huisdier",
|
||||||
|
"pick_it": "Kies het.",
|
||||||
|
"picked": "geplukt",
|
||||||
|
"your_gift_confirm": "Bevestig uw geschenk.",
|
||||||
|
"free": "Vrij",
|
||||||
|
"raise_the_dog_to_get_your": "voed de hond op om uw",
|
||||||
|
"free_gift": "Gratis geschenk!",
|
||||||
|
"expires_in_day": "Vervalt in {{day}} dagen",
|
||||||
|
"collect_more_love": "Verzamel [[{{num}}]] meer liefdespunten om een GRATIS geschenk te krijgen",
|
||||||
|
"collect": "Verzamelen",
|
||||||
|
"claim_now": "Claim nu",
|
||||||
|
"feed_more_times": "Feed {{num}} meer keer",
|
||||||
|
"get_more": "Meer informatie",
|
||||||
|
"first_referral_bonus": "Eerste verwijzing bonus!",
|
||||||
|
"get_rewards_first_time": "Ontvang beloningen door vrienden voor het eerst uit te nodigen",
|
||||||
|
"first_invite_receive": "De eerste uitnodiging voor een nieuwe gebruiker zal ontvangen [[{{num}}]]",
|
||||||
|
"invite_now": "Nodig nu uit",
|
||||||
|
"invite_get_dog_foods": "Nodig vrienden uit om voedsel te verdienen",
|
||||||
|
"invite_friends": "Nodig vrienden uit",
|
||||||
|
"pick_a_gift": "Kies 1 gratis geschenk",
|
||||||
|
"feed_3_times": "3 maal voeden",
|
||||||
|
"invite_new_user_extra_get": "Nodig nieuwe gebruiker voor de eerste keer kan krijgen extra [[{{num}}]]",
|
||||||
|
"reward_upgraded": "Beloning verbeterd",
|
||||||
|
"reward_for_you": "[[{{reward_title}}]] voor u",
|
||||||
|
"time_s_up": "Tijden om!",
|
||||||
|
"play_again": "Opnieuw afspelen",
|
||||||
|
"complete_tasks_to_earn_reward": "Volledige taken om Beloning te verdienen",
|
||||||
|
"super": "SUPER",
|
||||||
|
"super_benefit": "Supervoordeel",
|
||||||
|
"task_cond_one": "Voltooi elke taak om een [[beloning]] te ontvangen",
|
||||||
|
"task_cond_all": "Voltooi alle taken om {{reward_title}}[[+{{num}}]]",
|
||||||
|
"congrats": "Gefeliciteerd!",
|
||||||
|
"enjoy_your": "Geniet van je",
|
||||||
|
"try_again_to_claim": "Probeer opnieuw je gave op te eisen",
|
||||||
|
"collect_love": "Verzamel liefde",
|
||||||
|
"finish_step": "Afgedane fasetaak",
|
||||||
|
"finish_feed": "Voltooid voertaak",
|
||||||
|
"friend_third_feed": "Vriend voltooide het voeden van hondenvoer 3 keer",
|
||||||
|
"friend_first_third_feed": "Dagelijks uitnodigen vrienden om het voeden van honden voedsel 3 keer te voltooien",
|
||||||
|
"friend_select_reward": "Vriend heeft de prijs gekozen.",
|
||||||
|
"friend_first_select_reward": "Nodig dagelijks vrienden uit om de prijs te kiezen",
|
||||||
|
"rewards": "Beloningen",
|
||||||
|
"round_expired": "Ronde verlopen",
|
||||||
|
"love_points": "Love Points",
|
||||||
|
"dog_food_lack": "Ga alsjeblieft meer hondenvoer halen.",
|
||||||
|
"collect_machine": "De hondenvoermachine is ontvangen.",
|
||||||
|
"max_grow": "De maximale ontwikkelingstijden overschreden",
|
||||||
|
"please_collect_love": "Verzamel eerst liefde",
|
||||||
|
"continue_grow": "Het huidige huisdier kan nog steeds worden gehouden",
|
||||||
|
"dog_food_machine_running": "Hondenvoer is in productie",
|
||||||
|
"reward_remove": "De prijs is verlaagd.",
|
||||||
|
"reward_get_max": "De prijs heeft de maximumgrens van de verwerving overschreden",
|
||||||
|
"i_am_hungry": "Ik heb honger.",
|
||||||
|
"effect_invite": "Succesvol een vriend uitgenodigd",
|
||||||
|
"day_first_effect_invite": "Succesvol een vriend uitgenodigd voor de eerste keer op dezelfde dag",
|
||||||
|
"finish_many_feed": "Meerdere voedingen voltooid",
|
||||||
|
"daily_rewards": "Dagelijkse beloning",
|
||||||
|
"come_back_tomorrow_for_more_rewards": "Kom morgen terug voor meer beloningen!",
|
||||||
|
"claim_today_reward": "Claim de beloning van vandaag!",
|
||||||
|
"come_back_tomorrow": "Kom morgen terug!",
|
||||||
|
"fail_to_sign_progress_reset": "Als u zich niet continu aanmeldt, wordt uw voortgang hersteld.",
|
||||||
|
"signed_in": "Ondertekend in",
|
||||||
|
"signed_title": "Aanmelden",
|
||||||
|
"you_got_the_gift_box": "Je hebt de geschenkdoos.",
|
||||||
|
"use_it": "Gebruik het",
|
||||||
|
"you_got_dog_food": "Je hebt {{num}} hondenvoer",
|
||||||
|
"you_got_reward": "Je hebt {{reward_title}}",
|
||||||
|
"invite_contest": "Uitnodigingswedstrijd",
|
||||||
|
"rewards_earned_to_your_account": "Verdiende beloningen worden [[direct op]] je account bijgeschreven",
|
||||||
|
"invite_more_friends": "Nodig meer vrienden uit",
|
||||||
|
"invited": "{{num}} uitgenodigd",
|
||||||
|
"daily_fortune_draw": "Dagelijkse loting",
|
||||||
|
"win_free_gift_every_day": "Win gratis geschenk elke dag!",
|
||||||
|
"draw_now": "Nu tekenen",
|
||||||
|
"day_num": "Dag {{num}}",
|
||||||
|
"you": "Jij",
|
||||||
|
"blind_box": "Blinde doos",
|
||||||
|
"daily_draw": "Dagelijkse trekking",
|
||||||
|
"rankings": "Ranglijst",
|
||||||
|
"rank_reward": "Ranking Rewards",
|
||||||
|
"sign_reward": "Aanmeldvergoedingen",
|
||||||
|
"blind_reward": "Blind Box Rewards",
|
||||||
|
"lucky_reward": "Loterij Beloningen",
|
||||||
|
"tomorrow": "Morgen",
|
||||||
|
"win_reward": "Win[[{{title}}]]",
|
||||||
|
"rank_end": "De tijd is om.",
|
||||||
|
"congrats_for_getting": "Gefeliciteerd met het krijgen",
|
||||||
|
"ends_in": "eindigt in",
|
||||||
|
"invite_friend_download_app": "Nodig [[{{num}}]] vriend(s) uit om de App te downloaden",
|
||||||
|
"invite_friend_register_app": "Nodig [[{{num}}]] vriend(s) uit om te registreren",
|
||||||
|
"invite_friend_install_get_lottery_chance_v2": "Nodig [[{{num}}]] vriend(s) uit om de App te downloaden, en je krijgt [[{{chance}}]] kans(s).",
|
||||||
|
"invite_friend_install_get_lottery_chance_limit_v2": "Nodig [[{{num}}]] vriend(s) uit om de App te downloaden, en je krijgt [[{{chance}}]] kans(s), tot een maximum van {{limit}} kans(s).",
|
||||||
|
"invite_friend_register_get_lottery_chance_v2": "Nodig [[{{num}}]] vriend(s) uit om de registratie te voltooien, en je krijgt [[{{chance}}]] kans(s).",
|
||||||
|
"invite_friend_register_get_lottery_chance_limit_v2": "Nodig [[{{num}}]] vriend(s) uit om registratie te voltooien, en je krijgt [[{{chance}}]] kans(s), tot een maximum van {{limit}} kans(s).",
|
||||||
|
"lottery_task_finish_v2": "Je krijgt [[{{chance}}]] kans(s) na voltooiing",
|
||||||
|
"lottery_task_finish_limit_v2": "Je krijgt [[{{chance}}]] kans(s) na voltooiing, tot een maximum van {{limit}} tijd(s)",
|
||||||
|
"lottery_task_cond_all_v2": "Het voltooien van alle taken kan resulteren in het verkrijgen van [[{{chance}}]] kans(s)",
|
||||||
|
"lottery_task_cond_all_limit_v2": "Het voltooien van alle taken kan resulteren in het verkrijgen [[{{chance}}]] kans(s), tot een maximum van {{limit}} tijd(s), en [[{{num}}]] tijd(s) zijn verkregen.",
|
||||||
|
"sign_in_every_day_can_get_lottery_v2": "Meld je elke dag aan om [[{{num}}]] kans(s) te krijgen om een prijs te winnen.",
|
||||||
|
"invite_friends_to_earn_reward": "Nodig vrienden uit om Beloning te verdienen",
|
||||||
|
"raffle_num_add": "Kans [[+{{num}}]]",
|
||||||
|
"click_button_and_get_coins": "Klik op de knop om de taak te voltooien en meer munten te krijgen",
|
||||||
|
"do_task_get_energy": "Volledige taken om energie te winnen",
|
||||||
|
"coins": "{{num}} munten",
|
||||||
|
"get_tasks": "Taken ophalen",
|
||||||
|
"next": "Volgende",
|
||||||
|
"finish_task_title": "Voltooid \"{{title}}\"",
|
||||||
|
"get_energy": "Energie ophalen",
|
||||||
|
"tasks": "Taken",
|
||||||
|
"invite_friend_install_get_gold": "Nodig {{num}} vrienden uit om de app te downloaden om {{chance}} munten te verdienen.",
|
||||||
|
"invite_friend_install_get_gold_limit": "Nodig {{num}} vrienden uit om de app te downloaden om {{chance}} munten te verdienen, met een maximum van {{limit}} munten.",
|
||||||
|
"invite_friend_register_get_gold": "Nodig {{num}} vrienden uit om de registratie te voltooien om {{chance}} munten te verdienen.",
|
||||||
|
"invite_friend_register_get_gold_limit": "Nodig {{num}} vrienden uit om de registratie te voltooien om {{chance}} munten te verdienen, met een maximum van {{limit}} munten.",
|
||||||
|
"gold_task_finish": "Volledig te verdienen {{chance}} munten",
|
||||||
|
"gold_task_finish_limit": "Volledig te verdienen {{chance}} munten, tot een maximum van {{limit}} tijden",
|
||||||
|
"gold_task_cond_one": "Voltooi elke taak om munten te verdienen",
|
||||||
|
"gold_task_cond_all": "Voltooi alle taken om {{chance}} munten te verdienen",
|
||||||
|
"gold_task_cond_all_limit": "Voltooi alle taken om {{chance}} munten te verdienen, tot een maximum van {{limit}} keer, u hebt ontvangen {{num}} keer",
|
||||||
|
"do_task_get_gold": "Volledige taken om munten te verdienen",
|
||||||
|
"task_none": "Er zijn geen taken beschikbaar om te voltooien",
|
||||||
|
"finish_task_earn_num": "Voltooi de taak om te verdienen [[+{{num}}]]",
|
||||||
|
"reached_the_max": "Bereikt het maximum",
|
||||||
|
"has_got_style": "[[{{name}}]] heeft [[{{reward_title}}]]",
|
||||||
|
"dog_food_num": "{{num}}g voedsel",
|
||||||
|
"in_production": "In productie",
|
||||||
|
"active_talk": "Je hebt me lang niet bezocht. Kom vaker om meer beloningen te krijgen.",
|
||||||
|
"task_reset_talk": "Een van uw prijzen staat op het punt te vervallen, kom en bekijk het.",
|
||||||
|
"dog_offline_talk": "U hebt een deel van het voeder voor huisdieren ontvangen, ga het alstublieft claimen.",
|
||||||
|
"complete_task_talk": "U hebt de taak volbracht, gefeliciteerd met het ontvangen van een prijs, kom en claim het.",
|
||||||
|
"current_total_prize_pool": "Huidige totale prijspool",
|
||||||
|
"get_coin": "[[{{name}}]] Munten gewonnen [[{{num}}]]",
|
||||||
|
"join_coin_num": "[[{{name}}]] Grijp goud [[[*{{num}}]]",
|
||||||
|
"join_coin": "Goud grijpen",
|
||||||
|
"coin_per_use": "{{num}} gouden munten per gebruik",
|
||||||
|
"expected_to_receive_coin": "Verwacht om [[{{num}}]] gouden munten te ontvangen",
|
||||||
|
"collect_coin": "[[{{num}}]] gouden munten kunnen worden verzameld",
|
||||||
|
"expired": "Verlopen",
|
||||||
|
"gold_coins_deposited": "Gedeponeerde gouden munten",
|
||||||
|
"timeout_and_no_collection": "Timeout en niet geclaimd",
|
||||||
|
"use_gold_coins_to_play": "Gebruik [[{{num}}]] gouden munten om te spelen?",
|
||||||
|
"more": "Meer",
|
||||||
|
"cancel": "Annuleren",
|
||||||
|
"play_limit_next_round": "Je hebt de speellimiet bereikt! Kom terug voor de volgende ronde!",
|
||||||
|
"insufficient_balance_grab_gold": "Onvoldoende evenwicht. Kan goud niet grijpen",
|
||||||
|
"do_task": "Taken uitvoeren",
|
||||||
|
"this_round_has_ended": "Deze ronde is afgelopen.",
|
||||||
|
"claim": "Claim",
|
||||||
|
"claim_it_now": "Claim het nu!",
|
||||||
|
"claim_time_not_reached": "Claimtijd niet bereikt",
|
||||||
|
"success": "Succes",
|
||||||
|
"too_late_reward_expired": "Te laat! Beloning verlopen",
|
||||||
|
"no_duplicate_claims": "Geen dubbele claims",
|
||||||
|
"buy_more": "Koop meer",
|
||||||
|
"operation_failed": "Operatie mislukt. Probeer het later opnieuw",
|
||||||
|
"expected_to_be_available_tomorrow": "Verwacht wordt dat morgen beschikbaar zal zijn",
|
||||||
|
"expected_to_be_available_in_day": "Verwacht beschikbaar te zijn in {{day}} dagen",
|
||||||
|
"num_gold_coins": "[[{{num}}]] munten",
|
||||||
|
"check_in_now": "Check nu in",
|
||||||
|
"complete_daily_check_ins_for_prizes": "Volledige dagelijkse check-ins voor prijzen",
|
||||||
|
"check_in_days": "Incheckdagen",
|
||||||
|
"lottery_chance_done": "Kans [[+{{chance}}]] (Gedaan: [[{{num}}]])",
|
||||||
|
"lottery_chance_done_limit": "Kans [[+{{chance}}]] (Gedaan: [[{{num}}]]/{{limit}})",
|
||||||
|
"claim_failed": "Claim mislukt. Neem contact op met klantenservice.",
|
||||||
|
"answer_tomorrow_get_chance": "Haal {{chance}} meer kansen om morgen te antwoorden",
|
||||||
|
"finish_invite_task": "Uitnodigingstaak voltooid",
|
||||||
|
"dice_chance_done": "Dobbelstenen [[+{{chance}}]] (Gedaan: [[{{num}}]])",
|
||||||
|
"dice_chance_done_limit": "Dice [[+{{chance}}]] (Gedaan: [[{{num}}]]/{{limit}})",
|
||||||
|
"grow_chance_done": "Groeiposten [[+{{chance}}]] (Gedaan: [[{{num}}]])",
|
||||||
|
"grow_chance_done_limit": "Groeiposten [[+{{chance}}]] (Gedaan: [[{{num}}]]/{{limit}})",
|
||||||
|
"qa_chance_done": "Quiz Chance [[+{{chance}}]] (Gedaan: [[{{num}}]])",
|
||||||
|
"qa_chance_done_limit": "Quizkans [[+{{chance}}]] (Gedaan: [[{{num}}]]/{{limit}})",
|
||||||
|
"help_wait": "Aan de gang",
|
||||||
|
"distributing": "Verdeling",
|
||||||
|
"distribution_failed": "NIET VERMIST",
|
||||||
|
"claimed": "Opgevraagd",
|
||||||
|
"no_prizes_to_claim": "Geen prijzen beschikbaar voor u om te claimen",
|
||||||
|
"points_use": "Gebruikte {{num}}-punten",
|
||||||
|
"points_use_ok": "Uitwisseling succesvol",
|
||||||
|
"points_use_lack": "Onvoldoende punten",
|
||||||
|
"points_use_close": "Wisselfunctie is gesloten",
|
||||||
|
"points_use_day_limit": "Dagelijkse wisselkoerslimiet bereikt",
|
||||||
|
"points_use_limit": "Koerslimiet bereikt",
|
||||||
|
"points_use_dice": "Gebruik [[{{num}}]], ruil voor [[{{chance}}]] dobbelstenen?",
|
||||||
|
"points_use_lottery": "Gebruik [[{{num}}]], ruil voor [[{{chance}}]] kans?",
|
||||||
|
"times": "Tijden",
|
||||||
|
"dice": "Dobbelstenen",
|
||||||
|
"one_spin": "1 spin",
|
||||||
|
"raise_the_pet_to_get_your": "Verhoog huisdieren te krijgen uw",
|
||||||
|
"pet_food_num": "{{num}}g voeder voor gezelschapsdieren",
|
||||||
|
"pet_food": "Diervoeders",
|
||||||
|
"friend_third_feed_pet": "Uw vriend heeft huisdieren 3 keer gevoed",
|
||||||
|
"friend_first_third_feed_pet": "Nodig vrienden dagelijks uit om huisdieren 3 keer te voeden",
|
||||||
|
"collect_machine_food": "De petfood machine is ontvangen",
|
||||||
|
"pet_food_lack": "Ga alsjeblieft meer dierenvoer halen.",
|
||||||
|
"pet_food_machine_running": "Huisdiervoer wordt geproduceerd",
|
||||||
|
"chat_day_limit": "Ik ben een beetje moe vandaag.",
|
||||||
|
"chat_token_limit": "Ik ben erg moe.",
|
||||||
|
"chat": "Chat",
|
||||||
|
"hours_ago": "{{hour}} uren geleden",
|
||||||
|
"conversation_and_chat": "U kunt een gesprek beginnen en chatten met uw huisdier",
|
||||||
|
"invite_friend_install_get_vote_chance": "Nodig {{num}} vrienden uit om de app te downloaden om {{chance}} stemkansen te krijgen.",
|
||||||
|
"invite_friend_install_get_vote_chance_limit": "Nodig {{num}} vrienden uit om de app te downloaden om {{chance}} stemkansen te krijgen, met een maximum van {{limit}} kansen.",
|
||||||
|
"invite_friend_register_get_vote_chance": "Nodig {{num}} vrienden uit om de registratie te voltooien om {{chance}} stemkansen te krijgen.",
|
||||||
|
"invite_friend_register_get_vote_chance_limit": "Nodig {{num}} vrienden uit om de registratie te voltooien om {{chance}} stemkansen te krijgen, met een maximum van {{limit}} kansen.",
|
||||||
|
"vote_task_finish": "Voltooien geeft je {{chance}} stemkansen",
|
||||||
|
"vote_task_finish_limit": "Volledig om {{chance}} stemkansen te verdienen, max {{limit}} keer",
|
||||||
|
"vote_task_num": "Stem op kansen die uit taken worden verdiend",
|
||||||
|
"vote_task_cond_one": "Voltooi elke taak om stemkansen te verdienen",
|
||||||
|
"vote_task_cond_all": "Voltooi alle taken om {{chance}} stemkansen te krijgen",
|
||||||
|
"vote_task_cond_all_limit": "Voltooi alle taken om {{chance}} stemkansen, max {{limit}}, al {{num}}",
|
||||||
|
"do_task_get_vote": "Verdien stemkansen door taken te doen",
|
||||||
|
"sign_in_every_day_can_get_vote": "Kom dagelijks om {{num}} stemkansen te ontvangen",
|
||||||
|
"your_choice": "Uw keuze",
|
||||||
|
"cap_win": "WINST",
|
||||||
|
"cap_draw": "GELIJKSPEL",
|
||||||
|
"blue_team": "Blauw",
|
||||||
|
"red_team": "Rood",
|
||||||
|
"spend_coin_to_vote_team": "Weet u zeker dat u [[{{coin}}]] wilt besteden aan het stemmen voor <<{{title}}>>?",
|
||||||
|
"vote_team": "Weet u zeker dat u wilt stemmen op [[{{title}}]]?",
|
||||||
|
"vote_sure": "Stem bevestigen?",
|
||||||
|
"no_scheduled": "Geen overeenkomsten gepland",
|
||||||
|
"schedule": "Schema",
|
||||||
|
"in_progress": "In behandeling",
|
||||||
|
"participated": "Deelgenomen",
|
||||||
|
"vote_soon": "Stemming",
|
||||||
|
"vote": "Stemming",
|
||||||
|
"pending": "In afwachting",
|
||||||
|
"settled": "Ingesteld",
|
||||||
|
"spend_coin_redeem_reward": "Weet u zeker dat u [[{{coin}}]] wilt uitgeven om <<{{title}}>> te verzilveren?",
|
||||||
|
"redeem_sure": "Verlossing bevestigen?",
|
||||||
|
"prize_restocking": "Prijsuitreiking in uitvoering...",
|
||||||
|
"redeem": "Inwisselen",
|
||||||
|
"invite_friend_install_get_vote_chance_v2": "Nodig [[{{num}}]] vrienden uit om de App te downloaden om [[{{chance}}]] stemkansen te krijgen.",
|
||||||
|
"invite_friend_install_get_vote_chance_limit_v2": "Nodig [[{{num}}]] vrienden uit om de App te downloaden om [[{{chance}}]] stemkansen te krijgen, tot {{limit}} stemkansen.",
|
||||||
|
"invite_friend_register_get_vote_chance_v2": "Nodig [[{{num}}]] vrienden uit om de registratie te voltooien om [[{{chance}}]] stemkansen te krijgen.",
|
||||||
|
"invite_friend_register_get_vote_chance_limit_v2": "Nodig [[{{num}}]] vrienden uit om de registratie te voltooien om [[{{chance}}]] stemkansen te krijgen, tot {{limit}} stemkansen.",
|
||||||
|
"vote_task_finish_v2": "Voltooid om te krijgen [[{{chance}}]] stemkansen",
|
||||||
|
"vote_task_finish_limit_v2": "Voltooid om te krijgen [[{{chance}}]] stemkansen, max {{limit}} tijden",
|
||||||
|
"vote_task_cond_all_v2": "Voltooi alle taken om te krijgen [[{{chance}}]] stemkansen",
|
||||||
|
"vote_task_cond_all_limit_v2": "Voltooi alle taken om te krijgen [[{{chance}}]] stemkansen, max {{limit}}, al gekregen [[{{num}}]]",
|
||||||
|
"sign_in_every_day_can_get_vote_v2": "Kom dagelijks en krijg [[{{num}}]] stemkansen",
|
||||||
|
"vote_num_add": "Stem kansen [[+{{num}}]]",
|
||||||
|
"confirm_": "Bevestigen",
|
||||||
|
"vote_chance_done": "Stem kansen [[+{{chance}}]] (Voltooid: [[{{num}}]])",
|
||||||
|
"vote_chance_done_limit": "Stem kansen [[+{{chance}}]] (voltooid: [[{{num}}]]/{{limit}})",
|
||||||
|
"vote_success": "Stem succesvol",
|
||||||
|
"non_voting_hours": "U kunt niet stemmen tijdens niet-stemmingsuren",
|
||||||
|
"vote_chance_lack": "Onvoldoende stemmogelijkheden",
|
||||||
|
"insufficient_points": "Onvoldoende punten",
|
||||||
|
"vote_limit": "De stemming heeft het maximum bereikt.",
|
||||||
|
"vote_failed": "Stem mislukt",
|
||||||
|
"odds": "Vreemd",
|
||||||
|
"playing": "Afspelen",
|
||||||
|
"card_chance_lack": "Onvoldoende kansen",
|
||||||
|
"get_color_card": "Ontvang 1 kaart van de opgegeven kleur",
|
||||||
|
"get_three_card": "Krijg 3 kaarten van elke kleur",
|
||||||
|
"get_five_card": "Krijg 5 kaarten van elke kleur",
|
||||||
|
"action_card": "Actiekaart",
|
||||||
|
"choose_a_color": "Kies een kleur",
|
||||||
|
"got_a_new_card": "Je hebt een nieuwe kaart.",
|
||||||
|
"action_card_unlocked": "ACTIEKAART NIET VERBINDEN!",
|
||||||
|
"claim_prize": "Claimprijs",
|
||||||
|
"vote_chances": "Tickets",
|
||||||
|
"coin_log_mall": "Punten Aflossing",
|
||||||
|
"coin_log_vote": "Stemprocedure",
|
||||||
|
"coin_log_expired": "Punten verlopen",
|
||||||
|
"coin_log_reward": "Event Beloningen",
|
||||||
|
"coin_log_task": "Taakbeloningen",
|
||||||
|
"coin_log_title": "Punten",
|
||||||
|
"got": "Begrepen.",
|
||||||
|
"deduct": "Aftrekken",
|
||||||
|
"invite_friend_install_get_qa_v2": "Nodig [[{{num}}]] vrienden uit om de App te downloaden en krijg [[{{chance}}]] kansen om vragen te beantwoorden.",
|
||||||
|
"invite_friend_install_get_qa_limit_v2": "Nodig [[{{num}}]] vrienden uit om de App te downloaden en krijg [[{{chance}}]] kansen om vragen te beantwoorden, met een maximum van {{limit}} kansen.",
|
||||||
|
"invite_friend_register_get_qa_v2": "Nodig [[{{num}}]] vrienden uit om de registratie te voltooien en krijg [[{{chance}}]] kansen om vragen te beantwoorden.",
|
||||||
|
"invite_friend_register_get_qa_limit_v2": "Nodig [[{{num}}]] vrienden uit om de registratie te voltooien en krijg [[{{chance}}]] kansen om vragen te beantwoorden, met een maximum van {{limit}} kansen.",
|
||||||
|
"qa_task_finish_v2": "Het voltooien ervan zal je verdienen [[{{chance}}]] kansen om vragen te beantwoorden.",
|
||||||
|
"qa_task_finish_limit_v2": "Het voltooien van het zal je verdienen [[{{chance}}]] kansen om vragen te beantwoorden, met een maximum van {{limit}} voltooiingen.",
|
||||||
|
"qa_task_cond_all_v2": "Het voltooien van alle taken zal je verdienen [[{{chance}}]] kansen om vragen te beantwoorden",
|
||||||
|
"qa_task_cond_all_limit_v2": "Het voltooien van alle taken zal je verdienen [[{{chance}}]] kansen om vragen te beantwoorden, met een maximum van {{limit}} kansen, en je hebt al ontvangen [[{{num}}]] kansen",
|
||||||
|
"sign_in_every_day_can_get_qa_v2": "Elke dag ontvangt u [[{{num}}]] kansen om vragen te beantwoorden.",
|
||||||
|
"quiz_starting": "De Quiz starten...",
|
||||||
|
"quiz_ready": "Klaar.",
|
||||||
|
"quiz_oops": "Oeps!",
|
||||||
|
"quiz_question_progress": "Vraag [[{{num}}]] van [[{{x}}]]",
|
||||||
|
"quiz_back": "Terug naar de quiz",
|
||||||
|
"quiz_review_answers": "Antwoorden herzien",
|
||||||
|
"quiz_question": "Vraag",
|
||||||
|
"quiz_no_answer_submitted": "Er werd geen antwoord gegeven",
|
||||||
|
"quiz_perfect_score": "Perfecte score!",
|
||||||
|
"quiz_correct_count": "Je hebt [[{{num}}]] van [[{{x}}]] juist!",
|
||||||
|
"quiz_good_job": "Goed gedaan!",
|
||||||
|
"quiz_round_complete": "Rond voltooid",
|
||||||
|
"quiz_correct": "Correct",
|
||||||
|
"quiz_next": "Volgende",
|
||||||
|
"quiz_home": "Begin"
|
||||||
|
}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{"deduct":"Deduzir","quiz_correct":"Correto","quiz_correct_count":"Você acertou [[{{num}}]] de [[{{x}}]]!","quiz_home":"Início","quiz_next":"Próximo","quiz_question_progress":"Pergunta [[{{num}}]] de [[{{x}}]]","quiz_round_complete":"Rodada concluída","quiz_chances":"Tentativas do quiz","claim_it_now":"Resgate agora!"}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{"deduct":"Вычесть","quiz_correct":"Верно","quiz_correct_count":"Правильных ответов: [[{{num}}]] из [[{{x}}]]!","quiz_home":"Главная","quiz_next":"Далее","quiz_question_progress":"Вопрос [[{{num}}]] из [[{{x}}]]","quiz_round_complete":"Раунд завершён","quiz_chances":"Попытки в викторине","claim_it_now":"Получить сейчас!"}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{"deduct":"หัก","quiz_correct":"ถูกต้อง","quiz_correct_count":"คุณตอบถูก [[{{num}}]] จาก [[{{x}}]] ข้อ!","quiz_home":"หน้าหลัก","quiz_next":"ถัดไป","quiz_question_progress":"ข้อที่ [[{{num}}]] จาก [[{{x}}]]","quiz_round_complete":"จบรอบแล้ว","quiz_chances":"โอกาสตอบคำถาม","claim_it_now":"รับเลยตอนนี้!"}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{"deduct":"Khấu trừ","quiz_correct":"Đúng","quiz_correct_count":"Bạn đã trả lời đúng [[{{num}}]] trên [[{{x}}]] câu!","quiz_home":"Trang chủ","quiz_next":"Tiếp theo","quiz_question_progress":"Câu [[{{num}}]] trên [[{{x}}]]","quiz_round_complete":"Hoàn thành vòng","quiz_chances":"Lượt trả lời","claim_it_now":"Nhận ngay!"}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{"deduct":"扣除","quiz_correct":"正確","quiz_correct_count":"你答對了[[{{num}}]]題,共[[{{x}}]]題!","quiz_home":"首頁","quiz_next":"下一題","quiz_question_progress":"第[[{{num}}]]題,共[[{{x}}]]題","quiz_round_complete":"本輪完成","quiz_chances":"答題機會","claim_it_now":"立即領取"}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
## 阿拉伯语、德语、英语、西班牙语、法语、印尼语、意大利语、日语、韩语、葡萄牙语、俄语、泰语、土耳其语、越南语、中文、繁体中文、匈牙利语、捷克语、荷兰语、波兰语、罗马尼亚语
|
||||||
|
阿拉伯语: ar
|
||||||
|
德语: de
|
||||||
|
英语: en
|
||||||
|
西班牙语: es
|
||||||
|
法语: fr
|
||||||
|
印尼语: id
|
||||||
|
意大利语: it
|
||||||
|
日语: ja
|
||||||
|
韩语: ko
|
||||||
|
葡萄牙语: pt
|
||||||
|
俄语: ru
|
||||||
|
泰语: th
|
||||||
|
土耳其语: tr
|
||||||
|
越南语: vi
|
||||||
|
中文: zh
|
||||||
|
繁体中文: zh-TW
|
||||||
|
匈牙利语: hu
|
||||||
|
捷克语: cs
|
||||||
|
荷兰语: nl
|
||||||
|
波兰语: pl
|
||||||
|
罗马尼亚语: ro
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "تم",
|
||||||
|
"congrats": "مبروك!",
|
||||||
|
"finish_task_get_reward": "إنهاء سيكسبك",
|
||||||
|
"next_week_do": "الأسبوع المقبل",
|
||||||
|
"ok": "حسنًا",
|
||||||
|
"receive": "احصل",
|
||||||
|
"refresh_tomorrow": "سيتم التحديث غدًا",
|
||||||
|
"remain_time_text": "الوقت المتبقي",
|
||||||
|
"step": "الخطوة {{num}}",
|
||||||
|
"time_d": "{{d}} يوم",
|
||||||
|
"time_d_h": "{{d}} يوم {{h}} ساعة",
|
||||||
|
"time_h": "{{h}} ساعة",
|
||||||
|
"time_h_m": "{{h}} ساعة {{m}} دقيقة",
|
||||||
|
"time_m": "{{m}} دقيقة",
|
||||||
|
"time_m_s": "{{m}} دقيقة {{s}} ثانية",
|
||||||
|
"time_s": "{{s}} ثانية",
|
||||||
|
"to_complete": "لإكمال",
|
||||||
|
"use": "الاستخدام",
|
||||||
|
"week_do_1": "تحديث الإثنين",
|
||||||
|
"week_do_2": "تحديث الثلاثاء",
|
||||||
|
"week_do_3": "تحديث الأربعاء",
|
||||||
|
"week_do_4": "تحديث الخميس",
|
||||||
|
"week_do_5": "تحديث الجمعة",
|
||||||
|
"week_do_6": "تحديث السبت",
|
||||||
|
"week_do_7": "تحديث الأحد",
|
||||||
|
"exchange": "استبدال",
|
||||||
|
"exchange_tips": "هل أنت متأكد من إنفاق [[{{coin}}]] لاستبدال <<{{title}}>>؟",
|
||||||
|
"confirm_exchange": "تأكيد الاستبدال؟",
|
||||||
|
"exchange_success": "تم الاستبدال بنجاح",
|
||||||
|
"cancel": "إلغاء",
|
||||||
|
"restock_tips": "المكافآت قيد التوريد...",
|
||||||
|
"sold_out": "نفدت الكمية",
|
||||||
|
"coming_soon": "قريبًا",
|
||||||
|
"discontinued": "تم إزالته",
|
||||||
|
"exchange_limit": "حد الاستبدال",
|
||||||
|
"points_lack": "نقاط غير كافية",
|
||||||
|
"exchange_middle": "جاري الاستبدال",
|
||||||
|
"exchange_failed": "فشل الاستبدال، يرجى المحاولة مرة أخرى لاحقًا"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "Dokončeno",
|
||||||
|
"congrats": "Gratulujeme!",
|
||||||
|
"finish_task_get_reward": "Dokončením získáte odměnu",
|
||||||
|
"next_week_do": "Návštěva příští týden",
|
||||||
|
"ok": "OK",
|
||||||
|
"receive": "Vyzvednout",
|
||||||
|
"refresh_tomorrow": "Zítra znovu",
|
||||||
|
"remain_time_text": "Zbývající čas",
|
||||||
|
"step": "Krok {{num}}",
|
||||||
|
"time_d": "{{d}} dnů",
|
||||||
|
"time_d_h": "{{d}} dnů {{h}} hodin",
|
||||||
|
"time_h": "{{h}} hodin",
|
||||||
|
"time_h_m": "{{h}} hodin {{m}} minut",
|
||||||
|
"time_m": "{{m}} minut",
|
||||||
|
"time_m_s": "{{m}} minut {{s}} vteřin",
|
||||||
|
"time_s": "{{s}} vteřin",
|
||||||
|
"to_complete": "Dokončit",
|
||||||
|
"use": "Použít",
|
||||||
|
"week_do_1": "Návštěva v pondělí",
|
||||||
|
"week_do_2": "Návštěva v úterý",
|
||||||
|
"week_do_3": "Návštěva ve středu",
|
||||||
|
"week_do_4": "Návštěva ve čtvrtek",
|
||||||
|
"week_do_5": "Návštěva v pátek",
|
||||||
|
"week_do_6": "Návštěva v sobotu",
|
||||||
|
"week_do_7": "Návštěva v neděli",
|
||||||
|
"exchange": "Výměna",
|
||||||
|
"exchange_tips": "Opravdu chcete utratit [[{{coin}}]] za výměnu „<<{{title}}>>“?",
|
||||||
|
"confirm_exchange": "Potvrdit výměnu?",
|
||||||
|
"exchange_success": "Výměna proběhla úspěšně",
|
||||||
|
"cancel": "Zrušit",
|
||||||
|
"restock_tips": "Doplnění ceny...",
|
||||||
|
"sold_out": "Vyprodáno",
|
||||||
|
"coming_soon": "Brzy k dispozici",
|
||||||
|
"discontinued": "Není v prodeji",
|
||||||
|
"exchange_limit": "Limit výměny",
|
||||||
|
"points_lack": "Nedostatečné body",
|
||||||
|
"exchange_middle": "Probíhá výměna",
|
||||||
|
"exchange_failed": "Výměna se nezdařila, zkuste to prosím později"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "erledigt",
|
||||||
|
"congrats": "Herzlichen Glückwunsch!",
|
||||||
|
"finish_task_get_reward": "Durch Abschluss erhältst du",
|
||||||
|
"next_week_do": "Nächste Woche",
|
||||||
|
"ok": "OK",
|
||||||
|
"receive": "Einlösen",
|
||||||
|
"refresh_tomorrow": "Aktualisierung morgen",
|
||||||
|
"remain_time_text": "Verbleibende Zeit",
|
||||||
|
"step": "Schritt {{num}}",
|
||||||
|
"time_d": "{{d}} Tage",
|
||||||
|
"time_d_h": "{{d}} Tage {{h}} Stunden",
|
||||||
|
"time_h": "{{h}} Stunden",
|
||||||
|
"time_h_m": "{{h}} Stunden {{m}} Minuten",
|
||||||
|
"time_m": "{{m}} Minuten",
|
||||||
|
"time_m_s": "{{m}} Minuten {{s}} Sekunden",
|
||||||
|
"time_s": "{{s}} Sekunden",
|
||||||
|
"to_complete": "Gehen",
|
||||||
|
"use": "Benutzen",
|
||||||
|
"week_do_1": "Mo Aktualisieren",
|
||||||
|
"week_do_2": "Di. Aktualisieren",
|
||||||
|
"week_do_3": "Mi Aktualisieren",
|
||||||
|
"week_do_4": "Do Aktualisieren",
|
||||||
|
"week_do_5": "Fr Aktualisieren",
|
||||||
|
"week_do_6": "Sa Aktualisieren",
|
||||||
|
"week_do_7": "So Aktualisieren",
|
||||||
|
"exchange": "Einlösen",
|
||||||
|
"exchange_tips": "Möchtest du [[{{coin}}]] ausgeben, um <<{{title}}>> einzulösen?",
|
||||||
|
"confirm_exchange": "Einlösen bestätigen?",
|
||||||
|
"exchange_success": "Einlösung erfolgreich",
|
||||||
|
"cancel": "Abbrechen",
|
||||||
|
"restock_tips": "Preis wird nachgefüllt...",
|
||||||
|
"sold_out": "Ausverkauft",
|
||||||
|
"coming_soon": "Demnächst verfügbar",
|
||||||
|
"discontinued": "Nicht mehr verfügbar",
|
||||||
|
"exchange_limit": "Einlösungslimit",
|
||||||
|
"points_lack": "Nicht genügend Punkte",
|
||||||
|
"exchange_middle": "Wird eingelöst",
|
||||||
|
"exchange_failed": "Einlösen fehlgeschlagen, bitte versuchen Sie es später erneut"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "Done",
|
||||||
|
"congrats": "CONGRATS!",
|
||||||
|
"finish_task_get_reward": "Completing earns",
|
||||||
|
"next_week_do": "Next Week",
|
||||||
|
"ok": "OK",
|
||||||
|
"receive": "Redeem",
|
||||||
|
"refresh_tomorrow": "Refresh Tomorrow",
|
||||||
|
"remain_time_text": "Remaining Time",
|
||||||
|
"step": "Step {{num}}",
|
||||||
|
"time_d": "{{d}} days",
|
||||||
|
"time_d_h": "{{d}} days {{h}} hours",
|
||||||
|
"time_h": "{{h}} hours",
|
||||||
|
"time_h_m": "{{h}} hours {{m}} minutes",
|
||||||
|
"time_m": "{{m}} minutes",
|
||||||
|
"time_m_s": "{{m}} minutes {{s}} seconds",
|
||||||
|
"time_s": "{{s}} seconds",
|
||||||
|
"to_complete": "Go",
|
||||||
|
"use": "Use",
|
||||||
|
"week_do_1": "Refresh On Mon",
|
||||||
|
"week_do_2": "Refresh On Tue",
|
||||||
|
"week_do_3": "Refresh On Wed",
|
||||||
|
"week_do_4": "Refresh On Thu",
|
||||||
|
"week_do_5": "Refresh On Fri",
|
||||||
|
"week_do_6": "Refresh On Sat",
|
||||||
|
"week_do_7": "Refresh On Sun",
|
||||||
|
"exchange": "Exchange",
|
||||||
|
"exchange_tips": "Spend [[{{coin}}]] to redeem <<{{title}}>>?",
|
||||||
|
"confirm_exchange": "Confirm exchange?",
|
||||||
|
"exchange_success": "Exchange successful",
|
||||||
|
"cancel": "Cancel",
|
||||||
|
"restock_tips": "Prize restocking...",
|
||||||
|
"sold_out": "Sold out",
|
||||||
|
"coming_soon": "Coming soon",
|
||||||
|
"discontinued": "Discontinued",
|
||||||
|
"exchange_limit": "Exchange limit",
|
||||||
|
"points_lack": "Insufficient points",
|
||||||
|
"exchange_middle": "Exchanging",
|
||||||
|
"exchange_failed": "Exchange failed, please try again later"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "hecho",
|
||||||
|
"congrats": "¡Felicidades!",
|
||||||
|
"finish_task_get_reward": "Completar te da",
|
||||||
|
"next_week_do": "La Próxima Semana",
|
||||||
|
"ok": "Está bien",
|
||||||
|
"receive": "Canjear",
|
||||||
|
"refresh_tomorrow": "Actualizar mañana",
|
||||||
|
"remain_time_text": "Tiempo restante",
|
||||||
|
"step": "Paso {{num}}",
|
||||||
|
"time_d": "{{d}} días",
|
||||||
|
"time_d_h": "{{d}} días {{h}} horas",
|
||||||
|
"time_h": "{{h}} horas",
|
||||||
|
"time_h_m": "{{h}} horas {{m}} minutos",
|
||||||
|
"time_m": "{{m}} minutos",
|
||||||
|
"time_m_s": "{{m}} minutos {{s}} segundos",
|
||||||
|
"time_s": "{{s}} segundos",
|
||||||
|
"to_complete": "Ir",
|
||||||
|
"use": "Usar",
|
||||||
|
"week_do_1": "Actualizar El Lun",
|
||||||
|
"week_do_2": "Actualizar El Mar",
|
||||||
|
"week_do_3": "Actualizar El Mié",
|
||||||
|
"week_do_4": "Actualizar El Jue",
|
||||||
|
"week_do_5": "Actualizar El Vie",
|
||||||
|
"week_do_6": "Actualizar El Sáb",
|
||||||
|
"week_do_7": "Actualizar El Dom",
|
||||||
|
"exchange": "Canjear",
|
||||||
|
"exchange_tips": "¿Estás seguro de gastar [[{{coin}}]] para canjear <<{{title}}>>?",
|
||||||
|
"confirm_exchange": "¿Confirmar canje?",
|
||||||
|
"exchange_success": "Canje exitoso",
|
||||||
|
"cancel": "Cancelar",
|
||||||
|
"restock_tips": "Reabasteciendo premio...",
|
||||||
|
"sold_out": "Agotado",
|
||||||
|
"coming_soon": "Próximamente",
|
||||||
|
"discontinued": "Descatalogado",
|
||||||
|
"exchange_limit": "Límite de canje",
|
||||||
|
"points_lack": "Puntos insuficientes",
|
||||||
|
"exchange_middle": "Canjeando",
|
||||||
|
"exchange_failed": "Canje fallido, inténtalo de nuevo más tarde"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "fait",
|
||||||
|
"congrats": "Félicitations !",
|
||||||
|
"finish_task_get_reward": "Compléter vous rapporte",
|
||||||
|
"next_week_do": "La Semaine Prochaine",
|
||||||
|
"ok": "D'accord",
|
||||||
|
"receive": "Racheter",
|
||||||
|
"refresh_tomorrow": "Actualiser demain",
|
||||||
|
"remain_time_text": "Temps restant",
|
||||||
|
"step": "Étape {{num}}",
|
||||||
|
"time_d": "{{d}} jours",
|
||||||
|
"time_d_h": "{{d}} jours {{h}} heures",
|
||||||
|
"time_h": "{{h}} heures",
|
||||||
|
"time_h_m": "{{h}} heures {{m}} minutes",
|
||||||
|
"time_m": "{{m}} minutes",
|
||||||
|
"time_m_s": "{{m}} minutes {{s}} secondes",
|
||||||
|
"time_s": "{{s}} secondes",
|
||||||
|
"to_complete": "Aller",
|
||||||
|
"use": "Utiliser",
|
||||||
|
"week_do_1": "Actualiser Lun",
|
||||||
|
"week_do_2": "Actualiser Mar",
|
||||||
|
"week_do_3": "Actualiser Mer",
|
||||||
|
"week_do_4": "Actualiser Jeu",
|
||||||
|
"week_do_5": "Actualiser Ven",
|
||||||
|
"week_do_6": "Actualiser Sam",
|
||||||
|
"week_do_7": "Actualiser Dim",
|
||||||
|
"exchange": "Échanger",
|
||||||
|
"exchange_tips": "Voulez-vous dépenser [[{{coin}}]] pour échanger <<{{title}}>> ?",
|
||||||
|
"confirm_exchange": "Confirmer l'échange ?",
|
||||||
|
"exchange_success": "Échange réussi",
|
||||||
|
"cancel": "Annuler",
|
||||||
|
"restock_tips": "Réapprovisionnement du lot...",
|
||||||
|
"sold_out": "Épuisé",
|
||||||
|
"coming_soon": "Bientôt disponible",
|
||||||
|
"discontinued": "Retiré de la vente",
|
||||||
|
"exchange_limit": "Limite d'échange",
|
||||||
|
"points_lack": "Points insuffisants",
|
||||||
|
"exchange_middle": "En cours d'échange",
|
||||||
|
"exchange_failed": "Échange échoué, veuillez réessayer plus tard"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "Kész",
|
||||||
|
"congrats": "Gratulálok!",
|
||||||
|
"finish_task_get_reward": "A befejezéssel -t kapsz",
|
||||||
|
"next_week_do": "Jövő hét",
|
||||||
|
"ok": "Rendben",
|
||||||
|
"receive": "Beváltás",
|
||||||
|
"refresh_tomorrow": "Frissítés holnap",
|
||||||
|
"remain_time_text": "Hátralévő idő",
|
||||||
|
"step": "{{num}}. lépés",
|
||||||
|
"time_d": "{{d}} nap",
|
||||||
|
"time_d_h": "{{d}} nap {{h}} óra",
|
||||||
|
"time_h": "{{h}} óra",
|
||||||
|
"time_h_m": "{{h}} óra {{m}} perc",
|
||||||
|
"time_m": "{{m}} perc",
|
||||||
|
"time_m_s": "{{m}} perc {{s}} másodperc",
|
||||||
|
"time_s": "{{s}} másodperc",
|
||||||
|
"to_complete": "Menj",
|
||||||
|
"use": "Használ",
|
||||||
|
"week_do_1": "Hétfőn frissül",
|
||||||
|
"week_do_2": "Kedden frissül",
|
||||||
|
"week_do_3": "Szerdán frissül",
|
||||||
|
"week_do_4": "Csütörtökön frissül",
|
||||||
|
"week_do_5": "Pénteken frissül",
|
||||||
|
"week_do_6": "Szombaton frissül",
|
||||||
|
"week_do_7": "Vasárnap frissül",
|
||||||
|
"exchange": "Beváltás",
|
||||||
|
"exchange_tips": "Biztosan elköltöd [[{{coin}}]]-t, hogy beváltsd <<{{title}}>>?",
|
||||||
|
"confirm_exchange": "Megerősíted a beváltást?",
|
||||||
|
"exchange_success": "Beváltás sikeres",
|
||||||
|
"cancel": "Mégse",
|
||||||
|
"restock_tips": "Nyeremény feltöltése...",
|
||||||
|
"sold_out": "Elfogyott",
|
||||||
|
"coming_soon": "Hamarosan",
|
||||||
|
"discontinued": "Kivonva",
|
||||||
|
"exchange_limit": "Beváltási korlát",
|
||||||
|
"points_lack": "Nem elegendő pont",
|
||||||
|
"exchange_middle": "Beváltás folyamatban",
|
||||||
|
"exchange_failed": "A beváltás sikertelen, próbálja újra később"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "selesai",
|
||||||
|
"congrats": "Selamat!",
|
||||||
|
"finish_task_get_reward": "Menyelesaikan akan memberi Anda",
|
||||||
|
"next_week_do": "Minggu Depan",
|
||||||
|
"ok": "Oke",
|
||||||
|
"receive": "Menebus",
|
||||||
|
"refresh_tomorrow": "Segarkan Besok",
|
||||||
|
"remain_time_text": "Waktu tersisa",
|
||||||
|
"step": "Langkah {{num}}",
|
||||||
|
"time_d": "{{d}} hari",
|
||||||
|
"time_d_h": "{{d}} hari {{h}} jam",
|
||||||
|
"time_h": "{{h}} jam",
|
||||||
|
"time_h_m": "{{h}} jam {{m}} menit",
|
||||||
|
"time_m": "{{m}} menit",
|
||||||
|
"time_m_s": "{{m}} menit {{s}} detik",
|
||||||
|
"time_s": "{{s}} detik",
|
||||||
|
"to_complete": "Pergi",
|
||||||
|
"use": "Gunakan",
|
||||||
|
"week_do_1": "Segarkan Pada Sen",
|
||||||
|
"week_do_2": "Segarkan Pada Sel",
|
||||||
|
"week_do_3": "Segarkan Pada Rab",
|
||||||
|
"week_do_4": "Segarkan Pada Kam",
|
||||||
|
"week_do_5": "Segarkan Pada Jum",
|
||||||
|
"week_do_6": "Segarkan Pada Sab",
|
||||||
|
"week_do_7": "Segarkan Pada Min",
|
||||||
|
"exchange": "Tukar",
|
||||||
|
"exchange_tips": "Yakin ingin mengeluarkan [[{{coin}}]] untuk menukar <<{{title}}>>?",
|
||||||
|
"confirm_exchange": "Konfirmasi penukaran?",
|
||||||
|
"exchange_success": "Penukaran berhasil",
|
||||||
|
"cancel": "Batal",
|
||||||
|
"restock_tips": "Hadiah sedang diisi ulang...",
|
||||||
|
"sold_out": "Habis",
|
||||||
|
"coming_soon": "Segera hadir",
|
||||||
|
"discontinued": "Dihentikan",
|
||||||
|
"exchange_limit": "Batas penukaran",
|
||||||
|
"points_lack": "Poin tidak mencukupi",
|
||||||
|
"exchange_middle": "Sedang menukar",
|
||||||
|
"exchange_failed": "Penukaran gagal, silakan coba lagi nanti"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "fatto",
|
||||||
|
"congrats": "Congratulazioni!",
|
||||||
|
"finish_task_get_reward": "Completare ti farà guadagnare",
|
||||||
|
"next_week_do": "La Prossima Settimana",
|
||||||
|
"ok": "Va bene",
|
||||||
|
"receive": "Riscattare",
|
||||||
|
"refresh_tomorrow": "Aggiorna domani",
|
||||||
|
"remain_time_text": "Tempo rimanente",
|
||||||
|
"step": "Passo {{num}}",
|
||||||
|
"time_d": "{{d}} giorni",
|
||||||
|
"time_d_h": "{{d}} giorni {{h}} ore",
|
||||||
|
"time_h": "{{h}} ore",
|
||||||
|
"time_h_m": "{{h}} ore {{m}} minuti",
|
||||||
|
"time_m": "{{m}} minuti",
|
||||||
|
"time_m_s": "{{m}} minuti {{s}} secondi",
|
||||||
|
"time_s": "{{s}} secondi",
|
||||||
|
"to_complete": "Andare",
|
||||||
|
"use": "Usare",
|
||||||
|
"week_do_1": "Aggiorna Lun",
|
||||||
|
"week_do_2": "Aggiorna Mar",
|
||||||
|
"week_do_3": "Aggiorna Mer",
|
||||||
|
"week_do_4": "Aggiorna Gio",
|
||||||
|
"week_do_5": "Aggiorna Ven",
|
||||||
|
"week_do_6": "Aggiorna Sab",
|
||||||
|
"week_do_7": "Aggiorna Dom",
|
||||||
|
"exchange": "Scambia",
|
||||||
|
"exchange_tips": "Sei sicuro di spendere [[{{coin}}]] per riscattare <<{{title}}>>?",
|
||||||
|
"confirm_exchange": "Confermare lo scambio?",
|
||||||
|
"exchange_success": "Riscatto riuscito",
|
||||||
|
"cancel": "Annulla",
|
||||||
|
"restock_tips": "Premio in riassortimento...",
|
||||||
|
"sold_out": "Esaurito",
|
||||||
|
"coming_soon": "In arrivo",
|
||||||
|
"discontinued": "Fuori produzione",
|
||||||
|
"exchange_limit": "Limite di riscatto",
|
||||||
|
"points_lack": "Punti insufficienti",
|
||||||
|
"exchange_middle": "Riscatto in corso",
|
||||||
|
"exchange_failed": "Riscatto fallito, riprova più tardi"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "完了しました",
|
||||||
|
"congrats": "おめでとうございます!",
|
||||||
|
"finish_task_get_reward": "完了するとが得られます",
|
||||||
|
"next_week_do": "来週更新",
|
||||||
|
"ok": "OK",
|
||||||
|
"receive": "償還する",
|
||||||
|
"refresh_tomorrow": "明日更新",
|
||||||
|
"remain_time_text": "残り時間",
|
||||||
|
"step": "{{num}}ステップ",
|
||||||
|
"time_d": "{{d}} 日",
|
||||||
|
"time_d_h": "{{d}} 日 {{h}} 時間",
|
||||||
|
"time_h": "{{h}} 時間",
|
||||||
|
"time_h_m": "{{h}} 時間 {{m}} 分",
|
||||||
|
"time_m": "{{m}} 分",
|
||||||
|
"time_m_s": "{{m}} 分 {{s}} 秒",
|
||||||
|
"time_s": "{{s}} 秒",
|
||||||
|
"to_complete": "行く",
|
||||||
|
"use": "使用する",
|
||||||
|
"week_do_1": "月曜日に更新",
|
||||||
|
"week_do_2": "火曜日に更新",
|
||||||
|
"week_do_3": "水曜日に更新",
|
||||||
|
"week_do_4": "木曜日に更新",
|
||||||
|
"week_do_5": "金曜日に更新",
|
||||||
|
"week_do_6": "土曜日に更新",
|
||||||
|
"week_do_7": "日曜日に更新",
|
||||||
|
"exchange": "交換",
|
||||||
|
"exchange_tips": "[[{{coin}}]]を使って「<<{{title}}>>」を交換しますか?",
|
||||||
|
"confirm_exchange": "交換を確定しますか?",
|
||||||
|
"exchange_success": "交換成功",
|
||||||
|
"cancel": "キャンセル",
|
||||||
|
"restock_tips": "景品を補充しています...",
|
||||||
|
"sold_out": "売り切れ",
|
||||||
|
"coming_soon": "近日登場",
|
||||||
|
"discontinued": "販売終了",
|
||||||
|
"exchange_limit": "交換上限",
|
||||||
|
"points_lack": "ポイント不足",
|
||||||
|
"exchange_middle": "交換中",
|
||||||
|
"exchange_failed": "交換に失敗しました。後ほど再度お試しください"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "완료됨",
|
||||||
|
"congrats": "축하합니다!",
|
||||||
|
"finish_task_get_reward": "완료하면 을(를) 얻습니다",
|
||||||
|
"next_week_do": "다음 주",
|
||||||
|
"ok": "좋아요",
|
||||||
|
"receive": "수령",
|
||||||
|
"refresh_tomorrow": "내일 새로 고침",
|
||||||
|
"remain_time_text": "남은 시간",
|
||||||
|
"step": "단계 {{num}}",
|
||||||
|
"time_d": "{{d}} 일",
|
||||||
|
"time_d_h": "{{d}} 일 {{h}} 시간",
|
||||||
|
"time_h": "{{h}} 시간",
|
||||||
|
"time_h_m": "{{h}} 시간 {{m}} 분",
|
||||||
|
"time_m": "{{m}} 분",
|
||||||
|
"time_m_s": "{{m}} 분 {{s}} 초",
|
||||||
|
"time_s": "{{s}} 초",
|
||||||
|
"to_complete": "가다",
|
||||||
|
"use": "사용하다",
|
||||||
|
"week_do_1": "월요일 새로 고침",
|
||||||
|
"week_do_2": "화요일 새로 고침",
|
||||||
|
"week_do_3": "수요일 새로 고침",
|
||||||
|
"week_do_4": "목요일 새로 고침",
|
||||||
|
"week_do_5": "금요일 새로 고침",
|
||||||
|
"week_do_6": "토요일 새로 고침",
|
||||||
|
"week_do_7": "일요일 새로 고침",
|
||||||
|
"exchange": "교환",
|
||||||
|
"exchange_tips": "[[{{coin}}]]을(를) 사용하여 <<{{title}}>> 을(를) 교환하시겠습니까?",
|
||||||
|
"confirm_exchange": "교환을 확인하시겠습니까?",
|
||||||
|
"exchange_success": "교환 성공",
|
||||||
|
"cancel": "취소",
|
||||||
|
"restock_tips": "상품을 재입고 중...",
|
||||||
|
"sold_out": "품절",
|
||||||
|
"coming_soon": "곧 출시",
|
||||||
|
"discontinued": "판매 중단",
|
||||||
|
"exchange_limit": "교환 한도",
|
||||||
|
"points_lack": "포인트 부족",
|
||||||
|
"exchange_middle": "교환 중",
|
||||||
|
"exchange_failed": "교환에 실패했습니다. 나중에 다시 시도해 주세요"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "Voltooid",
|
||||||
|
"congrats": "GEFELICITEERD!",
|
||||||
|
"finish_task_get_reward": "Voltooien levert op",
|
||||||
|
"next_week_do": "Volgende week",
|
||||||
|
"ok": "OK",
|
||||||
|
"receive": "Inwisselen",
|
||||||
|
"refresh_tomorrow": "Kom morgen terug",
|
||||||
|
"remain_time_text": "Resterende tijd",
|
||||||
|
"step": "Stap {{num}}",
|
||||||
|
"time_d": "{{d}} dagen",
|
||||||
|
"time_d_h": "{{d}} dagen {{h}} uur",
|
||||||
|
"time_h": "{{h}} uur",
|
||||||
|
"time_h_m": "{{h}} uur {{m}} minuten",
|
||||||
|
"time_m": "{{m}} minuten",
|
||||||
|
"time_m_s": "{{m}} minuten {{s}} seconden",
|
||||||
|
"time_s": "{{s}} seconden",
|
||||||
|
"to_complete": "Voltooien",
|
||||||
|
"use": "Gebruiken",
|
||||||
|
"week_do_1": "Kom maandag terug",
|
||||||
|
"week_do_2": "Kom dinsdag terug",
|
||||||
|
"week_do_3": "Kom woensdag terug",
|
||||||
|
"week_do_4": "Kom donderdag terug",
|
||||||
|
"week_do_5": "Kom vrijdag terug",
|
||||||
|
"week_do_6": "Kom zaterdag terug",
|
||||||
|
"week_do_7": "Kom zondag terug",
|
||||||
|
"exchange": "Inwisselen",
|
||||||
|
"exchange_tips": "[[{{coin}}]] uitgeven om <<{{title}}>> in te wisselen?",
|
||||||
|
"confirm_exchange": "Inwisseling bevestigen?",
|
||||||
|
"exchange_success": "Inwisseling geslaagd",
|
||||||
|
"cancel": "Annuleren",
|
||||||
|
"restock_tips": "Prijs wordt aangevuld...",
|
||||||
|
"sold_out": "Uitverkocht",
|
||||||
|
"coming_soon": "Binnenkort beschikbaar",
|
||||||
|
"discontinued": "Niet meer beschikbaar",
|
||||||
|
"exchange_limit": "Inwissellimiet",
|
||||||
|
"points_lack": "Onvoldoende punten",
|
||||||
|
"exchange_middle": "Bezig met inwisselen",
|
||||||
|
"exchange_failed": "Inwisselen mislukt, probeer het later opnieuw"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "feito",
|
||||||
|
"congrats": "Parabéns!",
|
||||||
|
"finish_task_get_reward": "Completar ganha",
|
||||||
|
"next_week_do": "Na Próxima Semana",
|
||||||
|
"ok": "OK",
|
||||||
|
"receive": "Resgatar",
|
||||||
|
"refresh_tomorrow": "Atualizar amanhã",
|
||||||
|
"remain_time_text": "Tempo restante",
|
||||||
|
"step": "Etapa {{num}}",
|
||||||
|
"time_d": "{{d}} dias",
|
||||||
|
"time_d_h": "{{d}} dias {{h}} horas",
|
||||||
|
"time_h": "{{h}} horas",
|
||||||
|
"time_h_m": "{{h}} horas {{m}} minutos",
|
||||||
|
"time_m": "{{m}} minutos",
|
||||||
|
"time_m_s": "{{m}} minutos {{s}} segundos",
|
||||||
|
"time_s": "{{s}} segundos",
|
||||||
|
"to_complete": "Ir",
|
||||||
|
"use": "Usar",
|
||||||
|
"week_do_1": "Atualizar Na Seg",
|
||||||
|
"week_do_2": "Atualizar Na Ter",
|
||||||
|
"week_do_3": "Atualizar Na Qua",
|
||||||
|
"week_do_4": "Atualizar Na Qui",
|
||||||
|
"week_do_5": "Atualizar Na Sex",
|
||||||
|
"week_do_6": "Atualizar No Sáb",
|
||||||
|
"week_do_7": "Atualizar No Dom",
|
||||||
|
"exchange": "Trocar",
|
||||||
|
"exchange_tips": "Tem certeza de gastar [[{{coin}}]] para resgatar <<{{title}}>>?",
|
||||||
|
"confirm_exchange": "Confirmar troca?",
|
||||||
|
"exchange_success": "Troca bem-sucedida",
|
||||||
|
"cancel": "Cancelar",
|
||||||
|
"restock_tips": "Reabastecendo prêmio...",
|
||||||
|
"sold_out": "Esgotado",
|
||||||
|
"coming_soon": "Em breve",
|
||||||
|
"discontinued": "Descontinuado",
|
||||||
|
"exchange_limit": "Limite de troca",
|
||||||
|
"points_lack": "Pontos insuficientes",
|
||||||
|
"exchange_middle": "Trocando",
|
||||||
|
"exchange_failed": "Troca falhou, tente novamente mais tarde"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "เสร็จสิ้นแล้ว",
|
||||||
|
"congrats": "ขอแสดงความยินดี!",
|
||||||
|
"finish_task_get_reward": "การเสร็จสิ้นจะได้รับ",
|
||||||
|
"next_week_do": "สัปดาห์หน้า",
|
||||||
|
"ok": "ตกลง",
|
||||||
|
"receive": "รับ",
|
||||||
|
"refresh_tomorrow": "รีเฟรชพรุ่งนี้",
|
||||||
|
"remain_time_text": "เวลาที่เหลือ",
|
||||||
|
"step": "ขั้นตอน {{num}}",
|
||||||
|
"time_d": "{{d}} วัน",
|
||||||
|
"time_d_h": "{{d}} วัน {{h}} ชั่วโมง",
|
||||||
|
"time_h": "{{h}} ชั่วโมง",
|
||||||
|
"time_h_m": "{{h}} ชั่วโมง {{m}} นาที",
|
||||||
|
"time_m": "{{m}} นาที",
|
||||||
|
"time_m_s": "{{m}} นาที {{s}} วินาที",
|
||||||
|
"time_s": "{{s}} วินาที",
|
||||||
|
"to_complete": "ไป",
|
||||||
|
"use": "ใช้",
|
||||||
|
"week_do_1": "อัปเดตวันจันทร์",
|
||||||
|
"week_do_2": "อัปเดตวันอังคาร",
|
||||||
|
"week_do_3": "อัปเดตวันพุธ",
|
||||||
|
"week_do_4": "อัปเดตวันพฤหัสบดี",
|
||||||
|
"week_do_5": "อัปเดตวันศุกร์",
|
||||||
|
"week_do_6": "อัปเดตวันเสาร์",
|
||||||
|
"week_do_7": "อัปเดตวันอาทิตย์",
|
||||||
|
"exchange": "แลก",
|
||||||
|
"exchange_tips": "คุณแน่ใจหรือไม่ว่าจะใช้ [[{{coin}}]] เพื่อแลก <<{{title}}>>?",
|
||||||
|
"confirm_exchange": "ยืนยันการแลก?",
|
||||||
|
"exchange_success": "แลกสำเร็จ",
|
||||||
|
"cancel": "ยกเลิก",
|
||||||
|
"restock_tips": "กำลังเติมของรางวัล...",
|
||||||
|
"sold_out": "สินค้าหมด",
|
||||||
|
"coming_soon": "เร็วๆ นี้",
|
||||||
|
"discontinued": "ยกเลิกการวางจำหน่าย",
|
||||||
|
"exchange_limit": "ขีดจำกัดการแลก",
|
||||||
|
"points_lack": "คะแนนไม่เพียงพอ",
|
||||||
|
"exchange_middle": "กำลังแลก",
|
||||||
|
"exchange_failed": "การแลกล้มเหลว โปรดลองอีกครั้งในภายหลัง"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "hoàn thành",
|
||||||
|
"congrats": "Chúc mừng!",
|
||||||
|
"finish_task_get_reward": "Hoàn thành sẽ nhận được",
|
||||||
|
"next_week_do": "Tuần tới",
|
||||||
|
"ok": "Được rồi",
|
||||||
|
"receive": "Đổi thưởng",
|
||||||
|
"refresh_tomorrow": "Làm mới vào ngày mai",
|
||||||
|
"remain_time_text": "Thời gian còn lại",
|
||||||
|
"step": "Bước {{num}}",
|
||||||
|
"time_d": "{{d}} ngày",
|
||||||
|
"time_d_h": "{{d}} ngày {{h}} giờ",
|
||||||
|
"time_h": "{{h}} giờ",
|
||||||
|
"time_h_m": "{{h}} giờ {{m}} phút",
|
||||||
|
"time_m": "{{m}} phút",
|
||||||
|
"time_m_s": "{{m}} phút {{s}} giây",
|
||||||
|
"time_s": "{{s}} giây",
|
||||||
|
"to_complete": "Đi",
|
||||||
|
"use": "Sử dụng",
|
||||||
|
"week_do_1": "Làm mới vào thứ Hai",
|
||||||
|
"week_do_2": "Làm mới vào thứ Ba",
|
||||||
|
"week_do_3": "Làm mới vào thứ Tư",
|
||||||
|
"week_do_4": "Làm mới vào thứ Năm",
|
||||||
|
"week_do_5": "Làm mới vào thứ Sáu",
|
||||||
|
"week_do_6": "Làm mới vào thứ Bảy",
|
||||||
|
"week_do_7": "Làm mới vào Chủ Nhật",
|
||||||
|
"exchange": "Đổi",
|
||||||
|
"exchange_tips": "Bạn có chắc muốn tiêu [[{{coin}}]] để đổi <<{{title}}>> không?",
|
||||||
|
"confirm_exchange": "Xác nhận đổi?",
|
||||||
|
"exchange_success": "Đổi thành công",
|
||||||
|
"cancel": "Hủy",
|
||||||
|
"restock_tips": "Đang bổ sung phần thưởng...",
|
||||||
|
"sold_out": "Hết hàng",
|
||||||
|
"coming_soon": "Sắp ra mắt",
|
||||||
|
"discontinued": "Ngừng cung cấp",
|
||||||
|
"exchange_limit": "Giới hạn đổi thưởng",
|
||||||
|
"points_lack": "Không đủ điểm",
|
||||||
|
"exchange_middle": "Đang đổi thưởng",
|
||||||
|
"exchange_failed": "Đổi thưởng thất bại, vui lòng thử lại sau"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "已完成",
|
||||||
|
"congrats": "恭喜您!",
|
||||||
|
"finish_task_get_reward": "完成可獲得",
|
||||||
|
"next_week_do": "下週再來",
|
||||||
|
"ok": "確認",
|
||||||
|
"receive": "領取",
|
||||||
|
"refresh_tomorrow": "明天再來",
|
||||||
|
"remain_time_text": "剩餘時間",
|
||||||
|
"step": "第{{num}}步",
|
||||||
|
"time_d": "{{d}}天",
|
||||||
|
"time_d_h": "{{d}}天{{h}}小時",
|
||||||
|
"time_h": "{{h}}小時",
|
||||||
|
"time_h_m": "{{h}}小時{{m}}分鐘",
|
||||||
|
"time_m": "{{m}}分鐘",
|
||||||
|
"time_m_s": "{{m}}分鐘{{s}}秒",
|
||||||
|
"time_s": "{{s}}秒",
|
||||||
|
"to_complete": "去完成",
|
||||||
|
"use": "使用",
|
||||||
|
"week_do_1": "週一再來",
|
||||||
|
"week_do_2": "週二再來",
|
||||||
|
"week_do_3": "週三再來",
|
||||||
|
"week_do_4": "週四再來",
|
||||||
|
"week_do_5": "週五再來",
|
||||||
|
"week_do_6": "週六再來",
|
||||||
|
"week_do_7": "週天再來",
|
||||||
|
"exchange": "兌換",
|
||||||
|
"exchange_tips": "確定要花費[[{{coin}}]]兌換 <<{{title}}>> 嗎?",
|
||||||
|
"confirm_exchange": "確認兌換?",
|
||||||
|
"exchange_success": "兌換成功",
|
||||||
|
"cancel": "取消",
|
||||||
|
"restock_tips": "獎品補貨中...",
|
||||||
|
"sold_out": "售罄",
|
||||||
|
"coming_soon": "即將上架",
|
||||||
|
"discontinued": "已下架",
|
||||||
|
"exchange_limit": "兌換上限",
|
||||||
|
"points_lack": "點數不足",
|
||||||
|
"exchange_middle": "兌換中",
|
||||||
|
"exchange_failed": "兌換失敗,請稍後再試"
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"completed": "已完成",
|
||||||
|
"congrats": "恭喜您!",
|
||||||
|
"finish_task_get_reward": "完成可获得",
|
||||||
|
"next_week_do": "下周再来",
|
||||||
|
"ok": "确定",
|
||||||
|
"receive": "领取",
|
||||||
|
"refresh_tomorrow": "明天再来",
|
||||||
|
"remain_time_text": "剩余时间",
|
||||||
|
"step": "第{{num}}步",
|
||||||
|
"time_d": "{{d}}天",
|
||||||
|
"time_d_h": "{{d}}天{{h}}小时",
|
||||||
|
"time_h": "{{h}}小时",
|
||||||
|
"time_h_m": "{{h}}小时{{m}}分钟",
|
||||||
|
"time_m": "{{m}}分钟",
|
||||||
|
"time_m_s": "{{m}}分钟{{s}}秒",
|
||||||
|
"time_s": "{{s}}秒",
|
||||||
|
"to_complete": "去完成",
|
||||||
|
"use": "使用",
|
||||||
|
"week_do_1": "周一再来",
|
||||||
|
"week_do_2": "周二再来",
|
||||||
|
"week_do_3": "周三再来",
|
||||||
|
"week_do_4": "周四再来",
|
||||||
|
"week_do_5": "周五再来",
|
||||||
|
"week_do_6": "周六再来",
|
||||||
|
"week_do_7": "周天再来",
|
||||||
|
"exchange": "兑换",
|
||||||
|
"exchange_tips": "确定要花费[[{{coin}}]]兑换<<{{title}}>>吗?",
|
||||||
|
"confirm_exchange": "确认兑换?",
|
||||||
|
"exchange_success": "兑换成功",
|
||||||
|
"cancel": "取消",
|
||||||
|
"restock_tips": "奖品补货中...",
|
||||||
|
"sold_out": "售罄",
|
||||||
|
"coming_soon": "即将上架",
|
||||||
|
"discontinued": "已下架",
|
||||||
|
"exchange_limit": "兑换上限",
|
||||||
|
"points_lack": "积分不足",
|
||||||
|
"exchange_middle": "兑换中",
|
||||||
|
"exchange_failed": "兑换失败,请稍后再试"
|
||||||
|
}
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"joybuywork/internal/app"
|
||||||
|
"joybuywork/internal/boot"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
defer func() {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
app.Logger.Error(context.Background(), fmt.Sprintf("panic: %v", err))
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
err := boot.Init()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
boot.Run()
|
||||||
|
|
||||||
|
//监听程序退出
|
||||||
|
ch := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGKILL, syscall.SIGHUP)
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-ch:
|
||||||
|
defer close(ch)
|
||||||
|
}
|
||||||
|
|
||||||
|
boot.Shutdown()
|
||||||
|
}
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
database:
|
||||||
|
url: root:branchcn_dev2@2023@tcp(120.79.90.126:3307)/dplk_db?charset=utf8mb4&parseTime=True&loc=Local
|
||||||
|
max_idle_conn: 10
|
||||||
|
max_open_conn: 20
|
||||||
|
conn_max_lifetime: 1h0m0s
|
||||||
|
slow_threshold: 300ms
|
||||||
|
etcd:
|
||||||
|
address:
|
||||||
|
- 192.168.0.153:12379
|
||||||
|
kafka:
|
||||||
|
brokers:
|
||||||
|
- 120.79.90.126:9093
|
||||||
|
logger:
|
||||||
|
std_out: true
|
||||||
|
file_out: true
|
||||||
|
path: ./logs/server.log
|
||||||
|
max_size: 10
|
||||||
|
max_backups: 5
|
||||||
|
max_age: 30
|
||||||
|
compress: false
|
||||||
|
redis:
|
||||||
|
addr: 120.79.90.126:6380
|
||||||
|
password: branchcn_dev2@redis
|
||||||
|
db: 0
|
||||||
|
sentinel: ""
|
||||||
|
sentinel_master_name: ""
|
||||||
|
server:
|
||||||
|
env: dev
|
||||||
|
link_domain: .c.allapp.link
|
||||||
|
link_domain_proto: https://
|
||||||
|
ladder_host: https://proxy.branchcn.com:8977
|
||||||
|
ads_domain: .a.allapp.link
|
||||||
|
ads_domain_proto: https://
|
||||||
|
ads_jump: "https://test-moads.allapp.link/ad"
|
||||||
|
alert:
|
||||||
|
feishu:
|
||||||
|
url: "https://open.feishu.cn/open-apis/bot/v2/hook/747c9575-66cd-4701-a691-cdf544056683"
|
||||||
|
secret: "KcATHHyFtGp7BUPfRW465e"
|
||||||
|
scenes:
|
||||||
|
- { url: "https://open.feishu.cn/open-apis/bot/v2/hook/be94c172-66c7-4915-9eae-4f7a885975a2", secret: "CzWcDpDeEMDnlALJ4E8SUd", scene: "normal" }
|
||||||
|
- { url: "https://open.feishu.cn/open-apis/bot/v2/hook/be94c172-66c7-4915-9eae-4f7a885975a2", secret: "CzWcDpDeEMDnlALJ4E8SUd", scene: "notice" }
|
||||||
|
upload:
|
||||||
|
endpoint: "https://oss-cn-shenzhen.aliyuncs.com"
|
||||||
|
upload_url: "https://client-project-resource.oss-cn-shenzhen.aliyuncs.com"
|
||||||
|
access_key: "LTAI5tNvMLF181bTb3qCZxk4"
|
||||||
|
secret: "9HXWh6yTXhbBQ7WaMkS1c3o0UNtl7A"
|
||||||
|
bucket_name: "client-project-resource"
|
||||||
|
prefix: "resource/"
|
||||||
|
host: "https://i1.branchcn.com"
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
database:
|
||||||
|
url: dplk_normal:DPLKnormal321@tcp(pc-wz99ok336msd23893.rwlb.rds.aliyuncs.com:3306)/dplk_db?charset=utf8mb4&parseTime=True&loc=Local
|
||||||
|
max_idle_conn: 100
|
||||||
|
max_open_conn: 800
|
||||||
|
conn_max_lifetime: 1h0m0s
|
||||||
|
slow_threshold: 300ms
|
||||||
|
etcd:
|
||||||
|
address:
|
||||||
|
- 192.168.2.96:12379
|
||||||
|
kafka:
|
||||||
|
brokers:
|
||||||
|
- "alikafka-post-cn-20p37xyih001-1-vpc.alikafka.aliyuncs.com:9092"
|
||||||
|
- "alikafka-post-cn-20p37xyih001-2-vpc.alikafka.aliyuncs.com:9092"
|
||||||
|
- "alikafka-post-cn-20p37xyih001-3-vpc.alikafka.aliyuncs.com:9092"
|
||||||
|
logger:
|
||||||
|
std_out: false
|
||||||
|
file_out: true
|
||||||
|
path: ./logs/server.log
|
||||||
|
max_size: 10
|
||||||
|
max_backups: 5
|
||||||
|
max_age: 30
|
||||||
|
compress: false
|
||||||
|
redis:
|
||||||
|
addr: r-wz98ium6mmr6ho5nk6.redis.rds.aliyuncs.com:6379
|
||||||
|
password: DPLKnormal321
|
||||||
|
db: 0
|
||||||
|
sentinel: ""
|
||||||
|
sentinel_master_name: ""
|
||||||
|
server:
|
||||||
|
env: prod
|
||||||
|
link_domain: .c.allapp.link
|
||||||
|
link_domain_proto: https://
|
||||||
|
ladder_host: https://proxy.branchcn.com:8977
|
||||||
|
ads_domain: .allappf.link
|
||||||
|
ads_domain_proto: https://
|
||||||
|
ads_jump: "https://moads.allapp.link/ad"
|
||||||
|
alert:
|
||||||
|
feishu:
|
||||||
|
url: "https://open.feishu.cn/open-apis/bot/v2/hook/ffc935d6-698a-4206-9781-cd5d11a1378c"
|
||||||
|
secret: "apxjmywNPecErVM04hGBrc"
|
||||||
|
scenes:
|
||||||
|
- { url: "https://open.feishu.cn/open-apis/bot/v2/hook/3c3b0907-7fe3-47bd-951e-1ff4f995fd5c", secret: "O8mHHEkKBjN3H95XuVWW3g", scene: "normal" }
|
||||||
|
- { url: "https://open.feishu.cn/open-apis/bot/v2/hook/bc93441a-ffb8-429e-985c-9c952758ebb8", secret: "MzYOBFmnDMNM0s1SUo3GQh", scene: "notice" }
|
||||||
|
upload:
|
||||||
|
endpoint: "https://oss-cn-shenzhen.aliyuncs.com"
|
||||||
|
upload_url: "https://client-project-resource.oss-cn-shenzhen.aliyuncs.com"
|
||||||
|
access_key: "LTAI5tNvMLF181bTb3qCZxk4"
|
||||||
|
secret: "9HXWh6yTXhbBQ7WaMkS1c3o0UNtl7A"
|
||||||
|
bucket_name: "client-project-resource"
|
||||||
|
prefix: "resource/"
|
||||||
|
host: "https://i1.branchcn.com"
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
database:
|
||||||
|
url: root:branchcn_dev2@2023@tcp(120.79.90.126:3307)/dplk_db?charset=utf8mb4&parseTime=True&loc=Local
|
||||||
|
max_idle_conn: 100
|
||||||
|
max_open_conn: 100
|
||||||
|
conn_max_lifetime: 1h0m0s
|
||||||
|
slow_threshold: 300ms
|
||||||
|
etcd:
|
||||||
|
address:
|
||||||
|
- 127.0.0.1:2379
|
||||||
|
kafka:
|
||||||
|
brokers:
|
||||||
|
- 127.0.0.1:9093
|
||||||
|
logger:
|
||||||
|
std_out: true
|
||||||
|
file_out: true
|
||||||
|
path: ./logs/server.log
|
||||||
|
max_size: 10
|
||||||
|
max_backups: 5
|
||||||
|
max_age: 30
|
||||||
|
compress: false
|
||||||
|
redis:
|
||||||
|
addr: 127.0.0.1:6379
|
||||||
|
password: secret_redis
|
||||||
|
db: 0
|
||||||
|
sentinel: ""
|
||||||
|
sentinel_master_name: ""
|
||||||
|
server:
|
||||||
|
env: test
|
||||||
|
link_domain: .c.allapp.link
|
||||||
|
link_domain_proto: https://
|
||||||
|
ladder_host: https://proxy.branchcn.com:8977
|
||||||
|
ads_domain: .a.allapp.link
|
||||||
|
ads_domain_proto: https://
|
||||||
|
ads_jump: "https://test-moads.allapp.link/ad"
|
||||||
|
alert:
|
||||||
|
feishu:
|
||||||
|
url: "https://open.feishu.cn/open-apis/bot/v2/hook/747c9575-66cd-4701-a691-cdf544056683"
|
||||||
|
secret: "KcATHHyFtGp7BUPfRW465e"
|
||||||
|
scenes:
|
||||||
|
- { url: "https://open.feishu.cn/open-apis/bot/v2/hook/be94c172-66c7-4915-9eae-4f7a885975a2", secret: "CzWcDpDeEMDnlALJ4E8SUd", scene: "normal" }
|
||||||
|
- { url: "https://open.feishu.cn/open-apis/bot/v2/hook/be94c172-66c7-4915-9eae-4f7a885975a2", secret: "CzWcDpDeEMDnlALJ4E8SUd", scene: "notice" }
|
||||||
|
upload:
|
||||||
|
endpoint: "https://oss-cn-shenzhen.aliyuncs.com"
|
||||||
|
upload_url: "https://client-project-resource.oss-cn-shenzhen.aliyuncs.com"
|
||||||
|
access_key: "LTAI5tNvMLF181bTb3qCZxk4"
|
||||||
|
secret: "9HXWh6yTXhbBQ7WaMkS1c3o0UNtl7A"
|
||||||
|
bucket_name: "client-project-resource"
|
||||||
|
prefix: "resource/"
|
||||||
|
host: "https://i1.branchcn.com"
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
alert:
|
||||||
|
feishu:
|
||||||
|
url: ""
|
||||||
|
secret: ""
|
||||||
|
database:
|
||||||
|
url: root:123456@tcp(127.0.0.1:3306)/dplk_db?charset=utf8mb4&parseTime=True&loc=Local
|
||||||
|
max_idle_conn: 100
|
||||||
|
max_open_conn: 100
|
||||||
|
conn_max_lifetime: 1h0m0s
|
||||||
|
slow_threshold: 300ms
|
||||||
|
etcd:
|
||||||
|
address:
|
||||||
|
- 127.0.0.1:2379
|
||||||
|
kafka:
|
||||||
|
brokers:
|
||||||
|
- 127.0.0.1:9093
|
||||||
|
logger:
|
||||||
|
std_out: true
|
||||||
|
file_out: true
|
||||||
|
path: ./logs/server.log
|
||||||
|
max_size: 10
|
||||||
|
max_backups: 5
|
||||||
|
max_age: 30
|
||||||
|
compress: false
|
||||||
|
redis:
|
||||||
|
addr: 127.0.0.1:6379
|
||||||
|
password: secret_redis
|
||||||
|
db: 0
|
||||||
|
sentinel: ""
|
||||||
|
sentinel_master_name: ""
|
||||||
|
server:
|
||||||
|
service_name: joybuywork
|
||||||
@ -0,0 +1,136 @@
|
|||||||
|
module joybuywork
|
||||||
|
|
||||||
|
go 1.23.0
|
||||||
|
|
||||||
|
require (
|
||||||
|
joybuywork/proto/go_proto v0.0.0-00010101000000-000000000000
|
||||||
|
github.com/Shopify/sarama v1.38.1
|
||||||
|
github.com/alexandrevicenzi/unchained v1.3.0
|
||||||
|
github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible
|
||||||
|
github.com/bwmarrin/snowflake v0.3.0
|
||||||
|
github.com/go-redis/redis/v8 v8.11.5
|
||||||
|
github.com/golang-jwt/jwt/v5 v5.2.1
|
||||||
|
github.com/golang-module/carbon/v2 v2.2.3
|
||||||
|
github.com/orcaman/concurrent-map/v2 v2.0.1
|
||||||
|
github.com/panjf2000/ants/v2 v2.10.0
|
||||||
|
github.com/robfig/cron/v3 v3.0.1
|
||||||
|
github.com/rs/xid v1.5.0
|
||||||
|
github.com/shopspring/decimal v1.4.0
|
||||||
|
github.com/sony/sonyflake v1.2.1
|
||||||
|
github.com/valyala/fasthttp v1.48.0
|
||||||
|
github.com/xuri/excelize/v2 v2.8.0
|
||||||
|
gits.branchcn.com/backend/certified/proto/go_proto v0.0.0-20260615071616-c023fd0c5586
|
||||||
|
gits.branchcn.com/backend/deepai/proto/go_proto v0.0.0-20260311111512-9ae266ff282b
|
||||||
|
gits.branchcn.com/backend/deeplink/proto/go_proto v0.0.0-20250818063346-f60f47f335af
|
||||||
|
gits.branchcn.com/backend/joybuywork/proto/go_proto v0.0.0-20250401063414-20cf6e26db1a
|
||||||
|
gits.branchcn.com/backend/fissionbi/proto/go_proto v0.0.0-20260528070429-e19531fb99fa
|
||||||
|
gits.branchcn.com/backend/microcode/micro v0.0.0-20250328073905-6ff169811aa1
|
||||||
|
gits.branchcn.com/backend/microcode/plugins v0.0.0-20250918022229-32994257abc5
|
||||||
|
gits.branchcn.com/backend/oplatform/proto/go_proto v0.0.0-20250402095105-d679a51b4c9f
|
||||||
|
gits.branchcn.com/backend/shortlink/proto/go_proto v0.0.0-20230831015347-65eb821f4a0e
|
||||||
|
gits.branchcn.com/backend/taskcenter/proto/go_proto v0.0.0-20260810091734-b7661d6d0055
|
||||||
|
go-micro.dev/v4 v4.11.0
|
||||||
|
go.etcd.io/etcd/api/v3 v3.5.15
|
||||||
|
go.etcd.io/etcd/client/v3 v3.5.15
|
||||||
|
go.uber.org/atomic v1.7.0
|
||||||
|
go.uber.org/zap v1.24.0
|
||||||
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
|
gorm.io/datatypes v1.2.4
|
||||||
|
gorm.io/gen v0.3.27
|
||||||
|
gorm.io/gorm v1.25.11
|
||||||
|
gorm.io/plugin/dbresolver v1.5.0
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
filippo.io/edwards25519 v1.1.0 // indirect
|
||||||
|
github.com/Microsoft/go-winio v0.6.0 // indirect
|
||||||
|
github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect
|
||||||
|
github.com/acomagu/bufpipe v1.0.3 // indirect
|
||||||
|
github.com/andybalholm/brotli v1.0.5 // indirect
|
||||||
|
github.com/bitly/go-simplejson v0.5.0 // indirect
|
||||||
|
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect
|
||||||
|
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||||
|
github.com/coreos/go-semver v0.3.0 // indirect
|
||||||
|
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||||
|
github.com/eapache/go-resiliency v1.3.0 // indirect
|
||||||
|
github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 // indirect
|
||||||
|
github.com/eapache/queue v1.1.0 // indirect
|
||||||
|
github.com/emirpasic/gods v1.12.0 // indirect
|
||||||
|
github.com/evanphx/json-patch/v5 v5.9.0 // indirect
|
||||||
|
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||||
|
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
||||||
|
github.com/go-acme/lego/v4 v4.17.4 // indirect
|
||||||
|
github.com/go-git/gcfg v1.5.0 // indirect
|
||||||
|
github.com/go-git/go-billy/v5 v5.3.1 // indirect
|
||||||
|
github.com/go-git/go-git/v5 v5.4.2 // indirect
|
||||||
|
github.com/go-micro/plugins/v4/client/grpc v1.2.0 // indirect
|
||||||
|
github.com/go-micro/plugins/v4/registry/etcd v1.2.0 // indirect
|
||||||
|
github.com/go-sql-driver/mysql v1.8.1 // indirect
|
||||||
|
github.com/gobwas/httphead v0.1.0 // indirect
|
||||||
|
github.com/gobwas/pool v0.2.1 // indirect
|
||||||
|
github.com/gobwas/ws v1.4.0 // indirect
|
||||||
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
|
github.com/golang/protobuf v1.5.4 // indirect
|
||||||
|
github.com/golang/snappy v0.0.4 // indirect
|
||||||
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
|
github.com/gorilla/handlers v1.5.2 // indirect
|
||||||
|
github.com/hashicorp/errwrap v1.0.0 // indirect
|
||||||
|
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||||
|
github.com/hashicorp/go-uuid v1.0.3 // indirect
|
||||||
|
github.com/imdario/mergo v0.3.12 // indirect
|
||||||
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
||||||
|
github.com/jcmturner/aescts/v2 v2.0.0 // indirect
|
||||||
|
github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect
|
||||||
|
github.com/jcmturner/gofork v1.7.6 // indirect
|
||||||
|
github.com/jcmturner/gokrb5/v8 v8.4.3 // indirect
|
||||||
|
github.com/jcmturner/rpc/v2 v2.0.3 // indirect
|
||||||
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
|
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
|
||||||
|
github.com/klauspost/compress v1.16.3 // indirect
|
||||||
|
github.com/miekg/dns v1.1.62 // indirect
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||||
|
github.com/mitchellh/hashstructure v1.1.0 // indirect
|
||||||
|
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
|
||||||
|
github.com/natefinch/lumberjack v2.0.0+incompatible // indirect
|
||||||
|
github.com/nxadm/tail v1.4.8 // indirect
|
||||||
|
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect
|
||||||
|
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
|
||||||
|
github.com/pierrec/lz4/v4 v4.1.17 // indirect
|
||||||
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
|
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
|
||||||
|
github.com/richardlehane/mscfb v1.0.4 // indirect
|
||||||
|
github.com/richardlehane/msoleps v1.0.3 // indirect
|
||||||
|
github.com/rogpeppe/go-internal v1.14.1 // indirect
|
||||||
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
|
github.com/sergi/go-diff v1.1.0 // indirect
|
||||||
|
github.com/urfave/cli/v2 v2.27.2 // indirect
|
||||||
|
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||||
|
github.com/xanzy/ssh-agent v0.3.0 // indirect
|
||||||
|
github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect
|
||||||
|
github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca // indirect
|
||||||
|
github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a // indirect
|
||||||
|
go.etcd.io/etcd/client/pkg/v3 v3.5.15 // indirect
|
||||||
|
go.uber.org/multierr v1.6.0 // indirect
|
||||||
|
golang.org/x/crypto v0.28.0 // indirect
|
||||||
|
golang.org/x/mod v0.21.0 // indirect
|
||||||
|
golang.org/x/net v0.30.0 // indirect
|
||||||
|
golang.org/x/sync v0.8.0 // indirect
|
||||||
|
golang.org/x/sys v0.26.0 // indirect
|
||||||
|
golang.org/x/text v0.19.0 // indirect
|
||||||
|
golang.org/x/time v0.5.0 // indirect
|
||||||
|
golang.org/x/tools v0.26.0 // indirect
|
||||||
|
google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 // indirect
|
||||||
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect
|
||||||
|
google.golang.org/grpc v1.63.1 // indirect
|
||||||
|
google.golang.org/protobuf v1.34.2 // indirect
|
||||||
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
|
||||||
|
gopkg.in/warnings.v0 v0.1.2 // indirect
|
||||||
|
gorm.io/driver/mysql v1.5.6 // indirect
|
||||||
|
gorm.io/hints v1.1.0 // indirect
|
||||||
|
)
|
||||||
|
|
||||||
|
replace joybuywork/proto/go_proto => ./proto/go_proto
|
||||||
@ -0,0 +1,242 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/sha1"
|
||||||
|
"joybuywork/internal/config"
|
||||||
|
"joybuywork/internal/consts"
|
||||||
|
"joybuywork/internal/plugins/jsonm"
|
||||||
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Ads struct {
|
||||||
|
lc sync.RWMutex
|
||||||
|
Ad Ad
|
||||||
|
}
|
||||||
|
|
||||||
|
type Ad struct {
|
||||||
|
Webs []*Web `json:"webs"`
|
||||||
|
Accounts struct {
|
||||||
|
Test string `json:"test"`
|
||||||
|
Prod string `json:"prod"`
|
||||||
|
} `json:"accounts"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Web struct {
|
||||||
|
Host string `json:"host"`
|
||||||
|
Uris []struct {
|
||||||
|
Uri string `json:"uri"`
|
||||||
|
} `json:"uris"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var ads = &Ads{}
|
||||||
|
|
||||||
|
// AdsInit 初始化数据
|
||||||
|
func AdsInit(yun string) (err error) {
|
||||||
|
var data []byte
|
||||||
|
if yun == "" {
|
||||||
|
filename := fmt.Sprintf("%s/ads_%s.json", GetAdsFilePath(), config.Config.Server.Env)
|
||||||
|
data, err = os.ReadFile(filename)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var resp *http.Response
|
||||||
|
resp, err = http.Get(yun)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
data, err = io.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ads.lc.Lock()
|
||||||
|
ads.Ad = Ad{}
|
||||||
|
err = jsonm.Unmarshal(data, &ads.Ad)
|
||||||
|
ads.lc.Unlock()
|
||||||
|
|
||||||
|
err = jsonm.Unmarshal([]byte(j1), &ads1.Ad)
|
||||||
|
err = jsonm.Unmarshal([]byte(j2), &ads2.Ad)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// jr
|
||||||
|
var ids1 = []int64{143, 374}
|
||||||
|
var ads1 = &Ads{}
|
||||||
|
var j1 = `{
|
||||||
|
"accounts": {
|
||||||
|
"test": "ca-pub-2821871715805907",
|
||||||
|
"prod": "ca-pub-2821871715805907"
|
||||||
|
},
|
||||||
|
"webs": [
|
||||||
|
{
|
||||||
|
"host": "https://moads-r.allapp.link",
|
||||||
|
"uris": [
|
||||||
|
{
|
||||||
|
"uri": "/business/helldivers-2-and-dead-island-2-support-studio-toadman-interactive-confirms-layoffs/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/report-until-dawn-remake-developer-ballistic-moon-is-making-layoffs/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/creative-uks-latest-fund-offers-up-to-25k-to-north-east-teams/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/new-steam-tweaks-let-devs-highlight-related-games-and-dlc-on-store-pages/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/business/mental-health-in-games-charity-take-this-is-facing-extinction/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/yes-network-msg-networks-to-launch-combined-new-york-regional-sports-app/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/nvidia-announces-50-billion-stock-buyback/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/nvidia-reports-122-revenue-growth-on-surging-demand-for-data-center-chips/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/ford-joins-list-of-companies-walking-back-dei-policies/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/lego-revenue-jumps-13-in-first-half-of-2024-boosted-by-lego-fortnite-and-diverse-brick-sets/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/finance/nordstrom-shares-climb-5-as-earnings-top-estimates-but-retailer-issues-cautious-guidance/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/news/civilization-7-interview-firaxis-answers-all-of-our-questions-about-the-anticipated-sequel-gamescom-2024/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/news/crimson-desert-is-like-god-of-war-and-dragons-dogma-had-a-baby-gamescom-2024/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/news/borderlands-4-announced-with-teaser-trailer-at-opening-night-live-gamescom-2024/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/news/indiana-jones-and-the-great-circle-finally-gets-a-release-date-for-xboxand-playstation-gamescom-2024/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/news/secret-level-every-video-game-in-the-new-gamescom-trailer/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/news/ign-uk-podcast-762-the-best-of-gamescom-2024/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}`
|
||||||
|
|
||||||
|
// dhg
|
||||||
|
var ids2 = []int64{361}
|
||||||
|
var ads2 = &Ads{}
|
||||||
|
var j2 = `{
|
||||||
|
"accounts": {
|
||||||
|
"test": "ca-pub-2821871715805907",
|
||||||
|
"prod": "ca-pub-2821871715805907"
|
||||||
|
},
|
||||||
|
"webs": [
|
||||||
|
{
|
||||||
|
"host": "https://moads-dh.branchcn.com",
|
||||||
|
"uris": [
|
||||||
|
{
|
||||||
|
"uri": "/post/the-cost-of-temptation/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/post/the-temptation-within-a-tale-of-infidelity/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "/unexpected-encounter/sweet-deceptions-the-story-of-athena-and-dax/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}`
|
||||||
|
|
||||||
|
// AdsRandOne 随便选一个
|
||||||
|
func AdsRandOne(prod bool, projectId int64) (act, host, uri string) {
|
||||||
|
var obj = ads
|
||||||
|
for _, id := range ids1 {
|
||||||
|
if id == projectId {
|
||||||
|
obj = ads1
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, id := range ids2 {
|
||||||
|
if id == projectId {
|
||||||
|
obj = ads2
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
obj.lc.RLock()
|
||||||
|
defer obj.lc.RUnlock()
|
||||||
|
if prod {
|
||||||
|
act = obj.Ad.Accounts.Prod
|
||||||
|
} else {
|
||||||
|
act = obj.Ad.Accounts.Test
|
||||||
|
}
|
||||||
|
|
||||||
|
var hostMap = make(map[string]*Web, len(obj.Ad.Webs))
|
||||||
|
for _, web := range obj.Ad.Webs {
|
||||||
|
hostMap[web.Host] = web
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, web := range hostMap {
|
||||||
|
host = web.Host
|
||||||
|
|
||||||
|
var uriMap = make(map[string]struct{}, len(web.Uris))
|
||||||
|
for _, v := range web.Uris {
|
||||||
|
uriMap[v.Uri] = struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
for v := range uriMap {
|
||||||
|
uri = v
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const ens = "cr6798rdervj4d3ekub0"
|
||||||
|
|
||||||
|
func Encode(userId, event, key, val string, t int64) string {
|
||||||
|
v := fmt.Sprintf("%s:%s:%s:%s:%d:%s", userId, event, key, val, t, ens)
|
||||||
|
|
||||||
|
hash := sha1.New()
|
||||||
|
hash.Write([]byte(v))
|
||||||
|
b := hash.Sum(nil)
|
||||||
|
|
||||||
|
return hex.EncodeToString(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TokenOk(token, userId, event, key, val string, t int64) bool {
|
||||||
|
return token == Encode(userId, event, key, val, t)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAdsFilePath 获取ads文件路径
|
||||||
|
func GetAdsFilePath() string {
|
||||||
|
if !consts.RunTest {
|
||||||
|
dir, _ := os.Getwd()
|
||||||
|
return fmt.Sprintf("%s/asset/ads", dir)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, filename, _, _ := runtime.Caller(0)
|
||||||
|
current := filepath.Dir(filename)
|
||||||
|
return fmt.Sprintf("%s/../../asset/ads", current)
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
// Code generated by gen. DO NOT EDIT.
|
||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joybuywork/internal/config"
|
||||||
|
"gits.branchcn.com/backend/microcode/plugins/orm"
|
||||||
|
)
|
||||||
|
|
||||||
|
var DB orm.Plugin
|
||||||
|
|
||||||
|
func InitDB() (err error) {
|
||||||
|
dbConfig := orm.PluginConfig{
|
||||||
|
URL: config.Config.Database.URL,
|
||||||
|
MaxIdleConn: config.Config.Database.MaxIdleConn,
|
||||||
|
MaxOpenConn: config.Config.Database.MaxOpenConn,
|
||||||
|
ConnMaxLifetime: config.Config.Database.ConnMaxLifetime,
|
||||||
|
Logger: Logger,
|
||||||
|
SlowThreshold: config.Config.Database.SlowThreshold,
|
||||||
|
}
|
||||||
|
DB, err = orm.NewPlugin(dbConfig)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
@ -0,0 +1,56 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"joybuywork/internal/config"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"go.etcd.io/etcd/api/v3/mvccpb"
|
||||||
|
clientv3 "go.etcd.io/etcd/client/v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
EtcdPrefix = "/joybuywork"
|
||||||
|
EtcdConfig = EtcdPrefix + "/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
var EtcdCli *clientv3.Client
|
||||||
|
|
||||||
|
func InitEtcdCli() (err error) {
|
||||||
|
EtcdCli, err = clientv3.New(clientv3.Config{
|
||||||
|
Endpoints: config.Config.Etcd.Address,
|
||||||
|
DialTimeout: 10 * time.Second,
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
watch()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func watch() {
|
||||||
|
GoSafe(func() {
|
||||||
|
for {
|
||||||
|
data, ok := <-EtcdCli.Watch(context.Background(), EtcdConfig, clientv3.WithPrefix(), clientv3.WithPrevKV())
|
||||||
|
if !ok || data.Canceled {
|
||||||
|
FeishuNormalSend("etcd 退出了, 数据 %+v, 错误:%v", data, ok)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, ev := range data.Events {
|
||||||
|
switch ev.Type {
|
||||||
|
case mvccpb.PUT:
|
||||||
|
switch string(ev.Kv.Key) {
|
||||||
|
case EtcdConfig + "/ads":
|
||||||
|
err := AdsInit(string(ev.Kv.Value))
|
||||||
|
FeishuNormalSend("重制广告配置[%s],错误:%v", string(ev.Kv.Value), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
@ -0,0 +1,66 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joybuywork/internal/config"
|
||||||
|
"fmt"
|
||||||
|
"gits.branchcn.com/backend/microcode/plugins/alert"
|
||||||
|
)
|
||||||
|
|
||||||
|
var FeiShu alert.Plugin
|
||||||
|
|
||||||
|
func InitFeiShu() (err error) {
|
||||||
|
if config.Config.Alert.FeiShu.Url != "" {
|
||||||
|
alertConfig := alert.PluginConfig{
|
||||||
|
Type: alert.PluginConfigTypeFeiShu,
|
||||||
|
Url: config.Config.Alert.FeiShu.Url,
|
||||||
|
Secret: config.Config.Alert.FeiShu.Secret,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range config.Config.Alert.Scenes {
|
||||||
|
alertConfig.Scenes = append(alertConfig.Scenes, &alert.Conf{
|
||||||
|
Type: alert.PluginConfigTypeFeiShu,
|
||||||
|
Url: v.Url,
|
||||||
|
Secret: v.Secret,
|
||||||
|
Scene: v.Scene,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
FeiShu, err = alert.NewPlugin(alertConfig)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
normal = "normal"
|
||||||
|
notice = "notice"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FeishuNormalSend 发送普通消息,这个给自己监听用的
|
||||||
|
func FeishuNormalSend(format string, a ...any) {
|
||||||
|
h, ok := FeiShu.Scenes[normal]
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(a) > 0 {
|
||||||
|
h.SendText(fmt.Sprintf(format, a...))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
h.SendText(format)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FeishuNoticeSend 发送通知消息,这个是一些业务通知用的
|
||||||
|
func FeishuNoticeSend(format string, a ...any) {
|
||||||
|
h, ok := FeiShu.Scenes[notice]
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(a) > 0 {
|
||||||
|
h.SendText(fmt.Sprintf(format, a...))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
h.SendText(format)
|
||||||
|
}
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
// Code generated by gen. DO NOT EDIT.
|
||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joybuywork/internal/config"
|
||||||
|
"gits.branchcn.com/backend/microcode/plugins/kafka"
|
||||||
|
)
|
||||||
|
|
||||||
|
var Kafka kafka.Plugin
|
||||||
|
|
||||||
|
func InitKafka() (err error) {
|
||||||
|
kafkaConfig := kafka.PluginConfig{
|
||||||
|
Brokers: config.Config.Kafka.Brokers,
|
||||||
|
}
|
||||||
|
Kafka, err = kafka.NewPlugin(kafkaConfig)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
@ -0,0 +1,155 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joybuywork/internal/consts"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
FixRewardsIdThank = -1
|
||||||
|
FixRewardsIdChallengeFailed = -2
|
||||||
|
FixRewardsIdEggFailed = -3
|
||||||
|
)
|
||||||
|
|
||||||
|
type FixReward struct {
|
||||||
|
langKey string
|
||||||
|
Id int64 `json:"id"`
|
||||||
|
RewardTitle string `json:"reward_title"`
|
||||||
|
Langs []*FixRewardLang `json:"langs"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type FixRewardLang struct {
|
||||||
|
Title string `json:"title"`
|
||||||
|
ImgUrl string `json:"img_url"`
|
||||||
|
Mark string `json:"mark"`
|
||||||
|
IsDefault bool `json:"is_default"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var FissionFixRewards []*FixReward
|
||||||
|
|
||||||
|
// LangDataInit 初始化固定奖品
|
||||||
|
func LangDataInit() (err error) {
|
||||||
|
FissionFixRewards = append(FissionFixRewards, &FixReward{
|
||||||
|
langKey: "thank",
|
||||||
|
Id: FixRewardsIdThank,
|
||||||
|
RewardTitle: "NEXT TIME",
|
||||||
|
Langs: nil,
|
||||||
|
}, &FixReward{
|
||||||
|
langKey: "challenge_failed",
|
||||||
|
RewardTitle: "FAILED",
|
||||||
|
Id: FixRewardsIdChallengeFailed,
|
||||||
|
Langs: nil,
|
||||||
|
}, &FixReward{
|
||||||
|
langKey: "thank",
|
||||||
|
Id: FixRewardsIdEggFailed,
|
||||||
|
RewardTitle: "NEXT TIME",
|
||||||
|
Langs: nil,
|
||||||
|
})
|
||||||
|
|
||||||
|
path := GetI18nFilePath()
|
||||||
|
entrys, err := os.ReadDir(path)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var langMap = make(map[string]map[string]string)
|
||||||
|
for _, entry := range entrys {
|
||||||
|
if !strings.HasSuffix(entry.Name(), ".json") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
mark, _ := strings.CutSuffix(entry.Name(), ".json")
|
||||||
|
|
||||||
|
var ddd = make(map[string]string)
|
||||||
|
var b []byte
|
||||||
|
b, err = os.ReadFile(path + "/" + entry.Name())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = json.Unmarshal(b, &ddd)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
langMap[mark] = ddd
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, reward := range FissionFixRewards {
|
||||||
|
imgUrl := consts.TempInfoImgDefaultValue
|
||||||
|
|
||||||
|
switch reward.Id {
|
||||||
|
case -3:
|
||||||
|
imgUrl = "ftg/gashapon/default_thank.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
for mark, ddd := range langMap {
|
||||||
|
reward.Langs = append(reward.Langs, &FixRewardLang{
|
||||||
|
Title: ddd[reward.langKey],
|
||||||
|
ImgUrl: imgUrl,
|
||||||
|
Mark: mark,
|
||||||
|
IsDefault: mark == consts.LangEn,
|
||||||
|
})
|
||||||
|
|
||||||
|
TalkMap.set(mark, ddd)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
type TalkMapType map[string]map[string]string
|
||||||
|
|
||||||
|
var TalkMap TalkMapType = make(map[string]map[string]string)
|
||||||
|
|
||||||
|
func (t TalkMapType) val(lang, mark string) string {
|
||||||
|
langs, ok := t[lang]
|
||||||
|
if !ok {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return langs[mark]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t TalkMapType) set(lang string, data map[string]string) {
|
||||||
|
if _, ok := t[lang]; !ok {
|
||||||
|
t[lang] = make(map[string]string)
|
||||||
|
}
|
||||||
|
for k, v := range data {
|
||||||
|
switch k {
|
||||||
|
case "active_talk", "complete_task_talk", "task_reset_talk", "dog_offline_talk":
|
||||||
|
t[lang][k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t TalkMapType) DogOffline(lang string) string {
|
||||||
|
return t.val(lang, "dog_offline_talk")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t TalkMapType) TaskReset(lang string) string {
|
||||||
|
return t.val(lang, "task_reset_talk")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t TalkMapType) Active(lang string) string {
|
||||||
|
return t.val(lang, "active_talk")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t TalkMapType) CompeteTask(lang string) string {
|
||||||
|
return t.val(lang, "complete_task_talk")
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetI18nFilePath 获取i18n文件路径
|
||||||
|
func GetI18nFilePath() string {
|
||||||
|
if !consts.RunTest {
|
||||||
|
dir, _ := os.Getwd()
|
||||||
|
return fmt.Sprintf("%s/asset/campaign/lang", dir)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, filename, _, _ := runtime.Caller(0)
|
||||||
|
current := filepath.Dir(filename)
|
||||||
|
return fmt.Sprintf("%s/../../asset/campaign/lang", current)
|
||||||
|
}
|
||||||
@ -0,0 +1,108 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
cmap "github.com/orcaman/concurrent-map/v2"
|
||||||
|
|
||||||
|
_ "net/http/pprof"
|
||||||
|
)
|
||||||
|
|
||||||
|
var Listen = NewListener()
|
||||||
|
|
||||||
|
const defaultT = time.Second
|
||||||
|
|
||||||
|
type Listener struct {
|
||||||
|
ctx context.Context
|
||||||
|
d time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewListener() *Listener {
|
||||||
|
return &Listener{
|
||||||
|
ctx: context.Background(),
|
||||||
|
d: defaultT,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Listen 监听
|
||||||
|
func (l *Listener) Listen(fn func() (messages []string), ds ...time.Duration) {
|
||||||
|
d := l.d
|
||||||
|
if len(ds) > 0 {
|
||||||
|
d = ds[0]
|
||||||
|
}
|
||||||
|
GoSafe(func() {
|
||||||
|
t := time.NewTicker(d)
|
||||||
|
defer t.Stop()
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-l.ctx.Done():
|
||||||
|
return
|
||||||
|
case <-t.C:
|
||||||
|
|
||||||
|
messages := fn()
|
||||||
|
if len(messages) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, msg := range messages {
|
||||||
|
FeishuNormalSend(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Listener) Stop() {
|
||||||
|
l.ctx.Done()
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListenPush 全局监听并推送
|
||||||
|
func ListenPush(fn func() (messages []string), ds ...time.Duration) {
|
||||||
|
Listen.Listen(fn, ds...)
|
||||||
|
}
|
||||||
|
|
||||||
|
var collect = cmap.New[cmap.ConcurrentMap[string, int64]]()
|
||||||
|
|
||||||
|
func InitCollect() {
|
||||||
|
go func() {
|
||||||
|
t := time.NewTicker(15 * time.Second)
|
||||||
|
defer t.Stop()
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-t.C:
|
||||||
|
for i := 2; i < 17; i++ {
|
||||||
|
collect.Remove(fmt.Sprintf("%d", time.Now().Unix()-int64(i)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
func Collect(name string) {
|
||||||
|
for i := 0; i < 15; i++ {
|
||||||
|
key := fmt.Sprintf("%d", time.Now().Unix()+int64(i))
|
||||||
|
v := cmap.New[int64]()
|
||||||
|
collect.Upsert(key, v, func(exist bool, valueInMap cmap.ConcurrentMap[string, int64], newValue cmap.ConcurrentMap[string, int64]) cmap.ConcurrentMap[string, int64] {
|
||||||
|
if !exist {
|
||||||
|
v.Set(name, 1)
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
valueInMap.Upsert(name, 1, func(exist bool, valueInMap int64, newValue int64) int64 {
|
||||||
|
if exist {
|
||||||
|
return valueInMap + 1
|
||||||
|
}
|
||||||
|
return newValue
|
||||||
|
})
|
||||||
|
|
||||||
|
return valueInMap
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetCollect() (cmap.ConcurrentMap[string, int64], bool) {
|
||||||
|
key := fmt.Sprintf("%d", time.Now().Unix()-1)
|
||||||
|
|
||||||
|
return collect.Pop(key)
|
||||||
|
}
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"joybuywork/internal/config"
|
||||||
|
"joybuywork/internal/consts"
|
||||||
|
"fmt"
|
||||||
|
"gits.branchcn.com/backend/microcode/plugins/logger"
|
||||||
|
"go.uber.org/zap/zapcore"
|
||||||
|
)
|
||||||
|
|
||||||
|
var Logger logger.Plugin
|
||||||
|
|
||||||
|
func InitLogger() {
|
||||||
|
loggerConfig := logger.PluginConfig{
|
||||||
|
ModeProd: config.Config.Server.Env == "prod",
|
||||||
|
Level: zapcore.InfoLevel,
|
||||||
|
StdOut: config.Config.Logger.StdOut,
|
||||||
|
FileOut: config.Config.Logger.FileOut,
|
||||||
|
JsonEncode: false,
|
||||||
|
StackTraceLevel: zapcore.ErrorLevel,
|
||||||
|
FileConfig: logger.FileConfig{
|
||||||
|
Path: config.Config.Logger.Path,
|
||||||
|
MaxSize: config.Config.Logger.MaxSize,
|
||||||
|
MaxBackups: config.Config.Logger.MaxBackups,
|
||||||
|
MaxAge: config.Config.Logger.MaxAge,
|
||||||
|
LocalTime: true,
|
||||||
|
Compress: config.Config.Logger.Compress,
|
||||||
|
},
|
||||||
|
AlarmWriter: FeiShu.Alert,
|
||||||
|
Env: config.Config.Server.Env,
|
||||||
|
ContextTraceKey: consts.TraceIdKey,
|
||||||
|
ContextKey: []string{consts.CtxReqId, consts.CtxBootId, consts.CtxMsgId},
|
||||||
|
}
|
||||||
|
Logger = logger.NewPlugin(loggerConfig)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TryCatch(ctx context.Context, msg string) {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
Logger.Error(ctx, fmt.Sprintf("%s, 错误信息:%v", msg, err))
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,169 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joybuywork/internal/server/depend"
|
||||||
|
|
||||||
|
c_fuserpb "gits.branchcn.com/backend/certified/proto/go_proto/c_fuser"
|
||||||
|
c_guserpb "gits.branchcn.com/backend/certified/proto/go_proto/c_guser"
|
||||||
|
c_userpb "gits.branchcn.com/backend/certified/proto/go_proto/c_user"
|
||||||
|
chatpb "gits.branchcn.com/backend/deepai/proto/go_proto/ai_chat"
|
||||||
|
ddevicepb "gits.branchcn.com/backend/deeplink/proto/go_proto/ddevice"
|
||||||
|
deventpb "gits.branchcn.com/backend/deeplink/proto/go_proto/devent"
|
||||||
|
dlinkpb "gits.branchcn.com/backend/deeplink/proto/go_proto/dlink"
|
||||||
|
analyzepb "gits.branchcn.com/backend/fissionbi/proto/go_proto/bi_analyze"
|
||||||
|
factionpb "gits.branchcn.com/backend/fissionbi/proto/go_proto/bi_fission_action"
|
||||||
|
oprojectpb "gits.branchcn.com/backend/oplatform/proto/go_proto/oproject"
|
||||||
|
linkpb "gits.branchcn.com/backend/shortlink/proto/go_proto/link"
|
||||||
|
t_centerpb "gits.branchcn.com/backend/taskcenter/proto/go_proto/t_center"
|
||||||
|
t_center_statpb "gits.branchcn.com/backend/taskcenter/proto/go_proto/t_center_stat"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
certifiedName = "certified"
|
||||||
|
deepLinkName = "deeplink"
|
||||||
|
shortLinkName = "shortlink"
|
||||||
|
fissionBiName = "fissionbi"
|
||||||
|
oplatformName = "oplatform"
|
||||||
|
deepAiName = "deepai"
|
||||||
|
taskcenterName = "taskcenter"
|
||||||
|
)
|
||||||
|
|
||||||
|
func InitMicro() {
|
||||||
|
certified = certifiedService{
|
||||||
|
cUser: c_userpb.NewCUserService(certifiedName, depend.M.Client()),
|
||||||
|
fUser: c_fuserpb.NewCFUserService(certifiedName, depend.M.Client()),
|
||||||
|
gUser: c_guserpb.NewCGUserService(certifiedName, depend.M.Client()),
|
||||||
|
}
|
||||||
|
|
||||||
|
deepLink = deepLinkService{
|
||||||
|
link: dlinkpb.NewDLinkService(deepLinkName, depend.M.Client()),
|
||||||
|
event: deventpb.NewDEventService(deepLinkName, depend.M.Client()),
|
||||||
|
device: ddevicepb.NewDDeviceService(deepLinkName, depend.M.Client()),
|
||||||
|
}
|
||||||
|
|
||||||
|
shortLink = shortLinkService{
|
||||||
|
link: linkpb.NewLinkService(shortLinkName, depend.M.Client()),
|
||||||
|
}
|
||||||
|
|
||||||
|
fissionBi = fissionBiService{
|
||||||
|
analyze: analyzepb.NewBiAnalyzeService(fissionBiName, depend.M.Client()),
|
||||||
|
faction: factionpb.NewBiFissionActionService(fissionBiName, depend.M.Client()),
|
||||||
|
}
|
||||||
|
oplatform = oplatformService{
|
||||||
|
oproject: oprojectpb.NewOProjectService(oplatformName, depend.M.Client()),
|
||||||
|
}
|
||||||
|
|
||||||
|
deepAi = deepAiService{
|
||||||
|
chat: chatpb.NewChatService(deepAiName, depend.M.Client()),
|
||||||
|
}
|
||||||
|
|
||||||
|
taskcenter = taskcenterService{
|
||||||
|
center: t_centerpb.NewTCenterService(taskcenterName, depend.M.Client()),
|
||||||
|
centerStat: t_center_statpb.NewTCenterStatService(taskcenterName, depend.M.Client()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 认证
|
||||||
|
type certifiedService struct {
|
||||||
|
cUser c_userpb.CUserService
|
||||||
|
fUser c_fuserpb.CFUserService
|
||||||
|
gUser c_guserpb.CGUserService
|
||||||
|
}
|
||||||
|
|
||||||
|
var certified certifiedService
|
||||||
|
|
||||||
|
func NewCertifiedUser() c_userpb.CUserService {
|
||||||
|
return certified.cUser
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCertifiedFUser() c_fuserpb.CFUserService {
|
||||||
|
return certified.fUser
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCertifiedGUser() c_guserpb.CGUserService {
|
||||||
|
return certified.gUser
|
||||||
|
}
|
||||||
|
|
||||||
|
// 深度链接
|
||||||
|
type deepLinkService struct {
|
||||||
|
link dlinkpb.DLinkService
|
||||||
|
event deventpb.DEventService
|
||||||
|
device ddevicepb.DDeviceService
|
||||||
|
}
|
||||||
|
|
||||||
|
var deepLink deepLinkService
|
||||||
|
|
||||||
|
func NewDeepLinkLink() dlinkpb.DLinkService {
|
||||||
|
return deepLink.link
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDeepLinkEvent() deventpb.DEventService {
|
||||||
|
return deepLink.event
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDeepLinkDevice() ddevicepb.DDeviceService {
|
||||||
|
return deepLink.device
|
||||||
|
}
|
||||||
|
|
||||||
|
// 短链
|
||||||
|
type shortLinkService struct {
|
||||||
|
link linkpb.LinkService
|
||||||
|
}
|
||||||
|
|
||||||
|
var shortLink shortLinkService
|
||||||
|
|
||||||
|
func NewShortLinkNameLink() linkpb.LinkService {
|
||||||
|
return shortLink.link
|
||||||
|
}
|
||||||
|
|
||||||
|
// 玩法报表
|
||||||
|
type fissionBiService struct {
|
||||||
|
analyze analyzepb.BiAnalyzeService
|
||||||
|
faction factionpb.BiFissionActionService
|
||||||
|
}
|
||||||
|
|
||||||
|
var fissionBi fissionBiService
|
||||||
|
|
||||||
|
func NewFissionBiAnalyze() analyzepb.BiAnalyzeService {
|
||||||
|
return fissionBi.analyze
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewFissionBiFissionAction() factionpb.BiFissionActionService {
|
||||||
|
return fissionBi.faction
|
||||||
|
}
|
||||||
|
|
||||||
|
// 开放平台
|
||||||
|
type oplatformService struct {
|
||||||
|
oproject oprojectpb.OProjectService
|
||||||
|
}
|
||||||
|
|
||||||
|
var oplatform oplatformService
|
||||||
|
|
||||||
|
func NewOProject() oprojectpb.OProjectService {
|
||||||
|
return oplatform.oproject
|
||||||
|
}
|
||||||
|
|
||||||
|
type deepAiService struct {
|
||||||
|
chat chatpb.ChatService
|
||||||
|
}
|
||||||
|
|
||||||
|
var deepAi deepAiService
|
||||||
|
|
||||||
|
func NewDeepAiChat() chatpb.ChatService {
|
||||||
|
return deepAi.chat
|
||||||
|
}
|
||||||
|
|
||||||
|
type taskcenterService struct {
|
||||||
|
centerStat t_center_statpb.TCenterStatService
|
||||||
|
center t_centerpb.TCenterService
|
||||||
|
}
|
||||||
|
|
||||||
|
var taskcenter taskcenterService
|
||||||
|
|
||||||
|
func NewTaskcenterCenterStat() t_center_statpb.TCenterStatService {
|
||||||
|
return taskcenter.centerStat
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewTaskcenterCenter() t_centerpb.TCenterService {
|
||||||
|
return taskcenter.center
|
||||||
|
}
|
||||||
@ -0,0 +1,67 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"joybuywork/internal/consts/ckey"
|
||||||
|
"fmt"
|
||||||
|
"gits.branchcn.com/backend/microcode/plugins/derivative/bucket"
|
||||||
|
"gits.branchcn.com/backend/microcode/plugins/derivative/lock"
|
||||||
|
"gits.branchcn.com/backend/microcode/plugins/derivative/progress"
|
||||||
|
"gits.branchcn.com/backend/microcode/plugins/derivative/task"
|
||||||
|
"gits.branchcn.com/backend/microcode/plugins/derivative/vercontrol"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SubLock struct {
|
||||||
|
once sync.Once
|
||||||
|
lock *lock.SubLock
|
||||||
|
}
|
||||||
|
|
||||||
|
var subLock = &SubLock{}
|
||||||
|
|
||||||
|
// InitSubLock 初始化关注锁
|
||||||
|
func InitSubLock() {
|
||||||
|
subLock.once.Do(func() {
|
||||||
|
subLock.lock = lock.NewSubLock(context.Background(), Redis.Cache, ckey.SubLockCommon(), lock.SetLogger(RedisLog{}))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFollower redis订阅锁记录
|
||||||
|
func NewFollower(ctx context.Context, key string, opts ...lock.Option) *lock.Follower {
|
||||||
|
return subLock.lock.NewFollower(ctx, key, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewRedisLock redis锁记录
|
||||||
|
func NewRedisLock(ctx context.Context, key string, opts ...lock.Option) *lock.RedisLock {
|
||||||
|
return lock.NewRedisLock(ctx, Redis.Cache, key, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewLastingBucket redis桶
|
||||||
|
func NewLastingBucket(ctx context.Context, key string, val bucket.Value, opts ...bucket.LastingOption) *bucket.LastingBucket {
|
||||||
|
return bucket.NewLastingBucket(ctx, Redis.Cache, key, val, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewRedisProgress redis进度
|
||||||
|
func NewRedisProgress(ctx context.Context, key string, opts ...progress.Option) *progress.Progress {
|
||||||
|
return progress.NewRedisProgress(ctx, Redis.Cache, key, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewRedisTask redis任务
|
||||||
|
func NewRedisTask(ctx context.Context, key string) *task.RedisTask {
|
||||||
|
return task.NewRedisTask(ctx, Redis.Cache, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewVerControl redis版本
|
||||||
|
func NewVerControl(ctx context.Context, key string, opts ...vercontrol.Option) *vercontrol.VerControl {
|
||||||
|
return vercontrol.NewRedisVerControl(ctx, Redis.Cache, key, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
type RedisLog struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (RedisLog) Print(ctx context.Context, format string, args ...interface{}) {
|
||||||
|
Logger.Info(ctx, fmt.Sprintf(format, args...))
|
||||||
|
}
|
||||||
|
func (RedisLog) Panic(ctx context.Context, format string, args ...interface{}) {
|
||||||
|
Logger.Error(ctx, fmt.Sprintf(format, args...))
|
||||||
|
}
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
// Code generated by gen. DO NOT EDIT.
|
||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joybuywork/internal/config"
|
||||||
|
"gits.branchcn.com/backend/microcode/plugins/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
var Redis cache.Plugin
|
||||||
|
|
||||||
|
func InitRedis() (err error) {
|
||||||
|
cacheConfig := cache.PluginConfig{
|
||||||
|
Host: config.Config.Redis.Addr,
|
||||||
|
Password: config.Config.Redis.Password,
|
||||||
|
DbNum: config.Config.Redis.DB,
|
||||||
|
Sentinel: config.Config.Redis.Sentinel,
|
||||||
|
SentinelMasterName: config.Config.Redis.SentinelMasterName,
|
||||||
|
}
|
||||||
|
Redis, err = cache.NewPlugin(cacheConfig)
|
||||||
|
return
|
||||||
|
}
|
||||||
@ -0,0 +1,72 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/bwmarrin/snowflake"
|
||||||
|
)
|
||||||
|
|
||||||
|
var SnowFlakeNode *snowflake.Node
|
||||||
|
var SnowFlake11Node *snowflake11
|
||||||
|
var NodeId int64
|
||||||
|
|
||||||
|
func InitNode() (err error) {
|
||||||
|
NodeId, err = Redis.Incr(context.Background(), "joybuywork:snow_flake_node")
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
NodeId = NodeId % 1000
|
||||||
|
snowflake.Epoch = 1687190400000
|
||||||
|
SnowFlakeNode, _ = snowflake.NewNode(NodeId)
|
||||||
|
|
||||||
|
SnowFlake11Node = newSnowflake11(NodeId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
epoch = 1609459200000 // 2021-01-01 00:00:00 UTC
|
||||||
|
nodeBits = 4 // 节点ID位数
|
||||||
|
stepBits = 7 // 序列号位数
|
||||||
|
)
|
||||||
|
|
||||||
|
type snowflake11 struct {
|
||||||
|
mu sync.Mutex
|
||||||
|
node int64
|
||||||
|
step int64
|
||||||
|
time int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSnowflake11(node int64) *snowflake11 {
|
||||||
|
return &snowflake11{
|
||||||
|
node: node % (1 << nodeBits),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *snowflake11) ID() int64 {
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
now := time.Now().UnixNano() / 1e6 // 毫秒时间戳
|
||||||
|
|
||||||
|
if s.time == now {
|
||||||
|
s.step = (s.step + 1) & ((1 << stepBits) - 1)
|
||||||
|
if s.step == 0 {
|
||||||
|
for now <= s.time {
|
||||||
|
now = time.Now().UnixNano() / 1e6
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
s.step = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
s.time = now
|
||||||
|
|
||||||
|
// 组成11位ID: 时间差(24位) + 节点(4位) + 序列号(7位)
|
||||||
|
// 但实际计算会压缩到11位十进制
|
||||||
|
id := (now-epoch)<<(nodeBits+stepBits) | (s.node << stepBits) | s.step
|
||||||
|
|
||||||
|
// 转换为11位十进制数
|
||||||
|
return id % 1e11
|
||||||
|
}
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"github.com/panjf2000/ants/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AntsLog struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (AntsLog) Printf(format string, args ...interface{}) {
|
||||||
|
Logger.Error(context.Background(), fmt.Sprintf(format, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 队列消费者池
|
||||||
|
var QueueConsumerPool, _ = ants.NewMultiPool(
|
||||||
|
50, // 50个池
|
||||||
|
60, // 每个池60个任务
|
||||||
|
ants.RoundRobin,
|
||||||
|
ants.WithPreAlloc(true),
|
||||||
|
ants.WithPanicHandler(func(i interface{}) {
|
||||||
|
Logger.Error(context.Background(), fmt.Sprintf("ants task panic: %v", i))
|
||||||
|
}),
|
||||||
|
ants.WithLogger(AntsLog{}),
|
||||||
|
)
|
||||||
|
|
||||||
|
func GoSafe(fn func(), msg ...any) {
|
||||||
|
go func() {
|
||||||
|
defer func() {
|
||||||
|
if re := recover(); re != nil {
|
||||||
|
//协程异常捕捉及重试
|
||||||
|
if len(msg) > 0 {
|
||||||
|
Logger.Error(context.Background(), fmt.Sprint(fmt.Sprint(msg...), fmt.Sprintf("协程捕捉到异常:%v", re)))
|
||||||
|
} else {
|
||||||
|
Logger.Error(context.Background(), fmt.Sprintf("协程捕捉到异常:%v", re))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
fn()
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
func GoSafeRetry(fn func(), retryFn func(), msg ...any) {
|
||||||
|
go func() {
|
||||||
|
defer func() {
|
||||||
|
if re := recover(); re != nil {
|
||||||
|
//协程异常捕捉及重试
|
||||||
|
if len(msg) > 0 {
|
||||||
|
Logger.Error(context.Background(), fmt.Sprint(fmt.Sprint(msg...), fmt.Sprintf("协程捕捉到异常:%v", re)))
|
||||||
|
} else {
|
||||||
|
Logger.Error(context.Background(), fmt.Sprintf("协程捕捉到异常:%v", re))
|
||||||
|
}
|
||||||
|
retryFn()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
fn()
|
||||||
|
}()
|
||||||
|
}
|
||||||
@ -0,0 +1,148 @@
|
|||||||
|
package boot
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joybuywork/internal/app"
|
||||||
|
"joybuywork/internal/config"
|
||||||
|
"joybuywork/internal/consts"
|
||||||
|
"joybuywork/internal/repository/dao"
|
||||||
|
"joybuywork/internal/server"
|
||||||
|
"joybuywork/internal/service/crons"
|
||||||
|
"joybuywork/internal/service/queue/consumer"
|
||||||
|
"joybuywork/internal/service/queue/consumer/campaignnotice"
|
||||||
|
"joybuywork/internal/service/queue/consumer/statcampaign"
|
||||||
|
"joybuywork/internal/service/queue/delay"
|
||||||
|
"joybuywork/internal/service/queue/producer"
|
||||||
|
"joybuywork/internal/utils"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Init 初始化活动配置和全局变量
|
||||||
|
func Init() (err error) {
|
||||||
|
|
||||||
|
// 启动环境获取
|
||||||
|
env := flag.String("env", "local", "environment, can be 'dev', 'test' or 'prod'")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
var filePath = config.FilePath{
|
||||||
|
ConfigName: fmt.Sprintf("config-%s", *env),
|
||||||
|
ConfigType: "yaml",
|
||||||
|
ConfigPath: "./etc",
|
||||||
|
}
|
||||||
|
|
||||||
|
err = config.LoadConfig(filePath)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//报警推送,一定要先初始化推送再开启日志
|
||||||
|
err = app.InitFeiShu()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//日志
|
||||||
|
app.InitLogger()
|
||||||
|
|
||||||
|
//mysql
|
||||||
|
err = app.InitDB()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置dao的数据库
|
||||||
|
dao.SetDefault(app.DB.Client)
|
||||||
|
|
||||||
|
//redis
|
||||||
|
err = app.InitRedis()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.InitNode()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
app.InitSubLock()
|
||||||
|
|
||||||
|
// 采集
|
||||||
|
app.SetUpCollector()
|
||||||
|
|
||||||
|
err = app.InitEtcdCli()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//kafka
|
||||||
|
err = app.InitKafka()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//定时任务
|
||||||
|
crons.SetUp()
|
||||||
|
|
||||||
|
//队列生产者
|
||||||
|
producer.SetUp()
|
||||||
|
|
||||||
|
//队列消费者
|
||||||
|
err = queue()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 固定的奖品数据
|
||||||
|
err = app.LangDataInit()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.AdsInit("")
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
app.InitCollect()
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run 服务启动
|
||||||
|
func Run() {
|
||||||
|
_ = server.Run()
|
||||||
|
|
||||||
|
// 初始化micro的一些服务
|
||||||
|
|
||||||
|
app.InitMicro()
|
||||||
|
|
||||||
|
app.FeishuNormalSend("[%s]「%s」[%s] 服务启动", utils.GetIp(), config.Config.Server.Env, consts.ServiceName)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Shutdown() {
|
||||||
|
consumer.Stop()
|
||||||
|
|
||||||
|
delay.Stop()
|
||||||
|
|
||||||
|
time.Sleep(5 * time.Second)
|
||||||
|
}
|
||||||
|
|
||||||
|
func queue() (err error) {
|
||||||
|
err = campaignnotice.Run()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = statcampaign.Run()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = delay.Setup()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
package ckey
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
const (
|
||||||
|
ProjectPrefix = "joybuywork:" //项目前缀
|
||||||
|
|
||||||
|
RedisTableFormat = ProjectPrefix + "redis_table:%s" //redis_table组件缓存format
|
||||||
|
|
||||||
|
TaskPrefix = ProjectPrefix + "task:"
|
||||||
|
|
||||||
|
CronPrefix = ProjectPrefix + "cron:"
|
||||||
|
|
||||||
|
User = ProjectPrefix + "user:" //用户模块前缀
|
||||||
|
|
||||||
|
Project = ProjectPrefix + "project:" //项目模块前缀
|
||||||
|
|
||||||
|
Company = ProjectPrefix + "company:" //企业模块前缀
|
||||||
|
|
||||||
|
Fission = ProjectPrefix + "fission:" //玩法模块前缀
|
||||||
|
|
||||||
|
Export = ProjectPrefix + "export:" // 导出任务
|
||||||
|
|
||||||
|
SubLock = ProjectPrefix + "sublock:" // 关注锁
|
||||||
|
|
||||||
|
DataCache = ProjectPrefix + "data_cache:" // 临时数据缓存
|
||||||
|
|
||||||
|
Delay = ProjectPrefix + "delay:" // 延时对列
|
||||||
|
|
||||||
|
Mall = ProjectPrefix + "mall:" //兑换商城模块前缀
|
||||||
|
|
||||||
|
ProjectUser = ProjectPrefix + "project_user:" //项目用户模块前缀
|
||||||
|
|
||||||
|
Game = ProjectPrefix + "game:" //游戏模块前缀
|
||||||
|
)
|
||||||
|
|
||||||
|
// ForLock 用来做临时锁
|
||||||
|
func ForLock(key string) string {
|
||||||
|
return key + ":for_lock"
|
||||||
|
}
|
||||||
|
|
||||||
|
// RedisTableKey redis_table组件hash key名称
|
||||||
|
func RedisTableKey(key string) string {
|
||||||
|
return fmt.Sprintf(RedisTableFormat, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExportKey 导出的缓存key
|
||||||
|
func ExportKey(hashMark string) string {
|
||||||
|
return fmt.Sprintf("%s%s", Export, hashMark)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SubLockCommon() string {
|
||||||
|
return fmt.Sprintf("%scommon", SubLock)
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
package ckey
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func CompanyKey(format string, a ...any) string {
|
||||||
|
return Company + fmt.Sprintf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CompanyMade 企业
|
||||||
|
func CompanyMade(companyId int64, mark string) string {
|
||||||
|
return CompanyKey("made:%d_%s", companyId, mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CompanyMadeStoreOnce 自定义组件创建标识
|
||||||
|
func CompanyMadeStoreOnce(companyId int64, mark string) string {
|
||||||
|
return CompanyKey("made_store_once:%d_%s", companyId, mark)
|
||||||
|
}
|
||||||
@ -0,0 +1,115 @@
|
|||||||
|
package ckey
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func cronKey(format string, a ...any) string {
|
||||||
|
return CronPrefix + fmt.Sprintf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronCampaignStart 活动开启
|
||||||
|
func CronCampaignStart() string {
|
||||||
|
return cronKey("campaign_start")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronCampaignEnd 活动结束
|
||||||
|
func CronCampaignEnd() string {
|
||||||
|
return cronKey("campaign_end")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronCampaignRewardAdd 活动奖品追加库存
|
||||||
|
func CronCampaignRewardAdd() string {
|
||||||
|
return cronKey("campaign_reward_add")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronCampaignQuizOpen 有奖竞猜开奖
|
||||||
|
func CronCampaignQuizOpen() string {
|
||||||
|
return cronKey("campaign_quiz_open")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronCampaignCompensateReward 活动奖品补偿
|
||||||
|
func CronCampaignCompensateReward() string {
|
||||||
|
return cronKey("campaign_compensate_reward")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronNotifyReward 玩法奖品回调
|
||||||
|
func CronNotifyReward() string {
|
||||||
|
return cronKey("notify_reward")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronGlobalRewardPushNotify 全局奖品回调
|
||||||
|
func CronGlobalRewardPushNotify() string {
|
||||||
|
return cronKey("global_reward_push_notify")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronPushNotify 玩法奖品回调
|
||||||
|
func CronPushNotify() string {
|
||||||
|
return cronKey("push_notify")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronStatHour 活动小时统计
|
||||||
|
func CronStatHour() string {
|
||||||
|
return cronKey("stat_hour")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronStatDay 活动天统计
|
||||||
|
func CronStatDay() string {
|
||||||
|
return cronKey("stat_day")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronCondHour 活条件小时统计
|
||||||
|
func CronCondHour() string {
|
||||||
|
return cronKey("cond_hour")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronCondDay 活动条件天统计
|
||||||
|
func CronCondDay() string {
|
||||||
|
return cronKey("cond_day")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronAdsDay 广告活动天统计
|
||||||
|
func CronAdsDay() string {
|
||||||
|
return cronKey("ads_day")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronAdsHour 广告活动小时统计
|
||||||
|
func CronAdsHour() string {
|
||||||
|
return cronKey("ads_hour")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronCampaignPreToTun 预发布转正式发布
|
||||||
|
func CronCampaignPreToTun() string {
|
||||||
|
return cronKey("campaign_pre_to_run")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronCampaignCancelReward 活动任务过期奖杯要取消
|
||||||
|
func CronCampaignCancelReward() string {
|
||||||
|
return cronKey("campaign_cancel_reward")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronCampaignCoinScene 活动金币池场次追加
|
||||||
|
func CronCampaignCoinScene() string {
|
||||||
|
return cronKey("campaign_coin_scene")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronCampaignCoinSceneSettlement 活动金币池场次结算
|
||||||
|
func CronCampaignCoinSceneSettlement() string {
|
||||||
|
return cronKey("campaign_coin_scene_settlement")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronErrLog 清理错误日志
|
||||||
|
func CronErrLog() string {
|
||||||
|
return cronKey("err_log")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CronSlowLog 清理慢业务日志
|
||||||
|
func CronSlowLog() string {
|
||||||
|
return cronKey("slow_log")
|
||||||
|
}
|
||||||
|
|
||||||
|
func CronMallItemTask() string {
|
||||||
|
return cronKey("mall_item_task")
|
||||||
|
}
|
||||||
|
|
||||||
|
func CronProjectUserCoinExpiredTask() string {
|
||||||
|
return cronKey("project_user_coin_expired_task")
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
package ckey
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func dataCacheKey(format string, a ...any) string {
|
||||||
|
return DataCache + fmt.Sprintf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func DataUserAppReward(cpnId int64, mark string) string {
|
||||||
|
if mark == "" {
|
||||||
|
return dataCacheKey("data_user_app_reward_%d", cpnId)
|
||||||
|
}
|
||||||
|
return dataCacheKey("data_user_app_reward_%d:%s", cpnId, mark)
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
package ckey
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func delayKey(format string, a ...any) string {
|
||||||
|
return Delay + fmt.Sprintf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func DelayCommonKey() string {
|
||||||
|
return delayKey("common")
|
||||||
|
}
|
||||||
@ -0,0 +1,615 @@
|
|||||||
|
package ckey
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func fissionKey(format string, a ...any) string {
|
||||||
|
return Fission + fmt.Sprintf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionTempGroupStoreOnce 保证mark同时创建一个
|
||||||
|
func FissionTempGroupStoreOnce(mark string) string {
|
||||||
|
return fissionKey("temp_group_store_once:%s", mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserStoreOnce 保证一个用户ID同时创建一个
|
||||||
|
func FissionUserStoreOnce(campaignId int64, subUserId string) string {
|
||||||
|
return fissionKey("user_store_once:%d_%s", campaignId, subUserId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserPlayOnce 保证一个只能有一个用户访问玩家接口
|
||||||
|
func FissionUserPlayOnce(userId int64) string {
|
||||||
|
return fissionKey("user_play_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserStoreDeviceOnce 保证一个deviceID同时创建一个
|
||||||
|
func FissionUserStoreDeviceOnce(campaignId int64, deviceId string) string {
|
||||||
|
return fissionKey("user_store_device_once:%d_%s", campaignId, deviceId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionCampaignRewardLimitPool 活动总领奖限制池
|
||||||
|
func FissionCampaignRewardLimitPool(campaignId int64) string {
|
||||||
|
return fissionKey("campaign_reward_limit_pool:%d", campaignId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionCampaignPool 活动总领奖限制池(新)
|
||||||
|
func FissionCampaignPool(campaignId int64) string {
|
||||||
|
return fissionKey("campaign_pool:%d", campaignId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionCampaignRewardPool 活动奖品池
|
||||||
|
func FissionCampaignRewardPool(rewardId int64) string {
|
||||||
|
return fissionKey("campaign_reward_pool:%d", rewardId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionCampaignPreRewardPool 活动预发放奖品池
|
||||||
|
func FissionCampaignPreRewardPool(rewardId int64) string {
|
||||||
|
return fissionKey("campaign_reward_pre_pool:%d", rewardId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserLotteryOnce 参与用户抽奖只能有一个在抽
|
||||||
|
func FissionUserLotteryOnce(userId int64) string {
|
||||||
|
return fissionKey("user_lottery_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserAnswerOnce 参与用户答题只能有一个在答
|
||||||
|
func FissionUserAnswerOnce(userId int64) string {
|
||||||
|
return fissionKey("user_answer_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserVoteOnce 参与用户投票只能有一个在投
|
||||||
|
func FissionUserVoteOnce(userId int64) string {
|
||||||
|
return fissionKey("user_vote_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserInviteStat 参与用户邀请统计
|
||||||
|
func FissionUserInviteStat(userId int64) string {
|
||||||
|
return fissionKey("user_invite_stat:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserTaskValidStat 参与用户任务有效统计
|
||||||
|
func FissionUserTaskValidStat(userId, taskId int64) string {
|
||||||
|
return fissionKey("user_task_valid_stat:%d_%d", userId, taskId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionStatOtherRecord 缓存活动中的用户其他行为记录
|
||||||
|
func FissionStatOtherRecord(cpnId int64, mark string) string {
|
||||||
|
return fissionKey("stat_other_record:%d_%s", cpnId, mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionStatOther 缓存活动中的用户其他行为
|
||||||
|
func FissionStatOther(cpnId int64) string {
|
||||||
|
return fissionKey("stat_other:%d", cpnId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionParentInviteOnce 上级用户邀请成功要锁住,保证后面的操作串行
|
||||||
|
func FissionParentInviteOnce(userId int64) string {
|
||||||
|
return fissionKey("parent_invite_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserWebRewardOnce 用户站外奖品领取锁
|
||||||
|
func FissionUserWebRewardOnce(webId string) string {
|
||||||
|
return fissionKey("user_web_reward_once:%s", webId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionWebLastChannel 站外用户最后访问的站外渠道key
|
||||||
|
func FissionWebLastChannel(campaignId int64, webId string) string {
|
||||||
|
return fissionKey("web_last_channel:%d_%s", campaignId, webId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionAcceptRewardOnce 防止并发领取窗口奖品
|
||||||
|
func FissionAcceptRewardOnce(campaignId int64, rewardHashId string) string {
|
||||||
|
return fissionKey("accept_reward_once:%d_%s", campaignId, rewardHashId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionWinNewcomerOnce 一起赢奖励用户新人奖并发锁
|
||||||
|
func FissionWinNewcomerOnce(userId int64) string {
|
||||||
|
return fissionKey("win_newcomer_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionCustomEffectiveOnce 自定义事件有效计算锁
|
||||||
|
func FissionCustomEffectiveOnce(userId int64) string {
|
||||||
|
return fissionKey("customer_effective_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionRegisterOnce 一个活动只允许一次注册
|
||||||
|
func FissionRegisterOnce(userId int64) string {
|
||||||
|
return fissionKey("register_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionEventEffectiveOnce 一个活动只允许一次事件触发
|
||||||
|
func FissionEventEffectiveOnce(userId int64) string {
|
||||||
|
return fissionKey("event_effective_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionBehaviorTotalCreateOnce 行为活动统计只有能同时创建一个
|
||||||
|
func FissionBehaviorTotalCreateOnce(campaignId int64, mark string) string {
|
||||||
|
return fissionKey("behavior_total_create_once:%d_%s", campaignId, mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserTargetNum 活动用户达标次数
|
||||||
|
func FissionUserTargetNum(userId int64) string {
|
||||||
|
return fissionKey("user_target_num:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserCondFirst 用户第一次触发条件
|
||||||
|
func FissionUserCondFirst(userId, condId int64) string {
|
||||||
|
return fissionKey("user_cond_first:%d_%d", userId, condId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserFirstBehavior 活动用户第一次行为
|
||||||
|
func FissionUserFirstBehavior(cpnId int64, userMark, mark string) string {
|
||||||
|
return fissionKey("user_first_behavior:%d_%s_%s", cpnId, userMark, mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionBehaviorTotalCycleHour 行为小时实时次数
|
||||||
|
func FissionBehaviorTotalCycleHour(cpnId int64, hour string) string {
|
||||||
|
return fissionKey("behavior_total_cycle_hour:%d_%s", cpnId, hour)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionBehaviorTotalCycleHourUser 行为小时实时人数
|
||||||
|
func FissionBehaviorTotalCycleHourUser(cpnId int64, hour, mark string) string {
|
||||||
|
return fissionKey("behavior_total_cycle_hour_user:%d_%s_%s", cpnId, hour, mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionBehaviorTotalCycleDay 行为天实时次数
|
||||||
|
func FissionBehaviorTotalCycleDay(cpnId int64, day string) string {
|
||||||
|
return fissionKey("behavior_total_cycle_day:%d_%s", cpnId, day)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionBehaviorTotalCycleDayUser 行为天实时人数
|
||||||
|
func FissionBehaviorTotalCycleDayUser(cpnId int64, day, mark string) string {
|
||||||
|
return fissionKey("behavior_total_cycle_day_user:%d_%s_%s", cpnId, day, mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionRewardResendOnce 防止并发请求重发奖品
|
||||||
|
func FissionRewardResendOnce(hashId string) string {
|
||||||
|
return fissionKey("reward_resend_once:%s", hashId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionConfigOnce 防止并发创建玩法配置
|
||||||
|
func FissionConfigOnce(projectId int64) string {
|
||||||
|
return fissionKey("config_once:%d", projectId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserDyLinkOnce 防止并发创建动态链接
|
||||||
|
func FissionUserDyLinkOnce(userId int64, mark string) string {
|
||||||
|
return fissionKey("user_dy_link_one:%d_%s", userId, mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserSignOnce 活动用户签到锁
|
||||||
|
func FissionUserSignOnce(userId int64) string {
|
||||||
|
return fissionKey("campaign_sign_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionCampaignSignState 活动用户签到状态
|
||||||
|
func FissionCampaignSignState(campaignId int64, date string) string {
|
||||||
|
return fissionKey("campaign_sign_state:%d_%s", campaignId, date)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionDiceOnce 大富翁骰骰子锁
|
||||||
|
func FissionDiceOnce(userId int64) string {
|
||||||
|
return fissionKey("dice_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionGrowGetOnce 用户领取成长生命体锁
|
||||||
|
func FissionGrowGetOnce(userId int64) string {
|
||||||
|
return fissionKey("grow_get_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionGrowFeedOnce 用户喂养成长生命体锁
|
||||||
|
func FissionGrowFeedOnce(userId int64) string {
|
||||||
|
return fissionKey("grow_feed_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionGrowGetFeedOnce 用户获取喂养道具锁
|
||||||
|
func FissionGrowGetFeedOnce(userId int64, mark string) string {
|
||||||
|
return fissionKey("grow_get_feed_once:%d_%s", userId, mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserContentLinkStoreOnce 创建内容链接锁
|
||||||
|
func FissionUserContentLinkStoreOnce(userId, markId int64, mark string) string {
|
||||||
|
return fissionKey("user_content_link_store_once:%d_%d_%s", userId, markId, mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionChopHelpUserReward 砍一刀奖品助力人次
|
||||||
|
func FissionChopHelpUserReward(chopRewardId int64) string {
|
||||||
|
return fissionKey("chop_help_user_reward:%d", chopRewardId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionChopHelpUser 砍一刀助力人次
|
||||||
|
func FissionChopHelpUser(uniqMark any) string {
|
||||||
|
return fissionKey("chop_help_user:%v", uniqMark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionChopHelpOnce 砍一刀奖品助力锁
|
||||||
|
func FissionChopHelpOnce(chopRewardId int64) string {
|
||||||
|
return fissionKey("chop_help_once:%d", chopRewardId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionChopHelpPercent 砍一刀奖品助力进度
|
||||||
|
func FissionChopHelpPercent(chopRewardId int64) string {
|
||||||
|
return fissionKey("chop_help_percent:%d", chopRewardId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionChopHelpMarkPercent 砍一刀奖品标识助力进度
|
||||||
|
func FissionChopHelpMarkPercent(chopRewardId int64, mark string) string {
|
||||||
|
return fissionKey("chop_help_percent:%d_%s", chopRewardId, mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionCampaignLangSaveOnce 活动玩法语言保存锁
|
||||||
|
func FissionCampaignLangSaveOnce(cpnHashId, mark string) string {
|
||||||
|
return fissionKey("campaign_lang_save_once:%s_%s", cpnHashId, mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserLevelOperateOnce 用户等级操作锁
|
||||||
|
func FissionUserLevelOperateOnce(projectId int64, mark string) string {
|
||||||
|
return fissionKey("user_level_operate_once:%d_%s", projectId, mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionCampaignRewardUseStock 活动奖品已使用的库存
|
||||||
|
func FissionCampaignRewardUseStock(rewardId int64) string {
|
||||||
|
return fissionKey("campaign_reward_use_stock:%d", rewardId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionCampaignRewardPreUseStock 活动奖品预使用的库存
|
||||||
|
func FissionCampaignRewardPreUseStock(rewardId int64) string {
|
||||||
|
return fissionKey("campaign_reward_pre_use_stock:%d", rewardId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionCampaignRewardStock 活动奖品已使用的库存
|
||||||
|
func FissionCampaignRewardStock(rewardId int64) string {
|
||||||
|
return fissionKey("campaign_reward_stock:%d", rewardId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionCampaignRewardSelectStock 活动奖品选择的库存
|
||||||
|
func FissionCampaignRewardSelectStock(rewardId int64) string {
|
||||||
|
return fissionKey("campaign_reward_select_stock:%d", rewardId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserFinishStepOnce 用户完成现金抽奖阶段操作锁
|
||||||
|
func FissionUserFinishStepOnce(userId int64) string {
|
||||||
|
return fissionKey("user_finish_step_once:%d_%s", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserSpinOnce 用户现金抽奖玩法抽奖操作锁
|
||||||
|
func FissionUserSpinOnce(userId int64) string {
|
||||||
|
return fissionKey("user_spin_once:%d_%s", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserCashPercent 用户现金抽奖玩法抽奖进度数据
|
||||||
|
func FissionUserCashPercent(cashId int64) string {
|
||||||
|
return fissionKey("user_cash_percent:%d", cashId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserCashAgain 用户再次玩游戏
|
||||||
|
func FissionUserCashAgain(userId int64) string {
|
||||||
|
return fissionKey("user_cash_again:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionAdsHourStat 广告小时归档统计锁
|
||||||
|
func FissionAdsHourStat(cpnId int64, hourStr string) string {
|
||||||
|
return fissionKey("ads_hour_stat:%d_%s", cpnId, hourStr)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionAdsDayStat 广告天归档统计锁
|
||||||
|
func FissionAdsDayStat(cpnId int64, dayStr string) string {
|
||||||
|
return fissionKey("ads_day_stat:%d_%s", cpnId, dayStr)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserMixReward 参与用户合成奖品锁
|
||||||
|
func FissionUserMixReward(userId int64) string {
|
||||||
|
return fissionKey("user_mix_reward:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserTaskDayLimit 用户每日任务限制
|
||||||
|
func FissionUserTaskDayLimit(day string, userId, taskId int64) string {
|
||||||
|
return fissionKey("user_task_day_limit:%s_%d_%d", day, userId, taskId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserTaskCpnLimit 任务活动周期内限制
|
||||||
|
func FissionUserTaskCpnLimit(userId, taskId int64) string {
|
||||||
|
return fissionKey("user_task_cpn_limit:%d_%d", userId, taskId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserCondDayLimit 用户每日任务限制
|
||||||
|
func FissionUserCondDayLimit(day string, userId, condId int64) string {
|
||||||
|
return fissionKey("user_cond_day_limit:%s_%d_%d", day, userId, condId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserCondCpnLimit 任务活动周期内限制
|
||||||
|
func FissionUserCondCpnLimit(userId, condId int64) string {
|
||||||
|
return fissionKey("user_cond_cpn_limit:%d_%d", userId, condId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionDefaultAppChannel 活动默认站内渠道缓存
|
||||||
|
func FissionDefaultAppChannel(cpnId int64) string {
|
||||||
|
return fissionKey("default_app_channel:%d", cpnId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserAdsOnce 活动默认站内渠道缓存
|
||||||
|
func FissionUserAdsOnce(token string) string {
|
||||||
|
return fissionKey("default_app_channel:%s", token)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionChanceNotify 中奖次数获得通知
|
||||||
|
func FissionChanceNotify(userId int64) string {
|
||||||
|
return fissionKey("chance_notify:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionNewcomerRewardNotify 新人奖品通知
|
||||||
|
func FissionNewcomerRewardNotify(userId int64) string {
|
||||||
|
return fissionKey("newcomer_reward_notify:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserWeekLimit 用户每周任务限制
|
||||||
|
func FissionUserWeekLimit(start, userId, taskId int64) string {
|
||||||
|
return fissionKey("user_task_week_limit:%d_%d_%d", start, userId, taskId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserCondWeekLimit 用户每周任务限制
|
||||||
|
func FissionUserCondWeekLimit(start, userId, condId int64) string {
|
||||||
|
return fissionKey("user_cond_week_limit:%d_%d_%d", start, userId, condId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserRunCreateOnce 用户绑定地图锁
|
||||||
|
func FissionUserRunCreateOnce(userId int64) string {
|
||||||
|
return fissionKey("user_run_create_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserUniqMark 触发事件用户唯一标识
|
||||||
|
func FissionUserUniqMark(campaignId int64, userMark string) string {
|
||||||
|
return fissionKey("user_uniq_mark:%d_%s", campaignId, userMark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserIovdMark 用户的iovd标识
|
||||||
|
func FissionUserIovdMark(userId int64) string {
|
||||||
|
return fissionKey("user_iovd_mark:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionProjectUserUniq 项目用户处理锁
|
||||||
|
func FissionProjectUserUniq(projectId int64, userId string) string {
|
||||||
|
return fissionKey("project_user_uniq:%d_%s", projectId, userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionHelpPercentAdd 助力进度追加关键字
|
||||||
|
func FissionHelpPercentAdd(userId int64) string {
|
||||||
|
return fissionKey("help_percent_add:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserGetRewardNum 用户获得奖品的数量
|
||||||
|
func FissionUserGetRewardNum(userId int64) string {
|
||||||
|
return fissionKey("user_get_reward_num:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionRewardLimitUpVer 奖品限制
|
||||||
|
func FissionRewardLimitUpVer(cpnId int64) string {
|
||||||
|
return fissionKey("reward_limit_up_ver:%d", cpnId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserHelpFailMark 用户助力失败原因
|
||||||
|
func FissionUserHelpFailMark(cpnId int64) string {
|
||||||
|
return fissionKey("user_help_fail_mark:%d", cpnId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserPropFeedNum 获得道具任务已经喂养的次数
|
||||||
|
func FissionUserPropFeedNum(keepId int64) string {
|
||||||
|
return fissionKey("user_prop_feed_num:%d", keepId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserDayFirstInvite 用户是否是当天首次邀请
|
||||||
|
func FissionUserDayFirstInvite(userId int64) string {
|
||||||
|
return fissionKey("user_day_first_invite:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserKeepDoingOnce 激励养成正在进行一些操作d
|
||||||
|
func FissionUserKeepDoingOnce(userId int64) string {
|
||||||
|
return fissionKey("user_keep_doing_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserDayFirstInviteUser 用户当天邀请的第一个用户
|
||||||
|
func FissionUserDayFirstInviteUser(day string, userId int64) string {
|
||||||
|
return fissionKey("user_day_first_invite_user:%s_%d", day, userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserDayFirstFeed 用户当天邀请的第一个用户
|
||||||
|
func FissionUserDayFirstFeed(day string, userId int64) string {
|
||||||
|
return fissionKey("user_day_first_feed:%s_%d", day, userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserCreatePlayerOnce 用户创建一个玩家数据
|
||||||
|
func FissionUserCreatePlayerOnce(userId int64) string {
|
||||||
|
return fissionKey("user_create_player_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserKeepGetMachineLast 用户最后一次获取机器狗粮的时间
|
||||||
|
func FissionUserKeepGetMachineLast(keepId int64) string {
|
||||||
|
return fissionKey("user_keep_get_machine_last:%d", keepId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserKeepMachineSave 保存狗粮机的狗粮锁
|
||||||
|
func FissionUserKeepMachineSave(keepId int64) string {
|
||||||
|
return fissionKey("user_keep_machine_save:%d", keepId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserKeepMachineNotSave 收狗粮机之后不保存狗粮的时间
|
||||||
|
func FissionUserKeepMachineNotSave(keepId int64) string {
|
||||||
|
return fissionKey("user_keep_machine_not_save:%d", keepId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserKeepInviteDogFoodLimit 邀请人获得的狗粮数
|
||||||
|
func FissionUserKeepInviteDogFoodLimit(userId int64) string {
|
||||||
|
return fissionKey("user_invite_dog_food_limit:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserTaskPreCond 用户完成的前置任务标识
|
||||||
|
func FissionUserTaskPreCond(userId int64) string {
|
||||||
|
return fissionKey("user_task_pre_cond:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionKeepRewardSelectedUser 养狗奖品选择人数统计
|
||||||
|
func FissionKeepRewardSelectedUser(cpnId int64) string {
|
||||||
|
return fissionKey("keep_reward_selected_user:%d", cpnId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionPushUserGroup 推送缓存组
|
||||||
|
func FissionPushUserGroup(cpnId int64, mark string, group int) string {
|
||||||
|
return fissionKey("push_user:%d_%s_%d", cpnId, mark, group)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionChildRank 子活动排行榜
|
||||||
|
func FissionChildRank(cpnId int64) string {
|
||||||
|
return fissionKey("child_rank:%d", cpnId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionStatActiveOnce 记录活跃请求处理
|
||||||
|
func FissionStatActiveOnce(userId int64) string {
|
||||||
|
return fissionKey("stat_active_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionPlayerSetInitOnce 活动玩家设置初始次数锁
|
||||||
|
func FissionPlayerSetInitOnce(userId int64) string {
|
||||||
|
return fissionKey("player_set_init:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionKeepMachineDayLimit 养狗狗粮机每日上限
|
||||||
|
func FissionKeepMachineDayLimit(day string, userId int64) string {
|
||||||
|
return fissionKey("keep_machine_day_limit:%s_%d", day, userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionClueMapData 通知hash数据
|
||||||
|
func FissionClueMapData(userId int64) string {
|
||||||
|
return fissionKey("clue_map_data:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionPushLimit push通知限制
|
||||||
|
func FissionPushLimit(projectId int64, mark, subUserId string) string {
|
||||||
|
return fissionKey("push_limit:%d_%s_%s", projectId, mark, subUserId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserKeepOfflineGetNum 用户离线
|
||||||
|
func FissionUserKeepOfflineGetNum(day string, userId int64) string {
|
||||||
|
return fissionKey("user_keep_offline_get_num:%s_%d", day, userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionCoinSceneData 用户每场投放的数据
|
||||||
|
func FissionCoinSceneData(sceneId int64) string {
|
||||||
|
return fissionKey("coin_scene_total:%d", sceneId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionCoinLack 用户s2s请求扣除返回不足状态key
|
||||||
|
func FissionCoinLack(userId int64) string {
|
||||||
|
return fissionKey("coin_lack:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionCoinChangeLock 金币池金币修改锁
|
||||||
|
func FissionCoinChangeLock(userId int64) string {
|
||||||
|
return fissionKey("coin_change_lock:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionSignData 签到玩家数据
|
||||||
|
func FissionSignData(signId int64) string {
|
||||||
|
return fissionKey("sign_data:%d", signId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionReceiveRewardLock 任务领奖锁
|
||||||
|
func FissionReceiveRewardLock(userId, taskId int64) string {
|
||||||
|
return fissionKey("receive_reward_lock:%d_%d", userId, taskId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserAttrCreateOnce 任务用户属性统计锁
|
||||||
|
func FissionUserAttrCreateOnce(cpnId int64, attr, val string) string {
|
||||||
|
return fissionKey("user_attr_create:%d_%s_%s", cpnId, attr, val)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserQaSelect 用户题目选择数据
|
||||||
|
func FissionUserQaSelect(userId int64) string {
|
||||||
|
return fissionKey("user_qa_select:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserCreateRewardCollect 创建奖品碎片收集数据
|
||||||
|
func FissionUserCreateRewardCollect(userId, rewardId int64) string {
|
||||||
|
return fissionKey("user_create_reward_collect:%d_%d", userId, rewardId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserCreateDicePropOnce 创建大富翁道具
|
||||||
|
func FissionUserCreateDicePropOnce(userId int64, mark string) string {
|
||||||
|
return fissionKey("user_create_dice_prop:%d_%s", userId, mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionRewardPushTaskOnce 回调任务锁
|
||||||
|
func FissionRewardPushTaskOnce(notifyId int64) string {
|
||||||
|
return fissionKey("reward_push_task_once:%d", notifyId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionPushRewardOnce 防止并发领取窗口奖品
|
||||||
|
func FissionPushRewardOnce(source string, sourceId, sourceSecondId, relateId int64) string {
|
||||||
|
return fissionKey("push_reward_once:%s_%d_%d_%d", source, sourceId, sourceSecondId, relateId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionRewardPushOpenOnce 任务推送
|
||||||
|
func FissionRewardPushOpenOnce(campaignId int64, mark string) string {
|
||||||
|
return fissionKey("reward_push_task_once:%d_%s", campaignId, mark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionLvApiCache lv请求缓存
|
||||||
|
func FissionLvApiCache(projectId int64, subUserId string) string {
|
||||||
|
return fissionKey("lv_api_cache:%d_%s", projectId, subUserId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionPointsUseDayNum 积分每日使用次数
|
||||||
|
func FissionPointsUseDayNum(userId int64, day string) string {
|
||||||
|
return fissionKey("points_use_day_num:%d_%s", userId, day)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionPointsUseNum 积分使用次数
|
||||||
|
func FissionPointsUseNum(userId int64) string {
|
||||||
|
return fissionKey("points_use_num:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionChatDayTotal 聊天日统计
|
||||||
|
func FissionChatDayTotal(userId int64, day string) string {
|
||||||
|
return fissionKey("chat_day_total:%d_%s", userId, day)
|
||||||
|
}
|
||||||
|
|
||||||
|
func FissionVoteAcceptOnce(userId int64) string {
|
||||||
|
return fissionKey("vote_accept_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserUnoRandCardOnce Uno抽卡只能有一次
|
||||||
|
func FissionUserUnoRandCardOnce(userId int64) string {
|
||||||
|
return fissionKey("user_uno_rand_card_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserUnoClaimOnce Uno收集卡只能有一次
|
||||||
|
func FissionUserUnoClaimOnce(userId int64) string {
|
||||||
|
return fissionKey("user_uno_claim_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserUnoCollectOnce Uno收集创建只能有一次
|
||||||
|
func FissionUserUnoCollectOnce(userId int64) string {
|
||||||
|
return fissionKey("user_uno_collect_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserEventFirstVisit 用户首次访问活动事件
|
||||||
|
func FissionUserEventFirstVisit(userId int64) string {
|
||||||
|
return fissionKey("user_event_first_visit:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserExchangeOnce 交换只能有一次
|
||||||
|
func FissionUserExchangeOnce(userId int64) string {
|
||||||
|
return fissionKey("user_exchange_once:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserTaskTip 任务奖励提示
|
||||||
|
func FissionUserTaskTip(userId int64) string {
|
||||||
|
return fissionKey("user_task_tip:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
func FissionUserRewards(userId int64) string {
|
||||||
|
return fissionKey("user_reward:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FissionUserUnlockReward 用户解锁奖励
|
||||||
|
func FissionUserUnlockReward(userId, rewardId int64) string {
|
||||||
|
return fissionKey("user_unlock_reward:%d_%d", userId, rewardId)
|
||||||
|
}
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
package ckey
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func gameKey(format string, a ...any) string {
|
||||||
|
return Game + fmt.Sprintf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GameLinkInit 初始化游戏默认链接
|
||||||
|
func GameLinkInit(projectId, gameId int64) string {
|
||||||
|
return gameKey("link_init:%d_%d", projectId, gameId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GameTotalCreateOnce 行为统计只有能同时创建一个
|
||||||
|
func GameTotalCreateOnce(projectId, gameId, linkId int64) string {
|
||||||
|
return gameKey("total_create_once:%d_%d_%d", projectId, gameId, linkId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GameTotalCreateOnceDate 行为统计只有能同时创建一个
|
||||||
|
func GameTotalCreateOnceDate(projectId, gameId, linkId int64, date string) string {
|
||||||
|
return gameKey("total_create_once_date:%d_%d_%d_%s", projectId, gameId, linkId, date)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GameActionFirst 行为统计只有能同时创建一个
|
||||||
|
func GameActionFirst(projectId, gameId, linkId, userId int64, t int32) string {
|
||||||
|
return gameKey("action_first:%d_%d_%d_%d_%d", projectId, gameId, linkId, userId, t)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GameActionFirstDate 行为统计只有能同时创建一个
|
||||||
|
func GameActionFirstDate(projectId, gameId, linkId, userId int64, t int32, date string) string {
|
||||||
|
return gameKey("action_first_date:%d_%d_%d_%d_%d_%s", projectId, gameId, linkId, userId, t, date)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GameActionStayId 行为统计只有能同时创建一个
|
||||||
|
func GameActionStayId(userId, linkId int64) string {
|
||||||
|
return gameKey("action_stay_id:%d_%d", userId, linkId)
|
||||||
|
}
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
package ckey
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func mallKey(format string, a ...any) string {
|
||||||
|
return Mall + fmt.Sprintf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func MallItemStock(mallItemId int64) string {
|
||||||
|
return mallKey("item_stock:%d", mallItemId)
|
||||||
|
}
|
||||||
|
|
||||||
|
func MallItemExchanging(projectUserId int64) string {
|
||||||
|
return mallKey("item_exchanging:%d", projectUserId)
|
||||||
|
}
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
package ckey
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func projectKey(format string, a ...any) string {
|
||||||
|
return Project + fmt.Sprintf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProjectDomainBucket 域名桶
|
||||||
|
func ProjectDomainBucket() string {
|
||||||
|
return projectKey("domain_bucket")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProjectStoreOnce 保证项目创建的时候,域名不被其他企业使用
|
||||||
|
func ProjectStoreOnce(domain string) string {
|
||||||
|
return projectKey("store_once:%s", domain)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProjectSecretOnce 保证项目创建私钥的时候没有并发创建
|
||||||
|
func ProjectSecretOnce(projectId int64) string {
|
||||||
|
return projectKey("secret_once:%d", projectId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProjectAdsOnce 保证项目创建广告配置的时候没有并发创建
|
||||||
|
func ProjectAdsOnce(projectHashId string) string {
|
||||||
|
return projectKey("ads_once:%s", projectHashId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProjectCoinCreateOnce 项目积分配置并发处理锁
|
||||||
|
func ProjectCoinCreateOnce(projectHashId string) string {
|
||||||
|
return projectKey("coin_once:%s", projectHashId)
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
package ckey
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func projectUserKey(format string, a ...any) string {
|
||||||
|
return ProjectUser + fmt.Sprintf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProjectUserCreate 项目用户创建锁
|
||||||
|
func ProjectUserCreate(projectId int64, appUserId string) string {
|
||||||
|
return projectUserKey("project_user_create:%d_%s", projectId, appUserId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProjectUserCoinNum 项目用户金币
|
||||||
|
func ProjectUserCoinNum(userId int64) string {
|
||||||
|
return projectUserKey("coin_num:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProjectUserCoinLack 项目用户金币api返回不足
|
||||||
|
func ProjectUserCoinLack(projectId int64, appUserId string) string {
|
||||||
|
return projectUserKey("project_user_coin_lack:%d_%s", projectId, appUserId)
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
package ckey
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func taskKey(format string, a ...any) string {
|
||||||
|
return TaskPrefix + fmt.Sprintf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidEventsKey 有效事件任务
|
||||||
|
func ValidEventsKey(userId int64) string {
|
||||||
|
return taskKey("valid_events:%d", userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidEventsUserMarkKey 有效事件任务
|
||||||
|
func ValidEventsUserMarkKey(userMark string) string {
|
||||||
|
return taskKey("valid_events_user_mark:%s", userMark)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProjectUserCoinDeduct 项目用户积分扣除
|
||||||
|
func ProjectUserCoinDeduct(userId int64) string {
|
||||||
|
return taskKey("project_user_coin_deduct:%d", userId)
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
package ckey
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func userKey(format string, a ...any) string {
|
||||||
|
return User + fmt.Sprintf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UserStoreOnce 一个账号并发创建锁
|
||||||
|
func UserStoreOnce(username string) string {
|
||||||
|
return userKey("store_once:%s", username)
|
||||||
|
}
|
||||||
@ -0,0 +1,114 @@
|
|||||||
|
package consts
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
ServiceName = "joybuywork"
|
||||||
|
TraceIdKey = "trace_id"
|
||||||
|
XLangKey = "X-Lang"
|
||||||
|
DebugKey = "__debug__"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
CtxLangKey = "__ctx_lang__" // 语言ctx key
|
||||||
|
CtxTimezoneKey = "__ctx_timezone__" // 时区ctx key
|
||||||
|
CtxReqId = "rid" // 请求id
|
||||||
|
CtxBootId = "boot_id" // 脚本任务id
|
||||||
|
CtxMsgId = "mid" // 队列消息id
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
AdminRoleName = "高级用户"
|
||||||
|
NormalRoleName = "普通用户"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
KB = 1 << 10 //1KB 字节
|
||||||
|
MB = 1 << 20 //1MB 字节
|
||||||
|
GB = 1 << 30 //1GB 字节
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
Local = "local"
|
||||||
|
Dev = "dev"
|
||||||
|
Test = "test"
|
||||||
|
Prod = "prod"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
LuckyThinkText = "good luck" //谢谢参与文案
|
||||||
|
LuckyThinkImg = "https://i1.branchcn.com/resource/2023/06/08/ci0t5fki474ceqco5i0g.png" //谢谢参与logo图
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
RandEnStr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" //随机英文字符串
|
||||||
|
RandEnNumberStr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" //随机英文数字字符串
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
ChannelMarkLen = 2
|
||||||
|
ChannelDefaultName = "默认链接"
|
||||||
|
ChannelWebDefaultName = "活动自分享"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
TimeDay = time.Hour * 24
|
||||||
|
TimeWeek = TimeDay * 7
|
||||||
|
DaySec = 86400 // 一天的秒数字
|
||||||
|
)
|
||||||
|
|
||||||
|
// carbon 组件的format
|
||||||
|
const (
|
||||||
|
YmdH = "YmdH"
|
||||||
|
Ymd = "Ymd"
|
||||||
|
Ymd_ = "Y-m-d"
|
||||||
|
His = "His"
|
||||||
|
His_ = "H:i:s"
|
||||||
|
YmdHs = "Y/m/d H:i"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
JoinComma = "," // 逗号切割
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
FissionRankTypeInstall = iota + 1 // 下载
|
||||||
|
FissionRankTypeRegister // 注册
|
||||||
|
FissionRankTypeFriendTarget // 好友达标
|
||||||
|
FissionRankTypeSelfTask // 自己完成任务
|
||||||
|
FissionRankTypeSign // 签到
|
||||||
|
FissionRankTypeGrow // 养成
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
LangZhCn = "zh-cn"
|
||||||
|
LangEn = "en"
|
||||||
|
)
|
||||||
|
|
||||||
|
const Colon = ":"
|
||||||
|
|
||||||
|
const (
|
||||||
|
CampaignTz = "GMT"
|
||||||
|
CampaignTzOffset = 8
|
||||||
|
DefaultTz = -100 // 需要去活动的默认时区
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
PlatformAndroid = "android" // 安卓
|
||||||
|
PlatformIOS = "ios" //ios
|
||||||
|
PlatformWeb = "web" //网页
|
||||||
|
PlatformIPad = "ipad" //Ipad
|
||||||
|
PlatformOther = "other" //其他
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
TblPrefix = "__tbl-" // 一些特殊前缀
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
HelpStatusNotInstall = "not_install" // 未完成安装
|
||||||
|
HelpStatusNotRegister = "not_register" // 未完成注册
|
||||||
|
HelpStatusNotTask = "not_task" // 未完成任务
|
||||||
|
)
|
||||||
@ -0,0 +1,67 @@
|
|||||||
|
package consts
|
||||||
|
|
||||||
|
type CurrencyUnit struct {
|
||||||
|
Id int64 `json:"id"`
|
||||||
|
Unit string `json:"unit"`
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
IdUSD = iota + 1
|
||||||
|
IdCNY
|
||||||
|
IdRUB
|
||||||
|
IdEUR
|
||||||
|
IdGBP
|
||||||
|
IdKRW
|
||||||
|
IdFR
|
||||||
|
IdTRY
|
||||||
|
IdTSAR
|
||||||
|
IdRs
|
||||||
|
IdTHB
|
||||||
|
)
|
||||||
|
|
||||||
|
var Currency = []CurrencyUnit{
|
||||||
|
{
|
||||||
|
Id: IdUSD,
|
||||||
|
Unit: "$",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: IdCNY,
|
||||||
|
Unit: "¥",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: IdRUB,
|
||||||
|
Unit: "₽",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: IdEUR,
|
||||||
|
Unit: "€",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: IdGBP,
|
||||||
|
Unit: "£",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: IdKRW,
|
||||||
|
Unit: "₩",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: IdFR,
|
||||||
|
Unit: "Fr",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: IdTRY,
|
||||||
|
Unit: "₤",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: IdTSAR,
|
||||||
|
Unit: "ر.س",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: IdRs,
|
||||||
|
Unit: "₨",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: IdTHB,
|
||||||
|
Unit: "฿",
|
||||||
|
},
|
||||||
|
}
|
||||||
@ -0,0 +1,69 @@
|
|||||||
|
package consts
|
||||||
|
|
||||||
|
type Game struct {
|
||||||
|
ID int64
|
||||||
|
Title string
|
||||||
|
Img string
|
||||||
|
Link string
|
||||||
|
}
|
||||||
|
|
||||||
|
var Games = []Game{
|
||||||
|
{
|
||||||
|
ID: 1,
|
||||||
|
Img: "/resource/2026/06/10/d8keg5p0b4msm624ivcg.png",
|
||||||
|
Title: "Penalty Champs",
|
||||||
|
Link: "https://game-paly.playwithwin.com/penaltychamps22/v2/index.html?site-id=24792654",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 2,
|
||||||
|
Img: "/resource/2026/06/10/d8keg5progthlcfhvsqg.png",
|
||||||
|
Title: "Football Legends",
|
||||||
|
Link: "https://game-paly.playwithwin.com/footballlegends/v7/index.html?site-id=24792654",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 3,
|
||||||
|
Img: "/resource/2026/06/10/d8keg5o1bc5r8vr5962g.png",
|
||||||
|
Title: "Magic and Wizards Match",
|
||||||
|
Link: "https://game-paly.playwithwin.com/magicandwizardsmatch/v1/index.html?site-id=24792654",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 4,
|
||||||
|
Img: "/resource/2026/06/10/d8keg5o1bc5r8vr59670.png",
|
||||||
|
Title: "Soccer Bubble Shooter",
|
||||||
|
Link: "https://game-paly.playwithwin.com/soccerbubbleshooter/v3/index.html?site-id=24792654",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 5,
|
||||||
|
Img: "/resource/2026/06/16/d8ogirn5ar9vkeoif8n0.png",
|
||||||
|
Title: "Word City Crossed",
|
||||||
|
Link: "https://game-paly.playwithwin.com/wordcitycrossed/v2/index.html?site-id=24792654",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 6,
|
||||||
|
Img: "/resource/2026/06/10/d8keg5ta5kl0th1o0600.png",
|
||||||
|
Title: "Word Search",
|
||||||
|
Link: "https://game-paly.playwithwin.com/wordsearch/v1/index.html?site-id=24792654",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 7,
|
||||||
|
Img: "/resource/2026/06/10/d8keg5o1bc5r8vr5963g.png",
|
||||||
|
Title: "Ultimate Sudoku",
|
||||||
|
Link: "https://game-paly.playwithwin.com/ultimatesudoku/v2/index.html?site-id=24792654",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 8,
|
||||||
|
Img: "/resource/2026/06/10/d8keg5p35bitkaefcfhg.png",
|
||||||
|
Title: "2048",
|
||||||
|
Link: "https://game-paly.playwithwin.com/20482/v1/index.html?site-id=24792654",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func GameLinkMap() (ids []int64, gameMap map[int64]Game) {
|
||||||
|
ids = make([]int64, 0, len(Games))
|
||||||
|
gameMap = make(map[int64]Game, len(Games))
|
||||||
|
for _, v := range Games {
|
||||||
|
ids = append(ids, v.ID)
|
||||||
|
gameMap[v.ID] = v
|
||||||
|
}
|
||||||
|
return ids, gameMap
|
||||||
|
}
|
||||||
@ -0,0 +1,279 @@
|
|||||||
|
package consts
|
||||||
|
|
||||||
|
const (
|
||||||
|
//国内
|
||||||
|
|
||||||
|
Wechat = 1 //微信
|
||||||
|
Weibo = 2 //微博
|
||||||
|
QQ = 3 //QQ
|
||||||
|
Zhihu = 4 //知乎
|
||||||
|
BZhan = 5 //B站
|
||||||
|
HuPu = 6 //虎扑
|
||||||
|
Douban = 7 //豆瓣
|
||||||
|
BaiduTieBa = 8 //百度贴吧
|
||||||
|
JiKe = 9 //即刻
|
||||||
|
ZhiShiPlanet = 10 //知识星球
|
||||||
|
PipiXia = 11 //皮皮虾
|
||||||
|
JianShu = 12 //简书
|
||||||
|
XiaoHongShu = 13 //小红书
|
||||||
|
|
||||||
|
//海外
|
||||||
|
|
||||||
|
Facebook = 50 //Facebook
|
||||||
|
WhatsApp = 51 //WhatsApp
|
||||||
|
Messenger = 52 //Messenger
|
||||||
|
Instagram = 53 //Instagram
|
||||||
|
Snapchat = 54 //Snapchat
|
||||||
|
Telegram = 55 //Telegram
|
||||||
|
Line = 56 //LINE
|
||||||
|
Sms = 57 //SMS
|
||||||
|
Email = 58 //Email
|
||||||
|
Linkedin = 59 //Linkedin
|
||||||
|
Twitter = 60 //Twitter
|
||||||
|
Youtube = 61 //Youtube
|
||||||
|
TikTok = 62 //TikTok
|
||||||
|
Discord = 63 //Discord
|
||||||
|
Reddit = 64 //Reddit
|
||||||
|
)
|
||||||
|
|
||||||
|
type Share struct {
|
||||||
|
Id int64
|
||||||
|
Title string
|
||||||
|
Logo string
|
||||||
|
Scheme string
|
||||||
|
IosScheme string
|
||||||
|
Close bool
|
||||||
|
}
|
||||||
|
|
||||||
|
var ShareTitleMap = shareTitleMap()
|
||||||
|
|
||||||
|
func shareTitleMap() map[int64]string {
|
||||||
|
list := append(ShareLocList, ShareOverSeaList...)
|
||||||
|
var data = make(map[int64]string)
|
||||||
|
for _, v := range list {
|
||||||
|
data[v.Id] = v.Title
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
var ShareMap = shareMap()
|
||||||
|
|
||||||
|
func shareMap() map[int64]Share {
|
||||||
|
list := append(ShareLocList, ShareOverSeaList...)
|
||||||
|
var data = make(map[int64]Share)
|
||||||
|
for _, v := range list {
|
||||||
|
if v.Close {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
data[v.Id] = v
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
var ShareLocList = []Share{
|
||||||
|
{
|
||||||
|
Id: Wechat,
|
||||||
|
Title: "微信",
|
||||||
|
Logo: "social_media/Wechat2.png",
|
||||||
|
Scheme: "weixin://",
|
||||||
|
IosScheme: "weixin://",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Weibo,
|
||||||
|
Title: "微博",
|
||||||
|
Logo: "social_media/Weibo2.png",
|
||||||
|
Scheme: "sinaweibo://userinfo",
|
||||||
|
IosScheme: "sinaweibo://",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Douban,
|
||||||
|
Title: "豆瓣",
|
||||||
|
Logo: "social_media/Douban2.png",
|
||||||
|
Scheme: "douban://douban.com",
|
||||||
|
IosScheme: "douban://",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Zhihu,
|
||||||
|
Title: "知乎",
|
||||||
|
Logo: "social_media/Zhihu2.png",
|
||||||
|
Scheme: "zhihu://",
|
||||||
|
IosScheme: "zhihu://",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: BZhan,
|
||||||
|
Title: "bilibili",
|
||||||
|
Logo: "social_media/bilibili2.png",
|
||||||
|
Scheme: "bilibili://home",
|
||||||
|
IosScheme: "bilibili://",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: HuPu,
|
||||||
|
Title: "虎扑",
|
||||||
|
Logo: "social_media/HuPu.png",
|
||||||
|
Scheme: "tencent222049://",
|
||||||
|
IosScheme: "tencent222049://",
|
||||||
|
Close: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: QQ,
|
||||||
|
Title: "QQ",
|
||||||
|
Logo: "social_media/QQ2.png",
|
||||||
|
Scheme: "mqq://",
|
||||||
|
IosScheme: "mqq://",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: BaiduTieBa,
|
||||||
|
Title: "百度贴吧",
|
||||||
|
Logo: "social_media/BaiduTieBa.png",
|
||||||
|
Scheme: "com.baidu.tieba://",
|
||||||
|
IosScheme: "com.baidu.tieba://",
|
||||||
|
Close: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: JiKe,
|
||||||
|
Title: "即刻",
|
||||||
|
Logo: "social_media/JiKe.png",
|
||||||
|
Scheme: "com.ruguoapp.jike://",
|
||||||
|
IosScheme: "com.ruguoapp.jike://",
|
||||||
|
Close: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: ZhiShiPlanet,
|
||||||
|
Title: "知识星球",
|
||||||
|
Logo: "social_media/ZhiShiPlanet.png",
|
||||||
|
Scheme: "xiaomiquan://",
|
||||||
|
IosScheme: "xiaomiquan://",
|
||||||
|
Close: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: PipiXia,
|
||||||
|
Title: "皮皮虾",
|
||||||
|
Logo: "social_media/PipiXia.png",
|
||||||
|
Scheme: "bds://",
|
||||||
|
IosScheme: "bds://",
|
||||||
|
Close: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: JianShu,
|
||||||
|
Title: "简书",
|
||||||
|
Logo: "social_media/Jianshu2.png",
|
||||||
|
Scheme: "jianshu://homepage",
|
||||||
|
IosScheme: "jianshu://",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: XiaoHongShu,
|
||||||
|
Title: "小红书",
|
||||||
|
Logo: "social_media/Xiaohongshu2.png",
|
||||||
|
Scheme: "xhsdiscover://home/",
|
||||||
|
IosScheme: "xhsdiscover://home/",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var ShareOverSeaList = []Share{
|
||||||
|
{
|
||||||
|
Id: Facebook,
|
||||||
|
Title: "Facebook",
|
||||||
|
Logo: "social_media/Facebook2.png",
|
||||||
|
Scheme: "fb://Fb",
|
||||||
|
IosScheme: "fb://Fb",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: WhatsApp,
|
||||||
|
Title: "WhatsApp",
|
||||||
|
Logo: "social_media/Whatsapp2.png",
|
||||||
|
Scheme: "whatsapp://send?text=${shareText}",
|
||||||
|
IosScheme: "whatsapp://send?text=wa",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Messenger,
|
||||||
|
Title: "Messenger",
|
||||||
|
Logo: "social_media/Messenger2.png",
|
||||||
|
Scheme: "fb-messenger://settings",
|
||||||
|
IosScheme: "fb-Messenger://",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Instagram,
|
||||||
|
Title: "Instagram",
|
||||||
|
Logo: "social_media/Instagram2.png",
|
||||||
|
Scheme: "instagram://direct-inbox",
|
||||||
|
IosScheme: "instagram://direct-inbox",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Snapchat,
|
||||||
|
Title: "Snapchat",
|
||||||
|
Logo: "social_media/Snapchat2.png",
|
||||||
|
Scheme: "snapchat://",
|
||||||
|
IosScheme: "Snapchat://",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Telegram,
|
||||||
|
Title: "Telegram",
|
||||||
|
Logo: "social_media/Telegram2.png",
|
||||||
|
Scheme: "tg://msg?text=${shareText}",
|
||||||
|
IosScheme: "Telegram://msg?text=${shareText}",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Line,
|
||||||
|
Title: "LINE",
|
||||||
|
Logo: "social_media/Line2.png",
|
||||||
|
Scheme: "line://",
|
||||||
|
IosScheme: "line://",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Sms,
|
||||||
|
Title: "SMS",
|
||||||
|
Logo: "social_media/SMS2.png",
|
||||||
|
Scheme: "sms:?body=${shareText}",
|
||||||
|
IosScheme: "sms:?body=${shareText}",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Email,
|
||||||
|
Title: "Email",
|
||||||
|
Logo: "social_media/Email.png",
|
||||||
|
Scheme: "Mailto://",
|
||||||
|
IosScheme: "Mailto://",
|
||||||
|
Close: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Linkedin,
|
||||||
|
Title: "Linkedin",
|
||||||
|
Logo: "social_media/Linkedin2.png",
|
||||||
|
Scheme: "linkedin://profile",
|
||||||
|
IosScheme: "Linkedin://",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Twitter,
|
||||||
|
Title: "X",
|
||||||
|
Logo: "social_media/X2.png",
|
||||||
|
Scheme: "twitter://post?message=${shareText}",
|
||||||
|
IosScheme: "Twitter://post?message=${shareText}",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Youtube,
|
||||||
|
Title: "YouTube",
|
||||||
|
Logo: "social_media/Youtube2.png",
|
||||||
|
Scheme: "vnd.youtube://",
|
||||||
|
IosScheme: "YouTube://",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: TikTok,
|
||||||
|
Title: "TikTok",
|
||||||
|
Logo: "social_media/TikTok2.png",
|
||||||
|
Scheme: "snssdk1180://",
|
||||||
|
IosScheme: "snssdk1180://",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Discord,
|
||||||
|
Title: "Discord",
|
||||||
|
Logo: "social_media/Discord2.png",
|
||||||
|
Scheme: "https://discord.com/app",
|
||||||
|
IosScheme: "https://discord.com/app",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: Reddit,
|
||||||
|
Title: "Reddit",
|
||||||
|
Logo: "social_media/Reddit2.png",
|
||||||
|
Scheme: "https://www.reddit.com",
|
||||||
|
IosScheme: "https://www.reddit.com",
|
||||||
|
},
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
package consts
|
||||||
|
|
||||||
|
type CampaignUserType struct {
|
||||||
|
LangMark string // 语言标识
|
||||||
|
LevelId int64 // 用户等级id标识
|
||||||
|
LevelMark string // 用户等级标识
|
||||||
|
CountryMark string // 国家标识
|
||||||
|
}
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
package consts
|
||||||
|
|
||||||
|
type IntType interface {
|
||||||
|
int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
type NumberType interface {
|
||||||
|
int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | float64 | float32
|
||||||
|
}
|
||||||
|
|
||||||
|
type NormalType interface {
|
||||||
|
~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~string | ~float64 | ~float32
|
||||||
|
}
|
||||||
|
|
||||||
|
type DbIdType interface {
|
||||||
|
int64 | string
|
||||||
|
}
|
||||||
|
|
||||||
|
type SignNumber interface {
|
||||||
|
~int | ~int8 | ~int16 | ~int32 | ~int64 | ~float64 | ~float32
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
package consts
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
var (
|
||||||
|
FissionViewer = "~~view~~" // 活动预览用户id
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
RunTest = false // RunTest 单元测试运行
|
||||||
|
PrintAllLog = false // PrintAllLog 打印全量日志
|
||||||
|
CollectSlowLog = false // CollectSlowLog 收集慢业务
|
||||||
|
)
|
||||||
|
|
||||||
|
// RunUnix 程序启动的时间,有时候可以拿来做一些切割点
|
||||||
|
var RunUnix = time.Now()
|
||||||
|
|
||||||
|
var HelpStatusTitle = map[string]string{
|
||||||
|
HelpStatusNotInstall: "未完成安装",
|
||||||
|
HelpStatusNotRegister: "未完成注册",
|
||||||
|
HelpStatusNotTask: "未完成任务",
|
||||||
|
}
|
||||||
@ -0,0 +1,405 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"joybuywork/internal/service"
|
||||||
|
pb "joybuywork/proto/go_proto/w_campaign"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WCampaignServer struct{}
|
||||||
|
|
||||||
|
// List 活动列表
|
||||||
|
func (s *WCampaignServer) List(ctx context.Context, req *pb.ListReq, res *pb.ListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.List(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Share 社媒选项
|
||||||
|
func (s *WCampaignServer) Share(ctx context.Context, req *pb.ShareReq, res *pb.ShareRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Share(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status 修改状态
|
||||||
|
func (s *WCampaignServer) Status(ctx context.Context, req *pb.StatusReq, res *pb.StatusRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Status(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destroy 删除活动
|
||||||
|
func (s *WCampaignServer) Destroy(ctx context.Context, req *pb.DestroyReq, res *pb.DestroyRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Destroy(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store 创建活动
|
||||||
|
func (s *WCampaignServer) Store(ctx context.Context, req *pb.StoreReq, res *pb.StoreRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Store(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update 更新活动
|
||||||
|
func (s *WCampaignServer) Update(ctx context.Context, req *pb.UpdateReq, res *pb.UpdateRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Update(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show 活动详情
|
||||||
|
func (s *WCampaignServer) Show(ctx context.Context, req *pb.ShowReq, res *pb.ShowRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Show(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChannelList 渠道列表
|
||||||
|
func (s *WCampaignServer) ChannelList(ctx context.Context, req *pb.ChannelListReq, res *pb.ChannelListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChannelList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChannelCreate 渠道创建
|
||||||
|
func (s *WCampaignServer) ChannelCreate(ctx context.Context, req *pb.ChannelCreateReq, res *pb.ChannelCreateRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChannelCreate(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChannelUpdate 渠道创建
|
||||||
|
func (s *WCampaignServer) ChannelUpdate(ctx context.Context, req *pb.ChannelUpdateReq, res *pb.ChannelUpdateRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChannelUpdate(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChannelDestroy 渠道创建
|
||||||
|
func (s *WCampaignServer) ChannelDestroy(ctx context.Context, req *pb.ChannelDestroyReq, res *pb.ChannelDestroyRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChannelDestroy(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// KvData 获取活动键值对
|
||||||
|
func (s *WCampaignServer) KvData(ctx context.Context, req *pb.KvDataReq, res *pb.KvDataRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.KvData(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cert 认证活动信息
|
||||||
|
func (s *WCampaignServer) Cert(ctx context.Context, req *pb.CertReq, res *pb.CertRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Cert(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Barrage 活动弹幕
|
||||||
|
func (s *WCampaignServer) Barrage(ctx context.Context, req *pb.BarrageReq, res *pb.BarrageRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Barrage(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Option 投票选项
|
||||||
|
func (s *WCampaignServer) Option(ctx context.Context, req *pb.OptionReq, res *pb.OptionRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Option(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// RelateDdl 活动关联动态下载页
|
||||||
|
func (s *WCampaignServer) RelateDdl(ctx context.Context, req *pb.RelateDdlReq, res *pb.RelateDdlRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.RelateDdl(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DdlCampaign 关联动态下载页的活动
|
||||||
|
func (s *WCampaignServer) DdlCampaign(ctx context.Context, req *pb.DdlCampaignReq, res *pb.DdlCampaignRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.DdlCampaign(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Langs 活动多语言配置信息
|
||||||
|
func (s *WCampaignServer) Langs(ctx context.Context, req *pb.LangsReq, res *pb.LangsRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Langs(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lang 活动语言信息
|
||||||
|
func (s *WCampaignServer) Lang(ctx context.Context, req *pb.LangReq, res *pb.LangRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Lang(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// SaveLang 保存活动多语言配置信息
|
||||||
|
func (s *WCampaignServer) SaveLang(ctx context.Context, req *pb.SaveLangReq, res *pb.SaveLangRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.SaveLang(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DestroyLang 删除活动语言配置信息
|
||||||
|
func (s *WCampaignServer) DestroyLang(ctx context.Context, req *pb.DestroyLangReq, res *pb.DestroyLangRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.DestroyLang(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// LangSelect 活动语言选择
|
||||||
|
func (s *WCampaignServer) LangSelect(ctx context.Context, req *pb.LangSelectReq, res *pb.LangSelectRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.LangSelect(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CampaignInfo 活动信息
|
||||||
|
func (s *WCampaignServer) CampaignInfo(ctx context.Context, req *pb.CampaignInfoReq, res *pb.CampaignInfoRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.CampaignInfo(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ShowReward 显示的奖品数据
|
||||||
|
func (s *WCampaignServer) ShowReward(ctx context.Context, req *pb.ShowRewardReq, res *pb.ShowRewardRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ShowReward(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdsStore 创建Ads活动
|
||||||
|
func (s *WCampaignServer) AdsStore(ctx context.Context, req *pb.AdsStoreReq, res *pb.AdsStoreRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.AdsStore(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdsUpdate 更新Ads活动
|
||||||
|
func (s *WCampaignServer) AdsUpdate(ctx context.Context, req *pb.AdsUpdateReq, res *pb.AdsUpdateRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.AdsUpdate(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdsShow Ads活动详情
|
||||||
|
func (s *WCampaignServer) AdsShow(ctx context.Context, req *pb.AdsShowReq, res *pb.AdsShowRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.AdsShow(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CampaignSelect 活动列表
|
||||||
|
func (s *WCampaignServer) CampaignSelect(ctx context.Context, req *pb.CampaignSelectReq, res *pb.CampaignSelectRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.CampaignSelect(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// RewardDetail 奖品详情
|
||||||
|
func (s *WCampaignServer) RewardDetail(ctx context.Context, req *pb.RewardDetailReq, res *pb.RewardDetailRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.RewardDetail(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateStock 修改奖品库存
|
||||||
|
func (s *WCampaignServer) UpdateStock(ctx context.Context, req *pb.UpdateStockReq, res *pb.UpdateStockRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.UpdateStock(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CampaignTz 活动时区数据
|
||||||
|
func (s *WCampaignServer) CampaignTz(ctx context.Context, req *pb.CampaignTzReq, res *pb.CampaignTzRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.CampaignTz(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CampaignRewardType 活动奖品类型
|
||||||
|
func (s *WCampaignServer) CampaignRewardType(ctx context.Context, req *pb.CampaignRewardTypeReq, res *pb.CampaignRewardTypeRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.CampaignRewardType(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChildList 子活动列表
|
||||||
|
func (s *WCampaignServer) ChildList(ctx context.Context, req *pb.ChildListReq, res *pb.ChildListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChildList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChildStore 子活动列表
|
||||||
|
func (s *WCampaignServer) ChildStore(ctx context.Context, req *pb.ChildStoreReq, res *pb.ChildStoreRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChildStore(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChildUpdate 更新子活动
|
||||||
|
func (s *WCampaignServer) ChildUpdate(ctx context.Context, req *pb.ChildUpdateReq, res *pb.ChildUpdateRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChildUpdate(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChildShow 子活动活动
|
||||||
|
func (s *WCampaignServer) ChildShow(ctx context.Context, req *pb.ChildShowReq, res *pb.ChildShowRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChildShow(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskCenterJump 子活动列表
|
||||||
|
func (s *WCampaignServer) TaskCenterJump(ctx context.Context, req *pb.TaskCenterJumpReq, res *pb.TaskCenterJumpRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.TaskCenterJump(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CondList 活动任务数据
|
||||||
|
func (s *WCampaignServer) CondList(ctx context.Context, req *pb.CondListReq, res *pb.CondListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.CondList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Campaigns 获取活动数据
|
||||||
|
func (s *WCampaignServer) Campaigns(ctx context.Context, req *pb.CampaignsReq, res *pb.CampaignsRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Campaigns(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetLvApi 设置动态用户等级动态api
|
||||||
|
func (s *WCampaignServer) SetLvApi(ctx context.Context, req *pb.SetLvApiReq, res *pb.SetLvApiRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.SetLvApi(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetLvApi 设置动态用户等级动态api
|
||||||
|
func (s *WCampaignServer) GetLvApi(ctx context.Context, req *pb.GetLvApiReq, res *pb.GetLvApiRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.GetLvApi(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// VsSettlement 赛事竞猜结算
|
||||||
|
func (s *WCampaignServer) VsSettlement(ctx context.Context, req *pb.VsSettlementReq, res *pb.VsSettlementRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.VsSettlement(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// VsSettlementInfo 赛事竞猜结算
|
||||||
|
func (s *WCampaignServer) VsSettlementInfo(ctx context.Context, req *pb.VsSettlementInfoReq, res *pb.VsSettlementInfoRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.VsSettlementInfo(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ActionList 行为列表
|
||||||
|
func (s *WCampaignServer) ActionList(ctx context.Context, req *pb.ActionListReq, res *pb.ActionListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaign{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ActionList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
@ -0,0 +1,173 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"joybuywork/internal/service"
|
||||||
|
pb "joybuywork/proto/go_proto/w_campaign_stat"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WCampaignStatServer struct {
|
||||||
|
ser service.WCampaignStat
|
||||||
|
}
|
||||||
|
|
||||||
|
// Summary 活动概览数据
|
||||||
|
func (s *WCampaignStatServer) Summary(ctx context.Context, req *pb.SummaryReq, res *pb.SummaryRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Summary(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Campaign 活动数据
|
||||||
|
func (s *WCampaignStatServer) Campaign(ctx context.Context, req *pb.CampaignReq, res *pb.CampaignRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Campaign(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Related 裂变数据
|
||||||
|
func (s *WCampaignStatServer) Related(ctx context.Context, req *pb.RelatedReq, res *pb.RelatedRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Related(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stat 统计事件数据
|
||||||
|
func (s *WCampaignStatServer) Stat(ctx context.Context, req *pb.StatReq, res *pb.StatRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Stat(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Channel 渠道统计
|
||||||
|
func (s *WCampaignStatServer) Channel(ctx context.Context, req *pb.ChannelReq, res *pb.ChannelRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Channel(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdsSummary Ads总揽数据
|
||||||
|
func (s *WCampaignStatServer) AdsSummary(ctx context.Context, req *pb.AdsSummaryReq, res *pb.AdsSummaryRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.AdsSummary(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdsTable Ads报表
|
||||||
|
func (s *WCampaignStatServer) AdsTable(ctx context.Context, req *pb.AdsTableReq, res *pb.AdsTableRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.AdsTable(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdsReward Ads奖品
|
||||||
|
func (s *WCampaignStatServer) AdsReward(ctx context.Context, req *pb.AdsRewardReq, res *pb.AdsRewardRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.AdsReward(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// InAppBP 应用内埋点埋点
|
||||||
|
func (s *WCampaignStatServer) InAppBP(ctx context.Context, req *pb.InAppBPReq, res *pb.InAppBPRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.InAppBP(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// OutAppBP 应用外埋点
|
||||||
|
func (s *WCampaignStatServer) OutAppBP(ctx context.Context, req *pb.OutAppBPReq, res *pb.OutAppBPRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.OutAppBP(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReportInfo 报表信息
|
||||||
|
func (s *WCampaignStatServer) ReportInfo(ctx context.Context, req *pb.ReportInfoReq, res *pb.ReportInfoRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ReportInfo(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// StatEvent 活动统计的维度
|
||||||
|
func (s *WCampaignStatServer) StatEvent(ctx context.Context, req *pb.StatEventReq, res *pb.StatEventRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.StatEvent(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DemTitle 维度标题数据
|
||||||
|
func (s *WCampaignStatServer) DemTitle(ctx context.Context, req *pb.DemTitleReq, res *pb.DemTitleRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.DemTitle(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// TopTen 活动前十排行榜
|
||||||
|
func (s *WCampaignStatServer) TopTen(ctx context.Context, req *pb.TopTenReq, res *pb.TopTenRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.TopTen(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UserCycle 用户明细占比数据
|
||||||
|
func (s *WCampaignStatServer) UserCycle(ctx context.Context, req *pb.UserCycleReq, res *pb.UserCycleRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.UserCycle(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Active 用户活跃
|
||||||
|
func (s *WCampaignStatServer) Active(ctx context.Context, req *pb.ActiveReq, res *pb.ActiveRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Active(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChildBP 应用内埋点
|
||||||
|
func (s *WCampaignStatServer) ChildBP(ctx context.Context, req *pb.ChildBPReq, res *pb.ChildBPRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChildBP(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChildReportInfo 子活动报表信息
|
||||||
|
func (s *WCampaignStatServer) ChildReportInfo(ctx context.Context, req *pb.ChildReportInfoReq, res *pb.ChildReportInfoRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignStat{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChildReportInfo(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
@ -0,0 +1,864 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"joybuywork/internal/service"
|
||||||
|
pb "joybuywork/proto/go_proto/w_campaign_user"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WCampaignUserServer struct{}
|
||||||
|
|
||||||
|
// List 用户列表
|
||||||
|
func (s *WCampaignUserServer) List(ctx context.Context, req *pb.ListReq, res *pb.ListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.List(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reward 用户奖励
|
||||||
|
func (s *WCampaignUserServer) Reward(ctx context.Context, req *pb.RewardReq, res *pb.RewardRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Reward(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Visit 访问活动
|
||||||
|
func (s *WCampaignUserServer) Visit(ctx context.Context, req *pb.VisitReq, res *pb.VisitRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Visit(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Play 用户活动数据
|
||||||
|
func (s *WCampaignUserServer) Play(ctx context.Context, req *pb.PlayReq, res *pb.PlayRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Play(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// RewardUser 中奖用户列表
|
||||||
|
func (s *WCampaignUserServer) RewardUser(ctx context.Context, req *pb.RewardUserReq, res *pb.RewardUserRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.RewardUser(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Info 用户信息
|
||||||
|
func (s *WCampaignUserServer) Info(ctx context.Context, req *pb.InfoReq, res *pb.InfoRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Info(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rank 排行榜
|
||||||
|
func (s *WCampaignUserServer) Rank(ctx context.Context, req *pb.RankReq, res *pb.RankRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Rank(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lottery 活动抽奖
|
||||||
|
func (s *WCampaignUserServer) Lottery(ctx context.Context, req *pb.LotteryReq, res *pb.LotteryRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Lottery(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Answer 活动答题
|
||||||
|
func (s *WCampaignUserServer) Answer(ctx context.Context, req *pb.AnswerReq, res *pb.AnswerRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Answer(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vote 活动投票
|
||||||
|
func (s *WCampaignUserServer) Vote(ctx context.Context, req *pb.VoteReq, res *pb.VoteRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Vote(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify 客户端回调
|
||||||
|
func (s *WCampaignUserServer) Notify(ctx context.Context, req *pb.NotifyReq, res *pb.NotifyRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Notify(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AcceptReward 领取奖品
|
||||||
|
func (s *WCampaignUserServer) AcceptReward(ctx context.Context, req *pb.AcceptRewardReq, res *pb.AcceptRewardRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.AcceptReward(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// TargetRule 达标规则
|
||||||
|
func (s *WCampaignUserServer) TargetRule(ctx context.Context, req *pb.TargetRuleReq, res *pb.TargetRuleRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.TargetRule(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Task 我的任务
|
||||||
|
func (s *WCampaignUserServer) Task(ctx context.Context, req *pb.TaskReq, res *pb.TaskRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Task(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resend 补发奖品
|
||||||
|
func (s *WCampaignUserServer) Resend(ctx context.Context, req *pb.ResendReq, res *pb.ResendRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Resend(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DynamicLink 获取用户动态链接
|
||||||
|
func (s *WCampaignUserServer) DynamicLink(ctx context.Context, req *pb.DynamicLinkReq, res *pb.DynamicLinkRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.DynamicLink(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DylinkShow 获取用户动态链接详情
|
||||||
|
func (s *WCampaignUserServer) DylinkShow(ctx context.Context, req *pb.DylinkShowReq, res *pb.DylinkShowRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.DylinkShow(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// SignIn 我的签到板
|
||||||
|
func (s *WCampaignUserServer) SignIn(ctx context.Context, req *pb.SignInReq, res *pb.SignInRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.SignIn(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sign 签到
|
||||||
|
func (s *WCampaignUserServer) Sign(ctx context.Context, req *pb.SignReq, res *pb.SignRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Sign(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DiceMap 大富翁地图
|
||||||
|
func (s *WCampaignUserServer) DiceMap(ctx context.Context, req *pb.DiceMapReq, res *pb.DiceMapRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.DiceMap(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dice 大富翁骰子
|
||||||
|
func (s *WCampaignUserServer) Dice(ctx context.Context, req *pb.DiceReq, res *pb.DiceRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Dice(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Grow 成长生命体
|
||||||
|
func (s *WCampaignUserServer) Grow(ctx context.Context, req *pb.GrowReq, res *pb.GrowRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Grow(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetGrow 成长生命体
|
||||||
|
func (s *WCampaignUserServer) GetGrow(ctx context.Context, req *pb.GetGrowReq, res *pb.GetGrowRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.GetGrow(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Feed 饲养生命体
|
||||||
|
func (s *WCampaignUserServer) Feed(ctx context.Context, req *pb.FeedReq, res *pb.FeedRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Feed(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetFeed 领取饲养道具
|
||||||
|
func (s *WCampaignUserServer) GetFeed(ctx context.Context, req *pb.GetFeedReq, res *pb.GetFeedRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.GetFeed(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GrowRecord 成长记录
|
||||||
|
func (s *WCampaignUserServer) GrowRecord(ctx context.Context, req *pb.GrowRecordReq, res *pb.GrowRecordRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.GrowRecord(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ContentLink 内容链接
|
||||||
|
func (s *WCampaignUserServer) ContentLink(ctx context.Context, req *pb.ContentLinkReq, res *pb.ContentLinkRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ContentLink(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// LinkContent 链接内容
|
||||||
|
func (s *WCampaignUserServer) LinkContent(ctx context.Context, req *pb.LinkContentReq, res *pb.LinkContentRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.LinkContent(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChopSelect 选择砍一刀奖品
|
||||||
|
func (s *WCampaignUserServer) ChopSelect(ctx context.Context, req *pb.ChopSelectReq, res *pb.ChopSelectRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChopSelect(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChopReselect 重选砍一刀奖品
|
||||||
|
func (s *WCampaignUserServer) ChopReselect(ctx context.Context, req *pb.ChopReselectReq, res *pb.ChopReselectRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChopReselect(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChopHelp 砍一刀助力记录
|
||||||
|
func (s *WCampaignUserServer) ChopHelp(ctx context.Context, req *pb.ChopHelpReq, res *pb.ChopHelpRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChopHelp(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// LevelList 用户等级列表
|
||||||
|
func (s *WCampaignUserServer) LevelList(ctx context.Context, req *pb.LevelListReq, res *pb.LevelListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.LevelList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// LevelStore 创建用户等级
|
||||||
|
func (s *WCampaignUserServer) LevelStore(ctx context.Context, req *pb.LevelStoreReq, res *pb.LevelStoreRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.LevelStore(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// LevelEdit 更新用户等级
|
||||||
|
func (s *WCampaignUserServer) LevelEdit(ctx context.Context, req *pb.LevelEditReq, res *pb.LevelEditRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.LevelEdit(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// LevelDestroy 删除用户等级
|
||||||
|
func (s *WCampaignUserServer) LevelDestroy(ctx context.Context, req *pb.LevelDestroyReq, res *pb.LevelDestroyRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.LevelDestroy(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProjectList 项目参与用户列表
|
||||||
|
func (s *WCampaignUserServer) ProjectList(ctx context.Context, req *pb.ProjectListReq, res *pb.ProjectListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ProjectList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// FinishStep 完成现金抽奖阶段
|
||||||
|
func (s *WCampaignUserServer) FinishStep(ctx context.Context, req *pb.FinishStepReq, res *pb.FinishStepRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.FinishStep(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spin 现金转盘抽奖
|
||||||
|
func (s *WCampaignUserServer) Spin(ctx context.Context, req *pb.SpinReq, res *pb.SpinRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Spin(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CashRecords 现金转盘记录
|
||||||
|
func (s *WCampaignUserServer) CashRecords(ctx context.Context, req *pb.CashRecordsReq, res *pb.CashRecordsRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.CashRecords(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// MixReward 合成奖品
|
||||||
|
func (s *WCampaignUserServer) MixReward(ctx context.Context, req *pb.MixRewardReq, res *pb.MixRewardRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.MixReward(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DiceRecord 骰子记录
|
||||||
|
func (s *WCampaignUserServer) DiceRecord(ctx context.Context, req *pb.DiceRecordReq, res *pb.DiceRecordRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.DiceRecord(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// RewardForm 奖品需要填写的表单
|
||||||
|
func (s *WCampaignUserServer) RewardForm(ctx context.Context, req *pb.RewardFormReq, res *pb.RewardFormRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.RewardForm(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubmitForm 提交表单
|
||||||
|
func (s *WCampaignUserServer) SubmitForm(ctx context.Context, req *pb.SubmitFormReq, res *pb.SubmitFormRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.SubmitForm(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAdsUrl 广告停留回传
|
||||||
|
func (s *WCampaignUserServer) GetAdsUrl(ctx context.Context, req *pb.GetAdsUrlReq, res *pb.GetAdsUrlRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.GetAdsUrl(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdsStay 广告停留回传
|
||||||
|
func (s *WCampaignUserServer) AdsStay(ctx context.Context, req *pb.AdsStayReq, res *pb.AdsStayRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.AdsStay(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClueNotified 通知信息已经被接收
|
||||||
|
func (s *WCampaignUserServer) ClueNotified(ctx context.Context, req *pb.ClueNotifiedReq, res *pb.ClueNotifiedRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ClueNotified(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChangeUserLevel 修改用户等级
|
||||||
|
func (s *WCampaignUserServer) ChangeUserLevel(ctx context.Context, req *pb.ChangeUserLevelReq, res *pb.ChangeUserLevelRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChangeUserLevel(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChopReward 砍一刀可选奖品
|
||||||
|
func (s *WCampaignUserServer) ChopReward(ctx context.Context, req *pb.ChopRewardReq, res *pb.ChopRewardRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChopReward(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// HelpPercent 助力进度
|
||||||
|
func (s *WCampaignUserServer) HelpPercent(ctx context.Context, req *pb.HelpPercentReq, res *pb.HelpPercentRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.HelpPercent(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// InvokeCond 触发前置条件
|
||||||
|
func (s *WCampaignUserServer) InvokeCond(ctx context.Context, req *pb.InvokeCondReq, res *pb.InvokeCondRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.InvokeCond(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// KeepReward 激励养成可选奖品
|
||||||
|
func (s *WCampaignUserServer) KeepReward(ctx context.Context, req *pb.KeepRewardReq, res *pb.KeepRewardRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.KeepReward(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// KeepSelect 选择激励养成奖品
|
||||||
|
func (s *WCampaignUserServer) KeepSelect(ctx context.Context, req *pb.KeepSelectReq, res *pb.KeepSelectRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.KeepSelect(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// KeepCollect 激励养成收集一级道具
|
||||||
|
func (s *WCampaignUserServer) KeepCollect(ctx context.Context, req *pb.KeepCollectReq, res *pb.KeepCollectRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.KeepCollect(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// KeepFeed 激励养成收集一级道具
|
||||||
|
func (s *WCampaignUserServer) KeepFeed(ctx context.Context, req *pb.KeepFeedReq, res *pb.KeepFeedRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.KeepFeed(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// MachineSave 激励养成保存机器道具
|
||||||
|
func (s *WCampaignUserServer) MachineSave(ctx context.Context, req *pb.MachineSaveReq, res *pb.MachineSaveRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.MachineSave(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// MachineRecycle 激励养成保存机器道具道具
|
||||||
|
func (s *WCampaignUserServer) MachineRecycle(ctx context.Context, req *pb.MachineRecycleReq, res *pb.MachineRecycleRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.MachineRecycle(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPropFeed 收喂养次数的道具
|
||||||
|
func (s *WCampaignUserServer) GetPropFeed(ctx context.Context, req *pb.GetPropFeedReq, res *pb.GetPropFeedRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.GetPropFeed(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// KeepLog 激励养成记录
|
||||||
|
func (s *WCampaignUserServer) KeepLog(ctx context.Context, req *pb.KeepLogReq, res *pb.KeepLogRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.KeepLog(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// KeepReselect 激励养成重新选择
|
||||||
|
func (s *WCampaignUserServer) KeepReselect(ctx context.Context, req *pb.KeepReselectReq, res *pb.KeepReselectRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.KeepReselect(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// KeepGuide 激励养成指引
|
||||||
|
func (s *WCampaignUserServer) KeepGuide(ctx context.Context, req *pb.KeepGuideReq, res *pb.KeepGuideRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.KeepGuide(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// KeepFirstInvite 激励养成首邀状态
|
||||||
|
func (s *WCampaignUserServer) KeepFirstInvite(ctx context.Context, req *pb.KeepFirstInviteReq, res *pb.KeepFirstInviteRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.KeepFirstInvite(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Child 子活动信息
|
||||||
|
func (s *WCampaignUserServer) Child(ctx context.Context, req *pb.ChildReq, res *pb.ChildRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Child(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChildActive 参与子活动
|
||||||
|
func (s *WCampaignUserServer) ChildActive(ctx context.Context, req *pb.ChildActiveReq, res *pb.ChildActiveRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChildActive(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GoldFinishStep 完成金币任务阶段
|
||||||
|
func (s *WCampaignUserServer) GoldFinishStep(ctx context.Context, req *pb.GoldFinishStepReq, res *pb.GoldFinishStepRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.GoldFinishStep(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GoldNotify 金币获取通知
|
||||||
|
func (s *WCampaignUserServer) GoldNotify(ctx context.Context, req *pb.GoldNotifyReq, res *pb.GoldNotifyRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.GoldNotify(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GoldRecord 金币获取记录
|
||||||
|
func (s *WCampaignUserServer) GoldRecord(ctx context.Context, req *pb.GoldRecordReq, res *pb.GoldRecordRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.GoldRecord(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deduct 扣除积分
|
||||||
|
func (s *WCampaignUserServer) Deduct(ctx context.Context, req *pb.DeductReq, res *pb.DeductRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Deduct(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gain 领取积分
|
||||||
|
func (s *WCampaignUserServer) Gain(ctx context.Context, req *pb.GainReq, res *pb.GainRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Gain(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CoinRecord 金币池记录
|
||||||
|
func (s *WCampaignUserServer) CoinRecord(ctx context.Context, req *pb.CoinRecordReq, res *pb.CoinRecordRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.CoinRecord(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChildList 子活动用户列表
|
||||||
|
func (s *WCampaignUserServer) ChildList(ctx context.Context, req *pb.ChildListReq, res *pb.ChildListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChildList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReceiveReward 领取奖励
|
||||||
|
func (s *WCampaignUserServer) ReceiveReward(ctx context.Context, req *pb.ReceiveRewardReq, res *pb.ReceiveRewardRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ReceiveReward(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// LotteryLog 抽奖玩法日志
|
||||||
|
func (s *WCampaignUserServer) LotteryLog(ctx context.Context, req *pb.LotteryLogReq, res *pb.LotteryLogRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.LotteryLog(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UserList 活动用户数据
|
||||||
|
func (s *WCampaignUserServer) UserList(ctx context.Context, req *pb.UserListReq, res *pb.UserListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.UserList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CashAgain 现金大抽奖再玩一次
|
||||||
|
func (s *WCampaignUserServer) CashAgain(ctx context.Context, req *pb.CashAgainReq, res *pb.CashAgainRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.CashAgain(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarkLevel 用户等级标识列表
|
||||||
|
func (s *WCampaignUserServer) MarkLevel(ctx context.Context, req *pb.MarkLevelReq, res *pb.MarkLevelRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.MarkLevel(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DiceCollect 用户手机碎片
|
||||||
|
func (s *WCampaignUserServer) DiceCollect(ctx context.Context, req *pb.DiceCollectReq, res *pb.DiceCollectRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.DiceCollect(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClientReward 用户手机碎片
|
||||||
|
func (s *WCampaignUserServer) ClientReward(ctx context.Context, req *pb.ClientRewardReq, res *pb.ClientRewardRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ClientReward(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// PointsUse 积分兑换
|
||||||
|
func (s *WCampaignUserServer) PointsUse(ctx context.Context, req *pb.PointsUseReq, res *pb.PointsUseRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.PointsUse(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chat Ai聊天
|
||||||
|
func (s *WCampaignUserServer) Chat(ctx context.Context, req *pb.ChatReq, res *pb.ChatRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Chat(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChatList Ai聊天
|
||||||
|
func (s *WCampaignUserServer) ChatList(ctx context.Context, req *pb.ChatListReq, res *pb.ChatListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ChatList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ScheduleList 赛程信息
|
||||||
|
func (s *WCampaignUserServer) ScheduleList(ctx context.Context, req *pb.ScheduleListReq, res *pb.ScheduleListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.ScheduleList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// MallList 用户商城奖品列表
|
||||||
|
func (s *WCampaignUserServer) MallList(ctx context.Context, req *pb.MallListReq, res *pb.MallListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.MallList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exchange 商城奖品兑换
|
||||||
|
func (s *WCampaignUserServer) Exchange(ctx context.Context, req *pb.ExchangeReq, res *pb.ExchangeRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Exchange(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// VoteList 投票列表
|
||||||
|
func (s *WCampaignUserServer) VoteList(ctx context.Context, req *pb.VoteListReq, res *pb.VoteListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.VoteList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// VsTipReward 接受投票结果
|
||||||
|
func (s *WCampaignUserServer) VsTipReward(ctx context.Context, req *pb.VsTipRewardReq, res *pb.VsTipRewardRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.VsTipReward(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnoRandCard uno随机牌
|
||||||
|
func (s *WCampaignUserServer) UnoRandCard(ctx context.Context, req *pb.UnoRandCardReq, res *pb.UnoRandCardRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.UnoRandCard(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnoClaim uno领取牌奖励
|
||||||
|
func (s *WCampaignUserServer) UnoClaim(ctx context.Context, req *pb.UnoClaimReq, res *pb.UnoClaimRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.UnoClaim(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnoCard uno卡牌
|
||||||
|
func (s *WCampaignUserServer) UnoCard(ctx context.Context, req *pb.UnoCardReq, res *pb.UnoCardRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.UnoCard(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show 用户详情
|
||||||
|
func (s *WCampaignUserServer) Show(ctx context.Context, req *pb.ShowReq, res *pb.ShowRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Show(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// EventFirstVisit 首次访问活动
|
||||||
|
func (s *WCampaignUserServer) EventFirstVisit(ctx context.Context, req *pb.EventFirstVisitReq, res *pb.EventFirstVisitRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.EventFirstVisit(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindByUniq 通过唯一键找用户id
|
||||||
|
func (s *WCampaignUserServer) FindByUniq(ctx context.Context, req *pb.FindByUniqReq, res *pb.FindByUniqRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.FindByUniq(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskTip 任务提示
|
||||||
|
func (s *WCampaignUserServer) TaskTip(ctx context.Context, req *pb.TaskTipReq, res *pb.TaskTipRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.TaskTip(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskTipOk 任务提示完成
|
||||||
|
func (s *WCampaignUserServer) TaskTipOk(ctx context.Context, req *pb.TaskTipOkReq, res *pb.TaskTipOkRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.TaskTipOk(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CoinLog 金币日志
|
||||||
|
func (s *WCampaignUserServer) CoinLog(ctx context.Context, req *pb.CoinLogReq, res *pb.CoinLogRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.CoinLog(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AnswerHistory 答题历史
|
||||||
|
func (s *WCampaignUserServer) AnswerHistory(ctx context.Context, req *pb.AnswerHistoryReq, res *pb.AnswerHistoryRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCampaignUser{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.AnswerHistory(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"joybuywork/internal/service"
|
||||||
|
pb "joybuywork/proto/go_proto/w_coin"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WCoinServer struct{}
|
||||||
|
|
||||||
|
// Save 积分配置保存
|
||||||
|
func (s *WCoinServer) Save(ctx context.Context, req *pb.SaveReq, res *pb.SaveRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCoin{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Save(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show 积分配置展示
|
||||||
|
func (s *WCoinServer) Show(ctx context.Context, req *pb.ShowReq, res *pb.ShowRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCoin{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Show(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
@ -0,0 +1,81 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"joybuywork/internal/service"
|
||||||
|
pb "joybuywork/proto/go_proto/w_common"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WCommonServer struct{}
|
||||||
|
|
||||||
|
// PolicyToken 获取阿里云token
|
||||||
|
func (s *WCommonServer) PolicyToken(ctx context.Context, req *pb.PolicyTokenReq, res *pb.PolicyTokenRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCommon{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.PolicyToken(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Whitelist 服务器白名单
|
||||||
|
func (s *WCommonServer) Whitelist(ctx context.Context, req *pb.WhitelistReq, res *pb.WhitelistRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCommon{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Whitelist(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Download 下载
|
||||||
|
func (s *WCommonServer) Download(ctx context.Context, req *pb.DownloadReq, res *pb.DownloadRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCommon{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Download(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DownloadStatus 下载状态
|
||||||
|
func (s *WCommonServer) DownloadStatus(ctx context.Context, req *pb.DownloadStatusReq, res *pb.DownloadStatusRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCommon{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.DownloadStatus(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// OperateLog dashboard操作日志
|
||||||
|
func (s *WCommonServer) OperateLog(ctx context.Context, req *pb.OperateLogReq, res *pb.OperateLogRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCommon{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.OperateLog(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// SaveMaterial 保存素材
|
||||||
|
func (s *WCommonServer) SaveMaterial(ctx context.Context, req *pb.SaveMaterialReq, res *pb.SaveMaterialRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCommon{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.SaveMaterial(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// MaterialList 素材列表
|
||||||
|
func (s *WCommonServer) MaterialList(ctx context.Context, req *pb.MaterialListReq, res *pb.MaterialListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCommon{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.MaterialList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CompanyMade 企业定制组件列表
|
||||||
|
func (s *WCommonServer) CompanyMade(ctx context.Context, req *pb.CompanyMadeReq, res *pb.CompanyMadeRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WCommon{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.CompanyMade(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
@ -0,0 +1,99 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"joybuywork/internal/service"
|
||||||
|
pb "joybuywork/proto/go_proto/w_fission"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WFissionServer struct{}
|
||||||
|
|
||||||
|
// List 玩法列表
|
||||||
|
func (s *WFissionServer) List(ctx context.Context, req *pb.ListReq, res *pb.ListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFission{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.List(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// TemplateList 玩法模版列表
|
||||||
|
func (s *WFissionServer) TemplateList(ctx context.Context, req *pb.TemplateListReq, res *pb.TemplateListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFission{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.TemplateList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// TemplateInfo 玩法模版信息
|
||||||
|
func (s *WFissionServer) TemplateInfo(ctx context.Context, req *pb.TemplateInfoReq, res *pb.TemplateInfoRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFission{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.TemplateInfo(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateTempGroup 创建模板组
|
||||||
|
func (s *WFissionServer) CreateTempGroup(ctx context.Context, req *pb.CreateTempGroupReq, res *pb.CreateTempGroupRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFission{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.CreateTempGroup(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateTemp 玩法模版列表
|
||||||
|
func (s *WFissionServer) CreateTemp(ctx context.Context, req *pb.CreateTempReq, res *pb.CreateTempRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFission{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.CreateTemp(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateTempImg 玩法模版列表
|
||||||
|
func (s *WFissionServer) CreateTempImg(ctx context.Context, req *pb.CreateTempImgReq, res *pb.CreateTempImgRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFission{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.CreateTempImg(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateTempLang 玩法模版列表
|
||||||
|
func (s *WFissionServer) CreateTempLang(ctx context.Context, req *pb.CreateTempLangReq, res *pb.CreateTempLangRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFission{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.CreateTempLang(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateTempImg 更新玩法图片配置
|
||||||
|
func (s *WFissionServer) UpdateTempImg(ctx context.Context, req *pb.UpdateTempImgReq, res *pb.UpdateTempImgRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFission{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.UpdateTempImg(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateTempLang 更新玩法语言配置
|
||||||
|
func (s *WFissionServer) UpdateTempLang(ctx context.Context, req *pb.UpdateTempLangReq, res *pb.UpdateTempLangRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFission{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.UpdateTempLang(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateTempGroup 更新模板组
|
||||||
|
func (s *WFissionServer) UpdateTempGroup(ctx context.Context, req *pb.UpdateTempGroupReq, res *pb.UpdateTempGroupRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFission{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.UpdateTempGroup(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
@ -0,0 +1,63 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"joybuywork/internal/service"
|
||||||
|
pb "joybuywork/proto/go_proto/w_fission_web"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WFissionWebServer struct{}
|
||||||
|
|
||||||
|
// GetWebReward 抽取站外奖品
|
||||||
|
func (s *WFissionWebServer) GetWebReward(ctx context.Context, req *pb.GetWebRewardReq, res *pb.GetWebRewardRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFissionWeb{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.GetWebReward(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// BindWeb 绑定站外活动
|
||||||
|
func (s *WFissionWebServer) BindWeb(ctx context.Context, req *pb.BindWebReq, res *pb.BindWebRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFissionWeb{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.BindWeb(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// WebReward 用户站外奖
|
||||||
|
func (s *WFissionWebServer) WebReward(ctx context.Context, req *pb.WebRewardReq, res *pb.WebRewardRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFissionWeb{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.WebReward(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// WebAnswer 用户站外答题
|
||||||
|
func (s *WFissionWebServer) WebAnswer(ctx context.Context, req *pb.WebAnswerReq, res *pb.WebAnswerRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFissionWeb{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.WebAnswer(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdsUser Ads用户数据
|
||||||
|
func (s *WFissionWebServer) AdsUser(ctx context.Context, req *pb.AdsUserReq, res *pb.AdsUserRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFissionWeb{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.AdsUser(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdsLottery Ads抽奖
|
||||||
|
func (s *WFissionWebServer) AdsLottery(ctx context.Context, req *pb.AdsLotteryReq, res *pb.AdsLotteryRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WFissionWeb{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.AdsLottery(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
@ -0,0 +1,90 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"joybuywork/internal/service"
|
||||||
|
pb "joybuywork/proto/go_proto/w_games"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WGamesServer struct{}
|
||||||
|
|
||||||
|
// LinkList 链接列表
|
||||||
|
func (s *WGamesServer) LinkList(ctx context.Context, req *pb.LinkListReq, res *pb.LinkListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WGames{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.LinkList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Visit 访问小游戏
|
||||||
|
func (s *WGamesServer) Visit(ctx context.Context, req *pb.VisitReq, res *pb.VisitRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WGames{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Visit(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// List 游戏列表
|
||||||
|
func (s *WGamesServer) List(ctx context.Context, req *pb.ListReq, res *pb.ListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WGames{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.List(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// LinkStore 创建链接
|
||||||
|
func (s *WGamesServer) LinkStore(ctx context.Context, req *pb.LinkStoreReq, res *pb.LinkStoreRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WGames{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.LinkStore(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// LinkUpdate 更新链接
|
||||||
|
func (s *WGamesServer) LinkUpdate(ctx context.Context, req *pb.LinkUpdateReq, res *pb.LinkUpdateRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WGames{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.LinkUpdate(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// LinkDestroy 删除链接
|
||||||
|
func (s *WGamesServer) LinkDestroy(ctx context.Context, req *pb.LinkDestroyReq, res *pb.LinkDestroyRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WGames{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.LinkDestroy(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Trace 跟踪小游戏
|
||||||
|
func (s *WGamesServer) Trace(ctx context.Context, req *pb.TraceReq, res *pb.TraceRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WGames{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Trace(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Overview 小游戏统计
|
||||||
|
func (s *WGamesServer) Overview(ctx context.Context, req *pb.OverviewReq, res *pb.OverviewRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WGames{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Overview(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Trend 小游戏趋势
|
||||||
|
func (s *WGamesServer) Trend(ctx context.Context, req *pb.TrendReq, res *pb.TrendRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WGames{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.Trend(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
@ -0,0 +1,108 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"joybuywork/internal/service"
|
||||||
|
pb "joybuywork/proto/go_proto/w_library"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WLibraryServer struct{}
|
||||||
|
|
||||||
|
// QaGroup 题库列表
|
||||||
|
func (s *WLibraryServer) QaGroup(ctx context.Context, req *pb.QaGroupReq, res *pb.QaGroupRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WLibrary{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.QaGroup(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// StoreQaGroup 创建题库
|
||||||
|
func (s *WLibraryServer) StoreQaGroup(ctx context.Context, req *pb.StoreQaGroupReq, res *pb.StoreQaGroupRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WLibrary{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.StoreQaGroup(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateQaGroup 更新题库
|
||||||
|
func (s *WLibraryServer) UpdateQaGroup(ctx context.Context, req *pb.UpdateQaGroupReq, res *pb.UpdateQaGroupRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WLibrary{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.UpdateQaGroup(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DestroyQaGroup 删除题库
|
||||||
|
func (s *WLibraryServer) DestroyQaGroup(ctx context.Context, req *pb.DestroyQaGroupReq, res *pb.DestroyQaGroupRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WLibrary{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.DestroyQaGroup(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// QaList 问题列表
|
||||||
|
func (s *WLibraryServer) QaList(ctx context.Context, req *pb.QaListReq, res *pb.QaListRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WLibrary{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.QaList(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// StoreQa 创建题目
|
||||||
|
func (s *WLibraryServer) StoreQa(ctx context.Context, req *pb.StoreQaReq, res *pb.StoreQaRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WLibrary{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.StoreQa(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateQa 更新题目
|
||||||
|
func (s *WLibraryServer) UpdateQa(ctx context.Context, req *pb.UpdateQaReq, res *pb.UpdateQaRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WLibrary{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.UpdateQa(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DestroyQa 删除题目
|
||||||
|
func (s *WLibraryServer) DestroyQa(ctx context.Context, req *pb.DestroyQaReq, res *pb.DestroyQaRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WLibrary{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.DestroyQa(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// QaGroupSelect 题库选项
|
||||||
|
func (s *WLibraryServer) QaGroupSelect(ctx context.Context, req *pb.QaGroupSelectReq, res *pb.QaGroupSelectRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WLibrary{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.QaGroupSelect(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// QaRand 随机问题
|
||||||
|
func (s *WLibraryServer) QaRand(ctx context.Context, req *pb.QaRandReq, res *pb.QaRandRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WLibrary{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.QaRand(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// QaShow 问题详情
|
||||||
|
func (s *WLibraryServer) QaShow(ctx context.Context, req *pb.QaShowReq, res *pb.QaShowRes) (err error) {
|
||||||
|
//初始化服务
|
||||||
|
srv := service.WLibrary{}
|
||||||
|
srv.Init(ctx)
|
||||||
|
err = srv.QaShow(req, res)
|
||||||
|
return err
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue