hipbot-plugins 0.0.1 → 1.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 +7 -0
- data/.ruby-version +1 -0
- data/.travis.yml +18 -0
- data/Gemfile +1 -0
- data/README.md +43 -5
- data/Rakefile +4 -0
- data/hipbot-plugins.gemspec +10 -6
- data/lib/hipbot-plugins.rb +6 -0
- data/lib/hipbot-plugins/ascii.rb +47 -0
- data/lib/hipbot-plugins/excuses.rb +34 -0
- data/lib/hipbot-plugins/github.rb +17 -3
- data/lib/hipbot-plugins/google.rb +39 -14
- data/lib/hipbot-plugins/help.rb +64 -0
- data/lib/hipbot-plugins/human.rb +20 -18
- data/lib/hipbot-plugins/meme_generator.rb +70 -0
- data/lib/hipbot-plugins/urban_dictionary.rb +19 -0
- data/lib/hipbot-plugins/version.rb +1 -1
- data/lib/hipbot-plugins/wolfram_alpha.rb +26 -0
- data/spec/meme_generator_spec.rb +25 -0
- data/spec/spec_helper.rb +4 -0
- metadata +82 -31
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c30652ba6332517579abf6342c768f2d3116c7a9
|
4
|
+
data.tar.gz: 744466fd9846b70c90550b2ad869037df65561d8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 087d7e421dd75cd96d95cf3e6fc721b4c2a3ee780846b25cfc4af7e9415cbd7926dcdb87f0917c88692e03e2e345f28d9e382829356ad4c167a11473242b8dce
|
7
|
+
data.tar.gz: cc05e2b8f6fc29a90a816712a24701177f0f26cfcadb3da67c544d529eadf61905b05c4f18855e9923e7227040ef2b17cfa786da1c51ac04f04e01a968ffc750
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.1.0
|
data/.travis.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 1.9.2
|
4
|
+
- 1.9.3
|
5
|
+
- 2.0.0
|
6
|
+
- 2.1.0
|
7
|
+
- jruby-19mode
|
8
|
+
- rbx-19mode
|
9
|
+
- ruby-head
|
10
|
+
matrix:
|
11
|
+
allow_failures:
|
12
|
+
- rvm: ruby-head
|
13
|
+
notifications:
|
14
|
+
email:
|
15
|
+
recipients:
|
16
|
+
- pewniak747@gmail.com
|
17
|
+
- bartosz.kopinski@netguru.pl
|
18
|
+
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# hipbot-plugins
|
2
2
|
|
3
|
+
[](https://travis-ci.org/netguru/hipbot-plugins)
|
4
|
+
[](https://codeclimate.com/github/netguru/hipbot-plugins)
|
5
|
+
[](http://badge.fury.io/rb/hipbot-plugins)
|
6
|
+
|
3
7
|
This is a collection of open-source plugins for https://github.com/pewniak747/hipbot, initially developped at http://netguru.co
|
4
8
|
|
5
9
|
## Installation
|
@@ -14,18 +18,17 @@ And then execute:
|
|
14
18
|
|
15
19
|
## Usage
|
16
20
|
|
17
|
-
To include a plugin,
|
21
|
+
To include a plugin, require it in your bot.rb file:
|
18
22
|
|
19
23
|
``` ruby
|
20
24
|
require 'hipbot'
|
21
25
|
require 'hipbot-plugins'
|
26
|
+
require 'hipbot-plugins/human'
|
22
27
|
|
23
28
|
class MyCompanyBot < Hipbot::Bot
|
24
29
|
configure do |c|
|
25
|
-
c.name = 'robot'
|
26
30
|
c.jid = 'changeme@chat.hipchat.com'
|
27
31
|
c.password = 'secret'
|
28
|
-
c.plugins = [ Hipbot::Plugins::Human, Hipbot::Plugins::Google ]
|
29
32
|
end
|
30
33
|
end
|
31
34
|
```
|
@@ -42,7 +45,6 @@ Hipbot responds to:
|
|
42
45
|
* open the pod bay door
|
43
46
|
* make me a sandwich
|
44
47
|
* slap @someone
|
45
|
-
* insult @someone
|
46
48
|
* choose
|
47
49
|
* comfort me
|
48
50
|
* (AI simulation with Cleverbot)
|
@@ -59,7 +61,7 @@ Hipbot responds to:
|
|
59
61
|
* something vs somethingelse vs someoranother vs ...
|
60
62
|
* translate en:pl something I want to translate
|
61
63
|
|
62
|
-
### Github
|
64
|
+
### Hipbot::Plugins::Github
|
63
65
|
|
64
66
|
Can generate links to github
|
65
67
|
|
@@ -70,6 +72,42 @@ Hipbot responds to:
|
|
70
72
|
|
71
73
|
( For this to work you need to define `project` and `organization` methods as a response helpers: https://github.com/pewniak747/hipbot#response-helpers )
|
72
74
|
|
75
|
+
### Hipbot::Plugins::MemeGenerator
|
76
|
+
|
77
|
+
Create instant memes using memecaptain.com!
|
78
|
+
|
79
|
+
Hipbot responds to:
|
80
|
+
|
81
|
+
* memes
|
82
|
+
* meme allthethings "create all" "the memes!"
|
83
|
+
|
84
|
+
### Hipbot::Plugins::UrbanDictionary
|
85
|
+
|
86
|
+
Explains reality using UrbanDictionary.com
|
87
|
+
|
88
|
+
Hipbot responds to:
|
89
|
+
|
90
|
+
* explain the meaning of life, the universe and everything
|
91
|
+
|
92
|
+
### Hipbot::Plugins::WolframAlpha
|
93
|
+
|
94
|
+
Adds the ability to use wolframalpha.com computational search engine. You need to register for api key.
|
95
|
+
|
96
|
+
``` ruby
|
97
|
+
class MyCompanyBot < Hipbot::Bot
|
98
|
+
configure do |c|
|
99
|
+
# ...
|
100
|
+
Hipbot::Plugins::WolframAlpha.configure do |c|
|
101
|
+
c.appid = 'my-api-key'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
```
|
106
|
+
|
107
|
+
Hipbot responds to:
|
108
|
+
|
109
|
+
* wolfram plot x^2 + 3x - 1
|
110
|
+
|
73
111
|
## Contributing
|
74
112
|
|
75
113
|
1. Fork it
|
data/Rakefile
CHANGED
data/hipbot-plugins.gemspec
CHANGED
@@ -7,16 +7,20 @@ Gem::Specification.new do |gem|
|
|
7
7
|
gem.name = "hipbot-plugins"
|
8
8
|
gem.version = Hipbot::Plugins::VERSION
|
9
9
|
gem.authors = ["Bartosz Kopiński", "Tomasz Pewiński"]
|
10
|
-
gem.email = ["bartosz.kopinski@
|
11
|
-
gem.description = %q{
|
12
|
-
gem.summary = %q{A collection of plugins to use in your
|
10
|
+
gem.email = ["bartosz.kopinski@gmail.com", "pewniak747@gmail.com"]
|
11
|
+
gem.description = %q{Hipbot sample plugins}
|
12
|
+
gem.summary = %q{A collection of plugins to use in your Hipbot installation}
|
13
13
|
gem.homepage = "https://github.com/netguru/hipbot-plugins"
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split($/)
|
16
16
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
18
|
gem.require_paths = ["lib"]
|
19
|
-
gem.
|
20
|
-
gem.
|
21
|
-
gem.
|
19
|
+
gem.add_dependency "hipbot", '~> 1.0', '>= 1.0.0'
|
20
|
+
gem.add_dependency 'cleverbot', '~> 0.2.0'
|
21
|
+
gem.add_dependency 'htmlentities'
|
22
|
+
gem.add_dependency 'wolfram', '~> 0.2.1'
|
23
|
+
|
24
|
+
gem.add_development_dependency 'rake'
|
25
|
+
gem.add_development_dependency 'rspec'
|
22
26
|
end
|
data/lib/hipbot-plugins.rb
CHANGED
@@ -1,7 +1,13 @@
|
|
1
|
+
require "hipbot"
|
1
2
|
require "hipbot-plugins/version"
|
3
|
+
require "hipbot-plugins/ascii"
|
4
|
+
require "hipbot-plugins/excuses"
|
5
|
+
require "hipbot-plugins/help"
|
2
6
|
require "hipbot-plugins/human"
|
3
7
|
require "hipbot-plugins/github"
|
4
8
|
require "hipbot-plugins/google"
|
9
|
+
require "hipbot-plugins/wolfram_alpha"
|
10
|
+
require "hipbot-plugins/meme_generator"
|
5
11
|
|
6
12
|
module Hipbot
|
7
13
|
module Plugins
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
class ASCII
|
3
|
+
include Hipbot::Plugin
|
4
|
+
|
5
|
+
TABLE_FLIPS = [
|
6
|
+
'(╯°□°)╯︵ ┻━┻',
|
7
|
+
'(╯°□°)╯︵ ┻━┻',
|
8
|
+
'(ノ ゜Д゜)ノ ︵ ┻━┻',
|
9
|
+
'(ノಥ益ಥ)ノ ┻━┻',
|
10
|
+
"(╯'□')╯︵ ┻━┻",
|
11
|
+
'(ノಥДಥ)ノ︵┻━┻',
|
12
|
+
'ʕノ•ᴥ•ʔノ ︵ ┻━┻',
|
13
|
+
'(/¯◡ ‿ ◡)/¯ ~ ┻━┻',
|
14
|
+
'┗[© □ ©]┛ ︵ ┻━┻',
|
15
|
+
'┻━┻ ︵ ლ(⌒-⌒ლ)',
|
16
|
+
]
|
17
|
+
|
18
|
+
CLEAN_UPS = [
|
19
|
+
'┬──┬ ¯\\_(ツ)',
|
20
|
+
'┬─┬ノ( º _ ºノ)',
|
21
|
+
'(╯°Д°)╯︵ /(.□ . \\)',
|
22
|
+
'(/ .□.)\\ ︵╰(゜Д゜)╯︵ /(.□. \\)',
|
23
|
+
'ノ┬─┬ノ ︵ ( \\o°o)\\',
|
24
|
+
]
|
25
|
+
|
26
|
+
scope global: true do
|
27
|
+
on Regexp.union(TABLE_FLIPS) do
|
28
|
+
reply(CLEAN_UPS.sample)
|
29
|
+
end
|
30
|
+
|
31
|
+
on Regexp.union(CLEAN_UPS) do
|
32
|
+
reply(TABLE_FLIPS.sample)
|
33
|
+
end
|
34
|
+
|
35
|
+
on /\A\\o\/\z/ do
|
36
|
+
reply('\o/')
|
37
|
+
end
|
38
|
+
|
39
|
+
on /\A\/o\/\z/ do
|
40
|
+
reply('\\o\\')
|
41
|
+
end
|
42
|
+
|
43
|
+
on /\A\\o\\\z/ do
|
44
|
+
reply('/o/')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
module Hipbot
|
4
|
+
module Plugins
|
5
|
+
class Excuses
|
6
|
+
include Hipbot::Plugin
|
7
|
+
|
8
|
+
desc 'provides you with an excuse'
|
9
|
+
on /^excuse/ do
|
10
|
+
excuse = Grabber.new.call
|
11
|
+
reply(excuse)
|
12
|
+
end
|
13
|
+
|
14
|
+
class Grabber
|
15
|
+
ADDRESS = 'http://developerexcuses.com/'
|
16
|
+
|
17
|
+
def call
|
18
|
+
data = page.match link_regexp
|
19
|
+
data[1]
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def page
|
25
|
+
@page ||= open(ADDRESS).read
|
26
|
+
end
|
27
|
+
|
28
|
+
def link_regexp
|
29
|
+
/\<a href.+\>(.+)<\/a>/
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,13 +1,27 @@
|
|
1
1
|
module Hipbot
|
2
2
|
module Plugins
|
3
|
-
class Github
|
3
|
+
class Github
|
4
|
+
include Hipbot::Plugin
|
5
|
+
|
6
|
+
desc 'links to two github branches comparision eg. `compare master to stable`'
|
4
7
|
on /^compare (\w+)(?: to)? (\w+)$/, room: true do |stage1, stage2|
|
5
8
|
reply "https://github.com/#{organization}/#{project.name}/compare/#{stage1}...#{stage2}" if project
|
6
9
|
end
|
7
10
|
|
11
|
+
desc 'links to production <-> staging comparision'
|
12
|
+
on /^compare$/, room: true do
|
13
|
+
reply "https://github.com/#{organization}/#{project.name}/compare/production...staging" if project
|
14
|
+
end
|
15
|
+
|
16
|
+
desc 'links to github code search in organization'
|
8
17
|
on /^github (.+)/ do |query|
|
9
|
-
|
10
|
-
|
18
|
+
query_hash = {
|
19
|
+
q: "#{query} @#{organization}",
|
20
|
+
ref: 'searchresults',
|
21
|
+
type: 'Code',
|
22
|
+
s: 'indexed'
|
23
|
+
}
|
24
|
+
reply "https://github.com/search?#{query_hash.to_query}"
|
11
25
|
end
|
12
26
|
end
|
13
27
|
end
|
@@ -1,47 +1,72 @@
|
|
1
1
|
module Hipbot
|
2
2
|
module Plugins
|
3
|
-
class Google
|
3
|
+
class Google
|
4
|
+
include Hipbot::Plugin
|
5
|
+
|
6
|
+
desc 'returns first few results for Google search'
|
4
7
|
on /^google (.+)/ do |search|
|
5
|
-
get('http://ajax.googleapis.com/ajax/services/search/web', { q:
|
6
|
-
http.json
|
8
|
+
get('http://ajax.googleapis.com/ajax/services/search/web', { q: search, safe: 'off', v: '1.0' }) do |http|
|
9
|
+
results = http.json.fetch('responseData', {}).fetch('results', [])
|
10
|
+
results.each do |page|
|
7
11
|
reply("#{page['url']} - #{page['titleNoFormatting']}")
|
8
12
|
end
|
9
13
|
end
|
10
14
|
end
|
11
15
|
|
16
|
+
desc 'does an Google result count comparision eg. `firefox vs chrome vs ie`'
|
12
17
|
on /^(.+ vs?\.? .+)/i do |battle|
|
13
18
|
winner = { score: 0 }
|
14
19
|
objects = battle.split(/ vs?\.? /i)
|
15
20
|
left = objects.count
|
16
21
|
objects.each do |obj|
|
17
|
-
get('http://ajax.googleapis.com/ajax/services/search/web', { q:
|
18
|
-
|
22
|
+
get('http://ajax.googleapis.com/ajax/services/search/web', { q: obj, safe: 'off', v: '1.0' }) do |http|
|
23
|
+
resultCount = http.json.fetch('responseData', {}).fetch('cursor', {}).fetch('resultCount', 0)
|
24
|
+
score = resultCount.to_s.delete(' ').to_i
|
19
25
|
winner = { name: obj, score: score } if score > winner[:score]
|
20
26
|
left -= 1
|
21
27
|
end
|
22
28
|
end
|
23
29
|
sleep(1) until left == 0
|
24
|
-
|
30
|
+
reply("...and the winner is #{winner[:name]}!")
|
25
31
|
end
|
26
32
|
|
33
|
+
desc 'returns sample result of Google image search eg. `image trollface`'
|
27
34
|
on /^image (.+)/ do |search|
|
28
|
-
get('http://ajax.googleapis.com/ajax/services/search/images', { q:
|
29
|
-
|
35
|
+
get('http://ajax.googleapis.com/ajax/services/search/images', { q: search, safe: 'moderate', v: '1.0', hl: 'pl', imgsz: 'large', rsz: 1 }) do |http|
|
36
|
+
results = http.json.fetch('responseData', {}).fetch('results', [])
|
37
|
+
if results.any?
|
38
|
+
reply results.sample['url']
|
39
|
+
else
|
40
|
+
reply "I found nothing, #{sender}"
|
41
|
+
end
|
30
42
|
end
|
31
43
|
end
|
32
44
|
|
45
|
+
desc 'returns sample result of YouTube search eg. `yt rick roll`'
|
33
46
|
on /^youtube (.+)/, /^yt (.+)/ do |query|
|
34
|
-
get('http://gdata.youtube.com/feeds/api/videos', { q:
|
35
|
-
|
47
|
+
get('http://gdata.youtube.com/feeds/api/videos', { q: query, alt: 'json', :'max-results' => 3, orderBy: 'relevance' }) do |http|
|
48
|
+
entry = http.json.fetch('feed', {}).fetch('entry', [])
|
49
|
+
if entry.any?
|
50
|
+
reply entry.sample['link'][0]['href']
|
51
|
+
else
|
52
|
+
reply "I found nothing, #{sender}"
|
53
|
+
end
|
36
54
|
end
|
37
55
|
end
|
38
56
|
|
57
|
+
desc 'translates text using Google Translate eg. `translate en:pl Hello world`'
|
39
58
|
on /^translate (.+)/ do |query|
|
40
59
|
params, text = query.split(' ', 2)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
60
|
+
if text.nil?
|
61
|
+
text = params
|
62
|
+
from = 'auto'
|
63
|
+
to = 'en'
|
64
|
+
else
|
65
|
+
from, to = params.split(':')
|
66
|
+
if to.nil?
|
67
|
+
to = from
|
68
|
+
from = 'auto'
|
69
|
+
end
|
45
70
|
end
|
46
71
|
|
47
72
|
params = {
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Hipbot
|
2
|
+
module Plugins
|
3
|
+
class Help
|
4
|
+
include Hipbot::Plugin
|
5
|
+
|
6
|
+
desc 'lists all standard emoticons'
|
7
|
+
on /^emoticons/ do
|
8
|
+
reply ":-) :o :$ :( :-* :# :'( ;-) (embarrassed) :Z :p 8) O:) :-D (oops) :| (thumbsup) (thumbsdown) (allthethings) (android) (areyoukiddingme)" +
|
9
|
+
" (arrington) (ashton) (awyeah) (badpokerface) (basket) (beer) (bumble) (bunny) (cadbury) (cake) (candycorn) (caruso) (cereal)" +
|
10
|
+
" (challengeaccepted) (chewie) (chocobunny) (chompy) (chris) (coffee) (content) (cornelius) (dealwithit) (derp)" +
|
11
|
+
" (disapproval) (dosequis) (ducreux) (dumb) (facepalm) (fap) (foreveralone) (freddie) (fry) (fu) (fuckyeah) (garret) (gates) (ghost) (goodnews)"
|
12
|
+
# splitted for better formatting under Adobe AIR clients
|
13
|
+
reply "(greenbeer) (gtfo) (haveaseat) (heart) (hipchat) (hipster) (huh) (ilied) (itsatrap) (jackie) (jobs) (kennypowers) (krang) (kwanzaa) (lincoln)" +
|
14
|
+
" (lol) (lolwut) (megusta) (menorah) (notbad) (nothingtodohere) (ohcrap) (okay) (omg) (orly) (pbr) (pete) (philosoraptor) (pirate) (pokerface)" +
|
15
|
+
" (poo) (present) (pumpkin) (rageguy) (rebeccablack) (reddit) (rudolph) (sadpanda) (sadtroll) (samuel) (santa) (scumbag) (seomoz) (shamrock)" +
|
16
|
+
" (skyrim) (stare) (sweetjesus) (taft) (tree) (troll) (truestory) (turkey) (washington) (wat) (wtf) (yey) (yodawg) (yuno) (zoidberg) (zzz)"
|
17
|
+
end
|
18
|
+
|
19
|
+
desc 'generates help for all reactions'
|
20
|
+
on /^help$/ do
|
21
|
+
reactions_with_description = Hipbot.reactions.reject{ |reaction| reaction.desc.nil? }
|
22
|
+
help = reactions_with_description.map do |reaction|
|
23
|
+
"#{reaction.plugin_name}: #{reaction.readable_command} - #{reaction.desc}"
|
24
|
+
end
|
25
|
+
reply help.join("\n")
|
26
|
+
end
|
27
|
+
|
28
|
+
desc 'returns more info on given command'
|
29
|
+
on /^help (.+)/ do |subject|
|
30
|
+
reactions = Hipbot.reactions.select do |reaction|
|
31
|
+
[reaction.plugin_name, reaction.readable_command, reaction.desc].any?{ |v| v =~ /#{subject}/i }
|
32
|
+
end
|
33
|
+
help = []
|
34
|
+
reactions.each do |reaction|
|
35
|
+
help << "#{reaction.plugin_name}: #{reaction.readable_command}"
|
36
|
+
if !reaction.desc.nil?
|
37
|
+
help << " - #{reaction.desc}"
|
38
|
+
end
|
39
|
+
|
40
|
+
if reaction.to_private_message?
|
41
|
+
help << " - Private only"
|
42
|
+
elsif reaction.in_any_room?
|
43
|
+
help << " - Room only"
|
44
|
+
elsif reaction.rooms.any?
|
45
|
+
help << " - Only in: #{reaction.rooms.to_sentence}"
|
46
|
+
else
|
47
|
+
help << " - All rooms and private messages"
|
48
|
+
end
|
49
|
+
|
50
|
+
if !reaction.options[:from].nil?
|
51
|
+
help << " - Only for: #{reaction.users.to_sentence}"
|
52
|
+
else
|
53
|
+
help << " - From anybody"
|
54
|
+
end
|
55
|
+
|
56
|
+
if reaction.global?
|
57
|
+
help << " - Without mention"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
reply help.join("\n")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/hipbot-plugins/human.rb
CHANGED
@@ -3,7 +3,10 @@ require 'htmlentities'
|
|
3
3
|
|
4
4
|
module Hipbot
|
5
5
|
module Plugins
|
6
|
-
class Human
|
6
|
+
class Human
|
7
|
+
include Hipbot::Plugin
|
8
|
+
|
9
|
+
desc 'kindly greets the sender'
|
7
10
|
on /^hello/ do
|
8
11
|
reply("hello #{sender.first_name}!")
|
9
12
|
end
|
@@ -16,35 +19,34 @@ module Hipbot
|
|
16
19
|
reply("/me hands #{sender} a #{thing}")
|
17
20
|
end
|
18
21
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
on /insult (.+)/ do
|
26
|
-
message.mentions.each do |mention|
|
27
|
-
get('http://programmerinsults.com/') do |http|
|
28
|
-
insult = http.body.scan(/color: #333;">(.+?)<\/a>/mi).flatten
|
29
|
-
reply("#{mention}, #{insult.first}")
|
30
|
-
end
|
31
|
-
end
|
22
|
+
desc 'slaps given user eg. `slap @admin`'
|
23
|
+
on /slap (.+)/ do |name|
|
24
|
+
reply("/me slaps #{name} around a bit with a large trout.")
|
32
25
|
end
|
33
26
|
|
27
|
+
desc 'randomly chooses by default 1 person from online users eg. `choose 3`'
|
34
28
|
on /^choose( ([0-9]+))?/, room: true do |_, number|
|
35
29
|
number ||= 1
|
36
|
-
reply("/me chooses #{room.users.sample(number.to_i).map(&:name).to_sentence}")
|
30
|
+
reply("/me chooses #{room.users.sample(number.to_i).map(&:name).to_sentence}")
|
37
31
|
end
|
38
32
|
|
33
|
+
desc 'comforts with a pat on the back'
|
39
34
|
on /^(comfort|i haz a sad|i have a sad)/ do
|
40
35
|
reply("/me pats #{message.sender.first_name} on the head")
|
41
36
|
reply("#{message.sender.first_name}, everything is going to be alright!")
|
42
37
|
end
|
43
38
|
|
39
|
+
coder = HTMLEntities.new
|
40
|
+
cleverbot = Cleverbot::Client.new
|
44
41
|
default do |message|
|
45
|
-
|
46
|
-
|
47
|
-
|
42
|
+
response = cleverbot.write(message).to_s
|
43
|
+
if !response.empty?
|
44
|
+
# fixing broken encoding from cleverbot
|
45
|
+
response = coder.decode(response).gsub(/\|([0-9]{4})/){ |s| s.hex.chr }
|
46
|
+
reply(response)
|
47
|
+
else
|
48
|
+
reply('I don\'t understand you')
|
49
|
+
end
|
48
50
|
end
|
49
51
|
end
|
50
52
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Hipbot
|
2
|
+
module Plugins
|
3
|
+
class MemeGenerator
|
4
|
+
include Hipbot::Plugin
|
5
|
+
|
6
|
+
attr_accessor :username, :password
|
7
|
+
|
8
|
+
desc 'list available memes to generate'
|
9
|
+
on /^memes/ do
|
10
|
+
reply(Generator.memes.keys.sort.join(', '))
|
11
|
+
end
|
12
|
+
|
13
|
+
desc 'generates new meme eg. `meme allthethings Generate all the memes!`'
|
14
|
+
on /^meme (\w+)\s+(.*)/ do |meme, text|
|
15
|
+
generator = Generator.new(meme, text)
|
16
|
+
query = {
|
17
|
+
u: generator.image_url,
|
18
|
+
tt: generator.upper_text,
|
19
|
+
tb: generator.lower_text
|
20
|
+
}
|
21
|
+
encoded_query = query.respond_to?(:to_query) ? query.to_query : URI.encode_www_form(query)
|
22
|
+
image_url = "http://v1.memecaptain.com/i?#{encoded_query}"
|
23
|
+
reply(image_url)
|
24
|
+
end
|
25
|
+
|
26
|
+
class Generator
|
27
|
+
attr_reader :upper_text, :lower_text, :meme
|
28
|
+
def initialize meme, text
|
29
|
+
@meme = meme
|
30
|
+
assign_texts(text)
|
31
|
+
end
|
32
|
+
|
33
|
+
def image_url
|
34
|
+
meme_name = self.class.memes.fetch(meme.to_s)
|
35
|
+
"http://v1.memecaptain.com/#{meme_name}.png"
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def assign_texts text
|
41
|
+
quotes_regexp = /"(.*)"\s+"(.*)"/
|
42
|
+
matches = text.match(quotes_regexp)
|
43
|
+
if matches
|
44
|
+
assign_upper_and_lower_texts(matches[1], matches[2])
|
45
|
+
else
|
46
|
+
middle = text.length / 2
|
47
|
+
middle += 1 while !(text[middle].nil? || text[middle] =~ /\s/)
|
48
|
+
assign_upper_and_lower_texts(text[0..middle], text[middle+1..-1])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def assign_upper_and_lower_texts upper_text, lower_text
|
53
|
+
@upper_text = upper_text.to_s.strip
|
54
|
+
@lower_text = lower_text.to_s.strip
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.memes
|
58
|
+
{
|
59
|
+
"yuno" => "y_u_no",
|
60
|
+
"idontalways" => "most_interesting",
|
61
|
+
"allthethings" => "all_the_things",
|
62
|
+
"yodawg" => "xzibit",
|
63
|
+
"toodamnhigh" => "too_damn_high",
|
64
|
+
"fry" => "fry"
|
65
|
+
}
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'urban_dictionary'
|
2
|
+
|
3
|
+
module Hipbot
|
4
|
+
module Plugins
|
5
|
+
class UrbanDictionary
|
6
|
+
include Hipbot::Plugin
|
7
|
+
|
8
|
+
desc 'explains a phrase using UrbanDictionary'
|
9
|
+
on /^explain (.+)/ do |phrase|
|
10
|
+
entry = ::UrbanDictionary.define(phrase)
|
11
|
+
if entry.entries.nil? || entry.entries.empty?
|
12
|
+
reply("Congrats #{sender.first_name}, you just invented a completely new #{phrase.count(' ').zero? ? 'word' : 'phrase'}.")
|
13
|
+
else
|
14
|
+
reply(entry.entries.first.definition)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'wolfram'
|
2
|
+
|
3
|
+
module Hipbot
|
4
|
+
module Plugins
|
5
|
+
class WolframAlpha
|
6
|
+
include Hipbot::Plugin
|
7
|
+
|
8
|
+
delegate :appid=, to: :Wolfram
|
9
|
+
|
10
|
+
desc 'returns first three WolframAlpha search results'
|
11
|
+
on /^wolfram (.+)/ do |query|
|
12
|
+
result = Wolfram.fetch(query)
|
13
|
+
result.pods[1..3].each do |pod|
|
14
|
+
if !pod.plaintext.nil?
|
15
|
+
text = pod.plaintext
|
16
|
+
elsif !pod.img.attributes['src'].value.nil?
|
17
|
+
text = pod.img.attributes['src'].value + "#.jpg"
|
18
|
+
else
|
19
|
+
next
|
20
|
+
end
|
21
|
+
reply("#{pod.title}: #{text}")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hipbot::Plugins::MemeGenerator::Generator do
|
4
|
+
let(:meme) { stub.as_null_object }
|
5
|
+
|
6
|
+
describe "splitting text" do
|
7
|
+
it "should split text according to quotation marks" do
|
8
|
+
generator = described_class.new(meme, '"I don\'t always do a deploy" "but when I do, I do it on friday"')
|
9
|
+
generator.upper_text.should == "I don\'t always do a deploy"
|
10
|
+
generator.lower_text.should == "but when I do, I do it on friday"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should split text evenly" do
|
14
|
+
generator = described_class.new(meme, 'I don\'t always do a deploy but when I do, I do it on friday')
|
15
|
+
generator.upper_text.should == "I don't always do a deploy but"
|
16
|
+
generator.lower_text.should == "when I do, I do it on friday"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should not split monolithic text" do
|
20
|
+
generator = described_class.new(meme, 'ermagherdtestdrivendevelopment')
|
21
|
+
generator.upper_text.should == "ermagherdtestdrivendevelopment"
|
22
|
+
generator.lower_text.should == ""
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hipbot-plugins
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Bartosz Kopiński
|
@@ -10,98 +9,150 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date:
|
12
|
+
date: 2014-03-03 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: hipbot
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
|
-
- -
|
18
|
+
- - "~>"
|
21
19
|
- !ruby/object:Gem::Version
|
22
|
-
version: '0'
|
20
|
+
version: '1.0'
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.0.0
|
23
24
|
type: :runtime
|
24
25
|
prerelease: false
|
25
26
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
27
|
requirements:
|
28
|
-
- -
|
28
|
+
- - "~>"
|
29
29
|
- !ruby/object:Gem::Version
|
30
|
-
version: '0'
|
30
|
+
version: '1.0'
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.0.0
|
31
34
|
- !ruby/object:Gem::Dependency
|
32
35
|
name: cleverbot
|
33
36
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
37
|
requirements:
|
36
|
-
- -
|
38
|
+
- - "~>"
|
37
39
|
- !ruby/object:Gem::Version
|
38
|
-
version:
|
40
|
+
version: 0.2.0
|
39
41
|
type: :runtime
|
40
42
|
prerelease: false
|
41
43
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
44
|
requirements:
|
44
|
-
- -
|
45
|
+
- - "~>"
|
45
46
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
47
|
+
version: 0.2.0
|
47
48
|
- !ruby/object:Gem::Dependency
|
48
49
|
name: htmlentities
|
49
50
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
53
60
|
- !ruby/object:Gem::Version
|
54
61
|
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: wolfram
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.2.1
|
55
69
|
type: :runtime
|
56
70
|
prerelease: false
|
57
71
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
72
|
requirements:
|
60
|
-
- -
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.2.1
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: rake
|
78
|
+
requirement: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: rspec
|
92
|
+
requirement: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
type: :development
|
98
|
+
prerelease: false
|
99
|
+
version_requirements: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
61
102
|
- !ruby/object:Gem::Version
|
62
103
|
version: '0'
|
63
|
-
description:
|
104
|
+
description: Hipbot sample plugins
|
64
105
|
email:
|
65
|
-
- bartosz.kopinski@
|
106
|
+
- bartosz.kopinski@gmail.com
|
66
107
|
- pewniak747@gmail.com
|
67
108
|
executables: []
|
68
109
|
extensions: []
|
69
110
|
extra_rdoc_files: []
|
70
111
|
files:
|
71
|
-
- .gitignore
|
112
|
+
- ".gitignore"
|
113
|
+
- ".ruby-version"
|
114
|
+
- ".travis.yml"
|
72
115
|
- Gemfile
|
73
116
|
- LICENSE.txt
|
74
117
|
- README.md
|
75
118
|
- Rakefile
|
76
119
|
- hipbot-plugins.gemspec
|
77
120
|
- lib/hipbot-plugins.rb
|
121
|
+
- lib/hipbot-plugins/ascii.rb
|
122
|
+
- lib/hipbot-plugins/excuses.rb
|
78
123
|
- lib/hipbot-plugins/github.rb
|
79
124
|
- lib/hipbot-plugins/google.rb
|
125
|
+
- lib/hipbot-plugins/help.rb
|
80
126
|
- lib/hipbot-plugins/human.rb
|
127
|
+
- lib/hipbot-plugins/meme_generator.rb
|
128
|
+
- lib/hipbot-plugins/urban_dictionary.rb
|
81
129
|
- lib/hipbot-plugins/version.rb
|
130
|
+
- lib/hipbot-plugins/wolfram_alpha.rb
|
131
|
+
- spec/meme_generator_spec.rb
|
132
|
+
- spec/spec_helper.rb
|
82
133
|
homepage: https://github.com/netguru/hipbot-plugins
|
83
134
|
licenses: []
|
135
|
+
metadata: {}
|
84
136
|
post_install_message:
|
85
137
|
rdoc_options: []
|
86
138
|
require_paths:
|
87
139
|
- lib
|
88
140
|
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
141
|
requirements:
|
91
|
-
- -
|
142
|
+
- - ">="
|
92
143
|
- !ruby/object:Gem::Version
|
93
144
|
version: '0'
|
94
145
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
-
none: false
|
96
146
|
requirements:
|
97
|
-
- -
|
147
|
+
- - ">="
|
98
148
|
- !ruby/object:Gem::Version
|
99
149
|
version: '0'
|
100
150
|
requirements: []
|
101
151
|
rubyforge_project:
|
102
|
-
rubygems_version:
|
152
|
+
rubygems_version: 2.2.0.rc.1
|
103
153
|
signing_key:
|
104
|
-
specification_version:
|
105
|
-
summary: A collection of plugins to use in your
|
106
|
-
test_files:
|
107
|
-
|
154
|
+
specification_version: 4
|
155
|
+
summary: A collection of plugins to use in your Hipbot installation
|
156
|
+
test_files:
|
157
|
+
- spec/meme_generator_spec.rb
|
158
|
+
- spec/spec_helper.rb
|