Sutto-marvin 0.4.0 → 0.8.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/lib/marvin/irc/server.rb
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
module Marvin
|
2
|
-
module IRC
|
3
|
-
module Server
|
4
|
-
|
5
|
-
# Server utilities
|
6
|
-
autoload :NamedStore, 'marvin/irc/server/named_store'
|
7
|
-
|
8
|
-
# Store each user
|
9
|
-
UserStore = NamedStore.new(:nicks, :user) do
|
10
|
-
|
11
|
-
def virtual?(nick)
|
12
|
-
self[nick].is_a?(Marvin::IRC::Server::VirtualUserConnection)
|
13
|
-
end
|
14
|
-
|
15
|
-
def reclaim(nick)
|
16
|
-
if has_key?(nick) && virtual?(nick)
|
17
|
-
self[nick].reclaim!
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
# Nick is not taken when
|
22
|
-
def nick_taken?(nick)
|
23
|
-
has_key?(nick) && !virtual(nick)
|
24
|
-
end
|
25
|
-
|
26
|
-
def each_user_except(user)
|
27
|
-
self.each_user { |u| yield u unless user == u }
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# Store each channel
|
32
|
-
ChannelStore = NamedStore.new(:names, :channel)
|
33
|
-
|
34
|
-
autoload :RemoteInterface, 'marvin/irc/server/remote_interface'
|
35
|
-
autoload :Channel, 'marvin/irc/server/channel'
|
36
|
-
# The actual network connection
|
37
|
-
autoload :BaseConnection, 'marvin/irc/server/base_connection'
|
38
|
-
# An our implementations of protocol-specific stuff.
|
39
|
-
autoload :VirtualUserConnection, 'marvin/irc/server/virtual_user_connection'
|
40
|
-
autoload :AbstractConnection, 'marvin/irc/server/abstract_connection'
|
41
|
-
autoload :UserConnection, 'marvin/irc/server/user_connection'
|
42
|
-
# autoload :ServerConnection, 'marvin/irc/server/server_connection'
|
43
|
-
# Extensions for each part
|
44
|
-
autoload :User, 'marvin/irc/server/user'
|
45
|
-
|
46
|
-
# call start_server w/ the default options
|
47
|
-
# and inside an EM::run block.
|
48
|
-
def self.run
|
49
|
-
Marvin::IRC::Server::RemoteInterface.start
|
50
|
-
EventMachine::run do
|
51
|
-
Marvin::Logger.info "Starting server..."
|
52
|
-
start_server :bind_addr => "0.0.0.0"
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
# Starts the server with a set of given options
|
57
|
-
def self.start_server(opts = {})
|
58
|
-
opts[:started_at] ||= Time.now
|
59
|
-
opts[:host] ||= self.host_name
|
60
|
-
opts[:port] ||= 6667
|
61
|
-
EventMachine::start_server(opts[:bind_addr] || opts[:host], opts[:port], BaseConnection, opts)
|
62
|
-
Marvin::Logger.info "Server started"
|
63
|
-
end
|
64
|
-
|
65
|
-
def self.host_name
|
66
|
-
@@host_name ||= Socket.gethostname
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
data/lib/marvin/loader.rb
DELETED
@@ -1,149 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
require 'singleton'
|
3
|
-
|
4
|
-
module Marvin
|
5
|
-
class Loader
|
6
|
-
include Singleton
|
7
|
-
|
8
|
-
# A Controller is any class e.g. a client / server
|
9
|
-
# which is provides the main functionality of the
|
10
|
-
# current client.
|
11
|
-
CONTROLLERS = {
|
12
|
-
:client => Marvin::Settings.default_client,
|
13
|
-
:server => Marvin::IRC::Server,
|
14
|
-
:ring_server => Marvin::Distributed::RingServer,
|
15
|
-
:distributed_client => Marvin::Distributed::DRbClient,
|
16
|
-
:console => Marvin::Console
|
17
|
-
}
|
18
|
-
|
19
|
-
# For each of the known types, define a method
|
20
|
-
# as Marvin::Loader.type? so we can easily do
|
21
|
-
# things like conditional registers.
|
22
|
-
class << self
|
23
|
-
CONTROLLERS.keys.each do |type|
|
24
|
-
define_method(:"#{type}?") { Marvin::Loader.type == type }
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
cattr_accessor :hooks, :boot, :type
|
29
|
-
self.hooks = {}
|
30
|
-
self.type = :client
|
31
|
-
|
32
|
-
# Old style of registering a block to be run on startup
|
33
|
-
# for doing setup etc. now replaced by before_run
|
34
|
-
def self.before_connecting(&blk)
|
35
|
-
Marvin::Logger.warn "Marvin::Loader.before_connecting is deprecated, please use before_run instead."
|
36
|
-
before_run(&blk)
|
37
|
-
end
|
38
|
-
|
39
|
-
# Append a hook for a given type of hook in order
|
40
|
-
# to be called later on via invoke_hooks!
|
41
|
-
def self.append_hook(type, &blk)
|
42
|
-
self.hooks_for(type) << blk unless blk.blank?
|
43
|
-
end
|
44
|
-
|
45
|
-
# Return all of the existing hooks or an empty
|
46
|
-
# for a given hook type.
|
47
|
-
def self.hooks_for(type)
|
48
|
-
(self.hooks[type.to_sym] ||= [])
|
49
|
-
end
|
50
|
-
|
51
|
-
# Invoke (call) all of the hooks for a given
|
52
|
-
# type.
|
53
|
-
def self.invoke_hooks!(type)
|
54
|
-
hooks_for(type).each { |hook| hook.call }
|
55
|
-
end
|
56
|
-
|
57
|
-
# Append a call back to be run at a specific stage.
|
58
|
-
|
59
|
-
# Register a hook to be run before the controller
|
60
|
-
# has started running.
|
61
|
-
def self.before_run(&blk)
|
62
|
-
append_hook(:before_run, &blk)
|
63
|
-
end
|
64
|
-
|
65
|
-
# Register a hook to be run after the controller
|
66
|
-
# has stopped. Note that this will not guarantee
|
67
|
-
# all processing has completed.
|
68
|
-
def self.after_stop(&blk)
|
69
|
-
append_hook(:after_stop, &blk)
|
70
|
-
end
|
71
|
-
|
72
|
-
def self.run!(type = :client)
|
73
|
-
self.type = type.to_sym
|
74
|
-
self.instance.run!
|
75
|
-
end
|
76
|
-
|
77
|
-
def self.stop!(force = false)
|
78
|
-
self.instance.stop!(force)
|
79
|
-
end
|
80
|
-
|
81
|
-
def run!
|
82
|
-
self.register_signals
|
83
|
-
Marvin::Options.parse!
|
84
|
-
Marvin::Daemon.daemonize! if Marvin::Settings.daemon?
|
85
|
-
Marvin::Logger.setup
|
86
|
-
self.load_settings
|
87
|
-
require(Marvin::Settings.root / "config" / "setup")
|
88
|
-
self.load_handlers
|
89
|
-
self.class.invoke_hooks! :before_run
|
90
|
-
attempt_controller_action! :run
|
91
|
-
end
|
92
|
-
|
93
|
-
def stop!(force = false)
|
94
|
-
if force || !@attempted_stop
|
95
|
-
self.class.invoke_hooks! :before_stop
|
96
|
-
attempt_controller_action! :stop
|
97
|
-
self.class.invoke_hooks! :after_stop
|
98
|
-
@attempted_stop = true
|
99
|
-
end
|
100
|
-
Marvin::Daemon.cleanup! if Marvin::Settings.daemon?
|
101
|
-
end
|
102
|
-
|
103
|
-
protected
|
104
|
-
|
105
|
-
# Get the controller for the current type if
|
106
|
-
# it exists and attempt to class a given action.
|
107
|
-
def attempt_controller_action!(action)
|
108
|
-
klass = CONTROLLERS[self.type]
|
109
|
-
klass.send(action) unless klass.blank? || !klass.respond_to?(action, true)
|
110
|
-
end
|
111
|
-
|
112
|
-
# Load all of the handler's in the handlers subfolder
|
113
|
-
# of a marvin installation.
|
114
|
-
def load_handlers
|
115
|
-
Dir[Marvin::Settings.root / "handlers/**/*.rb"].each { |handler| require handler }
|
116
|
-
end
|
117
|
-
|
118
|
-
def load_settings
|
119
|
-
Marvin::Settings.setup
|
120
|
-
case Marvin::Loader.type
|
121
|
-
# Perform client / type specific setup.
|
122
|
-
when :client
|
123
|
-
Marvin::Settings.default_client.configuration = Marvin::Settings.to_hash
|
124
|
-
Marvin::Settings.default_client.setup
|
125
|
-
when :distributed_client
|
126
|
-
Marvin::Settings.default_client = Marvin::Distributed::DRbClient
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
def register_signals
|
131
|
-
["INT", "TERM"].each do |sig|
|
132
|
-
trap sig do
|
133
|
-
Marvin::Loader.stop!
|
134
|
-
exit
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
# Register to the Marvin::DataStore methods
|
140
|
-
if Marvin::Loader.client?
|
141
|
-
before_run do
|
142
|
-
Marvin::CoreCommands.register!
|
143
|
-
Marvin::DataStore.load!
|
144
|
-
end
|
145
|
-
after_stop { Marvin::DataStore.dump! }
|
146
|
-
end
|
147
|
-
|
148
|
-
end
|
149
|
-
end
|
data/lib/marvin/logger.rb
DELETED
@@ -1,86 +0,0 @@
|
|
1
|
-
module Marvin
|
2
|
-
class Logger
|
3
|
-
|
4
|
-
cattr_accessor :logger
|
5
|
-
|
6
|
-
class << self
|
7
|
-
|
8
|
-
def setup
|
9
|
-
log_path = Marvin::Settings.root / "log/#{Marvin::Loader.type.to_s.dasherize}-#{Marvin::Settings.environment}.log"
|
10
|
-
self.logger ||= new(log_path, Marvin::Settings.log_level, Marvin::Settings.verbose)
|
11
|
-
end
|
12
|
-
|
13
|
-
def method_missing(name, *args, &blk)
|
14
|
-
self.setup # Ensure the logger is setup
|
15
|
-
self.logger.send(name, *args, &blk)
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
LEVELS = {
|
21
|
-
:fatal => 7,
|
22
|
-
:error => 6,
|
23
|
-
:warn => 4,
|
24
|
-
:info => 3,
|
25
|
-
:debug => 0
|
26
|
-
}
|
27
|
-
|
28
|
-
PREFIXES = {}
|
29
|
-
|
30
|
-
LEVELS.each { |k,v| PREFIXES[k] = "[#{k.to_s.upcase}]".ljust 7 }
|
31
|
-
|
32
|
-
COLOURS = {
|
33
|
-
:fatal => 31, # red
|
34
|
-
:error => 33, # yellow
|
35
|
-
:warn => 35, # magenta
|
36
|
-
:info => 32, # green
|
37
|
-
:debug => 34 # white
|
38
|
-
}
|
39
|
-
|
40
|
-
attr_accessor :level, :file, :verbose
|
41
|
-
|
42
|
-
def initialize(path, level = :info, verbose = false)
|
43
|
-
self.level = level.to_sym
|
44
|
-
self.verbose = verbose
|
45
|
-
self.file = File.open(path, "a+")
|
46
|
-
end
|
47
|
-
|
48
|
-
def close!
|
49
|
-
self.file.close
|
50
|
-
end
|
51
|
-
|
52
|
-
LEVELS.each do |name, value|
|
53
|
-
|
54
|
-
define_method(name) do |message|
|
55
|
-
write "#{PREFIXES[name]} #{message}", name if LEVELS[self.level] <= value
|
56
|
-
end
|
57
|
-
|
58
|
-
define_method(:"#{name}?") do
|
59
|
-
LEVELS[self.level] <= value
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def debug_exception(exception)
|
64
|
-
|
65
|
-
error "Exception: #{exception}"
|
66
|
-
exception.backtrace.each do |l|
|
67
|
-
error ">> #{l}"
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
|
72
|
-
private
|
73
|
-
|
74
|
-
def write(message, level = self.level)
|
75
|
-
self.file.puts message
|
76
|
-
self.file.flush
|
77
|
-
STDOUT.puts colourize(message, level) if self.verbose
|
78
|
-
end
|
79
|
-
|
80
|
-
def colourize(message, level)
|
81
|
-
"\033[1;#{COLOURS[level]}m#{message}\033[0m"
|
82
|
-
end
|
83
|
-
|
84
|
-
|
85
|
-
end
|
86
|
-
end
|
data/lib/marvin/options.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'optparse'
|
2
|
-
|
3
|
-
module Marvin
|
4
|
-
class Options
|
5
|
-
|
6
|
-
def self.parse!
|
7
|
-
options = {
|
8
|
-
:verbose => Marvin::Settings.verbose,
|
9
|
-
:log_level => Marvin::Settings.log_level.to_s,
|
10
|
-
:daemon => false
|
11
|
-
}
|
12
|
-
|
13
|
-
ARGV.options do |o|
|
14
|
-
script_name = File.basename($0)
|
15
|
-
o.set_summary_indent(' ')
|
16
|
-
o.banner = "Usage: #{script_name} [OPTIONS]"
|
17
|
-
o.define_head "Ruby IRC Library"
|
18
|
-
o.separator ""
|
19
|
-
o.separator ""
|
20
|
-
o.on("-l", "--level=[level]", String, "The log level to use",
|
21
|
-
"Default: #{options[:log_level]}") {|v| options[:log_level] = v}
|
22
|
-
o.on("-v", "--verbose", "Be verbose (print to stdout)") {|v| options[:verbose] = v}
|
23
|
-
o.on("-d", "--daemon", "Run as a daemon (drop the PID)") {|v| options[:daemon] = v}
|
24
|
-
o.on("-k", "--kill", "Kill all of the current type / the running instances") do |kill|
|
25
|
-
if kill
|
26
|
-
Marvin::Daemon.kill_all(Marvin::Loader.type)
|
27
|
-
exit
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
o.separator ""
|
32
|
-
o.on_tail("-h", "--help", "Show this message.") { puts o; exit }
|
33
|
-
o.parse!
|
34
|
-
end
|
35
|
-
|
36
|
-
Marvin::Settings.daemon = options[:daemon]
|
37
|
-
Marvin::Settings.log_level = options[:log_level].to_sym
|
38
|
-
Marvin::Settings.verbose = options[:verbose]
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
@@ -1,93 +0,0 @@
|
|
1
|
-
module Marvin
|
2
|
-
module Parsers
|
3
|
-
class RegexpParser < Marvin::AbstractParser
|
4
|
-
|
5
|
-
cattr_accessor :regexp_matchers, :events
|
6
|
-
# Since we cbf implemented an ordered hash, just use regexp => event at the same
|
7
|
-
# index.
|
8
|
-
self.regexp_matchers = []
|
9
|
-
self.events = []
|
10
|
-
|
11
|
-
attr_accessor :current_line
|
12
|
-
|
13
|
-
# Appends an event to the end of the the events callback
|
14
|
-
# chain. It will be search in order of first-registered
|
15
|
-
# when used to match a URL (hence, order matters).
|
16
|
-
def self.register_event(*args)
|
17
|
-
matcher = args.delete_at(1) # Extract regexp.
|
18
|
-
if args.first.is_a?(Marvin::IRC::Event)
|
19
|
-
event = args.first
|
20
|
-
else
|
21
|
-
event = Marvin::IRC::Event.new(*args)
|
22
|
-
end
|
23
|
-
self.regexp_matchers << matcher
|
24
|
-
self.events << event
|
25
|
-
end
|
26
|
-
|
27
|
-
|
28
|
-
# Initialize a new RegexpParser from the given line.
|
29
|
-
def initialize(line)
|
30
|
-
self.current_line = line
|
31
|
-
end
|
32
|
-
|
33
|
-
def to_event
|
34
|
-
self.regexp_matchers.each_with_index do |matcher, offset|
|
35
|
-
if (match_data = matcher.match(self.current_line))
|
36
|
-
event = self.events[offset].dup
|
37
|
-
event.raw_arguments = match_data.to_a[1..-1]
|
38
|
-
return event
|
39
|
-
end
|
40
|
-
end
|
41
|
-
# otherwise, return nil
|
42
|
-
return nil
|
43
|
-
end
|
44
|
-
|
45
|
-
## The Default IRC Events
|
46
|
-
|
47
|
-
# Note that some of these Regexp's are from Net::YAIL,
|
48
|
-
# which apparantly sources them itself from the IRCSocket
|
49
|
-
# library.
|
50
|
-
|
51
|
-
register_event :invite, /^\:(.+)\!\~?(.+)\@(.+) INVITE (\S+) :?(.+?)$/i,
|
52
|
-
:nick, :ident, :host, :target, :channel
|
53
|
-
|
54
|
-
register_event :action, /^\:(.+)\!\~?(.+)\@(.+) PRIVMSG (\S+) :?\001ACTION (.+?)\001$/i,
|
55
|
-
:nick, :ident, :host, :target, :message
|
56
|
-
|
57
|
-
register_event :ctcp, /^\:(.+)\!\~?(.+)\@(.+) PRIVMSG (\S+) :?\001(.+?)\001$/i,
|
58
|
-
:nick, :ident, :host, :target, :message
|
59
|
-
|
60
|
-
register_event :message, /^\:(.+)\!\~?(.+)\@(.+) PRIVMSG (\S+) :?(.+?)$/i,
|
61
|
-
:nick, :ident, :host, :target, :message
|
62
|
-
|
63
|
-
register_event :join, /^\:(.+)\!\~?(.+)\@(.+) JOIN (\S+)/i,
|
64
|
-
:nick, :ident, :host, :target
|
65
|
-
|
66
|
-
register_event :part, /^\:(.+)\!\~?(.+)\@(.+) PART (\S+)\s?:?(.+?)$/i,
|
67
|
-
:nick, :ident, :host, :target, :message
|
68
|
-
|
69
|
-
register_event :mode, /^\:(.+)\!\~?(.+)\@(.+) MODE (\S+) :?(.+?)$/i,
|
70
|
-
:nick, :ident, :host, :target, :mode
|
71
|
-
|
72
|
-
register_event :kick, /^\:(.+)\!\~?(.+)\@(.+) KICK (\S+) (\S+)\s?:?(.+?)$/i,
|
73
|
-
:nick, :ident, :host, :target, :channel, :reason
|
74
|
-
|
75
|
-
register_event :topic, /^\:(.+)\!\~?(.+)\@(.+) TOPIC (\S+) :?(.+?)$/i,
|
76
|
-
:nick, :ident, :host, :target, :topic
|
77
|
-
|
78
|
-
register_event :nick, /^\:(.+)\!\~?(.+)\@(.+) NICK :?(.+?)$/i,
|
79
|
-
:nick, :ident, :host, :new_nick
|
80
|
-
|
81
|
-
register_event :quit, /^\:(.+)\!\~?(.+)\@(.+) QUIT :?(.+?)$/i,
|
82
|
-
:nick, :ident, :host, :message
|
83
|
-
|
84
|
-
register_event :ping, /^\:(.+)\!\~?(.+)\@(.+) PING (.*)$/,
|
85
|
-
:nick, :ident, :host, :data
|
86
|
-
|
87
|
-
register_event :ping, /PING (.*)$/, :data
|
88
|
-
|
89
|
-
register_event :numeric, /^\:(\S+) ([0-9]+) (.*)$/,
|
90
|
-
:server, :code, :data
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
data/lib/marvin/status.rb
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
module Marvin
|
2
|
-
class Status
|
3
|
-
CONTROLLERS = {
|
4
|
-
:client => "IRC Client",
|
5
|
-
:server => "IRC Server",
|
6
|
-
:ring_server => "Ring Server",
|
7
|
-
:distributed_client => "Distributed Client",
|
8
|
-
}
|
9
|
-
|
10
|
-
class << self
|
11
|
-
|
12
|
-
def show!
|
13
|
-
STDOUT.puts ""
|
14
|
-
STDOUT.puts " Marvin Status"
|
15
|
-
STDOUT.puts " ============="
|
16
|
-
STDOUT.puts ""
|
17
|
-
if ARGV.include?("--help") || ARGV.include?("-h")
|
18
|
-
STDOUT.puts " Usage: script/status [options]\n\n"
|
19
|
-
STDOUT.puts " -h, --help Show this message"
|
20
|
-
STDOUT.puts " -f, --full Include distributed stats"
|
21
|
-
STDOUT.puts ""
|
22
|
-
exit
|
23
|
-
end
|
24
|
-
pids = {}
|
25
|
-
CONTROLLERS.each_key { |k| pids[k] = Marvin::Daemon.pids_for_type(k) }
|
26
|
-
CONTROLLERS.each do |k, v|
|
27
|
-
count = pids[k].size
|
28
|
-
postfix = count == 1 ? "" : "s"
|
29
|
-
STDOUT.puts " #{count} running instance#{postfix} of the #{CONTROLLERS[k]}"
|
30
|
-
STDOUT.puts " Pid#{postfix}: #{pids[k].join(", ")}" unless count == 0
|
31
|
-
STDOUT.puts ""
|
32
|
-
end
|
33
|
-
|
34
|
-
if (ARGV.include?("-f") || ARGV.include?("--full")) && !pids[:ring_server].empty?
|
35
|
-
require 'rinda/ring'
|
36
|
-
DRb.start_service
|
37
|
-
STDOUT.puts " Distributed Status"
|
38
|
-
STDOUT.puts " ------------------"
|
39
|
-
begin
|
40
|
-
rs = Rinda::RingFinger.finger.lookup_ring(3)
|
41
|
-
STDOUT.puts " Ring Server: #{rs.__drburi}"
|
42
|
-
items = rs.read_all([:marvin_event, Marvin::Settings.distributed_namespace, nil, nil, nil])
|
43
|
-
STDOUT.puts " Unprocessed Items: #{items.size}"
|
44
|
-
STDOUT.puts ""
|
45
|
-
unless items.empty?
|
46
|
-
start_time = items.first[3][:dispatched_at]
|
47
|
-
STDOUT.puts " Earliest Item: #{start_time ? start_time.strftime("%I:%M%p %d/%m/%y") : "Never"}"
|
48
|
-
end_time = items.last[3][:dispatched_at]
|
49
|
-
STDOUT.puts " Latest Item: #{end_time ? end_time.strftime("%I:%M%p %d/%m/%y") : "Never"}"
|
50
|
-
mapping = {}
|
51
|
-
items.each do |i|
|
52
|
-
mapping[i[2].inspect] ||= 0
|
53
|
-
mapping[i[2].inspect] += 1
|
54
|
-
end
|
55
|
-
width = mapping.keys.map { |k| k.length }.max
|
56
|
-
STDOUT.puts ""
|
57
|
-
STDOUT.puts " Unprocessed Message Counts:"
|
58
|
-
STDOUT.puts " ---------------------------"
|
59
|
-
mapping.each { |k, v| STDOUT.puts " #{k.ljust width} => #{v}" }
|
60
|
-
STDOUT.puts ""
|
61
|
-
end
|
62
|
-
rescue
|
63
|
-
STDOUT.puts " Ring server not found."
|
64
|
-
STDOUT.puts ""
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
data/script/client
DELETED
data/script/console
DELETED
data/script/distributed_client
DELETED
data/script/install
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
gem uninstall marvin --quiet && rake gemspec && gem build marvin.gemspec && gem install marvin-*.gem
|
data/script/ring_server
DELETED
data/script/server
DELETED
data/script/status
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
-
|
3
|
-
# Tests the behaviour of the AbstractClient functionality
|
4
|
-
# via a thin wrapper of the class via Marvin::TestClient.
|
5
|
-
|
6
|
-
describe "the base Marvin::TestClient functionality" do
|
7
|
-
|
8
|
-
it "should dispatch :client_connected as the first event on process_connect" do
|
9
|
-
client(true).dispatched_events.should == []
|
10
|
-
client.process_connect
|
11
|
-
client.dispatched_events.first.should == [:client_connected, {}]
|
12
|
-
end
|
13
|
-
|
14
|
-
it "should dispatch :client_connected as the first event on process_connect" do
|
15
|
-
client(true).dispatched_events.should == []
|
16
|
-
client.process_connect
|
17
|
-
Marvin::Logger.info client.outgoing_commands.inspect
|
18
|
-
client.dispatched_events[-2].first.should == :outgoing_nick
|
19
|
-
client.dispatched_events[-1].first.should == :outgoing_join
|
20
|
-
client.outgoing_commands.length.should == 3
|
21
|
-
client.outgoing_commands[0].should =~ /^USER \w+ 0 \* :\w+ \r\n$/
|
22
|
-
client.outgoing_commands[1].should =~ /^NICK \w+ \r\n$/
|
23
|
-
client.outgoing_commands[2].should =~ /^JOIN \#[A-Za-z0-9\-\_]+ \r\n$/
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should dispatch :client_disconnect on process_disconnect" do
|
27
|
-
client(true).dispatched_events.should == []
|
28
|
-
client.process_disconnect
|
29
|
-
client.dispatched_events.last.should == [:client_disconnected, {}]
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should add an :incoming_line event for each incoming line" do
|
33
|
-
client(true).dispatched_events.should == []
|
34
|
-
client.receive_line "SOME RANDOM LINE THAT HAS ZERO ACTUAL USE"
|
35
|
-
client.dispatched_events.first.should == [:incoming_line, {:line => "SOME RANDOM LINE THAT HAS ZERO ACTUAL USE"}]
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
require "rubygems"
|
2
|
-
require "bacon"
|
3
|
-
|
4
|
-
require File.dirname(__FILE__) + "/../lib/marvin"
|
5
|
-
# Now, Set everything up.
|
6
|
-
Marvin::Logger.logger = Logger.new(File.dirname(__FILE__) + "/../log/test.log")
|
7
|
-
Marvin::Settings.default_client = Marvin::TestClient
|
8
|
-
Marvin::Loader.run!
|
9
|
-
|
10
|
-
def client(force_new = false)
|
11
|
-
$test_client = Marvin::TestClient.new if force_new || $test_client.nil?
|
12
|
-
return $test_client
|
13
|
-
end
|
14
|
-
|