cinch-bgg 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +3 -0
- data/README.md +82 -0
- data/cinch-bgg.gemspec +20 -0
- data/lib/cinch/plugins/bgg.rb +120 -0
- metadata +71 -0
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
# Cinch-IMDb - IMDb.com plugin
|
2
|
+
|
3
|
+
## Description
|
4
|
+
|
5
|
+
This plugin uses the [Film Buff gem](https://github.com/sachse/filmbuff) to access data from IMDb.com.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
### RubyGems
|
10
|
+
|
11
|
+
You can install the latest Cinch-IMDb gem using RubyGems
|
12
|
+
|
13
|
+
gem install cinch-imdb
|
14
|
+
|
15
|
+
### GitHub
|
16
|
+
|
17
|
+
Alternatively you can check out the latest code directly from Github
|
18
|
+
|
19
|
+
git clone http://github.com/sachse/cinch-imdb.git
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
Install the gem and load it in your Cinch bot:
|
24
|
+
|
25
|
+
require "cinch"
|
26
|
+
require "cinch/plugins/imdb"
|
27
|
+
|
28
|
+
bot = Cinch::Bot.new do
|
29
|
+
configure do |c|
|
30
|
+
# add all required options here
|
31
|
+
c.plugins.plugins = [Cinch::Plugins::IMDb] # optionally add more plugins
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
bot.start
|
36
|
+
|
37
|
+
If you want to return results in other languages this is possible as well. The supported locales are "de_DE", "en_US", "es_ES", "fr_FR", "it_IT" and "pt_PT" with "en_US" being the default.
|
38
|
+
|
39
|
+
require "cinch"
|
40
|
+
require "cinch/plugins/imdb"
|
41
|
+
|
42
|
+
bot = Cinch::Bot.new do
|
43
|
+
configure do |c|
|
44
|
+
# add all required options here
|
45
|
+
c.plugins.plugins = [Cinch::Plugins::IMDb] # optionally add more plugins
|
46
|
+
c.plugins.options[Cinch::Plugins::IMDb][:locale] = "de_DE"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
bot.start
|
51
|
+
|
52
|
+
## Commands
|
53
|
+
|
54
|
+
### imdb
|
55
|
+
|
56
|
+
By default the bot will reply with "Title (Year) - Rating/10 - IMDb link"
|
57
|
+
e.g. "The Wizard of Oz (1939) - 8.3/10 - http://www.imdb.com/title/tt0032138"
|
58
|
+
|
59
|
+
With a German locale (de_DE) the bot would instead reply with "Das zauberhafte Land (1939) - 8.3/10 - http://www.imdb.com/title/tt0032138"
|
60
|
+
|
61
|
+
If you want to change the output format this can be done in imdb.rb
|
62
|
+
The amount of information available is dependent on the Film Buff gem, which is used for accessing IMDb.com - At the time of writing the following information is accessible:
|
63
|
+
|
64
|
+
- Title
|
65
|
+
- Tagline
|
66
|
+
- Plot
|
67
|
+
- Runtime
|
68
|
+
- Rating
|
69
|
+
- Amount of votes
|
70
|
+
- Poster URL
|
71
|
+
- Genres
|
72
|
+
- Release date
|
73
|
+
- IMDb ID
|
74
|
+
|
75
|
+
## Authors
|
76
|
+
|
77
|
+
* [Kristoffer Sachse](https://github.com/sachse)
|
78
|
+
|
79
|
+
## Contribute
|
80
|
+
|
81
|
+
Fork the project, implement your changes in it's own branch, and send
|
82
|
+
a pull request to me. I'll gladly consider any help or ideas.
|
data/cinch-bgg.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "cinch-bgg"
|
5
|
+
s.version = "0.0.1"
|
6
|
+
s.platform = Gem::Platform::RUBY
|
7
|
+
s.authors = ["Caitlin Woodward"]
|
8
|
+
s.email = ["caitlin@caitlinwoodward.me"]
|
9
|
+
s.homepage = "https://github.com/caitlin/cinch-bgg"
|
10
|
+
s.summary = %q{Gives Cinch IRC bots access to BoardGameGeek data}
|
11
|
+
s.description = %q{Gives Cinch IRC bots access to BoardGameGeek data}
|
12
|
+
|
13
|
+
s.rubyforge_project = "cinch-bgg"
|
14
|
+
|
15
|
+
s.add_dependency("cinch", "~> 1.0")
|
16
|
+
s.add_dependency("nokogiri", "~> 1.5.2")
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'cinch'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'nokogiri'
|
4
|
+
|
5
|
+
module Cinch
|
6
|
+
module Plugins
|
7
|
+
class Bgg
|
8
|
+
include Cinch::Plugin
|
9
|
+
|
10
|
+
match /bgg (.+)/i, method: :bgg
|
11
|
+
match /bgguser (.+)/i, method: :bgguser
|
12
|
+
|
13
|
+
def bgg(m, title)
|
14
|
+
results = search_bgg(title)
|
15
|
+
if results == "not found"
|
16
|
+
m.reply "#{m.user.nick}: \"#{title}\" not found"
|
17
|
+
elsif results == "too big"
|
18
|
+
m.reply "#{m.user.nick}: \"#{title}\" was too broad of a search term"
|
19
|
+
else
|
20
|
+
game = results.sort{ |x, y| x.rank <=> y.rank }.first
|
21
|
+
m.reply "#{m.user.nick}: #{game.name} (#{game.year}) - #{game.rating} - Rank: #{game.game_rank} - Designer: #{game.designers.join(", ")} - Mechanics: #{game.mechanics.join(", ")} - " <<
|
22
|
+
"http://boardgamegeek.com/boardgame/#{game.id}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def bgguser(m, name)
|
27
|
+
user = search_for_user(name)
|
28
|
+
m.reply "#{m.user.nick}: #{user.name} - Collection: #{user.collection.size} - Top 5: #{user.top_games.first(5).join(", ")} - http://boardgamegeek.com/user/#{user.name}"
|
29
|
+
end
|
30
|
+
|
31
|
+
#--------------------------------------------------------------------------------
|
32
|
+
# Protected
|
33
|
+
#--------------------------------------------------------------------------------
|
34
|
+
protected
|
35
|
+
|
36
|
+
def search_bgg(search_string)
|
37
|
+
search_results_xml = Nokogiri::XML(open("http://boardgamegeek.com/xmlapi2/search?query=#{search_string.gsub(" ", "%20")}&type=boardgame&exact=1").read)
|
38
|
+
if search_results_xml.css('items')[0]['total'] == "0"
|
39
|
+
search_results_xml = Nokogiri::XML(open("http://boardgamegeek.com/xmlapi2/search?query=#{search_string.gsub(" ", "%20")}&type=boardgame").read)
|
40
|
+
end
|
41
|
+
search_results = search_results_xml.css('item').map { |i| i['id'].to_i }
|
42
|
+
|
43
|
+
# this is dumb, find a better way
|
44
|
+
if search_results.empty?
|
45
|
+
response = "not found"
|
46
|
+
elsif search_results.size > 50
|
47
|
+
response = "too big"
|
48
|
+
else
|
49
|
+
response = search_results.map do |id|
|
50
|
+
Game.new(id, get_info_for_game(id))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
response
|
54
|
+
end
|
55
|
+
|
56
|
+
def get_info_for_game(game_id)
|
57
|
+
unless File.exists?("data/#{game_id}.xml")
|
58
|
+
open("data/games/#{game_id}.xml", "wb") do |file|
|
59
|
+
open("http://boardgamegeek.com/xmlapi2/thing?id=#{game_id}&stats=1") do |uri|
|
60
|
+
file.write(uri.read)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
Nokogiri::XML(File.open("data/games/#{game_id}.xml"))
|
65
|
+
end
|
66
|
+
|
67
|
+
def search_for_user(name)
|
68
|
+
user_xml = Nokogiri::XML(open("http://boardgamegeek.com/xmlapi2/user?name=#{name}&hot=1&top=1").read)
|
69
|
+
collection_xml = Nokogiri::XML(open("http://boardgamegeek.com/xmlapi2/collection?username=#{name}&own=1").read)
|
70
|
+
User.new(name, user_xml, collection_xml)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
class Game
|
76
|
+
attr_accessor :id, :rating, :rank, :name, :year, :minplayers, :maxplayers, :playingtime, :categories, :mechanics, :designers, :publishers
|
77
|
+
|
78
|
+
NOT_RANKED_RANK = 10001
|
79
|
+
|
80
|
+
def initialize(id, xml)
|
81
|
+
self.id = id
|
82
|
+
self.rating = xml.css('statistics ratings average')[0]['value'].to_f
|
83
|
+
self.rank = xml.css('statistics ratings ranks rank')[0]["value"]
|
84
|
+
# if ranked, convert the value to integer; if not, set the value of the rank to the last possible
|
85
|
+
self.rank = self.rank == "Not Ranked" ? NOT_RANKED_RANK : self.rank.to_i
|
86
|
+
self.name = xml.css('name')[0]['value']
|
87
|
+
self.year = xml.css('yearpublished')[0]['value'].to_i
|
88
|
+
self.minplayers = xml.css('minplayers')[0]['value'].to_i
|
89
|
+
self.maxplayers = xml.css('maxplayers')[0]['value'].to_i
|
90
|
+
self.playingtime = xml.css('playingtime')[0]['value'].to_i
|
91
|
+
self.categories = xml.css('link[type=boardgamecategory]').map{ |l| l['value'] }
|
92
|
+
self.mechanics = xml.css('link[type=boardgamemechanic]').map{ |l| l['value'] }
|
93
|
+
self.designers = xml.css('link[type=boardgamedesigner]').map{ |l| l['value'] }
|
94
|
+
self.publishers = xml.css('link[type=boardgamepublisher]').map{ |l| l['value'] }
|
95
|
+
end
|
96
|
+
|
97
|
+
# Since we are resetting the not ranked values, let's make sure we return the correct values
|
98
|
+
#
|
99
|
+
def game_rank
|
100
|
+
(self.rank == NOT_RANKED_RANK) ? "Not Ranked" : self.rank
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
class User
|
105
|
+
|
106
|
+
attr_accessor :name, :top_games, :hot_games, :collection
|
107
|
+
|
108
|
+
def initialize(username, user_xml, collection_xml)
|
109
|
+
self.name = username
|
110
|
+
self.top_games = user_xml.css("top item").map{ |g| g["name"] }
|
111
|
+
self.hot_games = user_xml.css("hot item").map{ |g| g["name"] }
|
112
|
+
self.collection = {}
|
113
|
+
collection_xml.css("items item").each do |g|
|
114
|
+
self.collection[g["objectid"]] = g.css("name")[0].content
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cinch-bgg
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Caitlin Woodward
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-06-16 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: cinch
|
16
|
+
requirement: &70337759365740 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70337759365740
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: nokogiri
|
27
|
+
requirement: &70337759365260 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.5.2
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70337759365260
|
36
|
+
description: Gives Cinch IRC bots access to BoardGameGeek data
|
37
|
+
email:
|
38
|
+
- caitlin@caitlinwoodward.me
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files: []
|
42
|
+
files:
|
43
|
+
- Gemfile
|
44
|
+
- README.md
|
45
|
+
- cinch-bgg.gemspec
|
46
|
+
- lib/cinch/plugins/bgg.rb
|
47
|
+
homepage: https://github.com/caitlin/cinch-bgg
|
48
|
+
licenses: []
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options: []
|
51
|
+
require_paths:
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ! '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
requirements: []
|
66
|
+
rubyforge_project: cinch-bgg
|
67
|
+
rubygems_version: 1.8.6
|
68
|
+
signing_key:
|
69
|
+
specification_version: 3
|
70
|
+
summary: Gives Cinch IRC bots access to BoardGameGeek data
|
71
|
+
test_files: []
|