cinch-bgg 0.0.4 → 0.0.5

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.
data/cinch-bgg.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "cinch-bgg"
5
- s.version = "0.0.4"
5
+ s.version = "0.0.5"
6
6
  s.platform = Gem::Platform::RUBY
7
7
  s.authors = ["Caitlin Woodward"]
8
8
  s.email = ["caitlin@caitlinwoodward.me"]
@@ -18,7 +18,12 @@ module Cinch
18
18
 
19
19
  match /link_bgg (.+)/i, method: :link_to_bgg
20
20
 
21
- match /whohas (.+)/i, method: :who_has_game
21
+ match /whohas (.+)/i, method: :who_has_game
22
+ match /whotrading (.+)/i, method: :who_is_trading_game
23
+ match /whowants (.+)/i, method: :who_wants_game
24
+ match /whorated (.+)/i, method: :who_rated_game
25
+ match /whoplayed (.+)/i, method: :who_played_game
26
+
22
27
 
23
28
  def initialize(*args)
24
29
  super
@@ -39,8 +44,8 @@ module Cinch
39
44
  unless nick.start_with?("-u ")
40
45
  if self.in_community?(nick)
41
46
  name = self.find_bgg_by_irc(nick)
42
- user = search_for_user(name)
43
- m.reply "#{user.name} - Collection: #{user.collection.size} - Top 5: #{user.top_games.first(5).join(", ")} - http://boardgamegeek.com/user/#{user.name}", true
47
+ user = search_for_user(m, name)
48
+ self.show_user_details(m, user)
44
49
  else
45
50
  m.reply "There's no \"#{nick}\" in the community. To link yourself and join the community, \"!link_bgg bgg_username\". To search by actual bgg username, \"!bgguser -u bgg_username\".", true
46
51
  end
@@ -48,16 +53,21 @@ module Cinch
48
53
  end
49
54
 
50
55
  def bggself(m)
51
- self.bgguser(m.user.nick)
56
+ self.bgguser(m, m.user.nick)
52
57
  end
53
58
 
54
59
  def bggactualuser(m, nick)
55
60
  user = search_for_user(nick)
56
- m.reply "#{user.name} - Collection: #{user.collection.size} - Top 5: #{user.top_games.first(5).join(", ")} - http://boardgamegeek.com/user/#{user.name}", true
61
+ self.show_user_details(m, user)
62
+ end
63
+
64
+ def show_user_details(m, user)
65
+ top5 = (user.top_games.empty? ? "" : "- Top 5: #{user.top_games.first(5).join(", ")} ")
66
+ m.reply "#{user.name} - Collection: #{user.owned.size} #{top5}- http://boardgamegeek.com/user/#{user.name}", true
57
67
  end
58
68
 
59
69
  def link_to_bgg(m, username)
60
- @community[m.user.nick] = username
70
+ @community[m.user.nick.downcase] = username
61
71
  File.open("#{@data_dir}#{USERS_FILE}", 'w') do |file|
62
72
  @community.each do |irc_nick, bgg_name|
63
73
  file.write("#{irc_nick},#{bgg_name}\n")
@@ -67,13 +77,38 @@ module Cinch
67
77
  end
68
78
 
69
79
  def who_has_game(m, title)
80
+ self.who_what_a_game(m, title, :owned, "Owning")
81
+ end
82
+
83
+ def who_is_trading_game(m, title)
84
+ self.who_what_a_game(m, title, :trading, "Trading")
85
+ end
86
+
87
+ def who_wants_game(m, title)
88
+ self.who_what_a_game(m, title, :wanted, "Wants")
89
+ end
90
+
91
+ def who_rated_game(m, title)
92
+ self.who_what_a_game(m, title, :rated, "Rated", "rating")
93
+ end
94
+
95
+ def who_played_game(m, title)
96
+ self.who_what_a_game(m, title, :played, "Played", "plays")
97
+ end
98
+
99
+ def who_what_a_game(m, title, action, string, with_number_info = nil)
70
100
  game = search_bgg(m, title)
71
101
  unless game.nil?
72
102
  community = @community.dup
73
- community.each{ |irc, bgg| community[irc] = search_for_user(bgg, { :id => game.id, :use_cache => true }) }
103
+ community.each{ |irc, bgg| community[irc] = search_for_user(m, bgg, { :id => game.id, :use_cache => true }) }
74
104
 
75
- community.keep_if{ |irc, user| user.collection.include? game.id.to_s }
76
- m.reply "Owning \"#{game.name}\": #{community.keys.map{|n| self.dehighlight_nick(n)}.join(", ")}", true
105
+ community.keep_if{ |irc, user| user.send(action).include? game.id.to_s }
106
+ user_info = []
107
+ community.each do |irc, user|
108
+ number_info = with_number_info.nil? ? "" : " (#{user.send(action)[game.id.to_s][with_number_info].to_s})"
109
+ user_info << "#{self.dehighlight_nick(irc)}#{number_info}"
110
+ end
111
+ m.reply "#{string} \"#{game.name}\": #{user_info.join(", ")}", true
77
112
  end
78
113
  end
79
114
 
@@ -83,9 +118,9 @@ module Cinch
83
118
  protected
84
119
 
85
120
  def search_bgg(m, search_string)
