Sutto-marvin 0.4.0 → 0.8.0.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.
- data/bin/marvin +22 -156
- data/handlers/keiki_thwopper.rb +21 -0
- data/handlers/tweet_tweet.rb +1 -3
- data/lib/marvin/abstract_client.rb +75 -189
- data/lib/marvin/abstract_parser.rb +9 -11
- data/lib/marvin/base.rb +134 -101
- data/lib/marvin/client/actions.rb +104 -0
- data/lib/marvin/client/default_handlers.rb +97 -0
- data/lib/marvin/command_handler.rb +60 -49
- data/lib/marvin/console.rb +4 -31
- data/lib/marvin/core_commands.rb +30 -12
- data/lib/marvin/distributed/client.rb +225 -0
- data/lib/marvin/distributed/handler.rb +85 -0
- data/lib/marvin/distributed/protocol.rb +88 -0
- data/lib/marvin/distributed/server.rb +154 -0
- data/lib/marvin/distributed.rb +4 -10
- data/lib/marvin/dsl.rb +103 -0
- data/lib/marvin/exception_tracker.rb +7 -4
- data/lib/marvin/irc/client.rb +127 -99
- data/lib/marvin/irc/event.rb +14 -10
- data/lib/marvin/irc.rb +0 -1
- data/lib/marvin/middle_man.rb +1 -1
- data/lib/marvin/parsers/command.rb +10 -8
- data/lib/marvin/parsers/prefixes/host_mask.rb +12 -7
- data/lib/marvin/parsers/prefixes/server.rb +1 -1
- data/lib/marvin/parsers/ragel_parser.rb +59 -52
- data/lib/marvin/parsers/ragel_parser.rl +6 -7
- data/lib/marvin/parsers/simple_parser.rb +4 -9
- data/lib/marvin/parsers.rb +1 -2
- data/lib/marvin/settings.rb +29 -79
- data/lib/marvin/test_client.rb +20 -26
- data/lib/marvin/util.rb +10 -3
- data/lib/marvin.rb +42 -39
- data/templates/boot.erb +3 -0
- data/templates/connections.yml.erb +10 -0
- data/templates/debug_handler.erb +5 -0
- data/templates/hello_world.erb +10 -0
- data/templates/rakefile.erb +15 -0
- data/templates/settings.yml.erb +8 -0
- data/{config/setup.rb → templates/setup.erb} +8 -10
- data/templates/test_helper.erb +17 -0
- data/test/abstract_client_test.rb +63 -0
- data/test/parser_comparison.rb +2 -2
- data/test/parser_test.rb +3 -3
- data/test/test_helper.rb +58 -6
- metadata +51 -83
- data/README.textile +0 -105
- data/TUTORIAL.textile +0 -54
- data/VERSION.yml +0 -4
- data/config/boot.rb +0 -14
- data/config/connections.yml.sample +0 -5
- data/config/settings.yml.sample +0 -13
- data/handlers/logging_handler.rb +0 -89
- data/lib/marvin/core_ext.rb +0 -11
- data/lib/marvin/daemon.rb +0 -71
- data/lib/marvin/data_store.rb +0 -73
- data/lib/marvin/dispatchable.rb +0 -99
- data/lib/marvin/distributed/dispatch_handler.rb +0 -83
- data/lib/marvin/distributed/drb_client.rb +0 -78
- data/lib/marvin/distributed/ring_server.rb +0 -41
- data/lib/marvin/handler.rb +0 -12
- data/lib/marvin/irc/server/abstract_connection.rb +0 -84
- data/lib/marvin/irc/server/base_connection.rb +0 -66
- data/lib/marvin/irc/server/channel.rb +0 -115
- data/lib/marvin/irc/server/named_store.rb +0 -14
- data/lib/marvin/irc/server/remote_interface.rb +0 -77
- data/lib/marvin/irc/server/user/handle_mixin.rb +0 -140
- data/lib/marvin/irc/server/user.rb +0 -5
- data/lib/marvin/irc/server/user_connection.rb +0 -134
- data/lib/marvin/irc/server/virtual_user_connection.rb +0 -80
- data/lib/marvin/irc/server.rb +0 -71
- data/lib/marvin/loader.rb +0 -149
- data/lib/marvin/logger.rb +0 -86
- data/lib/marvin/options.rb +0 -42
- data/lib/marvin/parsers/regexp_parser.rb +0 -93
- data/lib/marvin/status.rb +0 -72
- data/script/client +0 -3
- data/script/console +0 -3
- data/script/distributed_client +0 -3
- data/script/install +0 -1
- data/script/ring_server +0 -4
- data/script/server +0 -4
- data/script/status +0 -3
- data/spec/marvin/abstract_client_test.rb +0 -38
- data/spec/spec_helper.rb +0 -14
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
|
4
|
+
task :default => "test:units"
|
5
|
+
|
6
|
+
namespace :test do
|
7
|
+
|
8
|
+
desc "Runs the unit tests for perennial"
|
9
|
+
Rake::TestTask.new("units") do |t|
|
10
|
+
t.pattern = 'test/*_test.rb'
|
11
|
+
t.libs << 'test'
|
12
|
+
t.verbose = true
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -4,16 +4,12 @@
|
|
4
4
|
# any connections are created
|
5
5
|
Marvin::Loader.before_run do
|
6
6
|
|
7
|
-
# Want a non-default namespace? Choose something simple
|
8
|
-
# Marvin::Settings.distributed_namespace = :some_namespace
|
9
|
-
|
10
7
|
# E.G.
|
11
8
|
# MyHandler.register! (Marvin::Base subclass) or
|
12
|
-
# Marvin::Settings.
|
9
|
+
# Marvin::Settings.client.register_handler my_handler (a handler instance)
|
13
10
|
|
14
|
-
# Register
|
15
|
-
#
|
16
|
-
# LoggingHandler.register! if Marvin::Settings.use_logging
|
11
|
+
# Register based on some setting you've added. e.g.:
|
12
|
+
# LoggingHandler.register! if Marvin::Settings.use_logging?
|
17
13
|
|
18
14
|
# Conditional registration - load the distributed dispatcher
|
19
15
|
# if an actual client, otherwise use the normal handlers.
|
@@ -22,12 +18,14 @@ Marvin::Loader.before_run do
|
|
22
18
|
# HelloWorld.register!
|
23
19
|
# DebugHandler.register!
|
24
20
|
# else
|
25
|
-
# Marvin::Distributed::
|
21
|
+
# Marvin::Distributed::Handler.register!
|
22
|
+
# else
|
23
|
+
|
26
24
|
# end
|
27
25
|
|
28
|
-
# And any other code here that will be run before the client
|
26
|
+
# And any other code here that will be run before the client, e.g:
|
29
27
|
|
30
28
|
HelloWorld.register!
|
31
29
|
DebugHandler.register!
|
32
30
|
|
33
|
-
end
|
31
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
# Testing dependencies
|
4
|
+
require 'test/unit'
|
5
|
+
require 'shoulda'
|
6
|
+
# RedGreen doesn't seem to be needed under 1.9
|
7
|
+
require 'redgreen' if RUBY_VERSION < "1.9"
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
root_directory = Pathname.new(__FILE__).dirname.join("..").expand_path
|
11
|
+
require root_directory.join("config", "boot")
|
12
|
+
|
13
|
+
class Test::Unit::TestCase
|
14
|
+
|
15
|
+
# Add your extensions here
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
class AbstractClientTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context 'testing out a connection' do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
@client = Marvin::Settings.client
|
9
|
+
@client.setup
|
10
|
+
@config = @client.configuration
|
11
|
+
@client.configuration = {
|
12
|
+
:user => "DemoUser",
|
13
|
+
:name => "Demo Users Name",
|
14
|
+
:nick => "Haysoos",
|
15
|
+
:nicks => ["Haysoos_", "Haysoos__"]
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
should "dispatch :client_connected as the first event on process_connect" do
|
20
|
+
assert_resets_client
|
21
|
+
client.process_connect
|
22
|
+
assert_equal [:client_connected, {}], client.dispatched_events.first
|
23
|
+
assert_dispatched :client_connected, 0, {}
|
24
|
+
end
|
25
|
+
|
26
|
+
should "dispatch :client_connected as the first event on process_connect" do
|
27
|
+
assert_resets_client
|
28
|
+
client.default_channels = ["#awesome", "#rock"]
|
29
|
+
client.process_connect
|
30
|
+
assert_dispatched :client_connected, -2, {}
|
31
|
+
assert_dispatched :outgoing_nick, -1
|
32
|
+
assert_equal 2, client.outgoing_commands.length
|
33
|
+
assert_equal "NICK Haysoos\r\n", client.outgoing_commands[0]
|
34
|
+
assert_sent_line "NICK Haysoos\r\n", 0
|
35
|
+
assert_sent_line "USER DemoUser 0 \* :Demo Users Name\r\n", 1
|
36
|
+
end
|
37
|
+
|
38
|
+
should "dispatch :client_disconnect on process_disconnect" do
|
39
|
+
assert_resets_client
|
40
|
+
client.process_disconnect
|
41
|
+
assert_dispatched :client_disconnected
|
42
|
+
end
|
43
|
+
|
44
|
+
should 'attempt to join the default channels on receiving welcome' do
|
45
|
+
assert_resets_client
|
46
|
+
client.default_channels = ["#awesome", "#rock"]
|
47
|
+
client.handle_welcome
|
48
|
+
assert_sent_line "JOIN #awesome,#rock\r\n"
|
49
|
+
end
|
50
|
+
|
51
|
+
should "add an :incoming_line event for each incoming line" do
|
52
|
+
assert_resets_client
|
53
|
+
client.receive_line "SOME RANDOM LINE THAT HAS ZERO ACTUAL USE"
|
54
|
+
assert_dispatched :incoming_line, 0, :line => "SOME RANDOM LINE THAT HAS ZERO ACTUAL USE"
|
55
|
+
end
|
56
|
+
|
57
|
+
teardown do
|
58
|
+
@client.configuration = @config
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
data/test/parser_comparison.rb
CHANGED
@@ -12,7 +12,7 @@ LINES = [
|
|
12
12
|
":SuttoL!n=SuttoL@li6-47.members.linode.com PRIVMSG #relayrelay :testing...",
|
13
13
|
":wolfe.freenode.net 004 MarvinBot3000 wolfe.freenode.net hyperion-1.0.2b aAbBcCdDeEfFGhHiIjkKlLmMnNopPQrRsStTuUvVwWxXyYzZ01234569*@ bcdefFhiIklmnoPqstv"
|
14
14
|
]
|
15
|
-
PARSERS = [Marvin::Parsers::
|
15
|
+
PARSERS = [Marvin::Parsers::SimpleParser, Marvin::Parsers::RagelParser]
|
16
16
|
|
17
17
|
LINES.each do |line|
|
18
18
|
|
@@ -44,7 +44,7 @@ puts ""
|
|
44
44
|
|
45
45
|
width = PARSERS.map { |p| p.name.length }.max + 2
|
46
46
|
|
47
|
-
ITERATIONS =
|
47
|
+
ITERATIONS = 100
|
48
48
|
|
49
49
|
Benchmark.bm(width) do |b|
|
50
50
|
PARSERS.each do |parser|
|
data/test/parser_test.rb
CHANGED
@@ -8,7 +8,7 @@ require File.join(File.dirname(__FILE__), 'test_helper')
|
|
8
8
|
class ParserTest < Test::Unit::TestCase
|
9
9
|
|
10
10
|
# The default parser
|
11
|
-
@@parser = Marvin::
|
11
|
+
@@parser = Marvin::Settings.parser
|
12
12
|
|
13
13
|
context "When parsing a LIST" do
|
14
14
|
setup { @parsed = @@parser.new("LIST #twilight_zone,#42") }
|
@@ -79,7 +79,7 @@ class ParserTest < Test::Unit::TestCase
|
|
79
79
|
end
|
80
80
|
|
81
81
|
should "have the correct nick" do
|
82
|
-
assert_equal "RelayBot", @parsed.command.prefix.
|
82
|
+
assert_equal "RelayBot", @parsed.command.prefix.nick
|
83
83
|
end
|
84
84
|
|
85
85
|
should "have the correct user" do
|
@@ -136,7 +136,7 @@ class ParserTest < Test::Unit::TestCase
|
|
136
136
|
end
|
137
137
|
|
138
138
|
should "have the correct nick" do
|
139
|
-
assert_equal "SuttoL", @parsed.command.prefix.
|
139
|
+
assert_equal "SuttoL", @parsed.command.prefix.nick
|
140
140
|
end
|
141
141
|
|
142
142
|
should "have the correct user" do
|
data/test/test_helper.rb
CHANGED
@@ -1,10 +1,62 @@
|
|
1
|
-
BASE_DIR = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
2
|
-
|
3
1
|
require 'rubygems'
|
4
|
-
|
2
|
+
|
3
|
+
# Testing dependencies
|
5
4
|
require 'test/unit'
|
6
|
-
require
|
5
|
+
require 'shoulda'
|
6
|
+
# RedGreen doesn't seem to be needed under 1.9
|
7
|
+
require 'redgreen' if RUBY_VERSION < "1.9"
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
root_directory = Pathname.new(__FILE__).dirname.join("..").expand_path
|
11
|
+
require root_directory.join("lib", "marvin")
|
12
|
+
|
13
|
+
Marvin::Settings.setup!
|
14
|
+
Marvin::Logger.setup!
|
15
|
+
|
16
|
+
Marvin::Settings.client = Marvin::TestClient
|
7
17
|
|
8
18
|
class Test::Unit::TestCase
|
9
|
-
|
10
|
-
|
19
|
+
|
20
|
+
@test_client = nil
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
def client(force_new = false)
|
25
|
+
@test_client = Marvin::TestClient.new if force_new || @test_client.nil?
|
26
|
+
@test_client
|
27
|
+
end
|
28
|
+
|
29
|
+
# Short hand for creating a class with
|
30
|
+
# a given class_eval block.
|
31
|
+
def class_via(*args, &blk)
|
32
|
+
klass = Class.new(*args)
|
33
|
+
klass.class_eval(&blk) unless blk.blank?
|
34
|
+
return klass
|
35
|
+
end
|
36
|
+
|
37
|
+
# Short hand for creating a test class
|
38
|
+
# for a set of mixins - give it the modules
|
39
|
+
# and it will include them all.
|
40
|
+
def test_class_for(*mods, &blk)
|
41
|
+
klass = Class.new
|
42
|
+
klass.class_eval { include(*mods) }
|
43
|
+
klass.class_eval(&blk) unless blk.blank?
|
44
|
+
return klass
|
45
|
+
end
|
46
|
+
|
47
|
+
def assert_dispatched(name, position = -1, opts = nil)
|
48
|
+
res = client.dispatched_events[position]
|
49
|
+
assert !res.nil?
|
50
|
+
assert_equal name, res[0]
|
51
|
+
assert_equal opts, res[1] if !opts.nil?
|
52
|
+
end
|
53
|
+
|
54
|
+
def assert_sent_line(line, position = -1)
|
55
|
+
assert_equal line, client.outgoing_commands[position]
|
56
|
+
end
|
57
|
+
|
58
|
+
def assert_resets_client
|
59
|
+
assert_equal [], client(true).dispatched_events
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Sutto-marvin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darcy Laycock
|
@@ -9,140 +9,113 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
13
|
-
default_executable:
|
12
|
+
date: 2009-09-16 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
17
|
-
type: :runtime
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: "0"
|
24
|
-
version:
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: activesupport
|
16
|
+
name: Sutto-perennial
|
27
17
|
type: :runtime
|
28
18
|
version_requirement:
|
29
19
|
version_requirements: !ruby/object:Gem::Requirement
|
30
20
|
requirements:
|
31
21
|
- - ">="
|
32
22
|
- !ruby/object:Gem::Version
|
33
|
-
version: 2.
|
23
|
+
version: 0.2.4.6
|
34
24
|
version:
|
35
25
|
- !ruby/object:Gem::Dependency
|
36
|
-
name: eventmachine
|
26
|
+
name: eventmachine-eventmachine
|
37
27
|
type: :runtime
|
38
28
|
version_requirement:
|
39
29
|
version_requirements: !ruby/object:Gem::Requirement
|
40
30
|
requirements:
|
41
31
|
- - ">="
|
42
32
|
- !ruby/object:Gem::Version
|
43
|
-
version: 0.12.
|
33
|
+
version: 0.12.9
|
44
34
|
version:
|
45
35
|
- !ruby/object:Gem::Dependency
|
46
|
-
name:
|
36
|
+
name: json
|
47
37
|
type: :runtime
|
48
38
|
version_requirement:
|
49
39
|
version_requirements: !ruby/object:Gem::Requirement
|
50
40
|
requirements:
|
51
41
|
- - ">="
|
52
42
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0
|
43
|
+
version: "0"
|
54
44
|
version:
|
55
|
-
description:
|
45
|
+
description:
|
56
46
|
email: sutto@sutto.net
|
57
|
-
executables:
|
58
|
-
|
47
|
+
executables: []
|
48
|
+
|
59
49
|
extensions: []
|
60
50
|
|
61
|
-
extra_rdoc_files:
|
62
|
-
|
51
|
+
extra_rdoc_files: []
|
52
|
+
|
63
53
|
files:
|
64
|
-
- README.textile
|
65
|
-
- TUTORIAL.textile
|
66
|
-
- VERSION.yml
|
67
54
|
- bin/marvin
|
68
|
-
-
|
69
|
-
- config/connections.yml.sample
|
70
|
-
- config/settings.yml.sample
|
71
|
-
- config/setup.rb
|
72
|
-
- handlers/debug_handler.rb
|
73
|
-
- handlers/hello_world.rb
|
74
|
-
- handlers/logging_handler.rb
|
75
|
-
- handlers/simple_logger.rb
|
76
|
-
- handlers/tweet_tweet.rb
|
77
|
-
- lib/marvin.rb
|
55
|
+
- lib/marvin
|
78
56
|
- lib/marvin/abstract_client.rb
|
79
57
|
- lib/marvin/abstract_parser.rb
|
80
58
|
- lib/marvin/base.rb
|
59
|
+
- lib/marvin/client
|
60
|
+
- lib/marvin/client/actions.rb
|
61
|
+
- lib/marvin/client/default_handlers.rb
|
81
62
|
- lib/marvin/command_handler.rb
|
82
63
|
- lib/marvin/console.rb
|
83
64
|
- lib/marvin/core_commands.rb
|
84
|
-
- lib/marvin/
|
85
|
-
- lib/marvin/
|
86
|
-
- lib/marvin/
|
87
|
-
- lib/marvin/
|
65
|
+
- lib/marvin/distributed
|
66
|
+
- lib/marvin/distributed/client.rb
|
67
|
+
- lib/marvin/distributed/handler.rb
|
68
|
+
- lib/marvin/distributed/protocol.rb
|
69
|
+
- lib/marvin/distributed/server.rb
|
88
70
|
- lib/marvin/distributed.rb
|
89
|
-
- lib/marvin/
|
90
|
-
- lib/marvin/distributed/drb_client.rb
|
91
|
-
- lib/marvin/distributed/ring_server.rb
|
71
|
+
- lib/marvin/dsl.rb
|
92
72
|
- lib/marvin/exception_tracker.rb
|
93
73
|
- lib/marvin/exceptions.rb
|
94
|
-
- lib/marvin/
|
95
|
-
- lib/marvin/irc.rb
|
74
|
+
- lib/marvin/irc
|
96
75
|
- lib/marvin/irc/client.rb
|
97
76
|
- lib/marvin/irc/event.rb
|
98
77
|
- lib/marvin/irc/replies.rb
|
99
|
-
- lib/marvin/irc
|
100
|
-
- lib/marvin/irc/server/abstract_connection.rb
|
101
|
-
- lib/marvin/irc/server/base_connection.rb
|
102
|
-
- lib/marvin/irc/server/channel.rb
|
103
|
-
- lib/marvin/irc/server/named_store.rb
|
104
|
-
- lib/marvin/irc/server/remote_interface.rb
|
105
|
-
- lib/marvin/irc/server/user.rb
|
106
|
-
- lib/marvin/irc/server/user/handle_mixin.rb
|
107
|
-
- lib/marvin/irc/server/user_connection.rb
|
108
|
-
- lib/marvin/irc/server/virtual_user_connection.rb
|
109
|
-
- lib/marvin/loader.rb
|
110
|
-
- lib/marvin/logger.rb
|
78
|
+
- lib/marvin/irc.rb
|
111
79
|
- lib/marvin/logging_handler.rb
|
112
80
|
- lib/marvin/middle_man.rb
|
113
|
-
- lib/marvin/
|
114
|
-
- lib/marvin/parsers.rb
|
81
|
+
- lib/marvin/parsers
|
115
82
|
- lib/marvin/parsers/command.rb
|
116
|
-
- lib/marvin/parsers/prefixes
|
83
|
+
- lib/marvin/parsers/prefixes
|
117
84
|
- lib/marvin/parsers/prefixes/host_mask.rb
|
118
85
|
- lib/marvin/parsers/prefixes/server.rb
|
86
|
+
- lib/marvin/parsers/prefixes.rb
|
119
87
|
- lib/marvin/parsers/ragel_parser.rb
|
120
88
|
- lib/marvin/parsers/ragel_parser.rl
|
121
|
-
- lib/marvin/parsers/regexp_parser.rb
|
122
89
|
- lib/marvin/parsers/simple_parser.rb
|
90
|
+
- lib/marvin/parsers.rb
|
123
91
|
- lib/marvin/settings.rb
|
124
|
-
- lib/marvin/status.rb
|
125
92
|
- lib/marvin/test_client.rb
|
126
93
|
- lib/marvin/util.rb
|
127
|
-
-
|
128
|
-
-
|
129
|
-
-
|
130
|
-
-
|
131
|
-
-
|
132
|
-
-
|
133
|
-
-
|
134
|
-
-
|
135
|
-
-
|
94
|
+
- lib/marvin.rb
|
95
|
+
- templates/boot.erb
|
96
|
+
- templates/connections.yml.erb
|
97
|
+
- templates/debug_handler.erb
|
98
|
+
- templates/hello_world.erb
|
99
|
+
- templates/rakefile.erb
|
100
|
+
- templates/settings.yml.erb
|
101
|
+
- templates/setup.erb
|
102
|
+
- templates/test_helper.erb
|
103
|
+
- test/abstract_client_test.rb
|
136
104
|
- test/parser_comparison.rb
|
137
105
|
- test/parser_test.rb
|
138
106
|
- test/test_helper.rb
|
139
107
|
- test/util_test.rb
|
108
|
+
- handlers/debug_handler.rb
|
109
|
+
- handlers/hello_world.rb
|
110
|
+
- handlers/keiki_thwopper.rb
|
111
|
+
- handlers/simple_logger.rb
|
112
|
+
- handlers/tweet_tweet.rb
|
140
113
|
has_rdoc: false
|
141
|
-
homepage: http://
|
114
|
+
homepage: http://sutto.net/
|
142
115
|
licenses:
|
143
116
|
post_install_message:
|
144
|
-
rdoc_options:
|
145
|
-
|
117
|
+
rdoc_options: []
|
118
|
+
|
146
119
|
require_paths:
|
147
120
|
- lib
|
148
121
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -163,11 +136,6 @@ rubyforge_project:
|
|
163
136
|
rubygems_version: 1.3.5
|
164
137
|
signing_key:
|
165
138
|
specification_version: 3
|
166
|
-
summary:
|
167
|
-
test_files:
|
168
|
-
|
169
|
-
- spec/spec_helper.rb
|
170
|
-
- test/parser_comparison.rb
|
171
|
-
- test/parser_test.rb
|
172
|
-
- test/test_helper.rb
|
173
|
-
- test/util_test.rb
|
139
|
+
summary: Evented IRC Library of Doom
|
140
|
+
test_files: []
|
141
|
+
|
data/README.textile
DELETED
@@ -1,105 +0,0 @@
|
|
1
|
-
h1. Marvin
|
2
|
-
|
3
|
-
Marvin is a ruby irc framework / library built on top of event machine.
|
4
|
-
It's been build from scratch to be evented - you build "handlers" which
|
5
|
-
are called whenever an event occurs.
|
6
|
-
|
7
|
-
A single client instance can handle multiple IRC connections (and will
|
8
|
-
automatically reconnect in the case that a connection is lost). Distributed
|
9
|
-
support (e.g. 1 client => multiple handler backends) is built in out of
|
10
|
-
the box on top of DRb.
|
11
|
-
|
12
|
-
h2. Getting Started
|
13
|
-
|
14
|
-
Starting out with Marvin is simple. You can either go the "edge" route -
|
15
|
-
cloning from the GitHub repository (in this case, [here](http://github.com/sutto/marvin))
|
16
|
-
and then running the following:
|
17
|
-
|
18
|
-
$ rake gemspec
|
19
|
-
$ gem build marvin.gemspec
|
20
|
-
$ sudo gem install marvin.gem
|
21
|
-
|
22
|
-
Or, for a generally more stable release you can install it from the GitHub gem
|
23
|
-
server (requiring Rubygems >= 1.2.0 with the GitHub sources added), by running
|
24
|
-
the following:
|
25
|
-
|
26
|
-
$ sudo gem install Sutto-marvin
|
27
|
-
|
28
|
-
Installing the gem will make available a new executable - "+marvin+" - which is
|
29
|
-
used as an easy way to do a variety of tasks. To get started, you can create
|
30
|
-
a project located at given path using the following command:
|
31
|
-
|
32
|
-
$ marvin create path-to-my-bot
|
33
|
-
|
34
|
-
Once that's done, you'll have a blank slate loaded with the default marvin handlers -
|
35
|
-
+HelloWorld+ (which will respond to any addressed "hello"'s) and an empty debug handler
|
36
|
-
which you can use for generic debugging. To run the new app, you can use either of the
|
37
|
-
following:
|
38
|
-
|
39
|
-
$ cd path-to-my-bot && script/client
|
40
|
-
|
41
|
-
or, alternatively,
|
42
|
-
|
43
|
-
$ marvin client path-to-my-bot
|
44
|
-
|
45
|
-
There are a couple of options available for the client (as well as the marvin library),
|
46
|
-
Each of which can be found by appending the "--help" option to the command.
|
47
|
-
|
48
|
-
Once your client has been started (assuming the name wasn't taken / it could connect),
|
49
|
-
simply join the chat room your bot was instructed to join and say the following (substiting
|
50
|
-
BotNick for the nick name your bot connected with):
|
51
|
-
|
52
|
-
BotNick: hello
|
53
|
-
|
54
|
-
Or even easier, by PM'ing the bot with:
|
55
|
-
|
56
|
-
hello
|
57
|
-
|
58
|
-
Assuming all went well, your bot should reply back with something akin to (where YourNick)
|
59
|
-
if the nickname you connected with):
|
60
|
-
|
61
|
-
YourNick: Hola from process with pid 12342
|
62
|
-
|
63
|
-
h2. Distributed Bots
|
64
|
-
|
65
|
-
One of the relatively unique features of Marvin is the ability to write bots
|
66
|
-
which use DRb and Rinda which can grow with relative ease.
|
67
|
-
|
68
|
-
It's important to keep in mind that keeping state is discouraged in this case
|
69
|
-
as it can not be ensured that clients are still active or that you will always
|
70
|
-
get messages from the same client.
|
71
|
-
|
72
|
-
For a start, take a look at the default +config/setup.rb+ file which contains
|
73
|
-
an example of registering handlers on a distributed client as well as setting
|
74
|
-
up the distributed handler which needs to be setup on the main client.
|
75
|
-
|
76
|
-
By default, the messages will be dispatched to the first discovered tuple
|
77
|
-
space (using Rinda::RingFinger) and will be of the format:
|
78
|
-
|
79
|
-
[:marvin_format, :your_namespace, :message_name, {:message => "options"}, client_reference]
|
80
|
-
|
81
|
-
You can change the namespace (which defaults to +:default+) by setting +Marvin::Settings.distributed_namespace+
|
82
|
-
|
83
|
-
Running a distributed client requires three things:
|
84
|
-
|
85
|
-
* 1 Ring server instance (+script/ring_server+ or +marvin ring_server+ or +marvin rs+)
|
86
|
-
* 1+ Client instances (+script/client+ or +marvin client+ or +marvin cl+)
|
87
|
-
* 1+ Distributed Client instances (+script/distributed_client+ or +marvin distributed_client+ or +marvin dc+)
|
88
|
-
|
89
|
-
Each of which takes the default options of:
|
90
|
-
* -v - Be verbose and print to STDOUT if not daemonized
|
91
|
-
* -level=something - set level, defaults to info
|
92
|
-
* -d - daemonize the process
|
93
|
-
* -k - kill all daemonized instances of this specific kind
|
94
|
-
|
95
|
-
h2. Example Bots
|
96
|
-
|
97
|
-
Coming soon.
|
98
|
-
|
99
|
-
h2. Thanks
|
100
|
-
|
101
|
-
Thanks go to:
|
102
|
-
|
103
|
-
* Jeff Rafter - contributed code and doc changes, now one of the co-developers.
|
104
|
-
* epitron / halogrium - For the ragel state machine used in Marvin::Parsers::RagelParser
|
105
|
-
* The creator of Ruby-IRCD - the server component is heavily influenced by / part derivative of said work.
|
data/TUTORIAL.textile
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
h1. A Quick Introduction to Marvin
|
2
|
-
|
3
|
-
Welcome young one - in today's lesson we're going to learn
|
4
|
-
how to build a simple IRC bot using "Marvin":http://github.com/Sutto/marvin.
|
5
|
-
If you haven't built an IRC bot before, there is a great
|
6
|
-
deal of things you can do - ranging from consuming content (e.g.
|
7
|
-
analysing logs of IRC rooms, seeing who swears the most)
|
8
|
-
as well as other things such as bridges between other
|
9
|
-
protocols (twitter => irc bridges) and all sorts of fancy stuff.
|
10
|
-
|
11
|
-
h3. What is this marvin thingy-majiggy?
|
12
|
-
|
13
|
-
Marvin is an IRC Library / Framework (it can be used either way)
|
14
|
-
built with an evented design on top of DRb, EventMachine and a bunch
|
15
|
-
of other stuff for Ruby. it's currently got a fairly complete client
|
16
|
-
and a very incomplete server implementation.
|
17
|
-
|
18
|
-
h2. Step #1 - Getting Marvin
|
19
|
-
|
20
|
-
There are currently two different ways to get marvin - via the
|
21
|
-
GitHub gem sources or directly from the source.
|
22
|
-
|
23
|
-
To install from the GitHub gem source, simply use:
|
24
|
-
|
25
|
-
sudo gem install Sutto-marvin -s http://gems.github.com
|
26
|
-
|
27
|
-
Alternatively, you can directly clone the repository. To do this, you'll need to run the
|
28
|
-
following:
|
29
|
-
|
30
|
-
git clone git://github.com/Sutto/marvin.git
|
31
|
-
cd marvin
|
32
|
-
sudo ./script/install
|
33
|
-
|
34
|
-
Once that's done, not only will you now have a handy "marvin" gem which you
|
35
|
-
can require but you will also have a handy executable of the same name which
|
36
|
-
you can use.
|
37
|
-
|
38
|
-
h2. Step #2 - Creating a Skeleton App
|
39
|
-
|
40
|
-
By default, marvin currently uses a simple skeleton app (not unlike
|
41
|
-
Ruby on Rails) as a starting point. To get started, you simply use
|
42
|
-
the "marvin create" command with a path to / folder name (which must not
|
43
|
-
yet exist) into which you wish to create the folder. For example, if I wanted
|
44
|
-
to create a new irc bot called "BlorkBot", I could do the following:
|
45
|
-
|
46
|
-
marvin create BlorkBot
|
47
|
-
|
48
|
-
And a new directory with the basic structure called "BlorkBot" will be created
|
49
|
-
under the current directory. To get started, you can then open your editor and
|
50
|
-
browse the given folder. Of this generated structure, there are only two folders
|
51
|
-
you need to worry about for the moment - config and handlers.
|
52
|
-
|
53
|
-
h2. Step #3 - Basic configuration
|
54
|
-
|
data/VERSION.yml
DELETED
data/config/boot.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# Load Marvin, do any initialization etc.
|
2
|
-
# Note: this is called from inside scripts
|
3
|
-
# or anywhere you want to start a base marvin
|
4
|
-
# instance.
|
5
|
-
|
6
|
-
require 'rubygems'
|
7
|
-
|
8
|
-
MARVIN_ROOT = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
9
|
-
|
10
|
-
# Check if a local copy of marvin exists, and set the load path if it does.
|
11
|
-
$:.unshift(File.dirname(__FILE__) + "/../lib/") if File.exist?(File.dirname(__FILE__) + "/../lib/marvin.rb")
|
12
|
-
|
13
|
-
# And Require Marvin.
|
14
|
-
require 'marvin'
|
data/config/settings.yml.sample
DELETED