botolo 0.10.0 → 0.20.0
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 +4 -4
- data/README.md +97 -2
- data/bin/botolo +7 -6
- data/botolo.gemspec +4 -1
- data/lib/botolo/bot/engine.rb +40 -13
- data/lib/botolo/version.rb +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d26a145e0b3ac102c30cf98e2ce8a45b25775149
|
4
|
+
data.tar.gz: 9655334f33005b852effe442d23142da14883175
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de587e1e239f1ab995b149936377168ffa13dd0ef3903df6c608bce8c119133902c6f351086518cd3b3fc4cf32f29c7a0e635b5a7dc4eba084049bec5b768e98
|
7
|
+
data.tar.gz: 071885a1b089208ef848deac5c487f02d6d26d36bcee5ffb7939abd68fc8320e9a6fa06357bb60feffd35e4f5cdf4fb4522db6925e5a6eafa44098705b33b23c
|
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# Botolo
|
2
2
|
|
3
|
-
|
3
|
+
Botolo is an engine for bots written in ruby. With botolo you must take care
|
4
|
+
only about writing actions your bot must implement and then the engine will
|
5
|
+
execute them for you.
|
4
6
|
|
5
7
|
## Installation
|
6
8
|
|
@@ -18,7 +20,100 @@ Or install it yourself as:
|
|
18
20
|
|
19
21
|
## Usage
|
20
22
|
|
21
|
-
|
23
|
+
For creating a great bot you have to describe in a YAML configuration file the
|
24
|
+
Bot behaviour and in a separate ruby class you must implement the methods your
|
25
|
+
bot must carry on.
|
26
|
+
|
27
|
+
Let's see how to create a very dummy bot saying _foo_ every 3 seconds and
|
28
|
+
saying _hello_ every 5 seconds.
|
29
|
+
|
30
|
+
You have to write a config.yaml file containing the action schedule and some
|
31
|
+
very basic information about your bot.
|
32
|
+
|
33
|
+
```
|
34
|
+
verbose: true
|
35
|
+
|
36
|
+
bot:
|
37
|
+
name: dummy-bot
|
38
|
+
version: 1.0
|
39
|
+
email: paolo@codesake.com
|
40
|
+
# This overrides any behaviour file passed as argument
|
41
|
+
behaviour: dummy-bot.rb
|
42
|
+
|
43
|
+
twitter:
|
44
|
+
enabled: no
|
45
|
+
task:
|
46
|
+
- { schedule: every 5 s, action: say_hello }
|
47
|
+
- { schedule: every 3 s, action: say_foo }
|
48
|
+
```
|
49
|
+
|
50
|
+
Botolo expects to find in the current directory a file named dummy-bot.rb
|
51
|
+
implementing the two methods (say\_hello and say\_foo) it has to run based upon
|
52
|
+
this schedule.
|
53
|
+
There is a **big** constraint: your ruby file must be a Botolo::Bot::Behaviour
|
54
|
+
class. It must also implement an initialize method with an Hash parameter
|
55
|
+
engine will use to pass options to the bot.
|
56
|
+
|
57
|
+
It will be used in the future to implement some form of communication between
|
58
|
+
the main process and threads, useful to provide a centralized console about
|
59
|
+
what's going on on your bot.
|
60
|
+
|
61
|
+
Let's see our dummy bot behaviour:
|
62
|
+
|
63
|
+
```
|
64
|
+
module Botolo
|
65
|
+
module Bot
|
66
|
+
class Behaviour
|
67
|
+
def initialize(options={})
|
68
|
+
end
|
69
|
+
|
70
|
+
def say_hello
|
71
|
+
puts "hello"
|
72
|
+
end
|
73
|
+
|
74
|
+
def say_foo
|
75
|
+
puts "foo"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
```
|
81
|
+
|
82
|
+
It's easy, isn't it!?!
|
83
|
+
|
84
|
+
Now, all you have to do is running the botolo command specifying the config
|
85
|
+
file as parameter. Remember to put the behaviour class in the same directory of
|
86
|
+
your YAML file.
|
87
|
+
|
88
|
+
```
|
89
|
+
$ botolo config.yaml
|
90
|
+
botolo:9: warning: already initialized constant OpenSSL::SSL::VERIFY_PEER
|
91
|
+
[*] dummy-bot v1.0 is starting up at 08:31:31
|
92
|
+
08:31:31: 2 tasks loaded
|
93
|
+
08:31:31: using ./dummy-bot.rb as bot behaviour
|
94
|
+
08:31:31: dummy-bot is online
|
95
|
+
08:31:31: entering main loop
|
96
|
+
08:31:31: hello
|
97
|
+
08:31:31: foo
|
98
|
+
08:31:34: foo
|
99
|
+
08:31:36: hello
|
100
|
+
08:31:37: foo
|
101
|
+
08:31:40: foo
|
102
|
+
08:31:41: hello
|
103
|
+
08:31:43: foo
|
104
|
+
^C08:31:46: shutting down threads
|
105
|
+
08:31:46: pid #<Thread:0x007fa731022e18> killed
|
106
|
+
08:31:46: pid #<Thread:0x007fa731022cd8> killed
|
107
|
+
[*] bot is shutting down at 08:31:46
|
108
|
+
```
|
109
|
+
|
110
|
+
Custom written behaviour can use the global variable $logger to use botolo logging
|
111
|
+
facilities and having the stdout/stderr prints more consistent.
|
112
|
+
|
113
|
+
## Missing features
|
114
|
+
|
115
|
+
A back channels for threads to communicate with the engine about action
|
116
|
+
status.
|
22
117
|
|
23
118
|
## Contributing
|
24
119
|
|
data/bin/botolo
CHANGED
@@ -5,10 +5,11 @@ require 'openssl'
|
|
5
5
|
require 'codesake_commons'
|
6
6
|
|
7
7
|
DEFAULT_BEHAVIOUR = "./lib/botolo/bot/behaviour.rb"
|
8
|
+
|
8
9
|
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
|
9
10
|
|
10
11
|
$logger = Codesake::Commons::Logging.instance
|
11
|
-
trap("INT") { $logger.helo('bot is shutting down'); Kernel.exit(0) }
|
12
|
+
trap("INT") { @bot.stop; $logger.helo('bot is shutting down'); Kernel.exit(0) }
|
12
13
|
|
13
14
|
behaviour_file = DEFAULT_BEHAVIOUR
|
14
15
|
config_file = nil
|
@@ -16,10 +17,10 @@ config_file = ARGV[0] if ARGV.count == 1
|
|
16
17
|
|
17
18
|
$logger.die "usage: botolo bot_configuration_file" if config_file.nil?
|
18
19
|
|
19
|
-
bot = Botolo::Bot::Engine.new({:config=>config_file})
|
20
|
-
$logger.log "#{bot.name} is online" if bot.online?
|
21
|
-
$logger.log "#{bot.name} is offline" unless bot.online?
|
22
|
-
bot.run if bot.online?
|
23
|
-
|
20
|
+
@bot = Botolo::Bot::Engine.new({:config=>config_file})
|
21
|
+
$logger.log "#{@bot.name} is online" if @bot.online?
|
22
|
+
$logger.log "#{@bot.name} is offline" unless @bot.online?
|
23
|
+
@bot.run if @bot.online?
|
24
|
+
@bot.infinite_loop
|
24
25
|
|
25
26
|
|
data/botolo.gemspec
CHANGED
@@ -9,7 +9,10 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Paolo Perego"]
|
10
10
|
spec.email = ["thesp0nge@gmail.com"]
|
11
11
|
spec.description = %q{botolo is a bot engine written in ruby}
|
12
|
-
spec.summary = %q{botolo is a bot engine written in ruby
|
12
|
+
spec.summary = %q{botolo is a bot engine written in ruby. With botolo
|
13
|
+
you can focus on writing a set of actions your bot will execute every
|
14
|
+
amount of seconds, minutes or whatever and implement those actions. The
|
15
|
+
part of executing them and putting babies to sleep will be up to botolo.}
|
13
16
|
spec.homepage = "http://codesake.com"
|
14
17
|
spec.license = "MIT"
|
15
18
|
|
data/lib/botolo/bot/engine.rb
CHANGED
@@ -3,23 +3,23 @@ require 'yaml'
|
|
3
3
|
|
4
4
|
module Botolo
|
5
5
|
module Bot
|
6
|
-
|
7
|
-
# This is the main bot class, it is responsible of:
|
8
|
-
# * reading configuration
|
9
|
-
# * using Twitter APIs
|
10
|
-
# * do something
|
11
6
|
class Engine
|
12
7
|
|
13
8
|
def initialize(options={})
|
14
9
|
@start_time = Time.now
|
15
10
|
@online = false
|
16
11
|
@config = read_conf(options[:config])
|
17
|
-
authenticate
|
12
|
+
authenticate if @config['twitter']['enabled']
|
13
|
+
|
18
14
|
@tasks = @config['task']
|
15
|
+
@task_pids = []
|
16
|
+
|
19
17
|
behaviour = File.join(".", @config['bot']['behaviour']) unless @config['bot']['behaviour'].nil?
|
20
18
|
|
21
19
|
$logger.helo "#{name} v#{version} is starting up"
|
22
20
|
|
21
|
+
$logger.log "#{@tasks.size} tasks loaded"
|
22
|
+
|
23
23
|
begin
|
24
24
|
load behaviour
|
25
25
|
$logger.log "using #{behaviour} as bot behaviour"
|
@@ -51,18 +51,45 @@ module Botolo
|
|
51
51
|
|
52
52
|
def run
|
53
53
|
$logger.log "entering main loop"
|
54
|
+
@tasks.each do |task|
|
55
|
+
@task_pids << Thread.start do
|
56
|
+
start_task(task['action'], task['schedule'])
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
def infinite_loop
|
54
63
|
while true
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def start_task(name, sleep)
|
69
|
+
while true
|
70
|
+
begin
|
71
|
+
@behaviour.send(name.to_sym) if @behaviour.respond_to? name.to_sym
|
72
|
+
rescue => e
|
73
|
+
$logger.err "#{name} failed (#{e.message})"
|
62
74
|
end
|
75
|
+
sleep calc_sleep_time(sleep)
|
63
76
|
end
|
64
77
|
|
65
78
|
end
|
79
|
+
|
80
|
+
def stop
|
81
|
+
$logger.log "shutting down threads"
|
82
|
+
@task_pids.each do |pid|
|
83
|
+
Thread.kill(pid)
|
84
|
+
sleep 0.05
|
85
|
+
$logger.log "pid #{pid} killed" if ! pid.alive?
|
86
|
+
$logger.err "pid #{pid} not killed" if pid.alive?
|
87
|
+
end
|
88
|
+
|
89
|
+
true
|
90
|
+
end
|
91
|
+
|
92
|
+
|
66
93
|
def authenticate
|
67
94
|
begin
|
68
95
|
Twitter.configure do |config|
|
data/lib/botolo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: botolo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.20.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paolo Perego
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-07-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -108,5 +108,8 @@ rubyforge_project:
|
|
108
108
|
rubygems_version: 2.0.3
|
109
109
|
signing_key:
|
110
110
|
specification_version: 4
|
111
|
-
summary: botolo is a bot engine written in ruby
|
111
|
+
summary: botolo is a bot engine written in ruby. With botolo you can focus on writing
|
112
|
+
a set of actions your bot will execute every amount of seconds, minutes or whatever
|
113
|
+
and implement those actions. The part of executing them and putting babies to sleep
|
114
|
+
will be up to botolo.
|
112
115
|
test_files: []
|