steam-condenser 1.3.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -41,6 +41,7 @@ included LICENSE file.
41
41
  * Mike Połtyn – mike(at)railslove.com
42
42
  * Sam Kinard – snkinard(at)gmail.com
43
43
  * "withgod" – noname(at)withgod.jp
44
+ * John Amicangelo - amicangelo.j(at)husky.neu.edu
44
45
 
45
46
  ## See Also
46
47
 
@@ -1,11 +1,11 @@
1
1
  # This code is free software; you can redistribute it and/or modify it under
2
2
  # the terms of the new BSD License.
3
3
  #
4
- # Copyright (c) 2010-2012, Sebastian Staudt
4
+ # Copyright (c) 2010-2013, Sebastian Staudt
5
5
 
6
6
  module SteamCondenser
7
7
 
8
8
  # The current version of Steam Condenser
9
- VERSION = '1.3.0'
9
+ VERSION = '1.3.1'
10
10
 
11
11
  end
@@ -96,7 +96,8 @@ module Cacheable
96
96
  bypass_cache = args.size > arity + 1 ? !!args.pop : false
97
97
  fetch = args.size > arity ? !!args.pop : true
98
98
 
99
- object = super *args
99
+ object = self.allocate
100
+ object.send :initialize, *args
100
101
  cached_object = object.send :cached_instance
101
102
  object = cached_object unless cached_object.nil? || bypass_cache
102
103
 
@@ -1,7 +1,7 @@
1
1
  # This code is free software; you can redistribute it and/or modify it under
2
2
  # the terms of the new BSD License.
3
3
  #
4
- # Copyright (c) 2011-2012, Sebastian Staudt
4
+ # Copyright (c) 2011-2013, Sebastian Staudt
5
5
 
6
6
  require 'steam/community/cacheable'
7
7
  require 'steam/community/game_item'
@@ -36,6 +36,11 @@ class GameInventory
36
36
  # @return [Array<GameItem>] All items in the backpack
37
37
  attr_reader :items
38
38
 
39
+ # Returns an array of all items that this player just found or traded
40
+ #
41
+ # @return [Array<GameItem>] All preliminary items of the inventory
42
+ attr_reader :preliminary_items
43
+
39
44
  # Returns the Steam ID of the player owning this inventory
40
45
  #
41
46
  # @return [SteamId] The Steam ID of the owner of this inventory
@@ -55,9 +60,11 @@ class GameInventory
55
60
  # @return [GameInventory] The inventory for the given user and game
56
61
  # @raise [SteamCondenserException] if creating the inventory fails
57
62
  # @macro cacheable
58
- def self.new(app_id, steam_id, *args)
59
- args = args.unshift steam_id
60
- if self != GameInventory
63
+ def self.new(app_id, steam_id = nil, *args)
64
+ args = args.unshift steam_id unless steam_id.nil?
65
+ if self == GameInventory
66
+ raise ArgumentError, 'wrong number of arguments (1 for 2)' if args.empty?
67
+ else
61
68
  args = args.unshift app_id
62
69
  app_id = self::APP_ID
63
70
  end
@@ -125,10 +132,15 @@ class GameInventory
125
132
  item_class = self.class.send :class_variable_get, :@@item_class
126
133
 
127
134
  @items = []
135
+ @preliminary_items = []
128
136
  result[:items].each do |item_data|
129
137
  unless item_data.nil?
130
138
  item = item_class.new(self, item_data)
131
- @items[item.backpack_position - 1] = item
139
+ if item.preliminary?
140
+ @preliminary_items << item
141
+ else
142
+ @items[item.backpack_position - 1] = item
143
+ end
132
144
  end
133
145
  end
134
146
  end
@@ -1,7 +1,7 @@
1
1
  # This code is free software; you can redistribute it and/or modify it under
2
2
  # the terms of the new BSD License.
3
3
  #
4
- # Copyright (c) 2011-2012, Sebastian Staudt
4
+ # Copyright (c) 2011-2013, Sebastian Staudt
5
5
 
6
6
  require 'steam/community/web_api'
7
7
 
@@ -99,6 +99,7 @@ module GameItem
99
99
  @name = schema_data[:item_name]
