need_for_type 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 639aa5cc56ee82cb00ffec60701a77825a32e443
4
- data.tar.gz: 80df9d75de5fd5dfe59fcb45b4b8d540cc916142
3
+ metadata.gz: 3e9ac057bc5ffec238c4c19a18199453c10ee97e
4
+ data.tar.gz: 57f4b54ab2ac962fab3d459adbf23166a10db4d0
5
5
  SHA512:
6
- metadata.gz: 8096e4b4bd1da4e34b5115f7516d886a807ec9a568035bdf9fcdc27334cc2e3d8372803d03211ddc22dfcc4524924247e3178e1058e986c8acd62746b5f6934c
7
- data.tar.gz: b05f61d604f63a7bb15954c483203126d0e72aa9a521d13f777a9438f103928d96c26ad0a5a0c34faf13b21c544e7f58ccd51437d4d692e876a768a56549b896
6
+ metadata.gz: 400d012e3c798d9900471714fe1bd861994b96b25c1cbeb637ec2a1f66fe6713390dc6149de063d74811c59c4fa7261c97aa8d9579badba56cf199783d4c9537
7
+ data.tar.gz: e3b390ee4248032e478a91f00513fbd0fbb6d21c48ce20e129eb1b2d8577efa0305113dc1caac2e00055ef6d0ddabfe3ee342465c056d09fb309abb604e4b0bf
data/README.md CHANGED
@@ -28,7 +28,7 @@ You can run `./bin/console` for an interactive prompt that will allow you to exp
28
28
 
29
29
  To install the development version of the gem onto your local machine, run `bundle exec rake install`.
30
30
 
31
- To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
31
+ To release a new version, update the version number in `version.rb` and update the `CHANGELOG.md` accordingly, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
32
 
33
33
 
34
34
  ## Contributing
@@ -0,0 +1,23 @@
1
+ require 'json'
2
+ require 'httparty'
3
+
4
+ module NeedForType::API
5
+ @@api_url = 'need-for-type.herokuapp.com'
6
+
7
+ def get_scores(text_id)
8
+ url = "https://#{@@api_url}/v1/scores?text_id=#{text_id}"
9
+ response = HTTParty.get(url)
10
+ JSON.parse(response.body)
11
+ end
12
+
13
+ def post_score(username, text_id, stats)
14
+ url = "https://#{@@api_url}/v1/scores"
15
+ headers = { 'Content-Type' => 'application/json' }
16
+ body = { score: { username: username,
17
+ text_id: text_id,
18
+ wpm: stats[:wpm],
19
+ time: stats[:total_time],
20
+ accuracy: stats[:accuracy] } }
21
+ HTTParty.post(url, headers: headers, body: body.to_json)
22
+ end
23
+ end
@@ -51,26 +51,52 @@ module NeedForType
51
51
  end
52
52
  end
53
53
 
54
- def render_end(stats, selected_option)
54
+ def render_end(stats, scores, selected_option)
55
55
  self.render_box do
56
56
  self.render_with_color(GREEN) do
57
57
  self.set_render_pos(3, 4)
58
58
  self.addstr("Congratulations you crossed the finish line!")
59
59
 
60
- render_stats(stats, 5, 4, :vertical)
60
+ self.set_render_pos(5, 4)
61
+ self.addstr("Your score:")
61
62
  end
63
+ render_stats(stats, 6, 4, :vertical)
62
64
 
63
- self.set_render_pos(9, 4)
65
+ self.set_render_pos(10, 4)
66
+ self.render_text("Top scores:", GREEN, NORMAL)
67
+ render_scores(scores, 11, 4)
68
+
69
+ self.set_render_pos(17, 4)
64
70
  mode = standout_mode(0, selected_option)
65
- self.render_text("1. Restart", WHITE, mode)
71
+ self.render_text("1. Submit Score", WHITE, mode)
66
72
 
67
- self.set_render_pos(10, 4)
73
+ self.set_render_pos(18, 4)
68
74
  mode = standout_mode(1, selected_option)
