This repository has been archived by the owner on Mar 16, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
reqSavePlayerProgress.go
142 lines (136 loc) · 4.97 KB
/
reqSavePlayerProgress.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package application
import (
"encoding/json"
"log"
"net/http"
"github.com/jinzhu/gorm"
newrelic "github.com/newrelic/go-agent"
"github.com/server-may-cry/bubble-go/models"
"github.com/server-may-cry/bubble-go/mynewrelic"
"github.com/server-may-cry/bubble-go/notification"
"github.com/server-may-cry/bubble-go/platforms"
)
/*
{
...
"reachedSubStage":"1", // номер точки на острове до которой игрок дошел за все время игры
"currentStage":"0", // номер острова на котором игрок прошел точку в текущей сессии
"reachedStage":"0", // номер острова до которого игрок дошел за все время игры
"completeSubStage":"1", // номер точки на острове которую игрок прошел в текущей сессии
"completeSubStageRecordStat":"2", // количество звезд набранных на пройденной точке
"levelMode":"standart", // режим игры, может принимать значения "standart" (01) и "arcade" (02)
Если режим игры "standart", то перезаписываются значения reachedStage01 reachedSubStage01,
которые приходят в ReqEnter`e, если же "arcade" то reachedStage02 и reachedSubStage02
}
*/
type savePlayerProgressRequest struct {
ReachedSubStage int8 `json:"reachedSubStage,string"`
CurrentStage int8 `json:"currentStage,string"` // island number
ReachedStage int8 `json:"reachedStage,string"`
CompleteSubStage int8 `json:"completeSubStage,string"` // level number on island
CompleteSubStageRecordStat int8 `json:"completeSubStageRecordStat,string"` // starCount
LevelMode string `json:"levelMode"` // standart
}
// ReqSavePlayerProgress save player progress
func ReqSavePlayerProgress(
vkWorker *notification.VkWorker,
db *gorm.DB,
) HTTPHandlerContainer {
handler := HTTPHandler{
URL: "/ReqSavePlayerProgress",
}
handler.HTTPHandler = func(w http.ResponseWriter, r *http.Request) {
request := savePlayerProgressRequest{}
defer r.Body.Close()
err := json.NewDecoder(r.Body).Decode(&request)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
user := r.Context().Value(userCtxID).(models.User)
var needUpdate bool
switch request.LevelMode {
case "standart":
if request.ReachedStage > user.ReachedStage01 {
needUpdate = true
user.ReachedStage01 = request.ReachedStage
user.ReachedSubStage01 = request.ReachedSubStage
} else if request.ReachedStage == user.ReachedStage01 && request.ReachedSubStage > user.ReachedSubStage01 {
needUpdate = true
user.ReachedSubStage01 = request.ReachedSubStage
}
progress := user.GetProgresStandart()
if int(request.CurrentStage) > len(progress) {
log.Panicf("cheating? can`t save progress %+v", request)
}
if request.CompleteSubStageRecordStat > progress[request.CurrentStage][request.CompleteSubStage] {
needUpdate = true
progress[request.CurrentStage][request.CompleteSubStage] = request.CompleteSubStageRecordStat
user.SetProgresStandart(progress)
}
default:
log.Panicf("not implemented level mode %s", request.LevelMode)
}
if needUpdate {
s := newrelic.DatastoreSegment{
StartTime: newrelic.StartSegmentNow(r.Context().Value(mynewrelic.Ctx).(newrelic.Transaction)),
Product: newrelic.DatastorePostgres,
Collection: "user",
Operation: "UPDATE",
}
db.Save(&user)
_ = s.End()
}
if user.SysID == platforms.VK {
vkSocialLogic(vkWorker, request, user)
}
JSON(w, "ok")
}
return HTTPHandlerContainer{
HTTPHandler: handler,
}
}
func vkSocialLogic(vkWorker *notification.VkWorker, request savePlayerProgressRequest, user models.User) {
if request.CompleteSubStageRecordStat > 0 {
// not failed level
levelOrder := 0
if request.CurrentStage > 0 {
levelOrder = int(request.CurrentStage)*14 - 6
}
levelOrder += int(request.CompleteSubStage) + 1
prevReachedLevelOrder := 0
if user.ReachedStage01 > 0 {
prevReachedLevelOrder = int(user.ReachedStage01)*14 - 6
}
prevReachedLevelOrder += int(request.ReachedSubStage) + 1
if levelOrder > prevReachedLevelOrder {
vkWorker.SendEvent(notification.VkEvent{
ExtID: user.ExtID,
Type: 1,
Value: levelOrder,
})
}
}
if request.CompleteSubStage == 14 || (request.CompleteSubStage == 8 && request.CurrentStage == 0) {
completeLastLevelOnIslandEventMap := [...]int{
4,
5,
6,
7,
8,
9,
}
// open new island event
islandOrder := request.CurrentStage // complete last mission on island
eventID := completeLastLevelOnIslandEventMap[islandOrder]
if eventID != 0 {
if request.CurrentStage > user.ReachedStage01 {
vkWorker.SendEvent(notification.VkEvent{
ExtID: user.ExtID,
Type: 2,
Value: eventID,
})
}
}
}
}