100
100
  @origin = inventory.item_schema.origins[item_data[:origin]]
101
101
  @original_id = item_data[:original_id]
102
+ @preliminary = item_data[:inventory] & 0x40000000 != 0
102
103
  @quality = inventory.item_schema.qualities[item_data[:quality]]
103
104
  @tradeable = !!item_data[:flag_cannot_trade]
104
105
  @type = schema_data[:item_type_name]
@@ -125,6 +126,16 @@ module GameItem
125
126
  @craftable
126
127
  end
127
128
 
129
+ # Returns whether this item is preliminary
130
+ #
131
+ # Preliminary means that this item was just found or traded and has not yet
132
+ # been added to the inventory
133
+ #
134
+ # @return [Boolean] `true` if this item is preliminary
135
+ def preliminary?
136
+ @preliminary
137
+ end
138
+
128
139
  # Returns the data for this item that's defined in the item schema
129
140
  #
130
141
  # @return [Hash<Symbol, Object>] The schema data for this item
@@ -312,8 +312,8 @@ class SteamId
312
312
  # @see #friends
313
313
  # @see #initialize
314
314
  def fetch_friends
315
- @friends = []
316
315
  friends_data = parse "#{base_url}/friends?xml=1"
316
+ @friends = []
317
317
  friends_data['friends']['friend'].each do |friend|
318
318
  @friends << SteamId.new(friend.to_i, false)
319
319
  end
@@ -327,9 +327,9 @@ class SteamId
327
327
  #
328
328
  # @see #games
329
329
  def fetch_games
330
+ games_data = parse "#{base_url}/games?xml=1"
330
331
  @games = {}
331
332
  @playtimes = {}
332
- games_data = parse "#{base_url}/games?xml=1"
333
333
  games_data['games']['game'].each do |game_data|
334
334
  app_id = game_data['appID'].to_i
335
335
  game = SteamGame.new app_id, game_data
@@ -1,7 +1,7 @@
1
1
  # This code is free software; you can redistribute it and/or modify it under
2
2
  # the terms of the new BSD License.
3
3
  #
4
- # Copyright (c) 2008-2011, Sebastian Staudt
4
+ # Copyright (c) 2008-2013, Sebastian Staudt
5
5
 
6
6
  require 'errors/rcon_no_auth_error'
7
7
  require 'steam/packets/rcon/rcon_auth_request'
@@ -72,7 +72,7 @@ class SourceServer
72
72
  @rcon_request_id = rand 2**16
73
73
 
74
74
  @rcon_socket.send RCONAuthRequest.new(@rcon_request_id, password)
75
- return rcon_auth(password) if @rcon_socket.reply.nil?
75
+ @rcon_socket.reply
76
76
  reply = @rcon_socket.reply
77
77
 
78
78
  @rcon_authenticated = reply.request_id == @rcon_request_id
@@ -82,6 +82,9 @@ class SourceServer
82
82
  #
83
83
  # @param [String] command The command to execute on the server via RCON
84
84
  # @return [String] The output of the executed command
85
+ # @raise [RCONBanException] if the IP of the local machine has been banned on
86
+ # the game server
87
+ # @raise [RCONNoAuthException] if not authenticated with the server
85
88
  # @see #rcon_auth
86
89
  def rcon_exec(command)
87
90
  raise RCONNoAuthError unless @rcon_authenticated
@@ -91,13 +94,19 @@ class SourceServer
91
94
 
92
95
  response = []
93
96
  begin
94
- response_packet = @rcon_socket.reply
95
- if response_packet.nil?
96
- @rcon_authenticated = false
97
- break
98
- elsif response_packet.is_a?(RCONAuthResponse)
99
- @rcon_authenticated = false
100
- raise RCONNoAuthError
97
+ begin
98
+ response_packet = @rcon_socket.reply
99
+ if response_packet.is_a? RCONAuthResponse
100
+ @rcon_authenticated = false
101
+ raise RCONNoAuthError
102
+ end
103
+ rescue RCONBanError
104
+ if @rcon_authenticated
105
+ @rcon_authenticated = false
106
+ raise RCONNoAuthError
107
+ end
108
+
109
+ raise $!
101
110
  end
