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
@@ -1,5 +1,9 @@
|
|
1
|
-
|
2
|
-
# line
|
1
|
+
|
2
|
+
# line 1 "ragel_parser.rl"
|
3
|
+
# Ragel Parser comes from the Arrbot Guys - Kudos to Halogrium and Epitron.
|
4
|
+
|
5
|
+
|
6
|
+
# line 109 "ragel_parser.rl"
|
3
7
|
|
4
8
|
|
5
9
|
module Marvin
|
@@ -7,7 +11,7 @@ module Marvin
|
|
7
11
|
class RagelParser < Marvin::AbstractParser
|
8
12
|
|
9
13
|
|
10
|
-
# line
|
14
|
+
# line 15 "ragel_parser.rb"
|
11
15
|
class << self
|
12
16
|
attr_accessor :_irc_actions
|
13
17
|
private :_irc_actions, :_irc_actions=
|
@@ -434,7 +438,8 @@ class << self
|
|
434
438
|
end
|
435
439
|
self.irc_en_main = 1;
|
436
440
|
|
437
|
-
|
441
|
+
|
442
|
+
# line 116 "ragel_parser.rl"
|
438
443
|
|
439
444
|
private
|
440
445
|
|
@@ -448,18 +453,19 @@ self.irc_en_main = 1;
|
|
448
453
|
hostmask = nil
|
449
454
|
server = nil
|
450
455
|
code = nil
|
451
|
-
command =
|
456
|
+
command = Command.new(data)
|
452
457
|
|
453
458
|
|
454
|
-
# line
|
459
|
+
# line 460 "ragel_parser.rb"
|
455
460
|
begin
|
456
461
|
p ||= 0
|
457
462
|
pe ||= data.length
|
458
463
|
cs = irc_start
|
459
464
|
end
|
460
|
-
|
465
|
+
|
466
|
+
# line 132 "ragel_parser.rl"
|
461
467
|
|
462
|
-
# line
|
468
|
+
# line 469 "ragel_parser.rb"
|
463
469
|
begin
|
464
470
|
_klen, _trans, _keys, _acts, _nacts = nil
|
465
471
|
_goto_level = 0
|
@@ -541,139 +547,139 @@ begin
|
|
541
547
|
_acts += 1
|
542
548
|
case _irc_actions[_acts - 1]
|
543
549
|
when 0 then
|
544
|
-
# line
|
550
|
+
# line 6 "ragel_parser.rl"
|
545
551
|
begin
|
546
552
|
|
547
|
-
server =
|
553
|
+
server = Prefixes::Server.new
|
548
554
|
end
|
549
|
-
# line
|
555
|
+
# line 6 "ragel_parser.rl"
|
550
556
|
when 1 then
|
551
|
-
# line
|
557
|
+
# line 10 "ragel_parser.rl"
|
552
558
|
begin
|
553
559
|
|
554
560
|
server.name << data[p]
|
555
561
|
end
|
556
|
-
# line
|
562
|
+
# line 10 "ragel_parser.rl"
|
557
563
|
when 2 then
|
558
|
-
# line
|
564
|
+
# line 14 "ragel_parser.rl"
|
559
565
|
begin
|
560
566
|
|
561
567
|
command.prefix = server
|
562
568
|
end
|
563
|
-
# line
|
569
|
+
# line 14 "ragel_parser.rl"
|
564
570
|
when 3 then
|
565
|
-
# line
|
571
|
+
# line 18 "ragel_parser.rl"
|
566
572
|
begin
|
567
573
|
|
568
|
-
hostmask =
|
574
|
+
hostmask = Prefixes::HostMask.new
|
569
575
|
end
|
570
|
-
# line
|
576
|
+
# line 18 "ragel_parser.rl"
|
571
577
|
when 4 then
|
572
|
-
# line
|
578
|
+
# line 22 "ragel_parser.rl"
|
573
579
|
begin
|
574
580
|
|
575
|
-
hostmask.
|
581
|
+
hostmask.nick << data[p]
|
576
582
|
end
|
577
|
-
# line
|
583
|
+
# line 22 "ragel_parser.rl"
|
578
584
|
when 5 then
|
579
|
-
# line
|
585
|
+
# line 26 "ragel_parser.rl"
|
580
586
|
begin
|
581
587
|
|
582
588
|
hostmask.user << data[p]
|
583
589
|
end
|
584
|
-
# line
|
590
|
+
# line 26 "ragel_parser.rl"
|
585
591
|
when 6 then
|
586
|
-
# line
|
592
|
+
# line 30 "ragel_parser.rl"
|
587
593
|
begin
|
588
594
|
|
589
595
|
hostmask.host << data[p]
|
590
596
|
end
|
591
|
-
# line
|
597
|
+
# line 30 "ragel_parser.rl"
|
592
598
|
when 7 then
|
593
|
-
# line
|
599
|
+
# line 34 "ragel_parser.rl"
|
594
600
|
begin
|
595
601
|
|
596
602
|
command.prefix = hostmask
|
597
603
|
end
|
598
|
-
# line
|
604
|
+
# line 34 "ragel_parser.rl"
|
599
605
|
when 8 then
|
600
|
-
# line
|
606
|
+
# line 38 "ragel_parser.rl"
|
601
607
|
begin
|
602
608
|
|
603
609
|
code = ""
|
604
610
|
end
|
605
|
-
# line
|
611
|
+
# line 38 "ragel_parser.rl"
|
606
612
|
when 9 then
|
607
|
-
# line
|
613
|
+
# line 42 "ragel_parser.rl"
|
608
614
|
begin
|
609
615
|
|
610
616
|
code << data[p]
|
611
617
|
end
|
612
|
-
# line
|
618
|
+
# line 42 "ragel_parser.rl"
|
613
619
|
when 10 then
|
614
|
-
# line
|
620
|
+
# line 46 "ragel_parser.rl"
|
615
621
|
begin
|
616
622
|
|
617
623
|
command.code = code
|
618
624
|
end
|
619
|
-
# line
|
625
|
+
# line 46 "ragel_parser.rl"
|
620
626
|
when 11 then
|
621
|
-
# line
|
627
|
+
# line 50 "ragel_parser.rl"
|
622
628
|
begin
|
623
629
|
|
624
630
|
params_1 = []
|
625
631
|
params_2 = []
|
626
632
|
end
|
627
|
-
# line
|
633
|
+
# line 50 "ragel_parser.rl"
|
628
634
|
when 12 then
|
629
|
-
# line
|
635
|
+
# line 55 "ragel_parser.rl"
|
630
636
|
begin
|
631
637
|
|
632
638
|
end
|
633
|
-
# line
|
639
|
+
# line 55 "ragel_parser.rl"
|
634
640
|
when 13 then
|
635
|
-
# line
|
641
|
+
# line 58 "ragel_parser.rl"
|
636
642
|
begin
|
637
643
|
|
638
644
|
params_1 << ""
|
639
645
|
end
|
640
|
-
# line
|
646
|
+
# line 58 "ragel_parser.rl"
|
641
647
|
when 14 then
|
642
|
-
# line
|
648
|
+
# line 62 "ragel_parser.rl"
|
643
649
|
begin
|
644
650
|
|
645
651
|
params_2 << ""
|
646
652
|
end
|
647
|
-
# line
|
653
|
+
# line 62 "ragel_parser.rl"
|
648
654
|
when 15 then
|
649
|
-
# line
|
655
|
+
# line 66 "ragel_parser.rl"
|
650
656
|
begin
|
651
657
|
|
652
658
|
params_1.last << data[p]
|
653
659
|
end
|
654
|
-
# line
|
660
|
+
# line 66 "ragel_parser.rl"
|
655
661
|
when 16 then
|
656
|
-
# line
|
662
|
+
# line 70 "ragel_parser.rl"
|
657
663
|
begin
|
658
664
|
|
659
665
|
params_2.last << data[p]
|
660
666
|
end
|
661
|
-
# line
|
667
|
+
# line 70 "ragel_parser.rl"
|
662
668
|
when 17 then
|
663
|
-
# line
|
669
|
+
# line 74 "ragel_parser.rl"
|
664
670
|
begin
|
665
671
|
|
666
672
|
command.params = params_1
|
667
673
|
end
|
668
|
-
# line
|
674
|
+
# line 74 "ragel_parser.rl"
|
669
675
|
when 18 then
|
670
|
-
# line
|
676
|
+
# line 78 "ragel_parser.rl"
|
671
677
|
begin
|
672
678
|
|
673
679
|
command.params = params_2
|
674
680
|
end
|
675
|
-
# line
|
676
|
-
# line
|
681
|
+
# line 78 "ragel_parser.rl"
|
682
|
+
# line 683 "ragel_parser.rb"
|
677
683
|
end # action switch
|
678
684
|
end
|
679
685
|
end
|
@@ -699,12 +705,13 @@ when 18 then
|
|
699
705
|
end
|
700
706
|
end
|
701
707
|
end
|
702
|
-
|
708
|
+
|
709
|
+
# line 133 "ragel_parser.rl"
|
703
710
|
|
704
711
|
if cs >= irc_first_final
|
705
712
|
command
|
706
713
|
else
|
707
|
-
raise UnparseableMessage, "Failed to parse the message: #{
|
714
|
+
raise UnparseableMessage, "Failed to parse the message: #{line.strip}"
|
708
715
|
end
|
709
716
|
end
|
710
717
|
|
@@ -1,11 +1,10 @@
|
|
1
|
-
# Ragel Parser comes from the Arrbot Guys -
|
2
|
-
# Kudos to Halogrium and Epitron.
|
1
|
+
# Ragel Parser comes from the Arrbot Guys - Kudos to Halogrium and Epitron.
|
3
2
|
|
4
3
|
%%{
|
5
4
|
machine irc;
|
6
5
|
|
7
6
|
action prefix_servername_start {
|
8
|
-
server =
|
7
|
+
server = Prefixes::Server.new
|
9
8
|
}
|
10
9
|
|
11
10
|
action prefix_servername {
|
@@ -17,11 +16,11 @@
|
|
17
16
|
}
|
18
17
|
|
19
18
|
action prefix_hostmask_start {
|
20
|
-
hostmask =
|
19
|
+
hostmask = Prefixes::HostMask.new
|
21
20
|
}
|
22
21
|
|
23
22
|
action hostmask_nickname {
|
24
|
-
hostmask.
|
23
|
+
hostmask.nick << fc
|
25
24
|
}
|
26
25
|
|
27
26
|
action hostmask_user {
|
@@ -127,7 +126,7 @@ module Marvin
|
|
127
126
|
hostmask = nil
|
128
127
|
server = nil
|
129
128
|
code = nil
|
130
|
-
command =
|
129
|
+
command = Command.new(data)
|
131
130
|
|
132
131
|
%% write init;
|
133
132
|
%% write exec;
|
@@ -135,7 +134,7 @@ module Marvin
|
|
135
134
|
if cs >= irc_first_final
|
136
135
|
command
|
137
136
|
else
|
138
|
-
raise UnparseableMessage, "Failed to parse the message: #{
|
137
|
+
raise UnparseableMessage, "Failed to parse the message: #{line.strip}"
|
139
138
|
end
|
140
139
|
end
|
141
140
|
|
@@ -7,17 +7,12 @@ module Marvin
|
|
7
7
|
# Parses an incoming message by using string
|
8
8
|
# Manipulation.
|
9
9
|
def self.parse!(line)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
prefix_text = nil
|
14
|
-
end
|
15
|
-
command = Marvin::Parsers::Command.new(line + "\r\n")
|
10
|
+
prefix_text = nil
|
11
|
+
prefix_text, line = line.split(" ", 2) if line[0] == ?:
|
12
|
+
command = Command.new("#{line}\r\n")
|
16
13
|
command.prefix = self.extract_prefix(prefix_text)
|
17
|
-
|
18
|
-
parts = head.split(" ")
|
14
|
+
parts = Marvin::Util.arguments(line)
|
19
15
|
command.code = parts.shift
|
20
|
-
parts << tail unless tail.nil?
|
21
16
|
command.params = parts
|
22
17
|
return command
|
23
18
|
end
|
data/lib/marvin/parsers.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
module Marvin
|
2
2
|
module Parsers
|
3
3
|
# Default Parsers
|
4
|
-
autoload :RegexpParser, 'marvin/parsers/regexp_parser'
|
5
|
-
autoload :SimpleParser, 'marvin/parsers/simple_parser'
|
6
4
|
autoload :Prefixes, 'marvin/parsers/prefixes'
|
7
5
|
autoload :Command, 'marvin/parsers/command'
|
6
|
+
autoload :SimpleParser, 'marvin/parsers/simple_parser'
|
8
7
|
autoload :RagelParser, 'marvin/parsers/ragel_parser'
|
9
8
|
end
|
10
9
|
end
|
data/lib/marvin/settings.rb
CHANGED
@@ -1,81 +1,31 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
def daemon?
|
17
|
-
self.daemon
|
18
|
-
end
|
19
|
-
|
20
|
-
def root
|
21
|
-
File.expand_path(defined?(MARVIN_ROOT) ? MARVIN_ROOT : File.dirname(__FILE__) / "../..")
|
22
|
-
end
|
23
|
-
|
24
|
-
def setup(options = {})
|
25
|
-
return if self.is_setup
|
26
|
-
self.setup!(options)
|
27
|
-
end
|
28
|
-
|
29
|
-
def distributed_namespace
|
30
|
-
@@distributed_namespace ||= :default
|
31
|
-
end
|
32
|
-
|
33
|
-
def setup!(options = {})
|
34
|
-
self.environment ||= "development"
|
35
|
-
self.configuration = {}
|
36
|
-
self.default_client ||= Marvin::IRC::Client
|
37
|
-
self.default_parser ||= Marvin::Parsers::SimpleParser
|
38
|
-
loaded_yaml = YAML.load_file(root / "config/settings.yml")
|
39
|
-
env_settings = loaded_yaml[self.environment] || {}
|
40
|
-
loaded_options = loaded_yaml["default"].merge(env_settings).merge(options)
|
41
|
-
self.configuration.merge!(loaded_options)
|
42
|
-
self.configuration.symbolize_keys!
|
43
|
-
mod = Module.new do
|
44
|
-
Settings.configuration.keys.each do |k|
|
45
|
-
define_method(k) do
|
46
|
-
return Settings.configuration[k]
|
47
|
-
end
|
48
|
-
|
49
|
-
define_method("#{k}=") do |val|
|
50
|
-
Settings.configuration[k] = val
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# Extend and include.
|
56
|
-
|
57
|
-
extend mod
|
58
|
-
include mod
|
59
|
-
|
60
|
-
self.is_setup = true
|
61
|
-
end
|
62
|
-
|
63
|
-
def [](key)
|
64
|
-
self.setup
|
65
|
-
return self.configuration[key.to_sym]
|
66
|
-
end
|
67
|
-
|
68
|
-
def []=(key, value)
|
69
|
-
self.setup
|
70
|
-
self.configuration[key.to_sym] = value
|
71
|
-
return value
|
72
|
-
end
|
73
|
-
|
74
|
-
def to_hash
|
75
|
-
self.configuration
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
79
|
-
|
1
|
+
# Example of extending built in Perennial
|
2
|
+
# functionality. Since const_get etc acts
|
3
|
+
# oddly, this is the best way to do it.
|
4
|
+
Marvin::Settings.class_eval do
|
5
|
+
|
6
|
+
def self.parser
|
7
|
+
# We use SimpleParser by default because it is almost
|
8
|
+
# 20 times faster (from basic benchmarks) than the Ragel
|
9
|
+
# based parser. If you're having issues with unexpected
|
10
|
+
# results, please try using Ragel as the parser for you
|
11
|
+
# application - It was (afaik) almost a direct port
|
12
|
+
# from the RFC where as I've taken some liberties with
|
13
|
+
# simple parser for the expected reasons.
|
14
|
+
@@parser ||= Marvin::Parsers::SimpleParser
|
80
15
|
end
|
16
|
+
|
17
|
+
def self.parser=(value)
|
18
|
+
raise ArgumentError, 'Is not a valid parser implementation' unless value < Marvin::AbstractParser
|
19
|
+
@@parser = value
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.client
|
23
|
+
@@client ||= Marvin::IRC::Client
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.client=(value)
|
27
|
+
raise ArgumentError, 'Is not a valid client implementation' unless value < Marvin::AbstractClient
|
28
|
+
@@client = value
|
29
|
+
end
|
30
|
+
|
81
31
|
end
|
data/lib/marvin/test_client.rb
CHANGED
@@ -1,63 +1,57 @@
|
|
1
|
-
require 'ostruct'
|
2
|
-
require 'active_support'
|
3
|
-
|
4
1
|
module Marvin
|
5
2
|
# Marvin::TestClient is a simple client used for testing
|
6
3
|
# Marvin::Base derivatives in a non-network-reliant setting.
|
7
4
|
class TestClient < AbstractClient
|
8
|
-
|
5
|
+
|
6
|
+
attr_accessor :incoming_commands, :outgoing_commands, :last_sent,
|
7
|
+
:dispatched_events, :connection_open
|
9
8
|
|
10
9
|
cattr_accessor :instances
|
11
|
-
|
10
|
+
@@instances = []
|
12
11
|
|
13
12
|
DispatchedEvents = Struct.new(:name, :options)
|
14
13
|
|
15
14
|
def initialize(opts = {})
|
16
15
|
super
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
16
|
+
@incoming_commands = []
|
17
|
+
@outgoing_commands = []
|
18
|
+
@dispatched_events = []
|
19
|
+
@connection_open = false
|
20
|
+
@@instances << self
|
22
21
|
end
|
23
22
|
|
24
23
|
def connection_open?
|
25
|
-
|
24
|
+
!!@connection_open
|
26
25
|
end
|
27
26
|
|
28
27
|
def send_line(*args)
|
29
|
-
|
30
|
-
|
28
|
+
@outgoing_commands += args
|
29
|
+
@last_sent = args.last
|
31
30
|
end
|
32
31
|
|
33
32
|
def test_command(name, *args)
|
34
|
-
options
|
33
|
+
options = args.extract_options!
|
35
34
|
host_mask = options.delete(:host_mask) || ":WiZ!jto@tolsun.oulu.fi"
|
36
|
-
name
|
37
|
-
args
|
38
|
-
|
39
|
-
self.receive_line irc_command
|
35
|
+
name = name.to_s.upcase
|
36
|
+
args = args.flatten.compact
|
37
|
+
receive_line "#{host_mask} #{name} #{args.join(" ").strip}"
|
40
38
|
end
|
41
39
|
|
42
40
|
def dispatch(name, opts = {})
|
43
|
-
|
41
|
+
@dispatched_events << [name, opts]
|
44
42
|
super(name, opts)
|
45
43
|
end
|
46
44
|
|
47
45
|
def self.run
|
48
|
-
|
49
|
-
i.connection_open = true
|
50
|
-
end
|
46
|
+
@@instances.each { |i| i.connection_open = true }
|
51
47
|
end
|
52
48
|
|
53
49
|
def self.stop
|
54
|
-
|
55
|
-
i.connection_open = false
|
56
|
-
end
|
50
|
+
@@instances.each { |i| i.connection_open = false }
|
57
51
|
end
|
58
52
|
|
59
53
|
def self.add_reconnect(opts = {})
|
60
|
-
|
54
|
+
logger.info "Added reconnect with options: #{opts.inspect}"
|
61
55
|
end
|
62
56
|
|
63
57
|
end
|
data/lib/marvin/util.rb
CHANGED
@@ -12,7 +12,8 @@ module Marvin
|
|
12
12
|
# appending "#" to the front if it doesn't already
|
13
13
|
# start with it.
|
14
14
|
def channel_name(name)
|
15
|
-
|
15
|
+
name = name.to_s
|
16
|
+
name =~ /^\#/ ? name : "##{name}"
|
16
17
|
end
|
17
18
|
alias chan channel_name
|
18
19
|
|
@@ -26,8 +27,14 @@ module Marvin
|
|
26
27
|
# Specifies the last parameter of a response, used to
|
27
28
|
# specify parameters which have spaces etc (for example,
|
28
29
|
# the actual message part of a response).
|
29
|
-
def last_param(section)
|
30
|
-
|
30
|
+
def last_param(section, ignore_prefix = true)
|
31
|
+
content = section.to_s.strip
|
32
|
+
return if content.blank?
|
33
|
+
if content =~ /\s+/ && (ignore_prefix || content !~ /^:/)
|
34
|
+
":#{content}"
|
35
|
+
else
|
36
|
+
content
|
37
|
+
end
|
31
38
|
end
|
32
39
|
alias lp last_param
|
33
40
|
|
data/lib/marvin.rb
CHANGED
@@ -1,53 +1,56 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
2
|
require 'rubygems'
|
4
|
-
require '
|
5
|
-
require 'marvin/core_ext'
|
6
|
-
|
7
|
-
# Make all exceptions available
|
8
|
-
require 'marvin/exceptions'
|
3
|
+
require 'perennial'
|
9
4
|
|
10
5
|
module Marvin
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
PATCH = 2
|
15
|
-
|
16
|
-
STRING = [MAJOR, MINOR, PATCH].join(".")
|
17
|
-
end
|
6
|
+
include Perennial
|
7
|
+
|
8
|
+
VERSION = [0, 8, 0, 0]
|
18
9
|
|
19
|
-
|
20
|
-
autoload :
|
10
|
+
# Misc.
|
11
|
+
#autoload :Util, 'marvin/util'
|
12
|
+
# Client
|
13
|
+
#autoload :AbstractClient, 'marvin/abstract_client'
|
14
|
+
#autoload :IRC, 'marvin/irc'
|
15
|
+
autoload :TestClient, 'marvin/test_client'
|
16
|
+
# Console of DOOM.
|
17
|
+
autoload :Console, 'marvin/console'
|
18
|
+
# Distributed
|
21
19
|
autoload :Distributed, 'marvin/distributed'
|
22
|
-
autoload :
|
20
|
+
autoload :Status, 'marvin/status'
|
21
|
+
# Handler
|
23
22
|
autoload :Base, 'marvin/base'
|
24
|
-
autoload :
|
25
|
-
autoload :CoreCommands, 'marvin/core_commands'
|
26
|
-
autoload :ClientMixin, 'marvin/client_mixin'
|
27
|
-
autoload :Settings, 'marvin/settings'
|
28
|
-
autoload :Logger, 'marvin/logger'
|
23
|
+
autoload :CommandHandler, 'marvin/command_handler'
|
29
24
|
autoload :LoggingHandler, 'marvin/logging_handler'
|
30
|
-
autoload :
|
31
|
-
autoload :TestClient, 'marvin/test_client'
|
32
|
-
autoload :Loader, 'marvin/loader'
|
25
|
+
autoload :CoreCommands, 'marvin/core_commands'
|
33
26
|
autoload :MiddleMan, 'marvin/middle_man'
|
34
|
-
|
35
|
-
autoload :
|
36
|
-
autoload :
|
37
|
-
autoload :Options, 'marvin/options'
|
38
|
-
autoload :Daemon, 'marvin/daemon'
|
39
|
-
autoload :Status, 'marvin/status'
|
40
|
-
# Parsers
|
41
|
-
autoload :AbstractParser, 'marvin/abstract_parser'
|
42
|
-
autoload :Parsers, 'marvin/parsers.rb'
|
27
|
+
# These should be namespaced under IRC
|
28
|
+
#autoload :AbstractParser, 'marvin/abstract_parser'
|
29
|
+
autoload :Parsers, 'marvin/parsers'
|
43
30
|
|
44
|
-
# Default Handlers
|
45
|
-
autoload :CommandHandler, 'marvin/command_handler'
|
46
31
|
|
47
|
-
|
32
|
+
manifest do |m, l|
|
33
|
+
Settings.root = File.dirname(File.dirname(__FILE__))
|
34
|
+
l.register_controller :client, 'Marvin::Settings.client'
|
35
|
+
l.register_controller :console, 'Marvin::Console'
|
36
|
+
l.register_controller :distributed_client, 'Marvin::Distributed::Client'
|
37
|
+
# Core Commands handily makes available a set
|
38
|
+
# of information about what is running etc.
|
39
|
+
|
40
|
+
l.before_run do
|
41
|
+
if l.distributed_client?
|
42
|
+
Marvin::Settings.client = Marvin::Distributed::Client
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
48
47
|
|
49
|
-
def self.version
|
50
|
-
VERSION
|
48
|
+
def self.version(include_minor = false)
|
49
|
+
VERSION[0, (include_minor ? 4 : 3)].join(".")
|
51
50
|
end
|
52
51
|
|
52
|
+
has_library :util, :abstract_client, :abstract_parser, :irc, :exception_tracker
|
53
|
+
|
54
|
+
extends_library :settings
|
55
|
+
|
53
56
|
end
|
data/templates/boot.erb
ADDED