69
- self.render_text("2. Main Menu", WHITE, mode)
75
+ self.render_text("2. Restart", WHITE, mode)
70
76
 
71
- self.set_render_pos(11, 4)
77
+ self.set_render_pos(19, 4)
72
78
  mode = standout_mode(2, selected_option)
73
- self.render_text("3. Exit", WHITE, mode)
79
+ self.render_text("3. Main Menu", WHITE, mode)
80
+
81
+ self.set_render_pos(20, 4)
82
+ mode = standout_mode(3, selected_option)
83
+ self.render_text("4. Exit", WHITE, mode)
84
+ end
85
+ end
86
+
87
+ def render_submit_score(username)
88
+ self.render_box do
89
+ self.set_render_pos(3, 4)
90
+ self.render_text("Submit your score !", GREEN, NORMAL)
91
+
92
+ self.set_render_pos(5, 4)
93
+ self.addstr("Type your username...")
94
+
95
+ self.set_render_pos(6, 4)
96
+ self.addstr(username)
97
+
98
+ self.set_render_pos(8, 4)
99
+ self.addstr("Click ENTER to submit")
74
100
  end
75
101
  end
76
102
 
@@ -87,8 +113,8 @@ module NeedForType
87
113
 
88
114
  def render_stats(stats, y, x, mode)
89
115
  stats_text = [
90
- "Time: #{stats[:total_time].round(2)} sec",
91
116
  "WPM: #{stats[:wpm].round}",
117
+ "Time: #{stats[:total_time].round(2)} sec",
92
118
  "Accuracy: #{stats[:accuracy].round(2)} %"
93
119
  ]
94
120
 
@@ -104,5 +130,18 @@ module NeedForType
104
130
  end
105
131
  end
106
132
  end
133
+
134
+ def render_scores(scores, y, x)
135
+ if scores.empty?
136
+ self.set_render_pos(y + 1, x)
137
+ self.addstr("There are no score yet for this text.")
138
+ else
139
+ scores.each do |s|
140
+ self.set_render_pos(y, x)
141
+ self.addstr("#{s['wpm']} wpm #{s['username']}")
142
+ y += 1
143
+ end
144
+ end
145
+ end
107
146
  end
108
147
  end
@@ -1,17 +1,15 @@
1
1
  module NeedForType
2
2
  class FileManager
3
- attr_accessor :content
3
+ attr_accessor :text, :text_id
4
4
 
5
5
  def initialize()
6
6
  @path = "#{NeedForType::GEM_ROOT}/assets/texts/"
7
7
  end
8
8
 
9
- # Reads random file from difficulty folder
10
- def get_random_text
9
+ def read_random_text
11
10
  directory_count = Dir[File.join(@path, '**', '*')].count
12
- random_file = rand(1..directory_count)
13
-
14
- @content = File.read("#{@path}/text-#{random_file}.txt").strip
11
+ @text_id = rand(1..directory_count)
12
+ @text = File.read("#{@path}/text-#{@text_id}.txt").strip
15
13
  end
16
14
  end
17
15
  end
@@ -1,25 +1,30 @@
1
- require 'curses'
2
-
3
1
  require 'need_for_type/states'
2
+ require 'need_for_type/api'
4
3
 
5
4
  module NeedForType::States
6
5
  class End < Menu
6
+ include NeedForType::API
7
7
 
8
- def initialize(display_window, stats, difficulty)
8
+ def initialize(display_window, stats, difficulty, text_id)
9
9
  super(display_window)
10
- @difficulty = difficulty
11
10
  @stats = stats
11
+ @difficulty = difficulty
12
+ @text_id = text_id
13
+
12
14
  @option = 0
15
+ @scores = get_scores(@text_id)
13
16
  end
14
17
 
15
18
  def update
16
- @display_window.render_end(@stats, @option)
19
+ @display_window.render_end(@stats, @scores, @option)
17
20
 
18
- input_worker(3) do
21
+ input_worker(4) do
19
22
  case @option