102
111
  response << response_packet.response
103
112
  end while response.size < 3 || response_packet.response.size > 0
@@ -1,13 +1,14 @@
1
1
  # This code is free software; you can redistribute it and/or modify it under
2
2
  # the terms of the new BSD License.
3
3
  #
4
- # Copyright (c) 2008-2012, Sebastian Staudt
4
+ # Copyright (c) 2008-2013, Sebastian Staudt
5
5
 
6
6
  require 'ipaddr'
7
7
  require 'socket'
8
8
  require 'timeout'
9
9
 
10
10
  require 'errors/rcon_ban_error'
11
+ require 'errors/rcon_no_auth_error'
11
12
  require 'errors/timeout_error'
12
13
  require 'steam/packets/rcon/rcon_packet'
13
14
  require 'steam/packets/rcon/rcon_packet_factory'
@@ -74,11 +75,17 @@ class RCONSocket
74
75
  #
75
76
  # @raise [RCONBanError] if the IP of the local machine has been banned on the
76
77
  # game server
78
+ # @raise [RCONNoAuthException] if an authenticated connection has been
79
+ # dropped by the server
77
80
  # @return [RCONPacket] The packet replied from the server
78
81
  def reply
79
- if receive_packet(4) == 0
80
- @socket.close
81
- return nil
82
+ begin
83
+ if receive_packet(4) == 0
84
+ @socket.close
85
+ raise RCONNoAuthError
86
+ end
87
+ rescue Errno::ECONNRESET
88
+ raise RCONBanError
82
89
  end
83
90
 
84
91
  remaining_bytes = @buffer.long
@@ -1,7 +1,7 @@
1
1
  # This code is free software; you can redistribute it and/or modify it under
2
2
  # the terms of the new BSD License.
3
3
  #
4
- # Copyright (c) 2008-2011, Sebastian Staudt
4
+ # Copyright (c) 2008-2013, Sebastian Staudt
5
5
 
6
6
  require 'ipaddr'
7
7
  require 'socket'
@@ -65,7 +65,8 @@ module SteamSocket
65
65
  begin
66
66
  data = @socket.recv @buffer.remaining
67
67
  rescue Errno::ECONNRESET
68
- return 0
68
+ @socket.close
69
+ raise $!
69
70
  end
70
71
  bytes_read = @buffer.write data
71
72
  @buffer.truncate bytes_read
@@ -123,6 +123,17 @@ class TestSteamId < Test::Unit::TestCase
123
123
  end
124
124
  assert_equal 'XML data could not be parsed.', error.message
125
125
  end
126
+
127
+ should 'not cache an empty hash when an error is encountered on steam' do
128
+ SteamId.any_instance.expects(:parse).raises(OpenURI::HTTPError.new('', nil))
129
+ steam_id = SteamId.new(76561197983311154, false)
130
+
131
+ assert_raises OpenURI::HTTPError do
132
+ steam_id.games
133
+ end
134
+
135
+ assert_equal(nil, steam_id.instance_variable_get("@games"))
136
+ end
126
137
 
127
138
  teardown do
128
139
  SteamId.clear_cache
@@ -96,12 +96,21 @@ class TestRCONSocket < Test::Unit::TestCase
96
96
  @socket.reply
97
97
  end
98
98
 
99
- should 'raise an error if the client has been banned' do
99
+ should 'raise an RCONBanError if the client has been banned' do
100
+ @socket.expects(:receive_packet).with(4).raises Errno::ECONNRESET
101
+
102
+ assert_raise RCONBanError do
103
+ assert_nil @socket.reply
104
+ end
105
+ end
106
+
107
+ should 'raise an RCONNoAuthError if the connection has been dropped' do
100
108
  @socket.expects(:receive_packet).with(4).returns 0
101
109
  @tcp_socket.expects :close
102
110
 
103
- assert_nil @socket.reply
104
- assert_nil @socket.instance_variable_get(:@tcp_socket)
111
+ assert_raise RCONNoAuthError do
112
+ assert_nil @socket.reply
113
+ end
105
114
  end
106
115
 
107
116
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: steam-condenser
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-29 00:00:00.000000000 Z
12
+ date: 2013-01-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bzip2-ruby