runescape 0.0.0 → 0.0.1

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
  SHA256:
3
- metadata.gz: 9b2742a80bb6157c4d154cd80edc523a84ba82ae6221362277d6f184304d2d69
4
- data.tar.gz: 8dd1eddae5aaca5be17f8aee996e8a94abb3da52a0629e50efb28d4cb1510bfb
3
+ metadata.gz: 03e73aa20edf6f3e65584526fd82f0a87639d4ab1808000c7c377f851ce120c7
4
+ data.tar.gz: 5078e079d337185be49b6426ec7ad9033e66fe7b07dcdb5c4fd7def4631a4a27
5
5
  SHA512:
6
- metadata.gz: 2018043ed2fa4ad922b97e774f621fadd3c903e0747ac0bc32903336127625e69a74c8b14f2f8664b795316113faf8c3f738d93f7e975d490a372ca96fd3f16f
7
- data.tar.gz: 9ed506243fa284da7b79d2853f8879222a1053e7b0042e338dc80235f9b6b7dd6315b822113bcbf295bf367b35462d71bea6f1c6922a13a842c76fb58e65b65d
6
+ metadata.gz: 4b41c109913580ab72f5bd11d7ea9eef50a92ae1fff9de58c24ff64331622020668fe5f1ee8e1ed423c8831a9558fbd4e060c433d3df004d3aa36780aa5b64e9
7
+ data.tar.gz: 2c12a835f048d34068fa160c4ab4984830fe5083c238fc0e91aff5506f924574f4b09766017c78dfaa3e1815a11bc86ee78563a7615dd2949cf6743ec92b3247
@@ -0,0 +1,17 @@
1
+ # runescape
2
+ [![Gem Version](https://badge.fury.io/rb/runescape.svg)](https://badge.fury.io/rb/runescape)
3
+ [![Build Status](https://travis-ci.com/marcellosabino/runescape.svg?branch=master)](https://travis-ci.com/marcellosabino/runescape)
4
+ [![codecov](https://codecov.io/gh/marcellosabino/runescape/branch/master/graph/badge.svg)](https://codecov.io/gh/marcellosabino/runescape)
5
+
6
+ A Ruby Gem that provides useful methods for RuneScape related applications.
7
+
8
+ # Installation
9
+ ```
10
+ gem install runescape
11
+ ```
12
+
13
+ # Documentation
14
+ TODO
15
+
16
+ # License
17
+ MIT
@@ -0,0 +1,83 @@
1
+ module OldSchool
2
+ ##
3
+ # :nodoc:
4
+ module HiScores
5
+ MODES = {
6
+ default: 'https://secure.runescape.com/m=hiscore_oldschool/',
7
+ ironman: 'http://services.runescape.com/m=hiscore_oldschool_ironman/',
8
+ ultimate: 'http://services.runescape.com/m=hiscore_oldschool_ultimate/',
9
+ hardcore: 'http://services.runescape.com/m=hiscore_oldschool_hardcore_ironman/',
10
+ deadman: 'http://services.runescape.com/m=hiscore_oldschool_deadman/',
11
+ seasonal: 'http://services.runescape.com/m=hiscore_oldschool_seasonal/',
12
+ tournament: 'http://services.runescape.com/m=hiscore_oldschool_tournament/'
13
+ }.freeze
14
+
15
+ RESOURCE = {
16
+ stats: 'index_lite.ws?player='
17
+ }.freeze
18
+
19
+ SKILLS = %i[
20
+ overall attack defence strength
21
+ hitpoints ranged prayer magic
22
+ cooking woodcutting fletching fishing
23
+ firemaking crafting smithing mining
24
+ herblore agility thieving slayer
25
+ farming runecraft hunter construction
26
+ ].freeze
27
+
28
+ MEMBER_SKILLS = %i[
29
+ fletching herblore agility thieving
30
+ slayer farming hunter construction
31
+ ].freeze
32
+
33
+ COMBAT_SKILLS = %i[
34
+ attack defence strength hitpoints
35
+ ranged prayer magic
36
+ ].freeze
37
+
38
+ MINIGAMES = %i[
39
+ bh_hunter bh_rogue
40
+ clue_all clue_easy clue_medium clue_hard clue_elite clue_master
41
+ ].freeze
42
+
43
+ MINIGAMES_SAFE = %i[
44
+ clue_all clue_easy clue_medium
45
+ clue_hard clue_elite clue_master
46
+ ].freeze
47
+
48
+ HUMAN_NAME = {
49
+ overall: 'Overall',
50
+ attack: 'Attack',
51
+ defence: 'Defence',
52
+ strength: 'Strength',
53
+ hitpoints: 'Hitpoints',
54
+ ranged: 'Ranged',
55
+ prayer: 'Prayer',
56
+ magic: 'Magic',
57
+ cooking: 'Cooking',
58
+ woodcutting: 'Woodcutting',
59
+ fletching: 'Fletching',
60
+ fishing: 'Fishing',
61
+ firemaking: 'Firemaking',
62
+ crafting: 'Crafting',
63
+ smithing: 'Smithing',
64
+ mining: 'Mining',
65
+ herblore: 'Herblore',
66
+ agility: 'Agility',
67
+ thieving: 'Thieving',
68
+ slayer: 'Slayer',
69
+ farming: 'Farming',
70
+ runecraft: 'Runecraft',
71
+ hunter: 'Hunter',
72
+ construction: 'Construction'
73
+ }.freeze
74
+
75
+ ##
76
+ # @note The symbol must be a valid skill or minigame
77
+ # @return [String] the human readable name for a given symbol
78
+ # @return ["Undefined"] if the given symbol is invalid
79
+ def self.human_name_for(symbol)
80
+ HUMAN_NAME[symbol] || 'Undefined'
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,66 @@
1
+ require_relative 'hiscores'
2
+
3
+ module OldSchool
4
+ module HiScores # :nodoc:
5
+ ##
6
+ # Represents a Minigame in OldSchool Runescape
7
+ class Minigame
8
+ # @return [String] The name of this minigame
9
+ attr_reader :name
10
+ # @return [Symbol] The symbol of this minigame
11
+ attr_reader :symbol
12
+ # @return [Number] The rank of this minigame on the HiScores
13
+ attr_reader :rank
14
+ # @return [Number] The score of this minigame on the HiScores
15
+ attr_reader :score
16
+
17
+ ##
18
+ # Creates a new Minigame instance
19
+ #
20
+ # @see OldSchool::HiScores::MINIGAMES Complete list of OldSchool Minigames
21
+ #
22
+ # @param symbol [Symbol] the symbol of the minigame
23
+ # @param rank [Number] the rank of the minigame on the HiScores
24
+ # @param score [Number] the score of the minigame on the HiScores
25
+ def initialize(symbol, rank = 0, score = 0)
26
+ @symbol = symbol
27
+ @name = HiScores.human_name_for symbol
28
+ @rank = rank
29
+ @score = score
30
+ end
31
+
32
+ ##
33
+ # Determines if this minigame is safe
34
+ #
35
+ # A minigame is safe if when you die while doing
36
+ # the minigame, you don't lose your items.
37
+ #
38
+ # @example Bounty Hunter you lose items on death
39
+ # minigame = OldSchool::HiScores::Minigame.new :bh_hunter
40
+ # minigame.safe? #=> false
41
+ # @note You can die during Clue Scrolls, but their intents are
42
+ # not PVP or even combat related, so clue scrolls are listed
43
+ # as safe.
44
+ # @return [true] if the minigame is classified as safe
45
+ # @return [false] if the minigame is classified as dangerous
46
+ def safe?
47
+ HiScores::MINIGAMES_SAFE.include? @symbol
48
+ end
49
+
50
+ ##
51
+ # Determines if this minigame is dangerous
52
+ #
53
+ # A minigame is dangerous if you lose items when you die
54
+ #
55
+ # @example Bounty Hunter Rogue is a dangerous minigame
56
+ # minigame = OldSchool::HiScores::Minigame.new :bh_rogue
57
+ # minigame.dangerous? #=> true
58
+ #
59
+ # @note This is the inverse of #safe?
60
+ # @see #safe?
61
+ def dangerous?
62
+ !safe?
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,129 @@
1
+ require_relative 'hiscores'
2
+
3
+ module OldSchool
4
+ module HiScores
5
+ ##
6
+ # Represents a Skill in OldSchool Runescape
7
+ class Skill
8
+ ##
9
+ # @example
10
+ # attack = OldSchool::HiScores::Skill.new :attack
11
+ # attack.name #=> "Attack"
12
+ # @return [String] The name of this Skill
13
+ attr_reader :name
14
+ # @return [Symbol] The of this Skill
15
+ attr_reader :symbol
16
+ # @return [Number] The rank of this Skill on the HiScores
17
+ attr_reader :rank
18
+ # @return [Number] The level of this Skill on the HiScores
19
+ attr_reader :level
20
+ # @return [Number] The experience of this Skill on the HiScores
21
+ attr_reader :experience
22
+
23
+ ##
24
+ # Creates a new instance of a Skill
25
+ #
26
+ # @param symbol [Symbol] the Symbol of this Skill
27
+ # @param rank [Number] the rank on the HiScores in this Skill
28
+ # @param level [Number] the level in this Skill
29
+ # @param experience [Number] the total number of experience in this Skill
30
+ def initialize(symbol, rank = 0, level = 1, experience = 0)
31
+ @symbol = symbol
32
+ @name = HiScores.human_name_for symbol
33
+ @rank = rank
34
+ @level = level
35
+ @experience = experience
36
+ end
37
+
38
+ ##
39
+ # Determines if this Skill affects a Player's combat level
40
+ #
41
+ # @example Attack affects combat level
42
+ # skill = OldSchool::HiScores::Skill.new :attack
43
+ # skill.combat? #=> true
44
+ # @example Farming doesn't affect combat level
45
+ # skill = OldSchool::HiScores::Skill.new :farming
46
+ # skill.combat? #=> false
47
+ #
48
+ # @see #noncombat?
49
+ #
50
+ # @return [true] if this skill affects a player's combat level
51
+ # @return [false] if this skill does not affect a player's combat level
52
+ def combat?
53
+ HiScores::COMBAT_SKILLS.include? @symbol
54
+ end
55
+
56
+ ##
57
+ # Determines if this Skill will not affect a Player's combat level
58
+ #
59
+ # @example Farming doesn't affect combat level
60
+ # skill = OldSchool::HiScores::Skill.new :farming
61
+ # skill.noncombat? #=> true
62
+ # @example Attack affects combat level
63
+ # skill = OldSchool::HiScores::Skill.new :attack
64
+ # skill.noncombat? #=> false
65
+ #
66
+ # @note This is the inverse of #combat?
67
+ # @see #combat?
68
+ # @see #skiller_friendly?
69
+ #
70
+ # @return [true] if this skill does not affect a Player's combat level
71
+ # @return [false] if this skill affects a Player's combat level
72
+ def noncombat?
73
+ !combat?
74
+ end
75
+
76
+ ##
77
+ # Determines if this Skill will not affect a Player's combat level
78
+ #
79
+ # @note This is an alias for #noncombat?
80
+ # @see #noncombat?
81
+ # @see #combat?
82
+ def skiller_friendly?
83
+ noncombat?
84
+ end
85
+
86
+ ##
87
+ # Determines if this is a member's only skill
88
+ #
89
+ # @example Slayer is a member's only skill
90
+ # skill = OldSchool::HiScores::Skill.new :slayer
91
+ # skill.member? #=> true
92
+ # @example Woodcutting is a free to play skill
93
+ # skill = OldSchool::HiScores::Skill.new :woodcutting
94
+ # skill.member? #=> false
95
+ #
96
+ # @return [true] if this is a member's only skill
97
+ # @return [false] if this is free to play
98
+ def member?
99
+ HiScores::MEMBER_SKILLS.include? @symbol
100
+ end
101
+
102
+ ##
103
+ # Determines if this is a free to play skill
104
+ #
105
+ # @example Woodcutting is a free to play skill
106
+ # skill = OldSchool::HiScores::Skill.new :woodcutting
107
+ # skill.free? #=> true
108
+ # @example Slayer is a member's only skill
109
+ # skill = OldSchool::HiScores::Skill.new :slayer
110
+ # skill.free? #=> false
111
+ #
112
+ # @return [true] if this skill is free to play
113
+ # @return [false] if this skill is member's only
114
+ def free?
115
+ !member?
116
+ end
117
+
118
+ ##
119
+ # Determines if this is a free to play skill
120
+ #
121
+ # @note This is an alias for #free?
122
+ # @see #free?
123
+ # @see #member?
124
+ def nonmember?
125
+ free?
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,222 @@
1
+ require 'csv'
2
+ require 'open-uri'
3
+ require_relative 'hiscores/hiscores'
4
+ require_relative 'hiscores/minigame'
5
+ require_relative 'hiscores/skill'
6
+
7
+ ##
8
+ # Module representing all things OldSchool
9
+ module OldSchool
10
+ ##
11
+ # Represents a single player on OldSchool
12
+ class Player
13
+ # @return [Symbol] the mode of the Player
14
+ attr_reader :mode
15
+ # @return [String] the Player's username
16
+ attr_reader :username
17
+ ##
18
+ # @example Extract Skill information from a Player
19
+ # player = OldSchool::Player.new 'ruby'
20
+ # player.skills[:overall].level #=> 1232
21
+ # player.skills[:hunter] #=> OldSchool::HiScores::Skill
22
+ # player.skills[:hunter].level #=> 72
23
+ # player.skills[:hunter].experience #=> 780_000
24
+ # player.skills[:hunter].rank #=> 131_232
25
+ # player.skills #=> Hash of all Skills
26
+ #
27
+ # @see OldSchool::HiScores::SKILLS List of all possible Skill Symbols
28
+ #
29
+ # @return [Hash<Symbol, OldSchool::HiScores::Skill>] a Hash containing
30
+ # all of the Player's skill information as it stands on the HiScores
31
+ attr_reader :skills
32
+ ##
33
+ # @example Extract Minigame information from a Player
34
+ # player = OldSchool::Player.new 'ruby'
35
+ # player.minigames[:bh_hunter].score #=> 1_344
36
+ # player.minigames[:bh_rogue].score #=> 900
37
+ # player.minigames[:clue_all].rank #=> 10_333
38
+ # player.minigames[:clue_elite].rank #=> 90_232
39
+ # player.minigames #=> Hash of all Minigames
40
+ #
41
+ # @see OldSchool::HiScores::MINIGAMES List of all possible Minigame Symbols
42
+ # @return [Hash<Symbol, OldSchool::HiScores::Minigame>] a Hash containing
43
+ # all of the Player's minigame information as it stands on the HiScores
44
+ attr_reader :minigames
45
+
46
+ ##
47
+ # Creates a new Player object
48
+ #
49
+ # Creates a new player object with the specified
50
+ # username
51
+ #
52
+ # @example Create a new OldSchool Player
53
+ # player = OldSchool::Player.new 'ruby'
54
+ # player.mode #=> :default
55
+ # player.username #=> "ruby"
56
+ # @example Create a new Ironman Player
57
+ # player = OldSchool::Player.new 'ruby', :ironman
58
+ # player.mode #=> :ironman
59
+ # player.username #=> "ruby"
60
+ #
61
+ # @see OldSchool::HiScores::MODES List of all available game modes
62
+ #
63
+ # @param username [String] the username of the Player
64
+ # @param mode [Symbol] the mode of the Player, such as
65
+ # :default, :ironman, :ultimate, :hardcore, :deadman etc.
66
+ def initialize(username, mode = :default)
67
+ @username = username
68
+ @mode = mode
69
+ @csv = nil
70
+
71
+ generate_hs_stats
72
+ end
73
+
74
+ ##
75
+ # Determines if this Player was/is a member
76
+ #
77
+ # This method determines that a Player is a member
78
+ # if they have any experience in any of their member's
79
+ # only skills. Some members, for example, do not have
80
+ # experience in any of their member's only skills.
81
+ #
82
+ # @example For a Player with experience in a member's only skill
83
+ # member = OldSchool::Player.new 'member'
84
+ # member.member? #=> true
85
+ # @example For a Player with no experience in a member's only skill
86
+ # f2p_player = OldSchool::Player.new 'f2p guy'
87
+ # f2p_player.member? #=> false
88
+ #
89
+ # @note There is a certain level of inaccuracy using this
90
+ # method, since this method determines a Player is a member
91
+ # if they have experience in their member's only skills.
92
+ #
93
+ # @return [true] if this Player has experience in any member only skill
94
+ # @return [false] if this Player has no experience in any member only skill
95
+ def member?
96
+ @skills.each do |_, skill|
97
+ return true if skill.experience > 0 && skill.member?
98
+ end
99
+ false
100
+ end
101
+
102
+ ##
103
+ # Determines if this Player is a F2P Player
104
+ #
105
+ # This method dermines that a Player is F2P if they do not
106
+ # have any experience in their member's only skills.
107
+ #
108
+ # @example For a player with no experience in a member's only skill
109
+ # f2p = OldSchool::Player.new 'f2p'
110
+ # f2p.free? #=> true
111
+ # @example For a Player with experience in a member's only skill
112
+ # member = OldSchool::Player.new 'member'
113
+ # member.free? #=> false
114
+ #
115
+ # @note This method is the inverse of #member?
116
+ # @see #member?
117
+ #
118
+ # @return [true] if this Player has no experience in any member only skill
119
+ # @return [false] if this Player has experience in any member only skill
120
+ def free?
121
+ !member?
122
+ end
123
+
124
+ ##
125
+ # An alias for #free?
126
+ # @see #free?
127
+ def nonmember?
128
+ free?
129
+ end
130
+
131
+ ##
132
+ # Determines if this Player is a skiller
133
+ #
134
+ # This method determines that a Player is a skiller by
135
+ # ensuring that the player has no combat-oriented skills
136
+ # over the level of 1 (with the exception of 10 hitpoints).
137
+ #
138
+ # @example For a level 3 skiller
139
+ # skiller = OldSchool::Player.new 'skiller'
140
+ # skiller.skiller? #=> true
141
+ # @example For a Player who has > 1 in any combat skill
142
+ # main = OldSchool::Player.new 'main'
143
+ # main.skiller? #=> false
144
+ #
145
+ # @return [true] if the player is classified as a skiller
146
+ # @return [false] if the player is not classified as a skiller
147
+ def skiller?
148
+ skiller = true
149
+ @skills.each do |_, skill|
150
+ next if skill.symbol == :hitpoints && skill.level <= 10
151
+
152
+ skiller = false if skill.combat? && skill.level > 1
153
+ end
154
+ skiller
155
+ end
156
+
157
+ ##
158
+ # Determines if this player is not a skiller
159
+ #
160
+ # @example For a level 3 skiller
161
+ # skiller = OldSchool::Player.new 'skiller'
162
+ # skiller.nonskiller? #=> false
163
+ # @example For a Player who has > 1 in any combat skill
164
+ # main = OldSchool::Player.new 'main'
165
+ # main.nonskiller? #=> true
166
+ #
167
+ # @note This is the inverse of #skiller?
168
+ # @see #skiller?
169
+ #
170
+ # @return [true] if the player is not classified as a skiller
171
+ # @return [false] if the player is classified as a skiller
172
+ def nonskiller?
173
+ !skiller?
174
+ end
175
+
176
+ private
177
+
178
+ def open_and_read(url)
179
+ open(url, &:read)
180
+ end
181
+
182
+ def csv_data
183
+ mode = HiScores::MODES[@mode]
184
+ resource = HiScores::RESOURCE[:stats] + @username
185
+ url = mode + resource
186
+
187
+ @csv = CSV.parse(open_and_read(url)).map { |r| r.map(&:to_i) }
188
+ end
189
+
190
+ def generate_hs_stats
191
+ csv_data if @csv.nil?
192
+
193
+ generate_skills
194
+ generate_minigames
195
+ end
196
+
197
+ def generate_skills
198
+ @skills = {}
199
+ skills_arr = HiScores::SKILLS
200
+
201
+ @csv.each_with_index do |row, i|
202
+ break if i >= HiScores::SKILLS.length
203
+
204
+ @skills[HiScores::SKILLS[i]] = HiScores::Skill.new(
205
+ skills_arr[i], row[0], row[1], row[2]
206
+ )
207
+ end
208
+ end
209
+
210
+ def generate_minigames
211
+ @minigames = {}
212
+ minigames_arr = HiScores::MINIGAMES
213
+ range = @skills.length..@skills.length + HiScores::MINIGAMES.length - 1
214
+
215
+ range.each_with_index do |val, i|
216
+ @minigames[HiScores::MINIGAMES[i]] = HiScores::Minigame.new(
217
+ minigames_arr[i], @csv[val][0], @csv[val][1]
218
+ )
219
+ end
220
+ end
221
+ end
222
+ end
@@ -1,6 +1,7 @@
1
- ##
2
- # A Ruby Gem that provides useful methods for RuneScape related applications.
3
- #
4
- # @author Marcello Sabino <marcello.github@gmail.com>
5
- module Runescape
6
- end
1
+ ##
2
+ # A Ruby Gem that provides useful methods for RuneScape related applications.
3
+ #
4
+ # @author Marcello Sabino <marcello.github@gmail.com>
5
+ module Runescape
6
+ VERSION = '0.0.1'.freeze
7
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: runescape
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
- - Marcello Sabino
7
+ - Marcello A. Sabino
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-31 00:00:00.000000000 Z
11
+ date: 2019-01-08 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A Ruby Gem that provides useful methods for RuneScape related applications.
14
14
  email: marcello.github@gmail.com
@@ -16,6 +16,11 @@ executables: []
16
16
  extensions: []
17
17
  extra_rdoc_files: []
18
18
  files:
19
+ - README.md
20
+ - lib/oldschool/hiscores/hiscores.rb
21
+ - lib/oldschool/hiscores/minigame.rb
22
+ - lib/oldschool/hiscores/skill.rb
23
+ - lib/oldschool/player.rb
19
24
  - lib/runescape.rb
20
25
  homepage: https://github.com/marcellosabino/runescape
21
26
  licenses:
@@ -29,16 +34,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
29
34
  requirements:
30
35
  - - ">="
31
36
  - !ruby/object:Gem::Version
32
- version: '0'
37
+ version: 2.2.0
33
38
  required_rubygems_version: !ruby/object:Gem::Requirement
34
39
  requirements:
35
40
  - - ">="
36
41
  - !ruby/object:Gem::Version
37
- version: '0'
42
+ version: 1.8.11
38
43
  requirements: []
39
44
  rubyforge_project:
40
45
  rubygems_version: 2.7.6
41
46
  signing_key:
42
47
  specification_version: 4
43
- summary: A Ruby Gem that provides useful methods for RuneScape
48
+ summary: A Ruby Gem that provides useful methods for RuneScape related applications
44
49
  test_files: []