20
23
  when 0
21
- return NeedForType::States::Game.new(@display_window, @difficulty)
24
+ return NeedForType::States::SubmitScore.new(@display_window, self, @text_id, @stats)
22
25
  when 1
26
+ return NeedForType::States::Game.new(@display_window, @difficulty)
27
+ when 2
23
28
  return NeedForType::States::Start.new(@display_window)
24
29
  end
25
30
  end
@@ -44,7 +44,10 @@ module NeedForType::States
44
44
 
45
45
  def handle_start_game
46
46
  file_manager = NeedForType::FileManager.new
47
- @text = file_manager.get_random_text
47
+ file_manager.read_random_text
48
+ @text = file_manager.text
49
+ @text_id = file_manager.text_id
50
+
48
51
  @display_window.render_game_text(@text, @chars_completed, @stats)
49
52
  @start_time = Time.now
50
53
 
@@ -106,7 +109,7 @@ module NeedForType::States
106
109
  def handle_end_game
107
110
  calculate_stats
108
111
 
109
- return NeedForType::States::End.new(@display_window, @stats, @difficulty)
112
+ return NeedForType::States::End.new(@display_window, @stats, @difficulty, @text_id)
110
113
  end
111
114
 
112
115
  def calculate_stats
@@ -0,0 +1,36 @@
1
+ require 'curses'
2
+
3
+ require 'need_for_type/states'
4
+ require 'need_for_type/api'
5
+
6
+ module NeedForType::States
7
+ class SubmitScore < State
8
+ include NeedForType::API
9
+
10
+ def initialize(display_window, end_state, text_id, stats)
11
+ super(display_window)
12
+ @end_state = end_state
13
+ @text_id = text_id
14
+ @stats = stats
15
+
16
+ @username = ''
17
+ end
18
+
19
+ def update
20
+ @display_window.render_submit_score(@username)
21
+
22
+ input = @display_window.get_input
23
+
24
+ if input == Curses::Key::ENTER || input == 10
25
+ post_score(@username, @text_id, @stats)
26
+ return @end_state
27
+ elsif input == Curses::Key::BACKSPACE || input == 127
28
+ @username = @username.chop
29
+ elsif input.is_a? String
30
+ @username += input
31
+ end
32
+
33
+ return self
34
+ end
35
+ end
36
+ end
@@ -3,6 +3,7 @@ require 'need_for_type/states/menu'
3
3
  require 'need_for_type/states/game'
4
4
  require 'need_for_type/states/start'
5
5
  require 'need_for_type/states/end'
6
+ require 'need_for_type/states/submit_score'
6
7
 
7
8
  module NeedForType
8
9
  module States
@@ -1,3 +1,3 @@
1
1
  module NeedForType
2
- VERSION = "0.2.2"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: need_for_type
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - tiagonbotelho
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-09-29 00:00:00.000000000 Z
12
+ date: 2016-10-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -53,6 +53,34 @@ dependencies:
53
53
  - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: json
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: httparty
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
56
84
  description: need-for-type is a terminal type racer inpired by Nitro Type
57
85
  email:
58
86
  - tiagonbotelho@gmail.com
@@ -773,6 +801,7 @@ files:
773
801
  - assets/texts/text-99.txt
774
802
  - bin/need_for_type
775
803
  - lib/need_for_type.rb
804
+ - lib/need_for_type/api.rb
776
805
  - lib/need_for_type/display_window.rb
777
806
  - lib/need_for_type/file_manager.rb
778
807
  - lib/need_for_type/states.rb
@@ -781,6 +810,7 @@ files:
781
810
  - lib/need_for_type/states/menu.rb
782
811
  - lib/need_for_type/states/start.rb
783
812
  - lib/need_for_type/states/state.rb
813
+ - lib/need_for_type/states/submit_score.rb
784
814
  - lib/need_for_type/typer.rb
785
815
  - lib/need_for_type/version.rb
786
816
  - lib/need_for_type/window.rb