diff --git a/database.go b/database.go index e8cdec9..b949504 100644 --- a/database.go +++ b/database.go @@ -104,6 +104,15 @@ func connectCassandra() { log.Fatal(err) } + if err := cassandraClusterSession.Query(`CREATE TABLE IF NOT EXISTS pretendo_smm.user_play_info ( + pid int PRIMARY KEY, + starred_courses set, + played_courses set + )`).Exec(); err != nil { + fmt.Println("pretendo_smm.user_play_info") + log.Fatal(err) + } + fmt.Println("Connected to Cassandra") } @@ -415,6 +424,13 @@ func incrementCourseAttemptCount(courseID uint64) { } } +func getUserStarredCourses(pid uint32) []*CourseMetadata { + var dataIDs []uint64 + _ = cassandraClusterSession.Query(`SELECT starred_courses FROM pretendo_smm.user_play_info WHERE pid=?`, pid).Scan(&dataIDs) + + return getCourseMetadataByDataIDs(dataIDs) +} + ////////////////////////////// // // // MongoDB database methods // diff --git a/get_buffer_queue.go b/get_buffer_queue.go index 5433537..4b44747 100644 --- a/get_buffer_queue.go +++ b/get_buffer_queue.go @@ -10,11 +10,9 @@ import ( func getBufferQueue(err error, client *nex.Client, callID uint32, param *nexproto.BufferQueueParam) { rmcResponseStream := nex.NewStreamOut(nexServer) - fmt.Printf("%+v\n", param) + // TODO: complete this - // TODO complete this - - pBufferQueue := make([][]byte, 0) + var pBufferQueue [][]byte switch param.Slot { case 0: // unknown diff --git a/get_custom_ranking_by_data_id.go b/get_custom_ranking_by_data_id.go index 46737e2..826242b 100644 --- a/get_custom_ranking_by_data_id.go +++ b/get_custom_ranking_by_data_id.go @@ -13,6 +13,8 @@ func getCustomRankingByDataId(err error, client *nex.Client, callID uint32, para var pResults []uint32 switch param.ApplicationId { + case 0: // Starred courses + pRankingResult, pResults = getCustomRankingByDataIdStarredCourses(client.PID()) case 300000000: // Mii data pRankingResult, pResults = getCustomRankingByDataIdMiiData(param) default: // Normal course data @@ -45,6 +47,106 @@ func getCustomRankingByDataId(err error, client *nex.Client, callID uint32, para nexServer.Send(responsePacket) } +func getCustomRankingByDataIdStarredCourses(pid uint32) ([]*nexproto.DataStoreCustomRankingResult, []uint32) { + courseMetadatas := getUserStarredCourses(pid) + + pRankingResult := make([]*nexproto.DataStoreCustomRankingResult, 0) + pResults := make([]uint32, 0) + + for _, courseMetadata := range courseMetadatas { + rankingResult := nexproto.NewDataStoreCustomRankingResult() + + rankingResult.Order = 0 // unknown + rankingResult.Score = courseMetadata.Stars + rankingResult.MetaInfo = nexproto.NewDataStoreMetaInfo() + rankingResult.MetaInfo.DataID = courseMetadata.DataID + rankingResult.MetaInfo.OwnerID = courseMetadata.OwnerPID + rankingResult.MetaInfo.Size = courseMetadata.Size + rankingResult.MetaInfo.Name = courseMetadata.Name + rankingResult.MetaInfo.DataType = courseMetadata.DataType + rankingResult.MetaInfo.MetaBinary = courseMetadata.MetaBinary + rankingResult.MetaInfo.Permission = nexproto.NewDataStorePermission() + rankingResult.MetaInfo.Permission.Permission = 0 // unknown + rankingResult.MetaInfo.Permission.RecipientIds = []uint32{} + rankingResult.MetaInfo.DelPermission = nexproto.NewDataStorePermission() + rankingResult.MetaInfo.DelPermission.Permission = 3 // unknown + rankingResult.MetaInfo.DelPermission.RecipientIds = []uint32{} + rankingResult.MetaInfo.CreatedTime = courseMetadata.CreatedTime + rankingResult.MetaInfo.UpdatedTime = courseMetadata.UpdatedTime + rankingResult.MetaInfo.Period = courseMetadata.Period + rankingResult.MetaInfo.Status = 0 // unknown + rankingResult.MetaInfo.ReferredCnt = 0 // unknown + rankingResult.MetaInfo.ReferDataID = 0 // unknown + rankingResult.MetaInfo.Flag = courseMetadata.Flag + rankingResult.MetaInfo.ReferredTime = courseMetadata.CreatedTime + rankingResult.MetaInfo.ExpireTime = nex.NewDateTime(671075926016) // December 31st, year 9999 + rankingResult.MetaInfo.Tags = []string{""} // unknown + rankingResult.MetaInfo.Ratings = []*nexproto.DataStoreRatingInfoWithSlot{ + nexproto.NewDataStoreRatingInfoWithSlot(), // attempts + nexproto.NewDataStoreRatingInfoWithSlot(), // unknown + nexproto.NewDataStoreRatingInfoWithSlot(), // completions + nexproto.NewDataStoreRatingInfoWithSlot(), // failures + nexproto.NewDataStoreRatingInfoWithSlot(), // unknown + nexproto.NewDataStoreRatingInfoWithSlot(), // unknown + nexproto.NewDataStoreRatingInfoWithSlot(), // unknown + } + + // attempts + rankingResult.MetaInfo.Ratings[0].Slot = 0 + rankingResult.MetaInfo.Ratings[0].Rating = nexproto.NewDataStoreRatingInfo() + rankingResult.MetaInfo.Ratings[0].Rating.TotalValue = int64(courseMetadata.Attempts) + rankingResult.MetaInfo.Ratings[0].Rating.Count = courseMetadata.Attempts + rankingResult.MetaInfo.Ratings[0].Rating.InitialValue = 0 + + // unknown + rankingResult.MetaInfo.Ratings[1].Slot = 1 + rankingResult.MetaInfo.Ratings[1].Rating = nexproto.NewDataStoreRatingInfo() + rankingResult.MetaInfo.Ratings[1].Rating.TotalValue = 2 + rankingResult.MetaInfo.Ratings[1].Rating.Count = 2 + rankingResult.MetaInfo.Ratings[1].Rating.InitialValue = 0 + + // completions + rankingResult.MetaInfo.Ratings[2].Slot = 2 + rankingResult.MetaInfo.Ratings[2].Rating = nexproto.NewDataStoreRatingInfo() + rankingResult.MetaInfo.Ratings[2].Rating.TotalValue = int64(courseMetadata.Completions) + rankingResult.MetaInfo.Ratings[2].Rating.Count = courseMetadata.Completions + rankingResult.MetaInfo.Ratings[2].Rating.InitialValue = 0 + + // failures + rankingResult.MetaInfo.Ratings[3].Slot = 3 + rankingResult.MetaInfo.Ratings[3].Rating = nexproto.NewDataStoreRatingInfo() + rankingResult.MetaInfo.Ratings[3].Rating.TotalValue = int64(courseMetadata.Failures) + rankingResult.MetaInfo.Ratings[3].Rating.Count = courseMetadata.Failures + rankingResult.MetaInfo.Ratings[3].Rating.InitialValue = 0 + + // unknown + rankingResult.MetaInfo.Ratings[4].Slot = 4 + rankingResult.MetaInfo.Ratings[4].Rating = nexproto.NewDataStoreRatingInfo() + rankingResult.MetaInfo.Ratings[4].Rating.TotalValue = 5 + rankingResult.MetaInfo.Ratings[4].Rating.Count = 5 + rankingResult.MetaInfo.Ratings[4].Rating.InitialValue = 0 + + // unknown + rankingResult.MetaInfo.Ratings[5].Slot = 5 + rankingResult.MetaInfo.Ratings[5].Rating = nexproto.NewDataStoreRatingInfo() + rankingResult.MetaInfo.Ratings[5].Rating.TotalValue = 6 + rankingResult.MetaInfo.Ratings[5].Rating.Count = 6 + rankingResult.MetaInfo.Ratings[5].Rating.InitialValue = 0 + + // Number of new Miiverse comments + rankingResult.MetaInfo.Ratings[6].Slot = 6 + rankingResult.MetaInfo.Ratings[6].Rating = nexproto.NewDataStoreRatingInfo() + rankingResult.MetaInfo.Ratings[6].Rating.TotalValue = 0 + rankingResult.MetaInfo.Ratings[6].Rating.Count = 0 + rankingResult.MetaInfo.Ratings[6].Rating.InitialValue = 0 + + pRankingResult = append(pRankingResult, rankingResult) + pResults = append(pResults, 0x690001) + } + + return pRankingResult, pResults +} + func getCustomRankingByDataIdMiiData(param *nexproto.DataStoreGetCustomRankingByDataIdParam) ([]*nexproto.DataStoreCustomRankingResult, []uint32) { pRankingResult := make([]*nexproto.DataStoreCustomRankingResult, 0) pResults := make([]uint32, 0)