-
Notifications
You must be signed in to change notification settings - Fork 65
/
funcs.go
239 lines (225 loc) · 7.56 KB
/
funcs.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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
package main
import (
"fmt"
"os"
"sort"
"time"
)
// ConvertMapToJSONStruct - Converst the map data to a JSON struct, this is used to save the data to the database.json :D
func ConvertMapToJSONStruct(data map[string]*MainData) Database {
var toReturn Database
for _, d := range data {
var main MainStruct
var mainListen []ListenArrayStruct
for _, listen := range d.ListeningArray {
var listenStruct ListenArrayStruct
listenStruct.ArtistName = listen.ArtistName
listenStruct.TimesListend = listen.TimesListend
var mainSongs []SongsStruct
//make songs array
for _, songUwU := range listen.Songs {
var songStruct SongsStruct
songStruct.SongName = songUwU.SongName
songStruct.TimesListened = songUwU.TimesListened
songStruct.Artist = listen.ArtistName
mainSongs = append(mainSongs, songStruct)
}
listenStruct.Songs = mainSongs
// append artist to artist struct array
mainListen = append(mainListen, listenStruct)
}
//append artists struct array
main.Userid = d.Userid
main.User = d.User
main.ListeningArray = mainListen
toReturn = append(toReturn, main)
}
return toReturn
}
// UpdateDatabase - Updates the main database.json file.
func UpdateDatabase(tosave string) {
f, err := os.Create("database.json")
if err != nil {
fmt.Println("error saving Database!")
f.Close()
return
}
f.WriteString(tosave)
f.Close()
fmt.Println("Saved Database!")
}
// ConverToMap - Convert the json data to a map we can use.
func ConverToMap(data Database) map[string]*MainData {
allData := make(map[string]*MainData)
for _, normalData := range data {
//if user doesn't exist
if _, ok := allData[normalData.Userid]; !ok {
listenArr := make(map[string]*Artist)
for _, listen := range normalData.ListeningArray {
//artist doesn't exist in lsitening array
if _, ok := listenArr[listen.ArtistName]; !ok {
songsArr := make(map[string]*Song)
for _, songData := range listen.Songs {
// Song doesn't exist in songs array
if _, ok := songsArr[songData.SongName]; !ok {
songsArr[songData.SongName] = &Song{
SongName: songData.SongName,
TimesListened: songData.TimesListened,
}
}
}
listenArr[listen.ArtistName] = &Artist{
ArtistName: listen.ArtistName,
Songs: songsArr,
TimesListend: listen.TimesListend,
}
}
}
allData[normalData.Userid] = &MainData{
Userid: normalData.Userid,
User: normalData.User,
ListeningArray: listenArr,
}
}
}
return allData
}
// MakeTimestamp - makes a ms timestamp
func MakeTimestamp() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}
// ConvertMapDataToStruct - Convert the main map to a json struct, this is used to sort user data on fetch. (artist/general)
func ConvertMapDataToStruct(d *MainData) MainStruct {
var main MainStruct
var mainListen []ListenArrayStruct
for _, listen := range d.ListeningArray {
var listenStruct ListenArrayStruct
listenStruct.ArtistName = listen.ArtistName
listenStruct.TimesListend = listen.TimesListend
var mainSongs []SongsStruct
//make songs array
for _, songUwU := range listen.Songs {
var songStruct SongsStruct
songStruct.SongName = songUwU.SongName
songStruct.TimesListened = songUwU.TimesListened
songStruct.Artist = listen.ArtistName
mainSongs = append(mainSongs, songStruct)
}
listenStruct.Songs = mainSongs
// append artist to artist struct array
mainListen = append(mainListen, listenStruct)
}
//append artists struct array
main.Userid = d.Userid
main.User = d.User
main.ListeningArray = mainListen
return main
}
// ConvertMapDataToStructArtistSpecific - Convert the main map to a json struct, this is used to sort user data on fetch. (song/specific)
func ConvertMapDataToStructArtistSpecific(artist string, d *MainData) ListenArrayStruct {
var toReturn ListenArrayStruct
toReturn.ArtistName = d.ListeningArray[artist].ArtistName
toReturn.TimesListend = d.ListeningArray[artist].TimesListend
var mainSongs []SongsStruct
for _, songUwU := range d.ListeningArray[artist].Songs {
var songStruct SongsStruct
songStruct.SongName = songUwU.SongName
songStruct.TimesListened = songUwU.TimesListened
songStruct.Artist = toReturn.ArtistName
mainSongs = append(mainSongs, songStruct)
}
toReturn.Songs = mainSongs
return toReturn
}
// ConvertToSendableString - Convert the struct to a string to send. (not specific)
/*
lets just walk through this here, comments take a lot of effort
1.) add 1 to the maximum, I'm not sure why but it just works. (0 -> first part but 9 -> 9th part :what:)
2.) we check the mode, if it's song we do this
a.) initiate an array of every song our user has listned to
b.) sort
c.) grab only the songs we need for the page number
d.) build the string and return it
3.) we check the mode, if it's artist do this
a.) initiate an array of every artist our user has listened to
b.) sort
c.) grab only what we need for the page number
d.) build string and return
*/
func ConvertToSendableString(structData MainStruct, mode string, min, max int) (string, int) {
//min++
max++
var toReturn string
if mode == "song" {
var songs []SongsStruct
for _, artistlol := range structData.ListeningArray {
for _, songlol := range artistlol.Songs {
songs = append(songs, songlol)
}
}
sort.Slice(songs, func(i, j int) bool {
return songs[i].TimesListened > songs[j].TimesListened
})
var numreturn = len(songs)
if max > numreturn {
max = numreturn
}
fmt.Println(min, max, len(songs))
songs = songs[min:max]
toReturn += fmt.Sprintf("**Top songs for %s**\n\n", structData.User)
var i = min + 1
for _, xd := range songs {
toReturn += fmt.Sprintf("%s.) **%s** by **%s** listened to %s time(s)\n", fmt.Sprint(i), xd.SongName, xd.Artist, fmt.Sprint(xd.TimesListened))
i++
}
return toReturn, numreturn
} else if mode == "artist" {
var artists []ListenArrayStruct
artists = structData.ListeningArray
sort.Slice(artists, func(i, j int) bool {
return artists[i].TimesListend > artists[j].TimesListend
})
var numreturn = len(artists)
if max > numreturn {
max = numreturn
}
artists = artists[min:max]
toReturn += fmt.Sprintf("**Top artists for %s**\n\n", structData.User)
var i = min + 1
for _, xd := range artists {
toReturn += fmt.Sprintf("%s.) **%s** listened to %s time(s)\n", fmt.Sprint(i), xd.ArtistName, fmt.Sprint(xd.TimesListend))
i++
}
return toReturn, numreturn
}
return "No valid data!", 0
}
// ConvertToSendAbleStringSpecific - Convert the struct to a string to send. (specific)
/*
1.) sort the songs
2.) grab what we need for the page number
3.) build string and return
*/
func ConvertToSendAbleStringSpecific(artist string, data ListenArrayStruct, user string, min, max int) string {
max++
var toReturn string
if len(data.Songs) < 1 {
toReturn = "**No data avalible for " + artist + "** (case sensitive)"
return toReturn
}
var songs = data.Songs
sort.Slice(songs, func(i, j int) bool {
return songs[i].TimesListened > songs[j].TimesListened
})
if max > len(songs) {
max = len(songs)
}
songs = songs[min:max]
toReturn += fmt.Sprintf("**Top songs for %s by %s**\n\n", user, artist)
var i = min + 1
for _, xd := range songs {
toReturn += fmt.Sprintf("%s.) **%s** by **%s** listened to %s time(s)\n", fmt.Sprint(i), xd.SongName, xd.Artist, fmt.Sprint(xd.TimesListened))
i++
}
return toReturn
}