monkeymusic 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/bin/monkeymusic-generate +6 -0
- data/levels/bomberman2.rb +31 -0
- data/levels/testmaze_10.rb +38 -0
- data/levels/testmaze_20.rb +38 -0
- data/levels/testmaze_30.rb +38 -0
- data/lib/monkey_music.rb +1 -3
- data/lib/monkey_music/game.rb +13 -3
- data/lib/monkey_music/level.rb +1 -1
- data/lib/monkey_music/level_loader.rb +3 -3
- data/lib/monkey_music/player.rb +13 -7
- data/lib/monkey_music/runner.rb +29 -85
- data/lib/monkey_music/ui/console_ui.rb +10 -6
- data/lib/monkey_music/units/monkey.rb +4 -0
- data/lib/monkey_music_generate.rb +6 -0
- data/lib/monkey_music_generate/generator.rb +98 -0
- data/lib/{monkey_music → monkey_music_generate}/recommendation_loader.rb +0 -0
- data/lib/{monkey_music → monkey_music_generate}/score_system.rb +0 -0
- data/lib/{monkey_music → monkey_music_generate}/toplist_loader.rb +0 -0
- metadata +15 -60
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZTg1NmQzOTk5MDc1YWI5ODI3ZmFjZGUyN2Q3MDg0ZGNlM2RlNTAyNw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NWQwODNmNzc1OGNkMGIyNDgyOTI2MDBhNjQ4ZTMwMmNkMmI1MmJjMQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
Mzk0YzYxYmRhOTZjYWYwYjY3NzBmYjIzNWIxMWJjOWQxZDZjMDUwMDQ1MGNm
|
10
|
+
ZWViMzRlZjM0M2VjNjYyZDhlNWM3N2Y2NzdhY2M1MjdlYWYxNTkzYTY1ZTJh
|
11
|
+
NDc4MjYwMTczMWM5ODc3YTBhNDYyZDViZDg2MzgxZjlmY2Q2MGU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
Y2U4MDUyOWJjN2E2ZDE5MWI4OWZkOWI4YmY4ZDhhYzdmM2FkYTQ3MjI1NWRk
|
14
|
+
MzVkYTRlN2I1NGNhOTFlZWUzOTU2NDRmNTE3ZWNlMzU3YjIyNmE5OWJlN2M5
|
15
|
+
NzkxYmVkYWRlMjYwMzNjYTdjNDEyZWVkZmExNTM4ZjNmZmQzZjI=
|
@@ -0,0 +1,31 @@
|
|
1
|
+
carrying_capacity 5
|
2
|
+
metadata_requests_per_turn 2
|
3
|
+
max_turns 100
|
4
|
+
|
5
|
+
legend({
|
6
|
+
"1" => Monkey.player(1),
|
7
|
+
"2" => Monkey.player(2),
|
8
|
+
"X" => Track.worth(-2),
|
9
|
+
"x" => Track.worth(-1),
|
10
|
+
"l" => Track.worth(1),
|
11
|
+
"t" => Track.worth(2),
|
12
|
+
"T" => Track.worth(3),
|
13
|
+
"U" => User,
|
14
|
+
"#" => Wall,
|
15
|
+
})
|
16
|
+
|
17
|
+
layout <<LAYOUT
|
18
|
+
Xl 1 U 2 lX
|
19
|
+
t ll ll t
|
20
|
+
###t ########### t###
|
21
|
+
#t # #T tlTlt T# # t#
|
22
|
+
## #T#l l#T# ##
|
23
|
+
#l ######X X###### l#
|
24
|
+
## # # x # # ##
|
25
|
+
#T# #t# #t# #T#
|
26
|
+
#x#l##### # #####l#x#
|
27
|
+
# # # l # # #
|
28
|
+
### # # # # # # # ###
|
29
|
+
#t # # # t#
|
30
|
+
#l###l#t#t#t#t#l###l#
|
31
|
+
LAYOUT
|
@@ -0,0 +1,38 @@
|
|
1
|
+
carrying_capacity 3
|
2
|
+
metadata_requests_per_turn 2
|
3
|
+
max_turns 100
|
4
|
+
|
5
|
+
legend({
|
6
|
+
"1" => Monkey.player(1),
|
7
|
+
"2" => Monkey.player(2),
|
8
|
+
"X" => Track.worth(-2),
|
9
|
+
"x" => Track.worth(-1),
|
10
|
+
"l" => Track.worth(1),
|
11
|
+
"t" => Track.worth(2),
|
12
|
+
"T" => Track.worth(3),
|
13
|
+
"U" => User,
|
14
|
+
})
|
15
|
+
|
16
|
+
layout <<LAYOUT
|
17
|
+
XXXXXXXXXXXXXXXXXXXXXXXXXUXXXXXXXXXXXXXXX
|
18
|
+
X X X X X X X 1 2 X X X X
|
19
|
+
X X X XXX XXX X X XXXXXXX X X X XXXXX X X
|
20
|
+
X X X X X X X X X X X X
|
21
|
+
X X XXX XXX XXX X X X XXX X XXXXXXXXX X X
|
22
|
+
X X X X X X X X X X X X X X
|
23
|
+
XXX X X X XXX X XXX XXXXX X X X X XXX X X
|
24
|
+
X X t X X X X X X X X X
|
25
|
+
X X XXXXXXXXX XXX XXXXXXX XXX XXX X X X X
|
26
|
+
X X X X X X X X X X X
|
27
|
+
XXX X X X X XXXXX X X X XXX X XXX X XXX X
|
28
|
+
X X X X X X X X X X X X X X X
|
29
|
+
X XXX X XXXXX X X X X X X X X XXXXXXX X
|
30
|
+
X X X X X X X X X X X X
|
31
|
+
XXXXXXXXX X XXX XXXXXXXXX XXX X X XXX XXX
|
32
|
+
X X lX X X X X T X X X X X
|
33
|
+
X XXX X X X X XXX X X X X XXX X XXX XXX X
|
34
|
+
X X X X X X X X X X X X X X X
|
35
|
+
XXX XXX X XXXXXXX X XXX X X XXX X X XXX X
|
36
|
+
X T X Xt X tX
|
37
|
+
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
38
|
+
LAYOUT
|
@@ -0,0 +1,38 @@
|
|
1
|
+
carrying_capacity 3
|
2
|
+
metadata_requests_per_turn 2
|
3
|
+
max_turns 100
|
4
|
+
|
5
|
+
legend({
|
6
|
+
"1" => Monkey.player(1),
|
7
|
+
"2" => Monkey.player(2),
|
8
|
+
"X" => Track.worth(-2),
|
9
|
+
"x" => Track.worth(-1),
|
10
|
+
"l" => Track.worth(1),
|
11
|
+
"t" => Track.worth(2),
|
12
|
+
"T" => Track.worth(3),
|
13
|
+
"U" => User,
|
14
|
+
})
|
15
|
+
|
16
|
+
layout <<LAYOUT
|
17
|
+
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
18
|
+
X X X X l X X XT X X X X
|
19
|
+
XXX X X X X XXXXXXX X X X X X XXX X X XXX
|
20
|
+
X X X X X X X X X X X X X X X X X X
|
21
|
+
X X XXX X X X X X X X X XXXXXXX X X X X X
|
22
|
+
X X X X X X X t X X
|
23
|
+
XXXXX X XXX XXXXX XXX X XXX XXX X XXXXX X
|
24
|
+
X X X X X X X X X X X X X
|
25
|
+
X X X XXX X XXX 1U2 X XXX XXX XXX XXX
|
26
|
+
X X l X X X X X X
|
27
|
+
X X XXX X XXX X X X XXX X X X XXX XXX X X
|
28
|
+
X X X X X X X X X X X X
|
29
|
+
XXXXX X XXXXX XXX XXX X XXXXXXX XXX X X X
|
30
|
+
X X X X X X X X X X X
|
31
|
+
X X X X XXX X X X XXXXX X X X X X X XXX X
|
32
|
+
X t X X X X X X X X XtX XT X X
|
33
|
+
X XXX XXXXX XXXXXXXXXXX X X X XXXXX X X X
|
34
|
+
X X X X X X X X X X X X X
|
35
|
+
X X X XXXXX X X X X XXXXXXX XXX X XXXXX X
|
36
|
+
X X X X X X X X X X
|
37
|
+
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
38
|
+
LAYOUT
|
@@ -0,0 +1,38 @@
|
|
1
|
+
carrying_capacity 3
|
2
|
+
metadata_requests_per_turn 2
|
3
|
+
max_turns 100
|
4
|
+
|
5
|
+
legend({
|
6
|
+
"1" => Monkey.player(1),
|
7
|
+
"2" => Monkey.player(2),
|
8
|
+
"X" => Track.worth(-2),
|
9
|
+
"x" => Track.worth(-1),
|
10
|
+
"l" => Track.worth(1),
|
11
|
+
"t" => Track.worth(2),
|
12
|
+
"T" => Track.worth(3),
|
13
|
+
"U" => User,
|
14
|
+
})
|
15
|
+
|
16
|
+
layout <<LAYOUT
|
17
|
+
#####################U###################
|
18
|
+
# # # # # # 1 2 # # # # #
|
19
|
+
# # ### # # # #####l#l### ### # # ### ###
|
20
|
+
# # # # # # # # # # # # #
|
21
|
+
# # # # # # # ### # # # ### ### # ### # #
|
22
|
+
# # # # # # # # # # # # # # # # #
|
23
|
+
### # ### ##### # # # ### # ##### # ### #
|
24
|
+
# # # # l # # # T# # #
|
25
|
+
# # ### ##### # # # # # # ### ### # ### #
|
26
|
+
# # # # # # # # # # # # # #
|
27
|
+
# ### ### ####### # # ### # ### ##### ###
|
28
|
+
# # # # # # # # # # #
|
29
|
+
# # # # # # ### # # # ##### ##### # # # #
|
30
|
+
# # # # # # # # # # # # # # # # # # #
|
31
|
+
# # ##### ### ### ### # # # ### # ##### #
|
32
|
+
# # t# # # # # # t# # #
|
33
|
+
# # ### ######### # ##### ### # # # # # #
|
34
|
+
# # # # # # # # # # # #
|
35
|
+
### # ### ### # ### # # ### # ##### ### #
|
36
|
+
# # # # # # # #
|
37
|
+
#########################################
|
38
|
+
LAYOUT
|
data/lib/monkey_music.rb
CHANGED
@@ -5,9 +5,6 @@ require 'set'
|
|
5
5
|
require 'monkey_music/runner'
|
6
6
|
require 'monkey_music/game'
|
7
7
|
require 'monkey_music/player'
|
8
|
-
require 'monkey_music/toplist_loader'
|
9
|
-
require 'monkey_music/recommendation_loader'
|
10
|
-
require 'monkey_music/score_system'
|
11
8
|
require 'monkey_music/level'
|
12
9
|
require 'monkey_music/level_loader'
|
13
10
|
|
@@ -18,3 +15,4 @@ require 'monkey_music/units/base'
|
|
18
15
|
require 'monkey_music/units/monkey'
|
19
16
|
require 'monkey_music/units/track'
|
20
17
|
require 'monkey_music/units/user'
|
18
|
+
require 'monkey_music/units/wall'
|
data/lib/monkey_music/game.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'optparse'
|
2
|
+
require 'benchmark'
|
2
3
|
|
3
4
|
module MonkeyMusic
|
4
5
|
class Game
|
@@ -10,17 +11,26 @@ module MonkeyMusic
|
|
10
11
|
end
|
11
12
|
|
12
13
|
def start
|
14
|
+
@ui.update(@level)
|
13
15
|
@level.max_turns.times do
|
14
16
|
if @level.complete?
|
15
17
|
break
|
16
18
|
end
|
17
|
-
@ui.update(@level)
|
18
19
|
# Query players for moves
|
19
|
-
|
20
|
+
query_threads = []
|
21
|
+
query_time = Benchmark.realtime do
|
22
|
+
@players.each do |p|
|
23
|
+
query_threads << Thread.new do
|
24
|
+
p.query_move!
|
25
|
+
end
|
26
|
+
end
|
27
|
+
query_threads.each(&:join)
|
28
|
+
end
|
20
29
|
# Move players in random order
|
21
30
|
@players.shuffle.each { |p| p.move! }
|
31
|
+
# Update ui
|
32
|
+
@ui.update(@level, query_time)
|
22
33
|
end
|
23
|
-
@ui.update(@level)
|
24
34
|
end
|
25
35
|
|
26
36
|
end
|
data/lib/monkey_music/level.rb
CHANGED
@@ -13,7 +13,7 @@ module MonkeyMusic
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def metadata_requests_per_turn(n)
|
16
|
-
@
|
16
|
+
@level.requests_per_turn = n
|
17
17
|
end
|
18
18
|
|
19
19
|
def carrying_capacity(capacity)
|
@@ -27,8 +27,8 @@ module MonkeyMusic
|
|
27
27
|
def layout(layout)
|
28
28
|
# Transform layout into x y indexed array
|
29
29
|
units = (layout.lines.map { |l| l.chomp.split(//) }).transpose
|
30
|
-
@level.width = units
|
31
|
-
@level.height = units.length
|
30
|
+
@level.width = units.length
|
31
|
+
@level.height = units[0].length
|
32
32
|
# Add units from layout to level
|
33
33
|
@level.height.times do |y|
|
34
34
|
@level.width.times do |x|
|
data/lib/monkey_music/player.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module MonkeyMusic
|
2
2
|
class Player
|
3
|
-
attr_accessor :monkey
|
3
|
+
attr_accessor :monkey, :level
|
4
4
|
|
5
5
|
def initialize(file)
|
6
6
|
@file = file
|
@@ -9,16 +9,22 @@ module MonkeyMusic
|
|
9
9
|
|
10
10
|
def query_move!
|
11
11
|
IO.popen(@file, "r+") do |io|
|
12
|
-
io.puts
|
13
|
-
io.puts @monkey.remaining_capacity
|
14
|
-
io.puts @monkey.level.width
|
15
|
-
io.puts @monkey.level.height
|
16
|
-
io.puts @monkey.level.serialize
|
12
|
+
io.puts player_output
|
17
13
|
move = io.gets
|
18
14
|
@next_move = parse_move(move) if move
|
19
15
|
end
|
20
16
|
end
|
21
17
|
|
18
|
+
def player_output
|
19
|
+
[ @monkey.id,
|
20
|
+
@monkey.remaining_capacity,
|
21
|
+
@monkey.level.requests_per_turn,
|
22
|
+
@monkey.level.width,
|
23
|
+
@monkey.level.height,
|
24
|
+
@monkey.level.serialize,
|
25
|
+
].join("\n")
|
26
|
+
end
|
27
|
+
|
22
28
|
def parse_move(s)
|
23
29
|
case s.chomp
|
24
30
|
when "N" then :north
|
@@ -34,7 +40,7 @@ module MonkeyMusic
|
|
34
40
|
end
|
35
41
|
|
36
42
|
def to_s
|
37
|
-
|
43
|
+
@monkey.name
|
38
44
|
end
|
39
45
|
|
40
46
|
end
|
data/lib/monkey_music/runner.rb
CHANGED
@@ -3,6 +3,9 @@ require 'optparse'
|
|
3
3
|
module MonkeyMusic
|
4
4
|
class Runner
|
5
5
|
|
6
|
+
@@default_level = 'testlevel.rb'
|
7
|
+
@@default_user = 'synth.yaml'
|
8
|
+
|
6
9
|
def initialize(arguments)
|
7
10
|
@arguments = arguments
|
8
11
|
@opt_parser = OptionParser.new
|
@@ -13,41 +16,19 @@ module MonkeyMusic
|
|
13
16
|
|
14
17
|
def run
|
15
18
|
@opt_parser.parse!
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
loaded_toplists = toplist_loader.loaded_toplists
|
30
|
-
recommendation_loader = RecommendationLoader.new(loaded_toplists)
|
31
|
-
recommendation_loader.load_for_user!(user)
|
32
|
-
# Disconnect from libspotify
|
33
|
-
session.logout!
|
34
|
-
# Evaluate recommendations
|
35
|
-
puts "Evaluating recommendations..."
|
36
|
-
score_system = ScoreSystem.new
|
37
|
-
score_system.evaluate_user_recommendations!(user)
|
38
|
-
# Dump and print the user
|
39
|
-
File.open(@out_file, 'w') do |f|
|
40
|
-
f.write(user.dump)
|
41
|
-
end
|
42
|
-
puts "====="
|
43
|
-
puts "DONE!"
|
44
|
-
puts "====="
|
45
|
-
puts "Loaded tracks:"
|
46
|
-
user.recommendations.group_by(&:multiplier).sort.each do |k,v|
|
47
|
-
puts "#Multiplier #{k}:\t#{v.length}"
|
48
|
-
end
|
49
|
-
exit
|
50
|
-
elsif not game_is_playable?
|
19
|
+
# Handle fallback to default level
|
20
|
+
@level_file ||= File.join(
|
21
|
+
File.dirname(__FILE__),
|
22
|
+
"../../levels",
|
23
|
+
@@default_level
|
24
|
+
)
|
25
|
+
# Handle fallback to default user
|
26
|
+
@user_file ||= File.join(
|
27
|
+
File.dirname(__FILE__),
|
28
|
+
"../../users",
|
29
|
+
@@default_user
|
30
|
+
)
|
31
|
+
if (not game_is_playable?)
|
51
32
|
puts @opt_parser
|
52
33
|
exit
|
53
34
|
end
|
@@ -73,14 +54,6 @@ module MonkeyMusic
|
|
73
54
|
|
74
55
|
private
|
75
56
|
|
76
|
-
def generate_user?
|
77
|
-
(defined? @toplist_file) &&
|
78
|
-
(defined? @out_file) &&
|
79
|
-
(defined? @spotify_appkey_file) &&
|
80
|
-
(defined? @spotify_account) &&
|
81
|
-
(defined? @spotify_password)
|
82
|
-
end
|
83
|
-
|
84
57
|
def game_is_playable?
|
85
58
|
(defined? @user_file) &&
|
86
59
|
(defined? @level_file) &&
|
@@ -92,19 +65,7 @@ module MonkeyMusic
|
|
92
65
|
end
|
93
66
|
|
94
67
|
def init_parser(opts)
|
95
|
-
opts.banner = 'Usage: monkeymusic [
|
96
|
-
|
97
|
-
opts.on('-l',
|
98
|
-
'--level LEVEL',
|
99
|
-
'The level to play.') do |file|
|
100
|
-
@level_file = File.join(Dir.getwd, file)
|
101
|
-
end
|
102
|
-
|
103
|
-
opts.on('-u',
|
104
|
-
'--user USER',
|
105
|
-
'The user the players will recommend music for.') do |user|
|
106
|
-
@user_file = File.join(Dir.getwd, user)
|
107
|
-
end
|
68
|
+
opts.banner = 'Usage: monkeymusic -p PLAYER_FILE -n PLAYER_NAME [-u USER_FILE] [-l LEVEL_FILE]'
|
108
69
|
|
109
70
|
opts.on('-p',
|
110
71
|
'--player FILE',
|
@@ -119,38 +80,21 @@ module MonkeyMusic
|
|
119
80
|
@players[-1].monkey.name = name unless @players.empty?
|
120
81
|
end
|
121
82
|
|
122
|
-
opts.on('-
|
123
|
-
'
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
opts.on('-g',
|
128
|
-
'--generate TOPLIST_FILE',
|
129
|
-
'Generate a user from a toplist file.') do |user|
|
130
|
-
@toplist_file = File.join(Dir.getwd, user)
|
131
|
-
end
|
132
|
-
|
133
|
-
opts.on('-o',
|
134
|
-
'--out OUT_FILE',
|
135
|
-
'The file to dump a generated user to.') do |file|
|
136
|
-
@out_file = File.join(Dir.getwd, file)
|
137
|
-
end
|
138
|
-
|
139
|
-
opts.on('-k',
|
140
|
-
'--app-key KEY',
|
141
|
-
'Path to libspotify application key.') do |key|
|
142
|
-
@spotify_appkey_file = File.join(Dir.getwd, key)
|
83
|
+
opts.on('-l',
|
84
|
+
'--level LEVEL',
|
85
|
+
'The level to play.') do |file|
|
86
|
+
@level_file = File.join(Dir.getwd, file)
|
143
87
|
end
|
144
|
-
|
145
|
-
opts.on('-
|
146
|
-
'--
|
147
|
-
'
|
148
|
-
@
|
88
|
+
|
89
|
+
opts.on('-u',
|
90
|
+
'--user USER',
|
91
|
+
'The user the players will recommend music for.') do |user|
|
92
|
+
@user_file = File.join(Dir.getwd, user)
|
149
93
|
end
|
150
94
|
|
151
|
-
opts.on('-
|
152
|
-
'
|
153
|
-
@
|
95
|
+
opts.on('-d', '--delay DELAY', OptionParser::DecimalNumeric,
|
96
|
+
'The delay (in seconds) between each round.') do |delay|
|
97
|
+
@delay = delay
|
154
98
|
end
|
155
99
|
|
156
100
|
opts.on('-b', '--browser-ui',
|
@@ -12,20 +12,24 @@ module MonkeyMusic
|
|
12
12
|
puts "\n"*5
|
13
13
|
end
|
14
14
|
|
15
|
-
def update(level)
|
15
|
+
def update(level, query_time = 0)
|
16
16
|
# Clear screen
|
17
17
|
puts "\e[H\e[2J"
|
18
18
|
# Level
|
19
19
|
puts level.to_s
|
20
20
|
# Score
|
21
21
|
puts "\n"
|
22
|
-
puts "="*10
|
23
|
-
puts "\n"
|
24
22
|
level.players.each do |player|
|
25
|
-
|
26
|
-
puts "
|
23
|
+
monkey = player.monkey
|
24
|
+
puts "---"
|
25
|
+
print "#{monkey.name} | "
|
26
|
+
print "Score: #{monkey.score} | "
|
27
|
+
puts "Capacity: #{monkey.remaining_capacity}"
|
28
|
+
monkey.carrying.each { |t| puts "#{t.value}p: #{t.name}" }
|
29
|
+
print("\n"*monkey.remaining_capacity)
|
27
30
|
end
|
28
|
-
|
31
|
+
puts "---"
|
32
|
+
sleep [@delay - query_time, 0].max
|
29
33
|
end
|
30
34
|
end
|
31
35
|
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'hallon'
|
3
|
+
|
4
|
+
module MonkeyMusic
|
5
|
+
class Generator
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
OptionParser.new do |opts|
|
9
|
+
opts.banner = 'Usage: monkeymusic-generate [options]'
|
10
|
+
|
11
|
+
opts.on('-g',
|
12
|
+
'--generate TOPLIST_FILE',
|
13
|
+
'Generate a user from a toplist file.') do |user|
|
14
|
+
@toplist_file = File.join(Dir.getwd, user)
|
15
|
+
end
|
16
|
+
|
17
|
+
opts.on('-o',
|
18
|
+
'--out OUT_FILE',
|
19
|
+
'The file to dump a generated user to.') do |file|
|
20
|
+
@out_file = File.join(Dir.getwd, file)
|
21
|
+
end
|
22
|
+
|
23
|
+
opts.on('-k',
|
24
|
+
'--app-key KEY',
|
25
|
+
'Path to libspotify application key.') do |key|
|
26
|
+
@spotify_appkey_file = File.join(Dir.getwd, key)
|
27
|
+
end
|
28
|
+
|
29
|
+
opts.on('-a',
|
30
|
+
'--account ACCOUNT',
|
31
|
+
'Username for a Spotify premium account.') do |account|
|
32
|
+
@spotify_account = account
|
33
|
+
end
|
34
|
+
|
35
|
+
opts.on('-w', '--password PASSWORD',
|
36
|
+
'Password for a Spotify premium account.') do |password|
|
37
|
+
@spotify_password = password
|
38
|
+
end
|
39
|
+
|
40
|
+
opts.on_tail('-h',
|
41
|
+
'--help',
|
42
|
+
'Show this message.') do
|
43
|
+
puts opts
|
44
|
+
exit
|
45
|
+
end
|
46
|
+
end.parse!
|
47
|
+
end
|
48
|
+
|
49
|
+
def run
|
50
|
+
if generate_user?
|
51
|
+
# Create user
|
52
|
+
user = User.new
|
53
|
+
# Connect to libspotify
|
54
|
+
Hallon.load_timeout = 0
|
55
|
+
session = Hallon::Session.initialize(IO.read(@spotify_appkey_file))
|
56
|
+
session.login!(@spotify_account, @spotify_password)
|
57
|
+
# Load toplists
|
58
|
+
puts "Loading toplists from #{@toplist_file}..."
|
59
|
+
toplist_loader = ToplistLoader.new(@toplist_file)
|
60
|
+
toplist_loader.load_for_user!(user)
|
61
|
+
# Generate recommendations
|
62
|
+
puts "Loading recommendations..."
|
63
|
+
loaded_toplists = toplist_loader.loaded_toplists
|
64
|
+
recommendation_loader = RecommendationLoader.new(loaded_toplists)
|
65
|
+
recommendation_loader.load_for_user!(user)
|
66
|
+
# Disconnect from libspotify
|
67
|
+
session.logout!
|
68
|
+
# Evaluate recommendations
|
69
|
+
puts "Evaluating recommendations..."
|
70
|
+
score_system = ScoreSystem.new
|
71
|
+
score_system.evaluate_user_recommendations!(user)
|
72
|
+
# Dump and print the user
|
73
|
+
File.open(@out_file, 'w') do |f|
|
74
|
+
f.write(user.dump)
|
75
|
+
end
|
76
|
+
puts "====="
|
77
|
+
puts "DONE!"
|
78
|
+
puts "====="
|
79
|
+
puts "Loaded tracks:"
|
80
|
+
user.recommendations.group_by(&:multiplier).sort.each do |k,v|
|
81
|
+
puts "#Multiplier #{k}:\t#{v.length}"
|
82
|
+
end
|
83
|
+
exit
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def generate_user?
|
90
|
+
(defined? @toplist_file) &&
|
91
|
+
(defined? @out_file) &&
|
92
|
+
(defined? @spotify_appkey_file) &&
|
93
|
+
(defined? @spotify_account) &&
|
94
|
+
(defined? @spotify_password)
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
metadata
CHANGED
@@ -1,68 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: monkeymusic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Oscar Soderlund
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
11
|
+
date: 2013-05-07 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: hallon
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ! '>='
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0'
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: rack
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ! '>='
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '0'
|
38
|
-
type: :runtime
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ! '>='
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: '0'
|
46
13
|
- !ruby/object:Gem::Dependency
|
47
14
|
name: json
|
48
15
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ! '>='
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '0'
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ! '>='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: em-websocket
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
16
|
requirements:
|
67
17
|
- - ! '>='
|
68
18
|
- !ruby/object:Gem::Version
|
@@ -70,7 +20,6 @@ dependencies:
|
|
70
20
|
type: :runtime
|
71
21
|
prerelease: false
|
72
22
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
23
|
requirements:
|
75
24
|
- - ! '>='
|
76
25
|
- !ruby/object:Gem::Version
|
@@ -82,6 +31,11 @@ executables:
|
|
82
31
|
extensions: []
|
83
32
|
extra_rdoc_files: []
|
84
33
|
files:
|
34
|
+
- lib/monkey_music_generate.rb
|
35
|
+
- lib/monkey_music_generate/recommendation_loader.rb
|
36
|
+
- lib/monkey_music_generate/toplist_loader.rb
|
37
|
+
- lib/monkey_music_generate/generator.rb
|
38
|
+
- lib/monkey_music_generate/score_system.rb
|
85
39
|
- lib/monkey_music.rb
|
86
40
|
- lib/monkey_music/level.rb
|
87
41
|
- lib/monkey_music/units/wall.rb
|
@@ -89,19 +43,21 @@ files:
|
|
89
43
|
- lib/monkey_music/units/track.rb
|
90
44
|
- lib/monkey_music/units/base.rb
|
91
45
|
- lib/monkey_music/units/user.rb
|
92
|
-
- lib/monkey_music/recommendation_loader.rb
|
93
46
|
- lib/monkey_music/game.rb
|
94
|
-
- lib/monkey_music/toplist_loader.rb
|
95
47
|
- lib/monkey_music/runner.rb
|
96
48
|
- lib/monkey_music/player.rb
|
97
49
|
- lib/monkey_music/level_loader.rb
|
98
50
|
- lib/monkey_music/ui/browser_ui.rb
|
99
51
|
- lib/monkey_music/ui/console_ui.rb
|
100
|
-
-
|
52
|
+
- levels/testmaze_30.rb
|
53
|
+
- levels/bomberman2.rb
|
101
54
|
- levels/the_last_crusade.rb
|
102
55
|
- levels/testlevel.rb
|
56
|
+
- levels/testmaze_10.rb
|
103
57
|
- levels/testlevel_maze.rb
|
104
58
|
- levels/travelling_salesmonkeys.rb
|
59
|
+
- levels/testmaze_20.rb
|
60
|
+
- bin/monkeymusic-generate
|
105
61
|
- bin/monkeymusic
|
106
62
|
- users/synth.yaml
|
107
63
|
- users/synth.rb
|
@@ -111,26 +67,25 @@ files:
|
|
111
67
|
- LICENSE
|
112
68
|
homepage: https://github.com/odsod/monkey-music
|
113
69
|
licenses: []
|
70
|
+
metadata: {}
|
114
71
|
post_install_message:
|
115
72
|
rdoc_options: []
|
116
73
|
require_paths:
|
117
74
|
- lib
|
118
75
|
required_ruby_version: !ruby/object:Gem::Requirement
|
119
|
-
none: false
|
120
76
|
requirements:
|
121
77
|
- - ! '>='
|
122
78
|
- !ruby/object:Gem::Version
|
123
79
|
version: '0'
|
124
80
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
|
-
none: false
|
126
81
|
requirements:
|
127
82
|
- - ! '>='
|
128
83
|
- !ruby/object:Gem::Version
|
129
84
|
version: 1.3.4
|
130
85
|
requirements: []
|
131
86
|
rubyforge_project: monkeymusic
|
132
|
-
rubygems_version:
|
87
|
+
rubygems_version: 2.0.3
|
133
88
|
signing_key:
|
134
|
-
specification_version:
|
89
|
+
specification_version: 4
|
135
90
|
summary: A runtime for an AI programming competition.
|
136
91
|
test_files: []
|