Added level progress indicators, still WIP.
Fixed a bug where GetLevelScore wouldn't work and simplified it slightly. Removed the account_dash_next_level phrase. Added the account_dash_level phrase.
This commit is contained in:
parent
4d75c543d2
commit
de78268b20
|
@ -130,6 +130,8 @@ type ProfilePage struct {
|
|||
*Header
|
||||
ItemList []ReplyUser
|
||||
ProfileOwner User
|
||||
CurrentScore int
|
||||
NextScore int
|
||||
}
|
||||
|
||||
type CreateTopicPage struct {
|
||||
|
@ -152,7 +154,10 @@ type EmailListPage struct {
|
|||
|
||||
type AccountDashPage struct {
|
||||
*Header
|
||||
MFASetup bool
|
||||
MFASetup bool
|
||||
CurrentScore int
|
||||
NextScore int
|
||||
NextLevel int
|
||||
}
|
||||
|
||||
type PanelStats struct {
|
||||
|
|
|
@ -214,7 +214,7 @@ func CompileTemplates() error {
|
|||
|
||||
varList = make(map[string]tmpl.VarItem)
|
||||
header.Title = "User 526"
|
||||
ppage := ProfilePage{header, replyList, user}
|
||||
ppage := ProfilePage{header, replyList, user, 0, 0} // TODO: Use the score from user to generate the currentScore and nextScore
|
||||
profileTmpl, err := compile("profile", "common.ProfilePage", ppage)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
@ -114,9 +114,8 @@ func RelativeTime(t time.Time) string {
|
|||
return fmt.Sprintf("%d minutes ago", int(seconds/60))
|
||||
case seconds < 7200:
|
||||
return "an hour ago"
|
||||
default:
|
||||
return fmt.Sprintf("%d hours ago", int(seconds/60/60))
|
||||
}
|
||||
return fmt.Sprintf("%d hours ago", int(seconds/60/60))
|
||||
}
|
||||
|
||||
// TODO: Write a test for this
|
||||
|
@ -192,9 +191,8 @@ func ConvertUnit(num int) (int, string) {
|
|||
return num / 1000000, "M"
|
||||
case num >= 1000:
|
||||
return num / 1000, "K"
|
||||
default:
|
||||
return num, ""
|
||||
}
|
||||
return num, ""
|
||||
}
|
||||
|
||||
// TODO: Write a test for this
|
||||
|
@ -212,9 +210,8 @@ func ConvertFriendlyUnit(num int) (int, string) {
|
|||
return num / 1000000, " million"
|
||||
case num >= 1000:
|
||||
return num / 1000, " thousand"
|
||||
default:
|
||||
return num, ""
|
||||
}
|
||||
return num, ""
|
||||
}
|
||||
|
||||
// TODO: Make slugs optional for certain languages across the entirety of Gosora?
|
||||
|
@ -369,6 +366,7 @@ func WordCount(input string) (count int) {
|
|||
if input == "" {
|
||||
return 0
|
||||
}
|
||||
|
||||
var inSpace bool
|
||||
for _, value := range input {
|
||||
if unicode.IsSpace(value) || unicode.IsPunct(value) {
|
||||
|
@ -380,6 +378,7 @@ func WordCount(input string) (count int) {
|
|||
inSpace = false
|
||||
}
|
||||
}
|
||||
|
||||
return count + 1
|
||||
}
|
||||
|
||||
|
@ -407,21 +406,17 @@ func GetLevel(score int) (level int) {
|
|||
// TODO: Write a test for this
|
||||
func GetLevelScore(getLevel int) (score int) {
|
||||
var base float64 = 25
|
||||
var current, prev float64
|
||||
var level int
|
||||
expFactor := 2.8
|
||||
var current float64
|
||||
var expFactor = 2.8
|
||||
|
||||
for i := 1; ; i++ {
|
||||
for i := 1; i <= getLevel; i++ {
|
||||
_, bit := math.Modf(float64(i) / 10)
|
||||
if bit == 0 {
|
||||
expFactor += 0.1
|
||||
}
|
||||
current = base + math.Pow(float64(i), expFactor) + (prev / 3)
|
||||
prev = current
|
||||
level++
|
||||
if level <= getLevel {
|
||||
break
|
||||
}
|
||||
current = base + math.Pow(float64(i), expFactor) + (current / 3)
|
||||
//fmt.Println("level: ", i)
|
||||
//fmt.Println("current: ", current)
|
||||
}
|
||||
return int(math.Ceil(current))
|
||||
}
|
||||
|
|
|
@ -448,7 +448,7 @@
|
|||
|
||||
"account_dash_2fa_setup":"Setup your two-factor authentication.",
|
||||
"account_dash_2fa_manage":"Remove or manage your two-factor authentication.",
|
||||
"account_dash_next_level":"Progress to next level.",
|
||||
"account_dash_level":"Level %d",
|
||||
"account_dash_security_notice":"Security",
|
||||
"account_avatar_select":"Select",
|
||||
"account_avatar_update_button":"Upload",
|
||||
|
|
|
@ -389,7 +389,12 @@ func AccountEdit(w http.ResponseWriter, r *http.Request, user common.User) commo
|
|||
mfaSetup = true
|
||||
}
|
||||
|
||||
pi := common.AccountDashPage{header, mfaSetup}
|
||||
// Normalise the score so that the user sees their relative progress to the next level rather than showing them their total score
|
||||
prevScore := common.GetLevelScore(user.Level)
|
||||
currentScore := user.Score - prevScore
|
||||
nextScore := common.GetLevelScore(user.Level+1) - prevScore
|
||||
|
||||
pi := common.AccountDashPage{header, mfaSetup, currentScore, nextScore, user.Level + 1}
|
||||
if common.RunPreRenderHook("pre_render_account_own_edit", w, r, &user, &pi) {
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -116,7 +116,12 @@ func ViewProfile(w http.ResponseWriter, r *http.Request, user common.User) commo
|
|||
return common.InternalError(err, w, r)
|
||||
}
|
||||
|
||||
ppage := common.ProfilePage{header, replyList, *puser}
|
||||
// Normalise the score so that the user sees their relative progress to the next level rather than showing them their total score
|
||||
prevScore := common.GetLevelScore(puser.Level)
|
||||
currentScore := puser.Score - prevScore
|
||||
nextScore := common.GetLevelScore(puser.Level+1) - prevScore
|
||||
|
||||
ppage := common.ProfilePage{header, replyList, *puser, currentScore, nextScore}
|
||||
if common.RunPreRenderHook("pre_render_profile", w, r, &user, &ppage) {
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
</div>
|
||||
<div id="dash_right" class="coldyn_item">
|
||||
<div class="rowitem">{{if not .MFASetup}}<a href="/user/edit/mfa/setup/">{{lang "account_dash_2fa_setup"}}</a>{{else}}<a href="/user/edit/mfa/">{{lang "account_dash_2fa_manage"}}</a>{{end}} <span class="dash_security">{{lang "account_dash_security_notice"}}</span></div>
|
||||
<div class="rowitem">{{lang "account_dash_next_level"}} <span class="account_soon">{{lang "account_coming_soon"}}</span></div>
|
||||
<div class="rowitem">Level {{.CurrentUser.Level}}: [{{.CurrentScore}} / {{.NextScore}}] <span class="account_soon">{{lang "account_coming_soon"}}</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
|
|
@ -13,6 +13,9 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="passiveBlock">
|
||||
<div class="rowitem passive">
|
||||
<a class="profile_menu_item">Level {{.ProfileOwner.Level}}: [{{.CurrentScore}} / {{.NextScore}}]</a>
|
||||
</div>
|
||||
{{if not .CurrentUser.Loggedin}}<div class="rowitem passive">
|
||||
<a class="profile_menu_item">{{lang "profile_login_for_options"}}</a>
|
||||
</div>{{else}}
|
||||
|
|
Loading…
Reference in New Issue