diff --git a/app/mitsuha/followers.go b/app/mitsuha/followers.go index af8a846..dcb217f 100644 --- a/app/mitsuha/followers.go +++ b/app/mitsuha/followers.go @@ -3,6 +3,7 @@ package mitsuha import ( "database/sql" "strconv" + "github.com/RealistikOsu/RealistikAPI/common" ) @@ -28,49 +29,43 @@ type friendsGETResponse struct { type subsCountGetResponse struct { common.ResponseBase - SubsCount string `json:"subscount"` + SubsCount string `json:"subscount"` + AllFriended string `json:"allFriended"` } +const MyFriendsQuery = ` + SELECT + users.id, users.username, users.register_datetime, + users.privileges, users.latest_activity, + users_stats.username_aka, + users_stats.country + FROM + users_relationships + LEFT JOIN + users + ON + users_relationships.user1 = users.id + LEFT JOIN + users_stats + ON + users_relationships.user1=users_stats.id + WHERE + users_relationships.user2=? + AND + NOT EXISTS + (SELECT * FROM users_relationships WHERE users_relationships.user1=? AND users_relationships.user2=users.id) + ` + func FollowersGET(md common.MethodData) common.CodeMessager { - var HasDonor bool - HasDonor = md.User.UserPrivileges&common.UserPrivilegeDonor > 0 - if !HasDonor { - return common.SimpleResponse(400, "non-donor") - } var myFrienders []int - myFriendersRaw, err := md.DB.Query("SELECT user1 FROM users_relationships WHERE user2 = ?", md.ID()) + err := md.DB.Get(myFrienders, "SELECT user1 FROM users_relationships WHERE user2 = ?", md.ID()) if err != nil { md.Err(err) return common.SimpleResponse(500, "An error occurred. Trying again may work. If it doesn't, yell at this Mitsuha instance admin and tell them to fix the API.") } - defer myFriendersRaw.Close() - for myFriendersRaw.Next() { - var i int - err := myFriendersRaw.Scan(&i) - if err != nil { - md.Err(err) - continue - } - myFrienders = append(myFrienders, i) - } - if err := myFriendersRaw.Err(); err != nil { - md.Err(err) - } - - myFriendsQuery := ` -SELECT - users.id, users.username, users.register_datetime, users.privileges, users.latest_activity, - users_stats.username_aka, - users_stats.country -FROM users_relationships -LEFT JOIN users -ON users_relationships.user1 = users.id -LEFT JOIN users_stats -ON users_relationships.user1=users_stats.id -WHERE users_relationships.user2=? AND NOT EXISTS (SELECT * FROM users_relationships WHERE users_relationships.user1=? AND users_relationships.user2=users.id) -` + myFriendsQuery := MyFriendsQuery myFriendsQuery += common.Sort(md, common.SortConfiguration{ Allowed: []string{ "id", @@ -108,41 +103,54 @@ WHERE users_relationships.user2=? AND NOT EXISTS (SELECT * FROM users_relationsh return r } +const myFriendsCount = ` + SELECT + COUNT(users.id) + FROM + users_relationships + INNER JOIN + users + ON + users_relationships.user1 = users.id + WHERE + users_relationships.user2=? + AND + NOT EXISTS + (SELECT * FROM users_relationships WHERE users_relationships.user1=? AND users_relationships.user2=users.id) +` + +const allFriendedCount = ` + SELECT + COUNT(user1) + FROM + users_relationships + WHERE + user2 = ? +` + func FollowersGetResponse(md common.MethodData) common.CodeMessager { userid, err := strconv.Atoi(md.Query("userid")) if err != nil { return common.SimpleResponse(500, "An error occurred. Trying again may work. If it doesn't, yell at this Mitsuha instance admin and tell them to fix the API.") } - myFriendsQuery := ` -SELECT - users.id, users.username, users.register_datetime, users.privileges, users.latest_activity, - users_stats.username_aka, - users_stats.country -FROM users_relationships -LEFT JOIN users -ON users_relationships.user1 = users.id -LEFT JOIN users_stats -ON users_relationships.user1=users_stats.id -WHERE users_relationships.user2=? AND NOT EXISTS (SELECT * FROM users_relationships WHERE users_relationships.user1=? AND users_relationships.user2=users.id)` - r := subsCountGetResponse{} - results, err := md.DB.Query(myFriendsQuery, userid, userid) + var userIds int + err = md.DB.Get(&userIds, myFriendsCount, userid, userid) if err != nil { md.Err(err) return common.SimpleResponse(500, "An error occurred. Trying again may work. If it doesn't, yell at this Mitsuha instance admin and tell them to fix the API.") } - var count int = 0 - defer results.Close() - for results.Next() { - count+=1 - } - - if err := results.Err(); err != nil { + var allFriended int + err = md.DB.Get(&allFriended, allFriendedCount, userid) + if err != nil { md.Err(err) + return common.SimpleResponse(500, "An error occurred. Trying again may work. If it doesn't, yell at this Mitsuha instance admin and tell them to fix the API.") } - r.SubsCount = strconv.Itoa(count) + + r.SubsCount = strconv.Itoa(userIds) + r.AllFriended = strconv.Itoa(allFriended) r.Code = 200 return r } diff --git a/app/v1/clan.go b/app/v1/clan.go index dafc729..ee5ae38 100644 --- a/app/v1/clan.go +++ b/app/v1/clan.go @@ -3,8 +3,9 @@ package v1 import ( "database/sql" "fmt" + "math" "sort" - "strconv" + "github.com/RealistikOsu/RealistikAPI/common" ) @@ -80,12 +81,65 @@ type megaStats struct { Clans []clanLbSingle `json:"clans"` } +const RXClanQuery = `SELECT users.id, users.username, users.register_datetime, users.privileges, +latest_activity, rx_stats.username_aka, + +rx_stats.country, rx_stats.user_color, +rx_stats.ranked_score_std, rx_stats.total_score_std, rx_stats.pp_std, rx_stats.playcount_std, rx_stats.replays_watched_std, rx_stats.total_hits_std, +rx_stats.ranked_score_taiko, rx_stats.total_score_taiko, rx_stats.pp_taiko, rx_stats.playcount_taiko, rx_stats.replays_watched_taiko,rx_stats.total_hits_taiko, +rx_stats.ranked_score_ctb, rx_stats.total_score_ctb, rx_stats.pp_ctb, rx_stats.playcount_ctb, rx_stats.replays_watched_ctb, rx_stats.total_hits_ctb, +rx_stats.ranked_score_mania, rx_stats.total_score_mania, rx_stats.pp_mania, rx_stats.playcount_mania, rx_stats.replays_watched_mania, rx_stats.total_hits_mania + +FROM user_clans uc +INNER JOIN users +ON users.id = uc.user +INNER JOIN rx_stats ON rx_stats.id = uc.user +WHERE clan = ? AND privileges & 1 = 1 +` + +const VNClanQuery = `SELECT users.id, users.username, users.register_datetime, users.privileges, +latest_activity, users_stats.username_aka, + +users_stats.country, users_stats.user_color, +users_stats.ranked_score_std, users_stats.total_score_std, users_stats.pp_std, users_stats.playcount_std, users_stats.replays_watched_std, users_stats.total_hits_std, +users_stats.ranked_score_taiko, users_stats.total_score_taiko, users_stats.pp_taiko, users_stats.playcount_taiko, users_stats.replays_watched_taiko,users_stats.total_hits_taiko, +users_stats.ranked_score_ctb, users_stats.total_score_ctb, users_stats.pp_ctb, users_stats.playcount_ctb, users_stats.replays_watched_ctb, users_stats.total_hits_ctb, +users_stats.ranked_score_mania, users_stats.total_score_mania, users_stats.pp_mania, users_stats.playcount_mania, users_stats.replays_watched_mania, users_stats.total_hits_mania + +FROM user_clans uc +INNER JOIN users +ON users.id = uc.user +INNER JOIN users_stats ON users_stats.id = uc.user +WHERE clan = ? AND privileges & 1 = 1 +` + +const APClanQuery = `SELECT users.id, users.username, users.register_datetime, users.privileges, +latest_activity, ap_stats.username_aka, + +ap_stats.country, ap_stats.user_color, +ap_stats.ranked_score_std, ap_stats.total_score_std, ap_stats.pp_std, ap_stats.playcount_std, ap_stats.replays_watched_std, ap_stats.total_hits_std, +ap_stats.ranked_score_taiko, ap_stats.total_score_taiko, ap_stats.pp_taiko, ap_stats.playcount_taiko, ap_stats.replays_watched_taiko,ap_stats.total_hits_taiko, +ap_stats.ranked_score_ctb, ap_stats.total_score_ctb, ap_stats.pp_ctb, ap_stats.playcount_ctb, ap_stats.replays_watched_ctb, ap_stats.total_hits_ctb, +ap_stats.ranked_score_mania, ap_stats.total_score_mania, ap_stats.pp_mania, ap_stats.playcount_mania, ap_stats.replays_watched_mania, ap_stats.total_hits_mania + +FROM user_clans uc +INNER JOIN users +ON users.id = uc.user +INNER JOIN ap_stats ON ap_stats.id = uc.user +WHERE clan = ? AND privileges & 1 = 1 +` + func AllClanStatsGET(md common.MethodData) common.CodeMessager { var ( r megaStats rows *sql.Rows err error ) + p := common.Int(md.Query("p")) - 1 + if p < 0 { + p = 0 + } + l := common.InString(1, md.Query("l"), 500, 50) rows, err = md.DB.Query("SELECT id, name, description, tag, icon FROM clans") if err != nil { @@ -96,8 +150,6 @@ func AllClanStatsGET(md common.MethodData) common.CodeMessager { for rows.Next() { nc := clanLbSingle{} err = rows.Scan(&nc.ID, &nc.Name, &nc.Description, &nc.Tag, &nc.Icon) - fmt.Println(rows) - fmt.Println(&nc.Tag) if err != nil { md.Err(err) } @@ -108,46 +160,34 @@ func AllClanStatsGET(md common.MethodData) common.CodeMessager { md.Err(err) } r.ResponseBase.Code = 200 - // anyone who ever looks into this, yes, i need to kill myself. ~Flame - // yeah.. yeah.. i see flame ~Hazuki-san - m, brr := strconv.ParseInt(string(md.Query("m")[19]), 10, 64) - if brr != nil { - fmt.Println(brr) - m = 0 - } + mode := common.Int(md.Query("m")) + rx := common.Int(md.Query("rx")) + n := "std" - if m == 1 { + if mode == 1 { n = "taiko" - } else if m == 2 { + } else if mode == 2 { n = "ctb" - } else if m == 3 { + } else if mode == 3 { n = "mania" } else { n = "std" } - fmt.Println(n) + + selectedQuery := VNClanQuery + if rx == 1 { + selectedQuery = RXClanQuery + } else if rx == 2 { + selectedQuery = APClanQuery + } for i := 0; i < len(r.Clans); i++ { var members clanMembersData rid := r.Clans[i].ID - err := md.DB.Select(&members.Members, `SELECT users.id, users.username, users.register_datetime, users.privileges, - latest_activity, rx_stats.username_aka, - - rx_stats.country, rx_stats.user_color, - rx_stats.ranked_score_std, rx_stats.total_score_std, rx_stats.pp_std, rx_stats.playcount_std, rx_stats.replays_watched_std, rx_stats.total_hits_std, - rx_stats.ranked_score_taiko, rx_stats.total_score_taiko, rx_stats.pp_taiko, rx_stats.playcount_taiko, rx_stats.replays_watched_taiko,rx_stats.total_hits_taiko, - rx_stats.ranked_score_ctb, rx_stats.total_score_ctb, rx_stats.pp_ctb, rx_stats.playcount_ctb, rx_stats.replays_watched_ctb, rx_stats.total_hits_ctb, - rx_stats.ranked_score_mania, rx_stats.total_score_mania, rx_stats.pp_mania, rx_stats.playcount_mania, rx_stats.replays_watched_mania, rx_stats.total_hits_mania - - FROM user_clans uc - INNER JOIN users - ON users.id = uc.user - INNER JOIN rx_stats ON rx_stats.id = uc.user - WHERE clan = ? AND privileges & 1 = 1 - `, rid) + err := md.DB.Select(&members.Members, selectedQuery, rid) if err != nil { fmt.Println(err) @@ -156,33 +196,74 @@ func AllClanStatsGET(md common.MethodData) common.CodeMessager { members.Code = 200 if n == "std" { - for u := 0; u < len(members.Members); u++ { - r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpStd - r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreStd - r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreStd - r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountStd + sort.Slice(members.Members, func(i, j int) bool { + return members.Members[i].PpStd > members.Members[j].PpStd + }) + + for idx, u := range members.Members { + r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + (u.PpStd * int(math.Pow(0.95, float64(idx)))) //r.Clans[i].ChosenMode.PP + members.Members[u].PpStd + r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + u.RankedScoreStd + r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + u.TotalScoreStd + r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + u.PlaycountStd } + // for u := 0; u < len(members.Members); u++ { + + // r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpStd + // r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreStd + // r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreStd + // r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountStd + // } } else if n == "taiko" { - for u := 0; u < len(members.Members); u++ { - r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpTaiko - r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreTaiko - r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreTaiko - r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountTaiko + sort.Slice(members.Members, func(i, j int) bool { + return members.Members[i].PpTaiko > members.Members[j].PpTaiko + }) + + for idx, u := range members.Members { + r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + (u.PpTaiko * int(math.Pow(0.95, float64(idx)))) //r.Clans[i].ChosenMode.PP + members.Members[u].PpStd + r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + u.RankedScoreTaiko + r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + u.TotalScoreTaiko + r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + u.PlaycountTaiko } + // for u := 0; u < len(members.Members); u++ { + // r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpTaiko + // r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreTaiko + // r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreTaiko + // r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountTaiko + // } } else if n == "ctb" { - for u := 0; u < len(members.Members); u++ { - r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpCtb - r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreCtb - r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreCtb - r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountCtb + sort.Slice(members.Members, func(i, j int) bool { + return members.Members[i].PpCtb > members.Members[j].PpCtb + }) + + for idx, u := range members.Members { + r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + (u.PpCtb * int(math.Pow(0.95, float64(idx)))) //r.Clans[i].ChosenMode.PP + members.Members[u].PpStd + r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + u.RankedScoreCtb + r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + u.TotalScoreCtb + r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + u.PlaycountCtb } + // for u := 0; u < len(members.Members); u++ { + // r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpCtb + // r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreCtb + // r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreCtb + // r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountCtb + // } } else if n == "mania" { - for u := 0; u < len(members.Members); u++ { - r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpMania - r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreMania - r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreMania - r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountMania + sort.Slice(members.Members, func(i, j int) bool { + return members.Members[i].PpMania > members.Members[j].PpMania + }) + + for idx, u := range members.Members { + r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + (u.PpStd * int(math.Pow(0.95, float64(idx)))) //r.Clans[i].ChosenMode.PP + members.Members[u].PpStd + r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + u.RankedScoreMania + r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + u.TotalScoreMania + r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + u.PlaycountMania } + // for u := 0; u < len(members.Members); u++ { + // r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpMania + // r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreMania + // r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreMania + // r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountMania + // } } //r.Clans[i].ChosenMode.PP = (r.Clans[i].ChosenMode.PP / (len(members.Members) + 1)) } @@ -192,9 +273,10 @@ func AllClanStatsGET(md common.MethodData) common.CodeMessager { }) for i := 0; i < len(r.Clans); i++ { - r.Clans[i].Rank = i + 1 + r.Clans[i].Rank = (p * l) + i + 1 } + r.Clans = r.Clans[p*l : l] return r } @@ -229,11 +311,9 @@ func TotalClanStatsGET(md common.MethodData) common.CodeMessager { if id == 0 { return ErrMissingField("id") } - //Uh... well... ;-; - m, brr := strconv.ParseInt(string(md.Query("m")[11]), 10, 64) - if brr != nil { - fmt.Println(brr) - } + + m := common.Int(md.Query("m")) + rx := common.Int(md.Query("rx")) n := "std" if m == 1 { @@ -245,28 +325,20 @@ func TotalClanStatsGET(md common.MethodData) common.CodeMessager { } else { n = "std" } - fmt.Println(n) + + selectedQuery := VNClanQuery + if rx == 1 { + selectedQuery = RXClanQuery + } else if rx == 2 { + selectedQuery = APClanQuery + } for i := 0; i < len(r.Clans); i++ { var members clanMembersData rid := r.Clans[i].ID - err := md.DB.Select(&members.Members, `SELECT users.id, users.username, users.register_datetime, users.privileges, - latest_activity, rx_stats.username_aka, - - rx_stats.country, rx_stats.user_color, - rx_stats.ranked_score_std, rx_stats.total_score_std, rx_stats.pp_std, rx_stats.playcount_std, rx_stats.replays_watched_std, rx_stats.total_hits_std, - rx_stats.ranked_score_taiko, rx_stats.total_score_taiko, rx_stats.pp_taiko, rx_stats.playcount_taiko, rx_stats.replays_watched_taiko, rx_stats.total_hits_taiko, - rx_stats.ranked_score_ctb, rx_stats.total_score_ctb, rx_stats.pp_ctb, rx_stats.playcount_ctb, rx_stats.replays_watched_ctb, rx_stats.total_hits_ctb, - rx_stats.ranked_score_mania, rx_stats.total_score_mania, rx_stats.pp_mania, rx_stats.playcount_mania, rx_stats.replays_watched_mania, rx_stats.total_hits_mania - - FROM user_clans uc - INNER JOIN users - ON users.id = uc.user - INNER JOIN rx_stats ON rx_stats.id = uc.user - WHERE clan = ? AND privileges & 1 = 1 - `, rid) + err := md.DB.Select(&members.Members, selectedQuery, rid) if err != nil { fmt.Println(err) @@ -275,41 +347,74 @@ func TotalClanStatsGET(md common.MethodData) common.CodeMessager { members.Code = 200 if n == "std" { - for u := 0; u < len(members.Members); u++ { - r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpStd - r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreStd - r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreStd - r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountStd - r.Clans[i].ChosenMode.ReplaysWatched = r.Clans[i].ChosenMode.ReplaysWatched + members.Members[u].ReplaysWatchedStd - r.Clans[i].ChosenMode.TotalHits = r.Clans[i].ChosenMode.TotalHits + members.Members[u].TotalHitsStd + sort.Slice(members.Members, func(i, j int) bool { + return members.Members[i].PpStd > members.Members[j].PpStd + }) + + for idx, u := range members.Members { + r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + (u.PpStd * int(math.Pow(0.95, float64(idx)))) //r.Clans[i].ChosenMode.PP + members.Members[u].PpStd + r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + u.RankedScoreStd + r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + u.TotalScoreStd + r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + u.PlaycountStd } + // for u := 0; u < len(members.Members); u++ { + + // r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpStd + // r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreStd + // r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreStd + // r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountStd + // } } else if n == "taiko" { - for u := 0; u < len(members.Members); u++ { - r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpTaiko - r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreTaiko - r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreTaiko - r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountTaiko - r.Clans[i].ChosenMode.ReplaysWatched = r.Clans[i].ChosenMode.ReplaysWatched + members.Members[u].ReplaysWatchedTaiko - r.Clans[i].ChosenMode.TotalHits = r.Clans[i].ChosenMode.TotalHits + members.Members[u].TotalHitsTaiko + sort.Slice(members.Members, func(i, j int) bool { + return members.Members[i].PpTaiko > members.Members[j].PpTaiko + }) + + for idx, u := range members.Members { + r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + (u.PpTaiko * int(math.Pow(0.95, float64(idx)))) //r.Clans[i].ChosenMode.PP + members.Members[u].PpStd + r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + u.RankedScoreTaiko + r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + u.TotalScoreTaiko + r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + u.PlaycountTaiko } + // for u := 0; u < len(members.Members); u++ { + // r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpTaiko + // r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreTaiko + // r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreTaiko + // r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountTaiko + // } } else if n == "ctb" { - for u := 0; u < len(members.Members); u++ { - r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpCtb - r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreCtb - r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreCtb - r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountCtb - r.Clans[i].ChosenMode.ReplaysWatched = r.Clans[i].ChosenMode.ReplaysWatched + members.Members[u].ReplaysWatchedCtb - r.Clans[i].ChosenMode.TotalHits = r.Clans[i].ChosenMode.TotalHits + members.Members[u].TotalHitsStd + sort.Slice(members.Members, func(i, j int) bool { + return members.Members[i].PpCtb > members.Members[j].PpCtb + }) + + for idx, u := range members.Members { + r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + (u.PpCtb * int(math.Pow(0.95, float64(idx)))) //r.Clans[i].ChosenMode.PP + members.Members[u].PpStd + r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + u.RankedScoreCtb + r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + u.TotalScoreCtb + r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + u.PlaycountCtb } + // for u := 0; u < len(members.Members); u++ { + // r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpCtb + // r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreCtb + // r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreCtb + // r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountCtb + // } } else if n == "mania" { - for u := 0; u < len(members.Members); u++ { - r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpMania - r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreMania - r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreMania - r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountMania - r.Clans[i].ChosenMode.ReplaysWatched = r.Clans[i].ChosenMode.ReplaysWatched + members.Members[u].ReplaysWatchedMania - r.Clans[i].ChosenMode.TotalHits = r.Clans[i].ChosenMode.TotalHits + members.Members[u].TotalHitsMania + sort.Slice(members.Members, func(i, j int) bool { + return members.Members[i].PpMania > members.Members[j].PpMania + }) + + for idx, u := range members.Members { + r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + (u.PpStd * int(math.Pow(0.95, float64(idx)))) //r.Clans[i].ChosenMode.PP + members.Members[u].PpStd + r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + u.RankedScoreMania + r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + u.TotalScoreMania + r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + u.PlaycountMania } + // for u := 0; u < len(members.Members); u++ { + // r.Clans[i].ChosenMode.PP = r.Clans[i].ChosenMode.PP + members.Members[u].PpMania + // r.Clans[i].ChosenMode.RankedScore = r.Clans[i].ChosenMode.RankedScore + members.Members[u].RankedScoreMania + // r.Clans[i].ChosenMode.TotalScore = r.Clans[i].ChosenMode.TotalScore + members.Members[u].TotalScoreMania + // r.Clans[i].ChosenMode.PlayCount = r.Clans[i].ChosenMode.PlayCount + members.Members[u].PlaycountMania + // } } //r.Clans[i].ChosenMode.PP = (r.Clans[i].ChosenMode.PP / (len(members.Members) + 1)) } @@ -386,8 +491,8 @@ type imFoolish struct { Invite string `json:"invite"` } type adminClan struct { - Id int `json:"user"` - Perms int `json:"perms"` + Id int `json:"user"` + Perms int `json:"perms"` } func ClanInviteGET(md common.MethodData) common.CodeMessager { @@ -420,18 +525,18 @@ func ClanMembersGET(md common.MethodData) common.CodeMessager { var members clanMembersData err := md.DB.Select(&members.Members, `SELECT users.id, users.username, users.register_datetime, users.privileges, - latest_activity, rx_stats.username_aka, - - rx_stats.country, rx_stats.user_color, - rx_stats.ranked_score_std, rx_stats.total_score_std, rx_stats.pp_std, rx_stats.playcount_std, rx_stats.replays_watched_std, rx_stats.total_hits_std, - rx_stats.ranked_score_taiko, rx_stats.total_score_taiko, rx_stats.pp_taiko, rx_stats.playcount_taiko, rx_stats.replays_watched_taiko, rx_stats.total_hits_taiko - -FROM user_clans uc -INNER JOIN users -ON users.id = uc.user -INNER JOIN rx_stats ON rx_stats.id = uc.user -WHERE clan = ? -ORDER BY id ASC `, i) + latest_activity, users_stats.username_aka, + + users_stats.country, users_stats.user_color, + users_stats.ranked_score_std, users_stats.total_score_std, users_stats.pp_std, users_stats.playcount_std, users_stats.replays_watched_std, users_stats.total_hits_std, + users_stats.ranked_score_taiko, users_stats.total_score_taiko, users_stats.pp_taiko, users_stats.playcount_taiko, users_stats.replays_watched_taiko, users_stats.total_hits_taiko + + FROM user_clans uc + INNER JOIN users + ON users.id = uc.user + INNER JOIN users_stats ON users_stats.id = uc.user + WHERE clan = ? + ORDER BY id ASC `, i) if err != nil { md.Err(err) @@ -444,18 +549,18 @@ ORDER BY id ASC `, i) var members clanMembersData err := md.DB.Select(&members.Members, `SELECT users.id, users.username, users.register_datetime, users.privileges, - latest_activity, rx_stats.username_aka, - - rx_stats.country, rx_stats.user_color, - rx_stats.ranked_score_std, rx_stats.total_score_std, rx_stats.pp_std, rx_stats.playcount_std, rx_stats.replays_watched_std, - rx_stats.ranked_score_taiko, rx_stats.total_score_taiko, rx_stats.pp_taiko, rx_stats.playcount_taiko, rx_stats.replays_watched_taiko - -FROM user_clans uc -INNER JOIN users -ON users.id = uc.user -INNER JOIN rx_stats ON rx_stats.id = uc.user -WHERE clan = ? AND perms = ? -ORDER BY id ASC `, i, r) + latest_activity, users_stats.username_aka, + + users_stats.country, users_stats.user_color, + users_stats.ranked_score_std, users_stats.total_score_std, users_stats.pp_std, users_stats.playcount_std, users_stats.replays_watched_std, + users_stats.ranked_score_taiko, users_stats.total_score_taiko, users_stats.pp_taiko, users_stats.playcount_taiko, users_stats.replays_watched_taiko + + FROM user_clans uc + INNER JOIN users + ON users.id = uc.user + INNER JOIN users_stats ON users_stats.id = uc.user + WHERE clan = ? AND perms = ? + ORDER BY id ASC `, i, r) if err != nil { md.Err(err) diff --git a/app/v1/leaderboard.go b/app/v1/leaderboard.go index d49b2e6..ff71d97 100644 --- a/app/v1/leaderboard.go +++ b/app/v1/leaderboard.go @@ -9,8 +9,8 @@ import ( redis "gopkg.in/redis.v5" - "zxq.co/ripple/ocl" "github.com/RealistikOsu/RealistikAPI/common" + "zxq.co/ripple/ocl" ) type leaderboardUser struct { @@ -141,7 +141,7 @@ func LeaderboardGET(md common.MethodData) common.CodeMessager { key = "ripple:leaderboard_ap:" + m } if country != "" { - key += ":" + country + key += ":" + strings.ToLower(country) } if sorted == "" { sorted = "pp" diff --git a/app/v1/user_achievements.go b/app/v1/user_achievements.go index a9a1614..016db02 100644 --- a/app/v1/user_achievements.go +++ b/app/v1/user_achievements.go @@ -5,16 +5,16 @@ import ( "fmt" "time" - "github.com/jmoiron/sqlx" "github.com/RealistikOsu/RealistikAPI/common" + "github.com/jmoiron/sqlx" ) // Achievement represents an achievement in the database. type Achievement struct { - ID int `json:"id"` - Name string `json:"name"` - Description string `json:"description"` - Icon string `json:"icon"` + ID int `json:"id"` + Name string `json:"name"` + Desc string `json:"desc"` + File string `json:"file"` } // LoadAchievementsEvery reloads the achievements in the database every given @@ -23,7 +23,7 @@ func LoadAchievementsEvery(db *sqlx.DB, d time.Duration) { for { achievs = nil err := db.Select(&achievs, - "SELECT id, name, description, icon FROM achievements ORDER BY id ASC") + "SELECT `id`, `name`, `desc`, `file` FROM `new_achievements` ORDER BY `id` ASC") if err != nil { fmt.Println("LoadAchievements error", err) common.GenericError(err) @@ -36,7 +36,8 @@ var achievs []Achievement type userAchievement struct { Achievement - Achieved bool `json:"achieved"` + Achived bool `json:"achived"` + Info AchievementUser `json:"info"` } type userAchievementsResponse struct { @@ -44,17 +45,21 @@ type userAchievementsResponse struct { Achievements []userAchievement `json:"achievements"` } +type AchievementUser struct { + ID int `json:"id"` + Time int `json:"time"` +} + // UserAchievementsGET handles requests for retrieving the achievements of a // given user. func UserAchievementsGET(md common.MethodData) common.CodeMessager { - shouldRet, whereClause, param := whereClauseUser(md, "users") + shouldRet, _, _ := whereClauseUser(md, "users") if shouldRet != nil { return *shouldRet } - var ids []int - err := md.DB.Select(&ids, `SELECT ua.achievement_id FROM users_achievements ua -INNER JOIN users ON users.id = ua.user_id -WHERE `+whereClause+` ORDER BY ua.achievement_id ASC`, param) + + var users_achi []AchievementUser + err := md.DB.Select(&users_achi, "SELECT achievement_id AS id, time FROM users_achievements WHERE user_id = ? ORDER by achievement_id ASC", md.Query("id")) switch { case err == sql.ErrNoRows: return common.SimpleResponse(404, "No such user!") @@ -62,23 +67,65 @@ WHERE `+whereClause+` ORDER BY ua.achievement_id ASC`, param) md.Err(err) return Err500 } - all := md.HasQuery("all") + + var achi_ids2 []int + for _, achi := range users_achi { + achi_ids2 = append(achi_ids2, achi.ID) + } + resp := userAchievementsResponse{Achievements: make([]userAchievement, 0, len(achievs))} - for _, ach := range achievs { - achieved := inInt(ach.ID, ids) - if all || achieved { - resp.Achievements = append(resp.Achievements, userAchievement{ach, achieved}) - } + for _, achi := range achievs { + // for _, achi2 := range users_achi { + // // if inInt(achi.ID, achi2) { + // // resp.Achievements = append(resp.Achievements, userAchievement{achi, achi2}) + // // } else { + // // resp.Achievements = append(resp.Achievements, userAchievement{achi, AchievementUser{achi.ID, 0}}) + // // } + + // } + achived, curr_achi := inInt(achi.ID, users_achi) + resp.Achievements = append(resp.Achievements, userAchievement{achi, achived, curr_achi}) + // if achived { + // resp.Achievements = append(resp.Achievements, userAchievement{achi, curr_achi}) + // } else { + // resp.Achievements = append(resp.Achievements, userAchievement{achi, AchievementUser{achi.ID, 0}}) + // } + // if inInt(achi.ID, users_achi) { + // for _, in achi + // } } + resp.Code = 200 return resp + + // var ids []int + // err := md.DB.Select(&ids, `SELECT ua.achievement_id FROM users_achievements ua + // INNER JOIN users ON users.id = ua.user_id + // WHERE `+whereClause+` ORDER BY ua.achievement_id ASC`, param) + // switch { + // case err == sql.ErrNoRows: + // return common.SimpleResponse(404, "No such user!") + // case err != nil: + // md.Err(err) + // return Err500 + // } + // all := md.HasQuery("all") + // resp := userAchievementsResponse{Achievements: make([]userAchievement, 0, len(achievs))} + // for _, ach := range achievs { + // achieved := inInt(ach.ID, ids) + // if all || achieved { + // resp.Achievements = append(resp.Achievements, userAchievement{ach, achieved}) + // } + // } + // resp.Code = 200 + // return resp } -func inInt(i int, js []int) bool { +func inInt(i int, js []AchievementUser) (bool, AchievementUser) { for _, j := range js { - if i == j { - return true + if i == j.ID { + return true, j } } - return false + return false, AchievementUser{i, 0} } diff --git a/app/v1/user_most_played.go b/app/v1/user_most_played.go index e126c8d..fdc9d33 100644 --- a/app/v1/user_most_played.go +++ b/app/v1/user_most_played.go @@ -5,13 +5,13 @@ import ( ) type mostPlayedBeatmap struct { - Beatmap beatmap `json:"beatmap"` - PlayCount int `json:"playcount"` + Beatmap beatmap `json:"beatmap"` + PlayCount int `json:"playcount"` } type mostPlayedBeatmapResponse struct { common.ResponseBase - Total string `json:"total"` + Total string `json:"total"` Beatmaps []mostPlayedBeatmap `json:"beatmaps"` } @@ -54,6 +54,7 @@ WHERE ` + whereClause + ` ORDER BY users_beatmap_playcount.playcount DESC ` + } r.Beatmaps = append(r.Beatmaps, mpb) } + //r.Total = strconv.Itoa(len(r.Beatmaps)) r.Code = 200 return r } diff --git a/app/v1/user_scores.go b/app/v1/user_scores.go index aeacfdb..abb8054 100644 --- a/app/v1/user_scores.go +++ b/app/v1/user_scores.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" - "gopkg.in/thehowl/go-osuapi.v1" "github.com/RealistikOsu/RealistikAPI/common" + "gopkg.in/thehowl/go-osuapi.v1" "zxq.co/x/getrank" ) @@ -16,6 +16,7 @@ type userScore struct { type userScoresResponse struct { common.ResponseBase + //Total string `json:"total"` Scores []userScore `json:"scores"` } @@ -82,7 +83,7 @@ func UserScoresBestGET(md common.MethodData) common.CodeMessager { if cm != nil { return *cm } - + mc := genModeClause(md) // For all modes that have PP, we leave out 0 PP scores. @@ -98,7 +99,7 @@ func UserScoresBestGET(md common.MethodData) common.CodeMessager { ORDER BY scores_relax.pp DESC, scores_relax.score DESC %s`, wc, mc, common.Paginate(md.Query("p"), md.Query("l"), 100), ), param) - } + } if common.Int(md.Query("rx")) == 2 { mc = strings.Replace(mc, "scores.", "scores_ap.", 1) return autoPuts(md, fmt.Sprintf( @@ -131,36 +132,45 @@ func UserScoresRecentGET(md common.MethodData) common.CodeMessager { if cm != nil { return *cm } + recentClause := "" + if md.Query("filter") == "recent" { + recentClause = " AND scores.completed > 1 " + } mc := genModeClause(md) if common.Int(md.Query("rx")) == 1 { mc = strings.Replace(mc, "scores.", "scores_relax.", 1) + recentClause = strings.Replace(recentClause, "scores.", "scores_relax.", 1) return relaxPuts(md, fmt.Sprintf( `WHERE + %s %s %s AND `+md.User.OnlyUserPublic(true)+` ORDER BY scores_relax.id DESC %s`, - wc, mc, common.Paginate(md.Query("p"), md.Query("l"), 100), + wc, mc, recentClause, common.Paginate(md.Query("p"), md.Query("l"), 100), ), param) } if common.Int(md.Query("rx")) == 2 { mc = strings.Replace(mc, "scores.", "scores_ap.", 1) + recentClause = strings.Replace(recentClause, "scores.", "scores_ap.", 1) return autoPuts(md, fmt.Sprintf( `WHERE + %s %s %s AND `+md.User.OnlyUserPublic(true)+` ORDER BY scores_ap.id DESC %s`, - wc, mc, common.Paginate(md.Query("p"), md.Query("l"), 100), + wc, mc, recentClause, common.Paginate(md.Query("p"), md.Query("l"), 100), ), param) } else { return scoresPuts(md, fmt.Sprintf( `WHERE + %s %s %s AND `+md.User.OnlyUserPublic(true)+` ORDER BY scores.id DESC %s`, - wc, genModeClause(md), common.Paginate(md.Query("p"), md.Query("l"), 100), + wc, genModeClause(md), recentClause, common.Paginate(md.Query("p"), md.Query("l"), 100), ), param) } } @@ -209,8 +219,10 @@ func scoresPuts(md common.MethodData, whereClause string, params ...interface{}) scores = append(scores, us) } r := userScoresResponse{} + //md.DB.Get(&r.Total, "SELECT COUNT(*) FROM scores WHERE ") r.Code = 200 r.Scores = scores + //r.Total = strconv.Itoa(len(r.Scores)) return r } @@ -260,6 +272,7 @@ func relaxPuts(md common.MethodData, whereClause string, params ...interface{}) r := userScoresResponse{} r.Code = 200 r.Scores = scores + //r.Total = strconv.Itoa(len(r.Scores)) return r } @@ -309,5 +322,6 @@ func autoPuts(md common.MethodData, whereClause string, params ...interface{}) c r := userScoresResponse{} r.Code = 200 r.Scores = scores + //r.Total = strconv.Itoa(len(r.Scores)) return r } diff --git a/app/v1/users_first.go b/app/v1/users_first.go index 98baee2..0e46eef 100644 --- a/app/v1/users_first.go +++ b/app/v1/users_first.go @@ -2,18 +2,19 @@ package v1 import ( "database/sql" + //"strconv" "strings" - "gopkg.in/thehowl/go-osuapi.v1" "github.com/RealistikOsu/RealistikAPI/common" + "gopkg.in/thehowl/go-osuapi.v1" "zxq.co/x/getrank" ) // Score is a score done. type tuser struct { common.ResponseBase - Total string `json:"total"` - Scores []userScore `json:"scores"` + Total string `json:"total"` + Scores []userScore `json:"scores"` } func UserFirstGET(md common.MethodData) common.CodeMessager { @@ -26,16 +27,16 @@ func UserFirstGET(md common.MethodData) common.CodeMessager { if m != 0 { mode = m } - //the worst queries i ever done and its fact - query := "SELECT scores.id, scores.beatmap_md5, scores.score, scores.max_combo, scores.full_combo, scores.mods, scores.300_count, scores.100_count, scores.50_count, scores.katus_count, scores.gekis_count, scores.misses_count, scores.time, scores.play_mode, scores.accuracy, scores.pp, scores.completed, beatmaps.beatmap_id, beatmaps.beatmapset_id, beatmaps.beatmap_md5, beatmaps.song_name, beatmaps.ar, beatmaps.od, beatmaps.difficulty_std, beatmaps.difficulty_std, beatmaps.difficulty_taiko, beatmaps.difficulty_ctb, beatmaps.difficulty_mania, beatmaps.max_combo, beatmaps.hit_length, beatmaps.ranked, beatmaps.ranked_status_freezed, beatmaps.latest_update FROM first_places, scores, beatmaps WHERE first_places.scoreid = scores.id AND scores.beatmap_md5 = beatmaps.beatmap_md5 AND scores.completed = 3 AND first_places.userid = ? AND scores.play_mode = ? AND first_places.relax = 0 ORDER BY scores.time DESC " - rx := common.Int(md.Query("rx")) - if rx == 1 { - query = "SELECT scores_relax.id, scores_relax.beatmap_md5, scores_relax.score, scores_relax.max_combo, scores_relax.full_combo, scores_relax.mods, scores_relax.300_count, scores_relax.100_count, scores_relax.50_count, scores_relax.katus_count, scores_relax.gekis_count, scores_relax.misses_count, scores_relax.time, scores_relax.play_mode, scores_relax.accuracy, scores_relax.pp, scores_relax.completed, beatmaps.beatmap_id, beatmaps.beatmapset_id, beatmaps.beatmap_md5, beatmaps.song_name, beatmaps.ar, beatmaps.od, beatmaps.difficulty_std, beatmaps.difficulty_std, beatmaps.difficulty_taiko, beatmaps.difficulty_ctb, beatmaps.difficulty_mania, beatmaps.max_combo, beatmaps.hit_length, beatmaps.ranked, beatmaps.ranked_status_freezed, beatmaps.latest_update FROM first_places, scores_relax, beatmaps WHERE first_places.score_id = scores_relax.id AND scores_relax.completed = 3 AND scores_relax.beatmap_md5 = beatmaps.beatmap_md5 AND first_places.user_id = ? AND scores_relax.play_mode = ? AND first_places.relax = 1 ORDER BY scores_relax.time DESC" - } else if rx == 2 { - query = "SELECT scores_ap.id, scores_ap.beatmap_md5, scores_ap.score, scores_ap.max_combo, scores_ap.full_combo, scores_ap.mods, scores_ap.300_count, scores_ap.100_count, scores_ap.50_count, scores_ap.katus_count, scores_ap.gekis_count, scores_ap.misses_count, scores_ap.time, scores_ap.play_mode, scores_ap.accuracy, scores_ap.pp, scores_ap.completed, beatmaps.beatmap_id, beatmaps.beatmapset_id, beatmaps.beatmap_md5, beatmaps.song_name, beatmaps.ar, beatmaps.od, beatmaps.difficulty_std, beatmaps.difficulty_std, beatmaps.difficulty_taiko, beatmaps.difficulty_ctb, beatmaps.difficulty_mania, beatmaps.max_combo, beatmaps.hit_length, beatmaps.ranked, beatmaps.ranked_status_freezed, beatmaps.latest_update FROM first_places, scores_ap, beatmaps WHERE first_places.score_id = scores_ap.id AND scores_ap.completed = 3 AND scores_ap.beatmap_md5 = beatmaps.beatmap_md5 AND first_places.user_id = ? AND scores_ap.play_mode = ? AND first_places.relax = 2 ORDER BY scores_ap.time DESC" - } else { - query = "SELECT scores.id, scores.beatmap_md5, scores.score, scores.max_combo, scores.full_combo, scores.mods, scores.300_count, scores.100_count, scores.50_count, scores.katus_count, scores.gekis_count, scores.misses_count, scores.time, scores.play_mode, scores.accuracy, scores.pp, scores.completed, beatmaps.beatmap_id, beatmaps.beatmapset_id, beatmaps.beatmap_md5, beatmaps.song_name, beatmaps.ar, beatmaps.od, beatmaps.difficulty_std, beatmaps.difficulty_std, beatmaps.difficulty_taiko, beatmaps.difficulty_ctb, beatmaps.difficulty_mania, beatmaps.max_combo, beatmaps.hit_length, beatmaps.ranked, beatmaps.ranked_status_freezed, beatmaps.latest_update FROM first_places, scores, beatmaps WHERE first_places.score_id = scores.id AND scores.beatmap_md5 = beatmaps.beatmap_md5 AND scores.completed = 3 AND first_places.user_id = ? AND scores.play_mode = ? AND first_places.relax = 0 ORDER BY scores.time DESC " -} + //the worst queries i ever done and its fact + query := "SELECT scores.id, scores.beatmap_md5, scores.score, scores.max_combo, scores.full_combo, scores.mods, scores.300_count, scores.100_count, scores.50_count, scores.katus_count, scores.gekis_count, scores.misses_count, scores.time, scores.play_mode, scores.accuracy, scores.pp, scores.completed, beatmaps.beatmap_id, beatmaps.beatmapset_id, beatmaps.beatmap_md5, beatmaps.song_name, beatmaps.ar, beatmaps.od, beatmaps.difficulty_std, beatmaps.difficulty_std, beatmaps.difficulty_taiko, beatmaps.difficulty_ctb, beatmaps.difficulty_mania, beatmaps.max_combo, beatmaps.hit_length, beatmaps.ranked, beatmaps.ranked_status_freezed, beatmaps.latest_update FROM first_places, scores, beatmaps WHERE first_places.scoreid = scores.id AND scores.beatmap_md5 = beatmaps.beatmap_md5 AND scores.completed = 3 AND first_places.user_id = ? AND scores.play_mode = ? AND first_places.relax = 0 ORDER BY scores.time DESC " + rx := common.Int(md.Query("rx")) + if rx == 1 { + query = "SELECT scores_relax.id, scores_relax.beatmap_md5, scores_relax.score, scores_relax.max_combo, scores_relax.full_combo, scores_relax.mods, scores_relax.300_count, scores_relax.100_count, scores_relax.50_count, scores_relax.katus_count, scores_relax.gekis_count, scores_relax.misses_count, scores_relax.time, scores_relax.play_mode, scores_relax.accuracy, scores_relax.pp, scores_relax.completed, beatmaps.beatmap_id, beatmaps.beatmapset_id, beatmaps.beatmap_md5, beatmaps.song_name, beatmaps.ar, beatmaps.od, beatmaps.difficulty_std, beatmaps.difficulty_std, beatmaps.difficulty_taiko, beatmaps.difficulty_ctb, beatmaps.difficulty_mania, beatmaps.max_combo, beatmaps.hit_length, beatmaps.ranked, beatmaps.ranked_status_freezed, beatmaps.latest_update FROM first_places, scores_relax, beatmaps WHERE first_places.score_id = scores_relax.id AND scores_relax.completed = 3 AND scores_relax.beatmap_md5 = beatmaps.beatmap_md5 AND first_places.user_id = ? AND scores_relax.play_mode = ? AND first_places.relax = 1 ORDER BY scores_relax.time DESC" + } else if rx == 2 { + query = "SELECT scores_ap.id, scores_ap.beatmap_md5, scores_ap.score, scores_ap.max_combo, scores_ap.full_combo, scores_ap.mods, scores_ap.300_count, scores_ap.100_count, scores_ap.50_count, scores_ap.katus_count, scores_ap.gekis_count, scores_ap.misses_count, scores_ap.time, scores_ap.play_mode, scores_ap.accuracy, scores_ap.pp, scores_ap.completed, beatmaps.beatmap_id, beatmaps.beatmapset_id, beatmaps.beatmap_md5, beatmaps.song_name, beatmaps.ar, beatmaps.od, beatmaps.difficulty_std, beatmaps.difficulty_std, beatmaps.difficulty_taiko, beatmaps.difficulty_ctb, beatmaps.difficulty_mania, beatmaps.max_combo, beatmaps.hit_length, beatmaps.ranked, beatmaps.ranked_status_freezed, beatmaps.latest_update FROM first_places, scores_ap, beatmaps WHERE first_places.score_id = scores_ap.id AND scores_ap.completed = 3 AND scores_ap.beatmap_md5 = beatmaps.beatmap_md5 AND first_places.user_id = ? AND scores_ap.play_mode = ? AND first_places.relax = 2 ORDER BY scores_ap.time DESC" + } else { + query = "SELECT scores.id, scores.beatmap_md5, scores.score, scores.max_combo, scores.full_combo, scores.mods, scores.300_count, scores.100_count, scores.50_count, scores.katus_count, scores.gekis_count, scores.misses_count, scores.time, scores.play_mode, scores.accuracy, scores.pp, scores.completed, beatmaps.beatmap_id, beatmaps.beatmapset_id, beatmaps.beatmap_md5, beatmaps.song_name, beatmaps.ar, beatmaps.od, beatmaps.difficulty_std, beatmaps.difficulty_std, beatmaps.difficulty_taiko, beatmaps.difficulty_ctb, beatmaps.difficulty_mania, beatmaps.max_combo, beatmaps.hit_length, beatmaps.ranked, beatmaps.ranked_status_freezed, beatmaps.latest_update FROM first_places, scores, beatmaps WHERE first_places.score_id = scores.id AND scores.beatmap_md5 = beatmaps.beatmap_md5 AND scores.completed = 3 AND first_places.user_id = ? AND scores.play_mode = ? AND first_places.relax = 0 ORDER BY scores.time DESC " + } var ( r tuser rows *sql.Rows @@ -43,8 +44,8 @@ func UserFirstGET(md common.MethodData) common.CodeMessager { ) // Fetch all score from users - md.DB.Get(&r.Total, "SELECT COUNT(score_id) FROM first_places WHERE user_id = ? AND mode = ? AND relax = ?", id, mode, rx) - rows, err = md.DB.Query(query + common.Paginate(md.Query("p"), md.Query("l"), 50), id, mode) + md.DB.Get(&r.Total, "SELECT COUNT(*) FROM first_places WHERE user_id = ? AND mode = ? AND relax = ?", id, mode, rx) + rows, err = md.DB.Query(query+common.Paginate(md.Query("p"), md.Query("l"), 50), id, mode) if err != nil { md.Err(err) return Err500 @@ -73,6 +74,7 @@ func UserFirstGET(md common.MethodData) common.CodeMessager { r.Scores = append(r.Scores, nc) } + //r.Total = strconv.Itoa(len(r.Scores)) r.ResponseBase.Code = 200 return r } diff --git a/main.go b/main.go index 44c2390..b1f77e5 100644 --- a/main.go +++ b/main.go @@ -6,11 +6,12 @@ import ( "strings" "syscall" - "zxq.co/ripple/agplwarning" "github.com/RealistikOsu/RealistikAPI/app" "github.com/RealistikOsu/RealistikAPI/beatmapget" "github.com/RealistikOsu/RealistikAPI/common" - "zxq.co/ripple/schiavolib" + "zxq.co/ripple/agplwarning" + schiavo "zxq.co/ripple/schiavolib" + // Golint pls dont break balls _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" @@ -31,7 +32,7 @@ func init() { var db *sqlx.DB func main() { - err := agplwarning.Warn("ripple", "The RealistikOsu API | test") + err := agplwarning.Warn("ripple", "The RealistikOsu API") if err != nil { fmt.Println(err) }