86
- search_results_xml = Nokogiri::XML(open("http://boardgamegeek.com/xmlapi2/search?query=#{search_string.gsub(" ", "%20")}&type=boardgame&exact=1").read)
121
+ search_results_xml = Nokogiri::XML(self.connect_to_bgg(m){ open("http://boardgamegeek.com/xmlapi2/search?query=#{search_string.gsub(" ", "%20")}&type=boardgame&exact=1") }.read)
87
122
  if search_results_xml.css('items')[0]['total'] == "0"
88
- search_results_xml = Nokogiri::XML(open("http://boardgamegeek.com/xmlapi2/search?query=#{search_string.gsub(" ", "%20")}&type=boardgame").read)
123
+ search_results_xml = Nokogiri::XML(self.connect_to_bgg(m){ open("http://boardgamegeek.com/xmlapi2/search?query=#{search_string.gsub(" ", "%20")}&type=boardgame") }.read)
89
124
  end
90
125
  search_results = search_results_xml.css('item').map { |i| i['id'].to_i }
91
126
 
@@ -113,12 +148,12 @@ module Cinch
113
148
  Nokogiri::XML(File.open("#{@data_dir}#{GAMES_SUBDIR}/#{game_id}.xml"))
114
149
  end
115
150
 
116
- def search_for_user(name, collection_options = {})
151
+ def search_for_user(m, name, collection_options = {})
117
152
  use_cache = collection_options[:use_cache] || false
118
153
  game_id = collection_options[:id] || nil
119
154
 
120
155
  search_game_id_str = (game_id.nil? ? "" : "&id=#{game_id}")
121
- user_xml = Nokogiri::XML(open("http://boardgamegeek.com/xmlapi2/user?name=#{name}&hot=1&top=1#{search_game_id_str}").read)
156
+ user_xml = Nokogiri::XML(self.connect_to_bgg(m){ open("http://boardgamegeek.com/xmlapi2/user?name=#{name}&hot=1&top=1#{search_game_id_str}")}.read)
122
157
  collection_xml = get_collection_data_for_user(name, use_cache)
123
158
  User.new(name, user_xml, collection_xml)
124
159
  end
@@ -127,7 +162,7 @@ module Cinch
127
162
  file_url = "#{@data_dir}#{USERS_SUBDIR}/#{name}.xml"
128
163
  unless using_cache
129
164
  open(file_url, "w") do |file|
130
- open("http://boardgamegeek.com/xmlapi2/collection?username=#{name}&own=1&stats=1") do |uri|
165
+ open("http://boardgamegeek.com/xmlapi2/collection?username=#{name}&stats=1" ) do |uri|
131
166
  file.write(uri.read)
132
167
  end
133
168
  end
@@ -146,7 +181,7 @@ module Cinch
146
181
  end
147
182
 
148
183
  def find_bgg_by_irc(irc_nick)
149
- @community[irc_nick]
184
+ @community[irc_nick.downcase]
150
185
  end
151
186
 
152
187
  def in_community?(irc_nick)
@@ -157,6 +192,30 @@ module Cinch
157
192
  nickname.chars.to_a * 8203.chr('UTF-8')
158
193
  end
159
194
 
195
+ def connect_to_bgg(m)
196
+ if block_given?
197
+ begin
198
+ yield
199
+ rescue Exception => e
200
+ case e
201
+ when Timeout::Error
202
+ error = 'BGG timeout'
203
+ when Errno::ECONNREFUSED
204
+ error = 'BGG connection refused'
205
+ when Errno::ECONNRESET
206
+ error = 'BGG connection reset'
207
+ when Errno::EHOSTUNREACH
208
+ error = 'BGG host not reachable'
209
+ else
210
+ error = "BGG unknown #{e.to_s}"
211
+
212
+ end
213
+ m.reply "#{error}. Please try again.", true
214
+ end
215
+ end
216
+ end
217
+
218
+
160
219
  end
161
220
 
162
221
  class Game
@@ -200,13 +259,34 @@ module Cinch
200
259
  collection_xml.css("items item").each do |g|
201
260
  self.collection[g["objectid"]] = {}
202
261
  self.collection[g["objectid"]]["name"] = g.css("name")[0].content
203
- self.collection[g["objectid"]]["for_trade"] = g.css("status fortrade")[0]
204
- self.collection[g["objectid"]]["want"] = g.css("status want")[0]
262
+ self.collection[g["objectid"]]["own"] = g.css("status")[0]['own'].to_i
263
+ self.collection[g["objectid"]]["for_trade"] = g.css("status")[0]['fortrade'].to_i
264
+ self.collection[g["objectid"]]["want"] = g.css("status")[0]['want'].to_i
205
265
  self.collection[g["objectid"]]["plays"] = g.css("numplays")[0].content.to_i
206
- self.collection[g["objectid"]]["ratings"] = g.css("stats")[0].css("rating")[0]['value']
266
+ self.collection[g["objectid"]]["rating"] = g.css("stats")[0].css("rating")[0]['value']
207
267
  end
208
268
  end
209
269
 
270
+ def owned
271
+ self.collection.select{ |id, game| game["own"] == 1 }
272
+ end
273
+
274
+ def trading
275
+ self.collection.select{ |id, game| game["for_trade"] == 1 }
276
+ end
277
+
278
+ def wanted
279
+ self.collection.select{ |id, game| game["want"] == 1 }
280
+ end
281
+
282
+ def rated
283
+ self.collection.reject{ |id, game| game["rating"] == "N/A" }
284
+ end
285
+
286
+ def played
287
+ self.collection.select{ |id, game| game["plays"] > 0 }
288
+ end
289
+
210
290
  end
211
291
  end
212
292
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cinch-bgg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: