spotify_rec 1.1 → 1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9daf63ceb4fca531e3c229176858b08e361a967f5e4659e8e4148986ea674f9b
4
- data.tar.gz: 74a1726add037202ce570f14395ea81938883c1fee44d322a26668dccb6effe1
3
+ metadata.gz: 832dfdbb67807131538f45562b49208797c83e0b11604cbbaa72891af354daab
4
+ data.tar.gz: cc7abdbdc29cda735fb491e2eb30c35957dd60be465f30f9e253d6c4fe8f294a
5
5
  SHA512:
6
- metadata.gz: 3646d4d9de7e2af452e6b63d73beb92018855ae502fc5cfbc7dd27de11c8887a2f4a83001430166a92d540ea548b8b348fbf89f595a22a0674afac01812a94f0
7
- data.tar.gz: b1d72a64347e2670f80b46284e4b1426f089d2f6311a24fa1a41dc71c718a0bcb6f5f50e3110d9fba0687ba366a79e6df6352c36f38c267aab94f71a92bd443e
6
+ metadata.gz: bc61791f2c2d5065b66010f991f5c625db257209562648f917f05832e8dcadb4545fe452e9c75eb30e9ff021a54e4e1be2dc97fd7f99bba0826cd65f5afb33fb
7
+ data.tar.gz: 528555fb05397d6d5106f724324d56da3e2eed96a003eed0a3ce9270640beba67f6dfb8d46724202007df0d6d059dab152945a396d2d82281523a3662f289a11
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  # gems
4
5
  require 'rspotify'
@@ -15,12 +16,14 @@ require_relative '../lib/login'
15
16
  require_relative '../lib/rec'
16
17
  require_relative '../lib/menu'
17
18
  require_relative '../lib/my_list'
19
+ require_relative '../lib/tutorial'
20
+ require_relative '../lib/error'
18
21
 
19
- #modules
22
+ # modules
20
23
  include Login
24
+ include Tutorial
21
25
 
22
- RSpotify.authenticate("712ff89a218a4e6dbe1f169e06f949b9", "e9e0517f405b4a01a1be8823126459b7")
23
- $prompt = TTY::Prompt.new
26
+ RSpotify.authenticate('712ff89a218a4e6dbe1f169e06f949b9', 'e9e0517f405b4a01a1be8823126459b7')
24
27
 
25
28
  VERSION = 1.0
26
29
 
@@ -28,27 +31,31 @@ ARGV << '--run' if ARGV.empty?
28
31
 
29
32
  options = {}
30
33
  parser = OptionParser.new do |opts|
31
- opts.banner = "Welcome to Spotify Recommendations! Usage: spotifyrec [options]".colorize(:light_green)
32
-
33
- opts.on("-v", "--version", "Display the version") do
34
- puts "Spotify Recommendations version #{VERSION}".colorize(:light_green)
35
- end
36
-
37
- opts.on("-h", "--help", "Display the help message") do
38
- puts opts
39
- exit
40
- end
41
-
42
- opts.on("-qGENRE", "--quick=GENRE", "Generate a quick recommendation with the chosen genre") do |genre|
43
- recommendations = RSpotify::Recommendations.generate(limit: 5, seed_genres: [genre])
44
- cleaned_recs = recommendations.tracks.map { |t| "#{t.name} by #{t.artists[0].name}" }
45
- puts "》 RECOMMENDATIONS 《".colorize(:light_green)
46
- cleaned_recs.each { |track| puts track }
47
- end
48
-
49
- opts.on("-r", "--run", "Run the application") do
50
- Login::login
51
- end
34
+ opts.banner = 'Welcome to Spotify Recommendations! Usage: spotify_rec [options]'.colorize(:light_green)
35
+
36
+ opts.on('-v', '--version', 'Display the version') do
37
+ puts "Spotify Recommendations version #{VERSION}".colorize(:light_green)
38
+ end
39
+
40
+ opts.on('-h', '--help', 'Display the help message') do
41
+ puts opts
42
+ exit
43
+ end
44
+
45
+ opts.on('-t', '--tutorial', 'View a brief tutorial') do
46
+ Tutorial.start
47
+ end
48
+
49
+ opts.on('-qGENRE', '--quick=GENRE', 'Generate a quick recommendation with the chosen genre') do |genre|
50
+ recommendations = RSpotify::Recommendations.generate(limit: 5, seed_genres: [genre])
51
+ cleaned_recs = recommendations.tracks.map { |t| "#{t.name} by #{t.artists[0].name}" }
52
+ puts '》 RECOMMENDATIONS 《'.colorize(:light_green)
53
+ cleaned_recs.each { |track| puts track }
54
+ end
55
+
56
+ opts.on('-r', '--run', 'Run the application') do
57
+ Login.login
58
+ end
52
59
  end
53
60
 
54
- parser.parse!
61
+ parser.parse!
@@ -1,117 +1,151 @@
1
- require_relative 'menu'
2
-
3
- module Login
4
-
5
- def user
6
- return @user
7
- end
8
-
9
- def userdata
10
- path = File.join(File.dirname(File.dirname(File.absolute_path(__FILE__))))
11
- userfile = "#{path}/public/users.json"
12
- return userfile
13
- end
14
-
15
- def clear
16
- system("clear")
17
- end
18
-
19
- def initial_login
20
- clear
21
- puts " ;;;;;;;;;;;;;;;;;;;
22
- ;;;;;;;;;;;;;;;;;;;
23
- ; ;
24
- ; ;
25
- ; ;
26
- ; ;
27
- ; ;
28
- ; ;
29
- ,;;;;; ,;;;;;
30
- ;;;;;; ;;;;;;
31
- `;;;;' `;;;;'
32
- ".colorize(:light_green)
33
- puts "》 Welcome to the Spotify Recommendations App! 《".colorize(:light_green)
34
- puts
35
- return $prompt.select("Are you a new or returning user? \n", %w(New Returning))
36
- end
37
-
38
- def load_data
39
- file = File.read(userdata)
40
- return JSON.parse(file)
41
- end
42
-
43
- def gen_uid
44
- return load_data.length + 1
45
- end
46
-
47
- def store_user
48
- data = load_data
49
- user_details = {
50
- "id" => "#{@user.uid}",
51
- "username" => @user.username,
52
- "password" => @user.password,
53
- "playlist" => @user.playlist,
54
- "mylist" => @user.mylist
55
- }
56
- data << user_details
57
- File.open(userdata,"w") do |f|
58
- f.puts JSON.pretty_generate(data)
59
- end
60
- puts "You're now registered! Logging you in..".colorize(:light_green)
61
- sleep(1)
62
- @menu = Menu.new(@user)
63
- @menu.menu_router
64
- end
65
-
66
- def new_user
67
- system("clear")
68
- puts "Welcome! Please register for an account to continue.".colorize(:light_green)
69
- username = $prompt.ask("Username >") { |u| u.validate(/\A[0-9a-zA-Z'-]*\z/, "Username must only contain letters and numbers")}
70
- password = $prompt.mask("Password >")
71
- @user = User.new(username, password, gen_uid)
72
- @user_playlist = Playlist.new(@user)
73
- store_user
74
- end
75
-
76
- def returning_user
77
- system("clear")
78
- puts "Welcome back! Please login to continue.".colorize(:light_green)
79
- username = $prompt.ask("Username >")
80
- password= $prompt.mask("Password >")
81
- authenticate(username, password)
82
- end
83
-
84
- def authenticate(username, password)
85
- data = load_data
86
- auth = false
87
- data.each do |hash|
88
- if hash["username"].downcase == username.downcase
89
- if hash["password"] == password
90
- auth = true
91
- @user = User.new(username, password, hash["id"], hash["playlist"], hash["mylist"])
92
- @user_playlist = Playlist.new(@user)
93
- puts "Success! Logging you in..".colorize(:light_green)
94
- sleep(1)
95
- @menu = Menu.new(@user)
96
- @menu.menu_router
97
- end
98
- end
99
- end
100
- unless auth
101
- puts "Incorrect username or password!".colorize(:red)
102
- sleep(1)
103
- returning_user
104
- end
105
- end
106
-
107
- def login
108
- new_returning = initial_login.downcase
109
- if new_returning == "new"
110
- new_user
111
- end
112
- if new_returning == "returning"
113
- returning_user
114
- end
115
- end
116
-
117
- end
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'menu'
4
+
5
+ module Login
6
+ @prompt = TTY::Prompt.new
7
+ @count = 0
8
+
9
+ # Login Logic Section
10
+ def initial_login
11
+ clear
12
+ ascii_art
13
+ puts '》 Welcome to the Spotify Recommendations App! 《'.colorize(:light_green)
14
+ puts
15
+ @prompt.select("Are you a new or returning user? \n", %w[New Returning])
16
+ end
17
+
18
+ def login
19
+ new_returning = initial_login.downcase
20
+ new_user if new_returning == 'new'
21
+ returning_user if new_returning == 'returning'
22
+ end
23
+
24
+ # New user
25
+
26
+ def new_user
27
+ system('clear')
28
+ File.open(userdata, 'w') { |f| f.write([].to_json) } unless File.exist?(userdata)
29
+ puts 'Welcome! Please register for an account to continue.'.colorize(:light_green)
30
+ username = @prompt.ask('Username >')
31
+ raise RequirementError.new, 'Requirements not met' if username.match?(/[!@#$%^&*(),.?":{}|<>]/)
32
+
33
+ new_user_password(username)
34
+ rescue RequirementError
35
+ puts 'Username cannot contain special characters. Please try again!'.colorize(:light_red)
36
+ new_user
37
+ end
38
+
39
+ def new_user_password(username)
40
+ password = @prompt.mask('Password >')
41
+ raise RequirementError.new, 'Requirements not met' if password.match?(/[!@#$%^&*(),.?":{}|<>]/)
42
+
43
+ @user = User.new(username, password, gen_uid)
44
+ @user_playlist = Playlist.new(@user)
45
+ store_user
46
+ rescue RequirementError
47
+ puts 'Password cannot contain special characters. Please try again!'.colorize(:light_red)
48
+ end
49
+
50
+ def store_user
51
+ data = load_data
52
+ user_details = {
53
+ 'id' => @user.uid.to_s,
54
+ 'username' => @user.username,
55
+ 'password' => @user.password,
56
+ 'playlist' => @user.playlist,
57
+ 'mylist' => @user.mylist
58
+ }
59
+ data << user_details
60
+ write_user(data)
61
+ end
62
+
63
+ def write_user(data)
64
+ File.open(userdata, 'w') do |f|
65
+ f.puts JSON.pretty_generate(data)
66
+ end
67
+ puts "You're now registered! Logging you in..".colorize(:light_green)
68
+ sleep(1)
69
+ go_to_menu
70
+ end
71
+
72
+ # Returning user
73
+
74
+ def returning_user
75
+ system('clear')
76
+ File.open(userdata, 'w') { |f| f.write([].to_json) } unless File.exist?(userdata)
77
+ puts 'Welcome back! Please login to continue.'.colorize(:light_green)
78
+ username = @prompt.ask('Username >')
79
+ user_password = @prompt.mask('Password >')
80
+ authenticate(username, user_password)
81
+ end
82
+
83
+ def authenticate(username, user_password)
84
+ data_arr = load_data
85
+ user_data(data_arr, username, user_password)
86
+ end
87
+
88
+ def user_data(data, username, user_password)
89
+ data.each do |hash|
90
+ next unless hash['username'].downcase == username.downcase
91
+
92
+ next unless hash['password'] == user_password
93
+
94
+ @user = User.new(username, user_password, hash['id'], hash['playlist'], hash['mylist'])
95
+ go_to_menu
96
+ end
97
+ @count += 1
98
+ no_auth
99
+ end
100
+
101
+ def no_auth
102
+ puts 'Incorrect username or password!'.colorize(:red)
103
+ sleep(1)
104
+ if @count >= 3
105
+ puts 'You have tried too many times! The application will now close..'.colorize(:light_red)
106
+ exit
107
+ end
108
+ returning_user
109
+ end
110
+
111
+ # Helper Module Methods
112
+
113
+ def user
114
+ @user
115
+ end
116
+
117
+ def gen_uid
118
+ load_data.length + 1
119
+ end
120
+
121
+ def userdata
122
+ path = File.join(File.dirname(File.dirname(File.absolute_path(__FILE__))))
123
+ "#{path}/public/users.json"
124
+ end
125
+
126
+ def load_data
127
+ file = File.read(userdata)
128
+ JSON.parse(file)
129
+ end
130
+
131
+ def clear
132
+ system('clear')
133
+ end
134
+
135
+ def go_to_menu
136
+ menu = Menu.new(@user)
137
+ menu.menu_router
138
+ end
139
+
140
+ def ascii_art
141
+ puts " ;;;;;;;;;;;;;;;;;;;
142
+ ; ;
143
+ ; ;
144
+ ; ;
145
+ ; ;
146
+ ; ;
147
+ ,;;;;; ,;;;;;
148
+ ;;;;;; ;;;;;;
149
+ `;;;;' `;;;;'\n".colorize(:light_green)
150
+ end
151
+ end
@@ -1,67 +1,90 @@
1
- class Menu
2
-
3
- def initialize(user)
4
- @user = user
5
- @prompt = prompt = TTY::Prompt.new
6
- @playlist = Playlist.new(@user)
7
- end
8
-
9
- def display_menu
10
- system("clear")
11
- return @prompt.select("》 MAIN MENU 《\n".colorize(:light_green), (["My List", "Recommendations", "Playlist", "Account Details", "Exit"]))
12
- end
13
-
14
- def my_list
15
- system("clear")
16
- selection = @prompt.select("》 MY LIST 《\n".colorize(:light_green), (["Display", "Add", "Remove", "Back"]))
17
- mylist = MyList.new(@user)
18
- case selection
19
- when "Display"
20
- mylist.list
21
- when "Add"
22
- mylist.add_to_list
23
- when "Remove"
24
- mylist.remove_from_list
25
- when "Back"
26
- menu_router
27
- end
28
- end
29
-
30
- def account_details
31
- system("clear")
32
- selection = @prompt.select("》 ACCOUNT MENU 《 \n".colorize(:light_green), (["View Details", "Change Username", "Change Password", "Delete Account", "Back"]))
33
- case selection
34
- when "View Details"
35
- @user.details
36
- when "Change Username"
37
- username = @prompt.ask("Please enter your new username >") { |u| u.validate(/\A[0-9a-zA-Z'-]*\z/, "Username must only contain letters and numbers")}
38
- @user.change_username(username)
39
- when "Change Password"
40
- password = @prompt.ask("Please enter your new password >")
41
- @user.change_password(password)
42
- when "Delete Account"
43
- @user.delete_account
44
- when "Back"
45
- menu_router
46
- end
47
- end
48
-
49
- def menu_router
50
- selection = display_menu
51
- case selection
52
- when "My List"
53
- system("clear")
54
- my_list
55
- when "Recommendations"
56
- recommendation = Rec.new(@user)
57
- recommendation.amount_of_suggestions
58
- when "Playlist"
59
- @playlist.menu
60
- when "Account Details"
61
- account_details
62
- when "Exit"
63
- exit
64
- end
65
- end
66
-
67
- end
1
+ # frozen_string_literal: true
2
+
3
+ class Menu
4
+ def initialize(user)
5
+ @user = user
6
+ @prompt = TTY::Prompt.new
7
+ @playlist = Playlist.new(@user)
8
+ end
9
+
10
+ def display_menu
11
+ system('clear')
12
+ arr = ['My List', 'Recommendations', 'Playlist', 'Account Details', 'Exit']
13
+ @prompt.select("》 MAIN MENU 《\n".colorize(:light_green), arr)
14
+ end
15
+
16
+ def menu_router
17
+ selection = display_menu
18
+ case selection
19
+ when 'My List'
20
+ my_list
21
+ when 'Recommendations'
22
+ recommendation = Rec.new(@user)
23
+ recommendation.amount_of_suggestions
24
+ else
25
+ case_menu(selection)
26
+ end
27
+ end
28
+
29
+ def case_menu(selection)
30
+ case selection
31
+ when 'Playlist'
32
+ @playlist.menu
33
+ when 'Account Details'
34
+ account_details
35
+ when 'Exit'
36
+ exit
37
+ end
38
+ end
39
+
40
+ def my_list
41
+ system('clear')
42
+ selection = @prompt.select("》 MY LIST 《\n".colorize(:light_green), %w[Display Add Remove Back])
43
+ mylist = MyList.new(@user)
44
+ case_my_list(selection, mylist)
45
+ end
46
+
47
+ def case_my_list(selection, mylist)
48
+ case selection
49
+ when 'Display'
50
+ mylist.list
51
+ when 'Add'
52
+ mylist.add_to_list
53
+ when 'Remove'
54
+ mylist.remove_from_list
55
+ when 'Back'
56
+ menu_router
57
+ end
58
+ end
59
+
60
+ def account_details_select
61
+ system('clear')
62
+ arr = ['View Details', 'Change Username', 'Change Password', 'Delete Account', 'Back']
63
+ @prompt.select('》 ACCOUNT DETAILS 《\n'.colorize(:light_green), arr)
64
+ end
65
+
66
+ def account_details
67
+ selection = account_details_select
68
+ case selection
69
+ when 'View Details'
70
+ @user.details
71
+ when 'Change Username'
72
+ username = @prompt.ask('Please enter your new username >')
73
+ @user.change_username(username)
74
+ else
75
+ case_account_details(selection)
76
+ end
77
+ end
78
+
79
+ def case_account_details(selection)
80
+ case selection
81
+ when 'Change Password'
82
+ password = @prompt.ask('Please enter your new password >')
83
+ @user.change_password(password)
84
+ when 'Delete Account'
85
+ @user.delete_account
86
+ when 'Back'
87
+ menu_router
88
+ end
89
+ end
90
+ end