twittbot 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +36 -0
- data/lib/twittbot/bot.rb +45 -5
- data/lib/twittbot/botpart.rb +21 -1
- data/lib/twittbot/cli.rb +7 -0
- data/lib/twittbot/defaults.rb +2 -2
- data/lib/twittbot/gem_ext/twitter/tweet.rb +13 -0
- data/lib/twittbot/generators/templates/big_ben_clock/big_ben_clock.rb +22 -0
- data/lib/twittbot/generators/templates/retweet_bot/retweet_bot.rb +3 -1
- data/twittbot.gemspec +5 -5
- metadata +15 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22b58f70f78a48918691c29b693ff73a2c5f3ba0
|
4
|
+
data.tar.gz: def4b5eac4b779e0d38743ebc7c9df5b77653ea0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50277aecaa7a5db1ac8eb02fcd777def98a37204ef367174d84f125bff11a4cc7b702133a7c5a9cadeb8de07fb2e938fe46e9c759973217a7542601470387297
|
7
|
+
data.tar.gz: 9482a62c929960385b853dd603a222c881ba6d7b7d41c84ca7fedc015bda6526361cc2f6aa83a8baacab7dc048efd8f15228bd543ba522cc4f7ffa61c7e5ebc8
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## 0.4.0
|
4
|
+
|
5
|
+
* Add `twittbot cron` for interacting with the bot outside from Twittbot processes, e.g. via cron
|
6
|
+
* Modify `retweet-bot` template to ignore retweets from ourselves
|
7
|
+
* Add new `big-ben-clock` template which demonstrates the usage of `twittbot cron`.
|
8
|
+
|
9
|
+
## 0.3.0
|
10
|
+
|
11
|
+
* Add `on :load` event.
|
12
|
+
|
13
|
+
## 0.2.0
|
14
|
+
|
15
|
+
* Bot callbacks are now stored in an array
|
16
|
+
|
17
|
+
## 0.1.2
|
18
|
+
|
19
|
+
* Automatically reconnect to user streams after 5 seconds
|
20
|
+
|
21
|
+
## 0.1.1
|
22
|
+
|
23
|
+
* Fix EOFError occurring when streams are open for a long time
|
24
|
+
|
25
|
+
## 0.1.0
|
26
|
+
|
27
|
+
* Add `add-admin` and `del-admin` commands
|
28
|
+
* Add support for direct messages
|
29
|
+
* Add new BotPart method for commands over direct messages
|
30
|
+
* Add a basic direct message template
|
31
|
+
* Add ability to save config for each BotPart
|
32
|
+
* Add example direct message command to `random-tweet` template
|
33
|
+
|
34
|
+
## 0.0.1
|
35
|
+
|
36
|
+
* Initial release
|
data/lib/twittbot/bot.rb
CHANGED
@@ -24,7 +24,9 @@ module Twittbot
|
|
24
24
|
config: Twittbot::DEFAULT_BOT_CONFIG.merge(
|
25
25
|
YAML.load_file(File.expand_path("./#{Twittbot::CONFIG_FILE_NAME}", @options[:current_dir]))
|
26
26
|
),
|
27
|
-
periodic: []
|
27
|
+
periodic: [],
|
28
|
+
save_config: true,
|
29
|
+
tasks: {}
|
28
30
|
}.merge!(options)
|
29
31
|
|
30
32
|
load_bot_code
|
@@ -32,7 +34,7 @@ module Twittbot
|
|
32
34
|
at_exit do
|
33
35
|
save_config
|
34
36
|
$bot[:botparts].each { |b| b.save_config }
|
35
|
-
end
|
37
|
+
end if $bot[:save_config]
|
36
38
|
end
|
37
39
|
|
38
40
|
# Authenticates an account with Twitter.
|
@@ -103,7 +105,7 @@ module Twittbot
|
|
103
105
|
@periodic_thread ||= Thread.new do
|
104
106
|
loop do
|
105
107
|
begin
|
106
|
-
do_periodic
|
108
|
+
Thread.new { do_periodic }
|
107
109
|
rescue => _
|
108
110
|
end
|
109
111
|
sleep 60
|
@@ -117,6 +119,20 @@ module Twittbot
|
|
117
119
|
@periodic_thread.join
|
118
120
|
end
|
119
121
|
|
122
|
+
# Runs the task `task_name`.
|
123
|
+
# @param task_name [Symbol] The name of the task to be run.
|
124
|
+
def cron(task_name)
|
125
|
+
task = $bot[:tasks][task_name]
|
126
|
+
unless task
|
127
|
+
say "Task \"#{task_name}\" does not exist. Use \"twittbot cron list\" for a list of available tasks."
|
128
|
+
return
|
129
|
+
end
|
130
|
+
|
131
|
+
#check_config
|
132
|
+
init_clients
|
133
|
+
task[:block].call
|
134
|
+
end
|
135
|
+
|
120
136
|
# @param screen_name [String] the user's screen name
|
121
137
|
# @param action [Symbol] :add or :delete
|
122
138
|
def modify_admin(screen_name, action = :add)
|
@@ -137,6 +153,7 @@ module Twittbot
|
|
137
153
|
# Loads the bot's actual code which is stored in the bot's +lib+
|
138
154
|
# subdirectory.
|
139
155
|
def load_bot_code
|
156
|
+
load_special_tasks
|
140
157
|
files = Dir["#{File.expand_path('./lib', @options[:current_dir])}/**/*"]
|
141
158
|
files.each do |file|
|
142
159
|
require_relative file.sub(/\.rb$/, '') if file.end_with? '.rb'
|
@@ -176,7 +193,7 @@ module Twittbot
|
|
176
193
|
is_mention = (object.user.screen_name != $bot[:config][:screen_name] and object.text.include?("@" + $bot[:config][:screen_name]) and not object.retweet?)
|
177
194
|
do_callbacks :retweet, object, opts if object.retweet? and object.retweeted_tweet.user.screen_name == $bot[:config][:screen_name]
|
178
195
|
do_callbacks :mention, object, opts if is_mention
|
179
|
-
do_callbacks :tweet, object, opts.merge({ mention: is_mention, retweet: object.retweet? })
|
196
|
+
do_callbacks :tweet, object, opts.merge({ mention: is_mention, retweet: object.retweet?, favorite: object.favorited? })
|
180
197
|
when Twitter::Streaming::Event
|
181
198
|
case object.name
|
182
199
|
when :follow, :favorite
|
@@ -210,7 +227,7 @@ module Twittbot
|
|
210
227
|
|
211
228
|
def do_periodic
|
212
229
|
$bot[:periodic].each_with_index do |h, i|
|
213
|
-
h[:remaining] = if h[:remaining]
|
230
|
+
h[:remaining] = if h[:remaining] - 1 <= 0
|
214
231
|
h[:block].call
|
215
232
|
h[:interval]
|
216
233
|
else
|
@@ -267,5 +284,28 @@ module Twittbot
|
|
267
284
|
oauth_response = access_token.get('/1.1/account/verify_credentials.json?skip_status=true')
|
268
285
|
oauth_response.body.match(/"screen_name"\s*:\s*"(.*?)"/).captures.first
|
269
286
|
end
|
287
|
+
|
288
|
+
# Load special tasks (e.g. list)
|
289
|
+
def load_special_tasks
|
290
|
+
$bot[:tasks][:list] = {
|
291
|
+
block: -> do
|
292
|
+
list_tasks
|
293
|
+
end,
|
294
|
+
desc: 'List all available tasks'
|
295
|
+
}
|
296
|
+
end
|
297
|
+
|
298
|
+
# Lists all tasks
|
299
|
+
def list_tasks
|
300
|
+
tasks = $bot[:tasks].map do |name, value|
|
301
|
+
[name, value[:desc]]
|
302
|
+
end.to_h
|
303
|
+
longest_name = tasks.keys.map(&:to_s).max { |a, b| a.length <=> b.length }.length
|
304
|
+
tasks = tasks.map do |name, desc|
|
305
|
+
"twittbot cron %-*s # %s" % [longest_name + 2, name, desc]
|
306
|
+
end.sort
|
307
|
+
|
308
|
+
puts tasks
|
309
|
+
end
|
270
310
|
end
|
271
311
|
end
|
data/lib/twittbot/botpart.rb
CHANGED
@@ -90,6 +90,26 @@ module Twittbot
|
|
90
90
|
}
|
91
91
|
end
|
92
92
|
|
93
|
+
# Defines a new task to be run outside of a running Twittbot process.
|
94
|
+
# @param name [Symbol] The name of the task.
|
95
|
+
# @param options [Hash] A customizable set of options.
|
96
|
+
# @option options [String] :desc ("") Description of this task
|
97
|
+
def task(name, options = {}, &block)
|
98
|
+
name = name.to_s.downcase.to_sym
|
99
|
+
task_re = /\A[a-z0-9.:-_]+\z/
|
100
|
+
raise "Task already exists: #{name}" if $bot[:tasks].include?(name)
|
101
|
+
raise "Task name does not match regexp #{task_re.to_s}" unless name.to_s.match(task_re)
|
102
|
+
|
103
|
+
opts = {
|
104
|
+
desc: ''
|
105
|
+
}.merge(options)
|
106
|
+
|
107
|
+
$bot[:tasks][name] ||= {
|
108
|
+
block: block,
|
109
|
+
desc: opts[:desc]
|
110
|
+
}
|
111
|
+
end
|
112
|
+
|
93
113
|
# Saves the botpart's configuration. This is automatically called when
|
94
114
|
# Twittbot exits.
|
95
115
|
def save_config
|
@@ -102,4 +122,4 @@ module Twittbot
|
|
102
122
|
end
|
103
123
|
end
|
104
124
|
end
|
105
|
-
end
|
125
|
+
end
|
data/lib/twittbot/cli.rb
CHANGED
@@ -26,6 +26,13 @@ module Twittbot
|
|
26
26
|
bot.start
|
27
27
|
end
|
28
28
|
|
29
|
+
desc 'cron TASK_NAME', 'Runs the task TASK_NAME, useful for calling from cron'
|
30
|
+
def cron(task_name)
|
31
|
+
require 'twittbot/bot'
|
32
|
+
bot = Twittbot::Bot.new(save_config: false)
|
33
|
+
bot.cron(task_name.downcase.to_sym)
|
34
|
+
end
|
35
|
+
|
29
36
|
desc 'generate TEMPLATE_NAME', 'Installs a template'
|
30
37
|
def generate(template_name)
|
31
38
|
require 'twittbot/generators/templates/template_generator'
|
data/lib/twittbot/defaults.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Twittbot
|
2
2
|
# The version of Twittbot.
|
3
|
-
VERSION = "0.
|
3
|
+
VERSION = "0.4.0"
|
4
4
|
|
5
5
|
CONSUMER_KEY = 'FYRuQcDbPAXAyVjuPZMuw' # :nodoc:
|
6
6
|
CONSUMER_SECRET = 'KiLCYTftPdxNebl5DNcj7Ey2Y8YVZu7hfqiFRYkcg' # :nodoc:
|
@@ -23,4 +23,4 @@ module Twittbot
|
|
23
23
|
|
24
24
|
# How many seconds should be waited until the bot reconnects
|
25
25
|
RECONNECT_WAIT_TIME = 5
|
26
|
-
end
|
26
|
+
end
|
@@ -26,6 +26,19 @@ module Twitter
|
|
26
26
|
rescue Twitter::Error => e
|
27
27
|
puts "caught Twitter error while retweeting: #{e.message}"
|
28
28
|
end
|
29
|
+
alias rt retweet
|
30
|
+
|
31
|
+
# Favourites a tweet
|
32
|
+
def favourite
|
33
|
+
return if $bot.nil? or $bot[:client].nil?
|
34
|
+
$bot[:client].favorite self.id
|
35
|
+
rescue Twitter::Error => e
|
36
|
+
puts "caught Twitter error while favouriting: #{e.message}"
|
37
|
+
end
|
38
|
+
alias fav favourite
|
39
|
+
alias fave favourite
|
40
|
+
# for the 'muricans
|
41
|
+
alias favorite favourite
|
29
42
|
|
30
43
|
# Scans the tweet text for screen names.
|
31
44
|
# @param reply_all [Boolean] Include all users in the reply.
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<%
|
2
|
+
# This is the config for this botpart.
|
3
|
+
# It is a hash and will be serialized to YAML and saved to 'etc/template_name.yml'.
|
4
|
+
botpart_config = {
|
5
|
+
string_to_repeat: 'BONG'
|
6
|
+
}
|
7
|
+
|
8
|
+
# Display a message after installation template installation
|
9
|
+
post_install_message <<-MSG
|
10
|
+
Note: You installed a botpart which contains a task.
|
11
|
+
|
12
|
+
A task can only be called outside of a running Twittbot process, e.g. from an
|
13
|
+
UNIX shell or cron.
|
14
|
+
MSG
|
15
|
+
%>
|
16
|
+
Twittbot::BotPart.new :<%= @template_name %> do
|
17
|
+
task :bong, desc: 'Big Ben Clock bong!' do
|
18
|
+
repeats = Time.now.hour % 12
|
19
|
+
repeats = 12 if repeats == 0
|
20
|
+
bot.tweet "#{@config[:string_to_repeat]} " * repeats
|
21
|
+
end
|
22
|
+
end
|
@@ -20,6 +20,8 @@ MSG
|
|
20
20
|
Twittbot::BotPart.new :<%= @template_name %> do
|
21
21
|
# When there's a new tweet in the timeline...
|
22
22
|
on :tweet do |tweet, opts|
|
23
|
+
# ... ignore this tweet if it is from ourselves ...
|
24
|
+
next if tweet.user.screen_name == @config[:screen_name]
|
23
25
|
# ... check if the tweet text contains at least one of the tags defined in your config...
|
24
26
|
@config[:tags].each do |tag|
|
25
27
|
if tweet.text.downcase.include? tag.downcase
|
@@ -29,4 +31,4 @@ Twittbot::BotPart.new :<%= @template_name %> do
|
|
29
31
|
end
|
30
32
|
end
|
31
33
|
end
|
32
|
-
end
|
34
|
+
end
|
data/twittbot.gemspec
CHANGED
@@ -20,9 +20,9 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_dependency 'thor', '~> 0.19'
|
22
22
|
spec.add_dependency 'erubis', '~> 2.7', '>= 2.7.0'
|
23
|
-
spec.add_dependency 'oauth', '~> 0.
|
24
|
-
spec.add_dependency 'twitter', '~> 5.
|
25
|
-
spec.add_development_dependency 'yard', '~> 0.
|
26
|
-
spec.add_development_dependency 'bundler', '
|
27
|
-
spec.add_development_dependency 'rake', '~>
|
23
|
+
spec.add_dependency 'oauth', '~> 0.5'
|
24
|
+
spec.add_dependency 'twitter', '~> 5.16'
|
25
|
+
spec.add_development_dependency 'yard', '~> 0.9'
|
26
|
+
spec.add_development_dependency 'bundler', '>= 1.7'
|
27
|
+
spec.add_development_dependency 'rake', '~> 11.3'
|
28
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twittbot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- nilsding
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-10-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -50,54 +50,54 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '0.
|
53
|
+
version: '0.5'
|
54
54
|
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: '0.
|
60
|
+
version: '0.5'
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: twitter
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
65
|
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: '5.
|
67
|
+
version: '5.16'
|
68
68
|
type: :runtime
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: '5.
|
74
|
+
version: '5.16'
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: yard
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
79
|
- - "~>"
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: '0.
|
81
|
+
version: '0.9'
|
82
82
|
type: :development
|
83
83
|
prerelease: false
|
84
84
|
version_requirements: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: '0.
|
88
|
+
version: '0.9'
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
90
|
name: bundler
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
92
92
|
requirements:
|
93
|
-
- - "
|
93
|
+
- - ">="
|
94
94
|
- !ruby/object:Gem::Version
|
95
95
|
version: '1.7'
|
96
96
|
type: :development
|
97
97
|
prerelease: false
|
98
98
|
version_requirements: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
|
-
- - "
|
100
|
+
- - ">="
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: '1.7'
|
103
103
|
- !ruby/object:Gem::Dependency
|
@@ -106,14 +106,14 @@ dependencies:
|
|
106
106
|
requirements:
|
107
107
|
- - "~>"
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version: '
|
109
|
+
version: '11.3'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
112
|
version_requirements: !ruby/object:Gem::Requirement
|
113
113
|
requirements:
|
114
114
|
- - "~>"
|
115
115
|
- !ruby/object:Gem::Version
|
116
|
-
version: '
|
116
|
+
version: '11.3'
|
117
117
|
description: Twittbot is an advanced Twitter bot. See the README for more info.
|
118
118
|
email:
|
119
119
|
- nilsding@nilsding.org
|
@@ -124,6 +124,7 @@ extra_rdoc_files: []
|
|
124
124
|
files:
|
125
125
|
- ".gitignore"
|
126
126
|
- ".yardopts"
|
127
|
+
- CHANGELOG.md
|
127
128
|
- Gemfile
|
128
129
|
- LICENSE.txt
|
129
130
|
- README.md
|
@@ -140,6 +141,7 @@ files:
|
|
140
141
|
- lib/twittbot/gem_ext/twitter/tweet.rb
|
141
142
|
- lib/twittbot/gem_ext/twitter/user.rb
|
142
143
|
- lib/twittbot/generators/templates/basic_dm/basic_dm.rb
|
144
|
+
- lib/twittbot/generators/templates/big_ben_clock/big_ben_clock.rb
|
143
145
|
- lib/twittbot/generators/templates/followback/followback.rb
|
144
146
|
- lib/twittbot/generators/templates/random_reply/random_reply.rb
|
145
147
|
- lib/twittbot/generators/templates/random_tweet/random_tweet.rb
|
@@ -173,9 +175,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
173
175
|
version: '0'
|
174
176
|
requirements: []
|
175
177
|
rubyforge_project:
|
176
|
-
rubygems_version: 2.
|
178
|
+
rubygems_version: 2.5.1
|
177
179
|
signing_key:
|
178
180
|
specification_version: 4
|
179
181
|
summary: An advanced Twitter bot.
|
180
182
|
test_files: []
|
181
|
-
has_rdoc:
|