rlyeh 0.0.2 → 0.1.1
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/.gitignore +1 -0
- data/examples/basic.rb +18 -0
- data/examples/echo.rb +1 -1
- data/examples/middleware.rb +1 -1
- data/examples/oauth.rb +21 -0
- data/lib/rlyeh.rb +33 -15
- data/lib/rlyeh/base.rb +3 -2
- data/lib/rlyeh/connection.rb +78 -23
- data/lib/rlyeh/deep_ones/auth.rb +5 -67
- data/lib/rlyeh/deep_ones/auth/base.rb +88 -0
- data/lib/rlyeh/deep_ones/auth/basic.rb +21 -0
- data/lib/rlyeh/deep_ones/auth/null.rb +12 -0
- data/lib/rlyeh/deep_ones/auth/oauth.rb +55 -0
- data/lib/rlyeh/deep_ones/closer.rb +7 -3
- data/lib/rlyeh/deep_ones/logger.rb +8 -6
- data/lib/rlyeh/deep_ones/parser.rb +6 -2
- data/lib/rlyeh/deep_ones/typablemap.rb +1 -1
- data/lib/rlyeh/dispatcher.rb +23 -25
- data/lib/rlyeh/environment.rb +4 -2
- data/lib/rlyeh/logger.rb +20 -0
- data/lib/rlyeh/sender.rb +18 -0
- data/lib/rlyeh/server.rb +33 -39
- data/lib/rlyeh/session.rb +23 -24
- data/lib/rlyeh/target.rb +27 -0
- data/lib/rlyeh/version.rb +1 -1
- data/lib/rlyeh/worker.rb +38 -0
- data/rlyeh.gemspec +1 -1
- data/spec/rlyeh/environment_spec.rb +42 -0
- metadata +46 -18
- data/examples/simple.rb +0 -20
- data/lib/rlyeh/runner.rb +0 -42
- data/lib/rlyeh/sendable.rb +0 -11
data/.gitignore
CHANGED
data/examples/basic.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
$:.unshift 'lib', '../lib'
|
4
|
+
require 'rlyeh'
|
5
|
+
|
6
|
+
class BasicServer < Rlyeh::Base
|
7
|
+
use Rlyeh::DeepOnes::Logger
|
8
|
+
use Rlyeh::DeepOnes::Auth::Basic, 'dankogai', 'kogaidan'
|
9
|
+
|
10
|
+
set :server_name, 'basic-server'
|
11
|
+
set :server_version, '1.0.0'
|
12
|
+
|
13
|
+
on :privmsg do |env|
|
14
|
+
puts "RECV: #{env.message}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
Rlyeh.emerge BasicServer, :host => '0.0.0.0'
|
data/examples/echo.rb
CHANGED
data/examples/middleware.rb
CHANGED
data/examples/oauth.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
$LOAD_PATH.unshift 'lib', '../lib'
|
4
|
+
require 'rlyeh'
|
5
|
+
|
6
|
+
class OAuthServer < Rlyeh::Base
|
7
|
+
use Rlyeh::DeepOnes::Logger
|
8
|
+
use Rlyeh::DeepOnes::Auth::OAuth, 'consumer key', 'consumer secret', {
|
9
|
+
:authorize_path => '/oauth/authenticate',
|
10
|
+
:site => 'https://api.twitter.com'
|
11
|
+
}
|
12
|
+
|
13
|
+
set :server_name, 'oauth-server'
|
14
|
+
set :server_version, '1.0.0'
|
15
|
+
|
16
|
+
on :privmsg do |env|
|
17
|
+
puts "RECV: #{env.message}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Rlyeh.emerge OAuthServer, :host => '0.0.0.0'
|
data/lib/rlyeh.rb
CHANGED
@@ -1,21 +1,39 @@
|
|
1
|
-
require '
|
1
|
+
require 'rlyeh/version'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
require 'rlyeh/logger'
|
4
|
+
require 'rlyeh/dispatcher'
|
5
|
+
require 'rlyeh/sender'
|
6
|
+
|
7
|
+
require 'rlyeh/settings'
|
8
|
+
require 'rlyeh/server'
|
9
|
+
require 'rlyeh/connection'
|
10
|
+
require 'rlyeh/session'
|
11
|
+
require 'rlyeh/environment'
|
12
|
+
require 'rlyeh/numeric_reply'
|
13
|
+
require 'rlyeh/target'
|
14
|
+
require 'rlyeh/base'
|
15
|
+
|
16
|
+
require 'rlyeh/deep_ones'
|
5
17
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
autoload :Environment, 'rlyeh/environment'
|
10
|
-
autoload :NumericReply, 'rlyeh/numeric_reply'
|
11
|
-
autoload :Base, 'rlyeh/base'
|
18
|
+
module Rlyeh
|
19
|
+
class << self
|
20
|
+
attr_accessor :logger
|
12
21
|
|
13
|
-
|
14
|
-
|
15
|
-
autoload :Settings, 'rlyeh/settings'
|
22
|
+
def run(app_class, options = {})
|
23
|
+
supervisor = Rlyeh::Server.supervise_as :server, app_class, options
|
16
24
|
|
17
|
-
|
25
|
+
trap(:INT) do
|
26
|
+
supervisor.terminate
|
27
|
+
exit
|
28
|
+
end
|
18
29
|
|
19
|
-
|
20
|
-
|
30
|
+
sleep
|
31
|
+
end
|
32
|
+
alias_method :emerge, :run
|
33
|
+
end
|
21
34
|
end
|
35
|
+
|
36
|
+
require 'logger'
|
37
|
+
#Celluloid.logger = nil
|
38
|
+
Rlyeh.logger = ::Logger.new $stderr
|
39
|
+
|
data/lib/rlyeh/base.rb
CHANGED
@@ -10,6 +10,8 @@ module Rlyeh
|
|
10
10
|
|
11
11
|
set :server_name, 'Rlyeh'
|
12
12
|
set :server_version, Rlyeh::VERSION
|
13
|
+
set :available_user_modes, ''
|
14
|
+
set :available_channel_modes, ''
|
13
15
|
|
14
16
|
class << self
|
15
17
|
def middlewares
|
@@ -58,8 +60,7 @@ module Rlyeh
|
|
58
60
|
end
|
59
61
|
|
60
62
|
def call(env)
|
61
|
-
|
62
|
-
trigger name, env
|
63
|
+
dispatch env
|
63
64
|
@app.call env if @app
|
64
65
|
end
|
65
66
|
|
data/lib/rlyeh/connection.rb
CHANGED
@@ -1,55 +1,110 @@
|
|
1
|
+
require 'celluloid'
|
2
|
+
require 'forwardable'
|
3
|
+
require 'rlyeh/logger'
|
4
|
+
require 'rlyeh/sender'
|
5
|
+
require 'rlyeh/worker'
|
1
6
|
require 'rlyeh/environment'
|
2
|
-
require 'rlyeh/filters'
|
3
|
-
require 'rlyeh/sendable'
|
4
7
|
|
5
8
|
module Rlyeh
|
6
|
-
class Connection
|
7
|
-
include
|
8
|
-
include Rlyeh::
|
9
|
+
class Connection
|
10
|
+
include Rlyeh::Logger
|
11
|
+
include Rlyeh::Sender
|
12
|
+
include Rlyeh::Worker
|
13
|
+
extend Forwardable
|
9
14
|
|
10
|
-
attr_reader :server, :
|
11
|
-
attr_reader :app, :session
|
15
|
+
attr_reader :server, :socket
|
16
|
+
attr_reader :app, :host, :port, :session
|
12
17
|
|
13
|
-
|
18
|
+
def_delegators :@socket, :close, :closed?
|
19
|
+
|
20
|
+
BUFFER_SIZE = 4096
|
21
|
+
|
22
|
+
def initialize(server, socket)
|
14
23
|
@server = server
|
15
|
-
@
|
16
|
-
@
|
17
|
-
|
24
|
+
@socket = socket
|
25
|
+
_, @port, @host = @socket.peeraddr
|
26
|
+
@app = @server.app_class.new nil
|
27
|
+
|
28
|
+
debug "Connection started: #{@host}:#{@port}"
|
18
29
|
end
|
19
30
|
|
20
|
-
def
|
21
|
-
@
|
31
|
+
def close
|
32
|
+
@socket.close unless @socket.closed?
|
33
|
+
|
34
|
+
if attached?
|
35
|
+
@session.detach self
|
36
|
+
|
37
|
+
if @session.empty?
|
38
|
+
@session.close
|
39
|
+
@server.sessions.delete @session.id
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
debug "Connection closed: #{@host}:#{@port}"
|
22
44
|
end
|
23
45
|
|
24
|
-
def
|
25
|
-
|
46
|
+
def run
|
47
|
+
catch :quit do
|
48
|
+
read_each do |data|
|
49
|
+
invoke do
|
50
|
+
process data
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
26
54
|
end
|
27
55
|
|
28
|
-
def
|
56
|
+
def read_each(&block)
|
57
|
+
loop do
|
58
|
+
@buffer ||= ''.force_encoding('ASCII-8BIT')
|
59
|
+
@buffer << @socket.readpartial(BUFFER_SIZE).force_encoding('ASCII-8BIT')
|
60
|
+
|
61
|
+
while data = @buffer.slice!(/(.+)\n/, 1)
|
62
|
+
block.call data.chomp if block
|
63
|
+
end
|
64
|
+
end
|
65
|
+
rescue EOFError => e
|
66
|
+
# client disconnected
|
67
|
+
rescue Celluloid::Task::TerminatedError
|
68
|
+
# kill a running task
|
69
|
+
end
|
70
|
+
|
71
|
+
def process(data)
|
29
72
|
env = Rlyeh::Environment.new
|
73
|
+
env.version = Rlyeh::VERSION
|
30
74
|
env.data = data
|
31
75
|
env.server = @server
|
32
76
|
env.connection = self
|
33
|
-
env.settings = @app_class.settings
|
77
|
+
env.settings = @server.app_class.settings
|
34
78
|
|
35
79
|
catch :halt do
|
36
|
-
|
80
|
+
begin
|
81
|
+
@app.call env
|
82
|
+
rescue Exception => e
|
83
|
+
crash e
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def send_data(data, multicast = true)
|
89
|
+
data = data.to_s
|
90
|
+
if multicast && attached?
|
91
|
+
@session.send_data data
|
92
|
+
else
|
93
|
+
@socket.write data
|
37
94
|
end
|
38
95
|
end
|
39
96
|
|
40
|
-
def
|
97
|
+
def attach(session)
|
41
98
|
@session = session
|
42
99
|
end
|
43
100
|
|
44
|
-
def
|
101
|
+
def detach(session)
|
45
102
|
@session = nil
|
46
103
|
end
|
47
104
|
|
48
105
|
def attached?
|
49
106
|
!!@session
|
50
107
|
end
|
51
|
-
|
52
|
-
include Rlyeh::Filters
|
53
|
-
define_filters :attached, :detached
|
54
108
|
end
|
55
109
|
end
|
110
|
+
|
data/lib/rlyeh/deep_ones/auth.rb
CHANGED
@@ -1,72 +1,10 @@
|
|
1
|
-
require 'socket'
|
2
|
-
require 'rlyeh/dispatcher'
|
3
|
-
|
4
1
|
module Rlyeh
|
5
2
|
module DeepOnes
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def initialize(app, &authenticator)
|
12
|
-
@app = app
|
13
|
-
@authenticator = authenticator
|
14
|
-
@authorized = false
|
15
|
-
end
|
16
|
-
|
17
|
-
def call(env)
|
18
|
-
dispatch env
|
19
|
-
|
20
|
-
if authorized?
|
21
|
-
env.auth = self
|
22
|
-
@app.call env
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def load_session(env, id)
|
27
|
-
env.server.sessions[id] ||= Rlyeh::Session.new(id)
|
28
|
-
end
|
29
|
-
|
30
|
-
def authorized?
|
31
|
-
@authorized
|
32
|
-
end
|
33
|
-
|
34
|
-
def authorized(env)
|
35
|
-
name = env.settings.server_name
|
36
|
-
version = env.settings.server_version
|
37
|
-
|
38
|
-
env.connection.tap do |conn|
|
39
|
-
conn.send_numeric_reply :welcome, @host, "Welcome to the Internet Relay Network #{@nick}!#{@user}@#{@host}"
|
40
|
-
conn.send_numeric_reply :yourhost, @host, "Your host is #{name}, running version #{version}"
|
41
|
-
conn.send_numeric_reply :created, @host, "This server was created #{Time.now}"
|
42
|
-
conn.send_numeric_reply :myinfo, @host, "#{name} #{version} #{""} #{""}"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
on :pass do |env|
|
47
|
-
@pass = env.message.params[0]
|
48
|
-
end
|
49
|
-
|
50
|
-
on :nick do |env|
|
51
|
-
@nick = env.message.params[0]
|
52
|
-
end
|
53
|
-
|
54
|
-
on :user do |env|
|
55
|
-
@user = env.message.params[0]
|
56
|
-
@real = env.message.params[3]
|
57
|
-
port, @host = Socket.unpack_sockaddr_in(env.connection.get_peername)
|
58
|
-
|
59
|
-
session_id = @authenticator.call(self)
|
60
|
-
if session_id.nil?
|
61
|
-
p "Auth error"
|
62
|
-
else
|
63
|
-
@authorized = true
|
64
|
-
session = load_session env, session_id
|
65
|
-
session.attach env.connection
|
66
|
-
authorized env
|
67
|
-
p 'Session attached.'
|
68
|
-
end
|
69
|
-
end
|
3
|
+
module Auth
|
4
|
+
autoload :Base, 'rlyeh/deep_ones/auth/base'
|
5
|
+
autoload :Null, 'rlyeh/deep_ones/auth/null'
|
6
|
+
autoload :Basic, 'rlyeh/deep_ones/auth/basic'
|
7
|
+
autoload :OAuth, 'rlyeh/deep_ones/auth/oauth'
|
70
8
|
end
|
71
9
|
end
|
72
10
|
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'rlyeh/dispatcher'
|
2
|
+
require 'rlyeh/logger'
|
3
|
+
|
4
|
+
module Rlyeh
|
5
|
+
module DeepOnes
|
6
|
+
module Auth
|
7
|
+
class Base
|
8
|
+
include Rlyeh::Dispatcher
|
9
|
+
include Rlyeh::Logger
|
10
|
+
|
11
|
+
attr_reader :nick, :pass, :user, :real, :host
|
12
|
+
|
13
|
+
def initialize(app, &block)
|
14
|
+
@app = app
|
15
|
+
@authenticated = false
|
16
|
+
instance_eval &block if block
|
17
|
+
end
|
18
|
+
|
19
|
+
def call(env)
|
20
|
+
dispatch env
|
21
|
+
|
22
|
+
if authenticated?
|
23
|
+
env.auth = self
|
24
|
+
@app.call env if @app
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def authenticated?
|
29
|
+
@authenticated
|
30
|
+
end
|
31
|
+
|
32
|
+
def try(env)
|
33
|
+
raise NotImplementedError
|
34
|
+
end
|
35
|
+
|
36
|
+
def session_id
|
37
|
+
@nick
|
38
|
+
end
|
39
|
+
|
40
|
+
def succeeded(env)
|
41
|
+
@authorized = true
|
42
|
+
session = env.server.load_session session_id
|
43
|
+
session.attach env.connection
|
44
|
+
debug "Authentication succeeded #{env.connection.host}:#{env.connection.port}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def failed(env)
|
48
|
+
env.connection.send_numeric_reply :passwdmismatch, @host, ':Password incorrect'
|
49
|
+
debug "Authentication failed #{env.connection.host}:#{env.connection.port}"
|
50
|
+
end
|
51
|
+
|
52
|
+
def welcome(env)
|
53
|
+
name = env.settings.server_name
|
54
|
+
version = env.settings.server_version
|
55
|
+
user_modes = env.settings.available_user_modes
|
56
|
+
channel_modes = env.settings.available_channel_modes
|
57
|
+
|
58
|
+
messages = {
|
59
|
+
:welcome => "Welcome to the Internet Relay Network #{@nick}!#{@user}@#{@host}",
|
60
|
+
:yourhost => "Your host is #{name}, running version #{version}",
|
61
|
+
:created => "This server was created #{Time.now}",
|
62
|
+
:myinfo => "#{name} #{version} #{user_modes} #{channel_modes}"
|
63
|
+
}
|
64
|
+
|
65
|
+
messages.each do |type, message|
|
66
|
+
env.connection.send_numeric_reply type, @nick, ":#{message}", :prefix => {:servername => name}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
on :pass do |env|
|
71
|
+
@pass = env.message.params[0]
|
72
|
+
end
|
73
|
+
|
74
|
+
on :nick do |env|
|
75
|
+
@nick = env.message.params[0]
|
76
|
+
end
|
77
|
+
|
78
|
+
on :user do |env|
|
79
|
+
@user = env.message.params[0]
|
80
|
+
@real = env.message.params[3]
|
81
|
+
@host = env.connection.host
|
82
|
+
|
83
|
+
try env
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Rlyeh
|
2
|
+
module DeepOnes
|
3
|
+
module Auth
|
4
|
+
class Basic < Rlyeh::DeepOnes::Auth::Base
|
5
|
+
def initialize(app, nick, pass)
|
6
|
+
@basic = [nick, pass].freeze
|
7
|
+
super app
|
8
|
+
end
|
9
|
+
|
10
|
+
def try(env)
|
11
|
+
if @basic == [nick, pass]
|
12
|
+
succeeded env
|
13
|
+
welcome env
|
14
|
+
else
|
15
|
+
failed env
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'oauth'
|
2
|
+
|
3
|
+
module Rlyeh
|
4
|
+
module DeepOnes
|
5
|
+
module Auth
|
6
|
+
class OAuth < Rlyeh::DeepOnes::Auth::Base
|
7
|
+
attr_accessor :consumer_key, :consumer_secret, :client_options
|
8
|
+
attr_accessor :open_timeout, :read_timeout
|
9
|
+
attr_accessor :authorize_params, :request_params
|
10
|
+
attr_reader :access_token
|
11
|
+
|
12
|
+
def initialize(app, consumer_key, consumer_secret, client_options = {})
|
13
|
+
@consumer_key = consumer_key
|
14
|
+
@consumer_secret = consumer_secret
|
15
|
+
@client_options = client_options
|
16
|
+
@open_timeout = nil
|
17
|
+
@read_timeout = nil
|
18
|
+
@authorize_params = {}
|
19
|
+
@request_params = {}
|
20
|
+
super app
|
21
|
+
end
|
22
|
+
|
23
|
+
def consumer
|
24
|
+
consumer = ::OAuth::Consumer.new @consumer_key, @consumer_secret, @client_options
|
25
|
+
consumer.http.open_timeout = @open_timeout if @open_timeout
|
26
|
+
consumer.http.read_timeout = @read_timeout if @read_timeout
|
27
|
+
consumer
|
28
|
+
end
|
29
|
+
|
30
|
+
def try(env)
|
31
|
+
welcome env
|
32
|
+
request_phase env
|
33
|
+
end
|
34
|
+
|
35
|
+
def request_phase(env)
|
36
|
+
request_token = consumer.get_request_token @request_params
|
37
|
+
|
38
|
+
talk env, 'Access this URL get the PIN and paste it here.'
|
39
|
+
talk env, request_token.authorize_url(@authorize_params)
|
40
|
+
end
|
41
|
+
|
42
|
+
protected
|
43
|
+
|
44
|
+
def sender_nick
|
45
|
+
'$oauth'
|
46
|
+
end
|
47
|
+
|
48
|
+
def talk(env, text)
|
49
|
+
target = Target.new env, @nick
|
50
|
+
target.privmsg text, sender_nick
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -4,14 +4,18 @@ module Rlyeh
|
|
4
4
|
module DeepOnes
|
5
5
|
class Closer
|
6
6
|
include Rlyeh::Dispatcher
|
7
|
-
|
7
|
+
|
8
8
|
def initialize(app)
|
9
9
|
@app = app
|
10
10
|
end
|
11
11
|
|
12
|
+
def call(env)
|
13
|
+
dispatch env
|
14
|
+
@app.call env if @app
|
15
|
+
end
|
16
|
+
|
12
17
|
on :quit do |env|
|
13
|
-
|
14
|
-
throw :halt
|
18
|
+
throw :quit
|
15
19
|
end
|
16
20
|
end
|
17
21
|
end
|
@@ -1,21 +1,23 @@
|
|
1
|
-
require 'logger'
|
1
|
+
require 'rlyeh/logger'
|
2
2
|
|
3
3
|
module Rlyeh
|
4
4
|
module DeepOnes
|
5
5
|
class Logger
|
6
|
-
|
6
|
+
include Rlyeh::Logger
|
7
|
+
|
8
|
+
def initialize(app, logger = nil, level = :debug)
|
7
9
|
@app = app
|
8
|
-
@logger =
|
9
|
-
@
|
10
|
+
@logger = logger || self
|
11
|
+
@level = level
|
10
12
|
end
|
11
13
|
|
12
14
|
def call(env)
|
13
15
|
write env
|
14
|
-
@app.call env
|
16
|
+
@app.call env if @app
|
15
17
|
end
|
16
18
|
|
17
19
|
def write(env)
|
18
|
-
@logger.
|
20
|
+
@logger.__send__ @level, "Message received: #{env.data}"
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
@@ -1,8 +1,11 @@
|
|
1
1
|
require 'ircp'
|
2
|
+
require 'rlyeh/logger'
|
2
3
|
|
3
4
|
module Rlyeh
|
4
5
|
module DeepOnes
|
5
6
|
class Parser
|
7
|
+
include Rlyeh::Logger
|
8
|
+
|
6
9
|
def initialize(app)
|
7
10
|
@app = app
|
8
11
|
end
|
@@ -11,9 +14,10 @@ module Rlyeh
|
|
11
14
|
begin
|
12
15
|
message = Ircp.parse env.data
|
13
16
|
env.message = message
|
14
|
-
|
17
|
+
env.event = message.command.to_s.downcase
|
18
|
+
@app.call env if @app
|
15
19
|
rescue Ircp::ParseError => e
|
16
|
-
|
20
|
+
debug "#{e.class}: #{e.to_s}"
|
17
21
|
end
|
18
22
|
end
|
19
23
|
end
|
data/lib/rlyeh/dispatcher.rb
CHANGED
@@ -7,45 +7,43 @@ module Rlyeh
|
|
7
7
|
end
|
8
8
|
|
9
9
|
module ClassMethods
|
10
|
-
def callbacks(
|
11
|
-
@dispatchers ||=
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
else
|
17
|
-
key == name
|
10
|
+
def callbacks(target)
|
11
|
+
@dispatchers ||= []
|
12
|
+
callbacks = @dispatchers.select do |item|
|
13
|
+
key = item[0]
|
14
|
+
case key
|
15
|
+
when Regexp then key =~ target
|
16
|
+
else key == target
|
18
17
|
end
|
19
|
-
end.
|
18
|
+
end.map { |item| item[1] }.flatten
|
20
19
|
|
21
20
|
if superclass.respond_to?(:callbacks)
|
22
|
-
superclass.callbacks(
|
21
|
+
superclass.callbacks(target) + callbacks
|
23
22
|
else
|
24
23
|
callbacks
|
25
24
|
end
|
26
25
|
end
|
27
26
|
|
28
|
-
def on(
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
callbacks.uniq!
|
34
|
-
end
|
35
|
-
end
|
27
|
+
def on(*args, &block)
|
28
|
+
options = Rlyeh::Utils.extract_options! args
|
29
|
+
target = args.shift
|
30
|
+
target = Array(options[:scope]) + Array(target) if [String, Symbol].any? { |type| target.is_a?(type) }
|
31
|
+
target = target.join('.') if target.is_a?(Array)
|
36
32
|
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
@dispatchers ||= []
|
34
|
+
@dispatchers << [target, Rlyeh::Utils.generate_method(self, "__on_#{target}", block)]
|
35
|
+
end
|
40
36
|
end
|
41
37
|
|
42
38
|
def dispatch(env)
|
43
|
-
|
44
|
-
|
39
|
+
if env.has_event?
|
40
|
+
target = env.event
|
41
|
+
trigger target, env
|
42
|
+
end
|
45
43
|
end
|
46
44
|
|
47
|
-
def trigger(
|
48
|
-
callbacks = self.class.callbacks
|
45
|
+
def trigger(target, *args, &block)
|
46
|
+
callbacks = self.class.callbacks target
|
49
47
|
callbacks.each do |callback|
|
50
48
|
break if callback.bind(self).call(*args, &block) == false
|
51
49
|
end
|
data/lib/rlyeh/environment.rb
CHANGED
@@ -4,9 +4,10 @@ module Rlyeh
|
|
4
4
|
super || respond_to_missing?(method_id, include_private)
|
5
5
|
end
|
6
6
|
|
7
|
-
def respond_to_missing?(
|
7
|
+
def respond_to_missing?(method_id, include_private)
|
8
8
|
method_name = method_id.to_s
|
9
9
|
return true if method_name =~ /^(.+)=$/
|
10
|
+
return true if method_name =~ /^has_(.+)\?$/
|
10
11
|
return true if self.key? method_name
|
11
12
|
super
|
12
13
|
end
|
@@ -14,8 +15,9 @@ module Rlyeh
|
|
14
15
|
def method_missing(method_id, *args, &block)
|
15
16
|
method_name = method_id.to_s
|
16
17
|
return self[$1] = args.first if method_name =~ /^(.+)=$/
|
18
|
+
return self.has_key? $1 if method_name =~ /^has_(.+)\?$/
|
17
19
|
return self[method_name] if self.key? method_name
|
18
|
-
super
|
20
|
+
super
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
data/lib/rlyeh/logger.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Rlyeh
|
2
|
+
module Logger
|
3
|
+
module_function
|
4
|
+
|
5
|
+
[:debug, :info, :warn, :error, :fatal].each do |level|
|
6
|
+
define_method level do |message|
|
7
|
+
Rlyeh.logger.__send__(level, message) if Rlyeh.logger
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def crash(exception, message = nil)
|
12
|
+
error [message, format_exception(exception)].compact.join("\n")
|
13
|
+
end
|
14
|
+
|
15
|
+
def format_exception(exception)
|
16
|
+
str = "#{exception.class}: #{exception.to_s}\n"
|
17
|
+
str << exception.backtrace.map { |s| " #{s}" }.join("\n")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/rlyeh/sender.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'ircp'
|
2
|
+
require 'rlyeh/numeric_reply'
|
3
|
+
require 'rlyeh/utils'
|
4
|
+
|
5
|
+
module Rlyeh
|
6
|
+
module Sender
|
7
|
+
def send_message(command, *args)
|
8
|
+
options = Rlyeh::Utils.extract_options! args
|
9
|
+
send_data Ircp::Message.new(*args, options.merge(:command => command))
|
10
|
+
end
|
11
|
+
|
12
|
+
def send_numeric_reply(type, target, *args)
|
13
|
+
options = Rlyeh::Utils.extract_options! args
|
14
|
+
numeric = Rlyeh::NumericReply.to_value type
|
15
|
+
send_data Ircp::Message.new(target, *args, options.merge(:command => numeric))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/rlyeh/server.rb
CHANGED
@@ -1,57 +1,51 @@
|
|
1
|
+
require 'celluloid/io'
|
1
2
|
require 'rlyeh/connection'
|
2
|
-
require 'rlyeh/
|
3
|
-
require 'rlyeh/filters'
|
3
|
+
require 'rlyeh/logger'
|
4
4
|
|
5
5
|
module Rlyeh
|
6
6
|
class Server
|
7
|
+
include Celluloid::IO
|
8
|
+
include Rlyeh::Logger
|
9
|
+
|
7
10
|
attr_reader :options, :host, :port
|
8
|
-
attr_reader :app_class, :
|
9
|
-
|
10
|
-
def initialize(
|
11
|
-
@
|
12
|
-
@
|
13
|
-
@
|
14
|
-
@
|
15
|
-
@signature = nil
|
11
|
+
attr_reader :app_class, :sessions, :server
|
12
|
+
|
13
|
+
def initialize(app_class, options = {})
|
14
|
+
@app_class = app_class
|
15
|
+
@options = options.dup
|
16
|
+
@host = @options.delete(:host) { '127.0.0.1' }
|
17
|
+
@port = @options.delete(:port) { 46667 }
|
16
18
|
@sessions = {}
|
17
|
-
|
19
|
+
@server = Celluloid::IO::TCPServer.new @host, @port
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
+
info "Rlyeh has emerged on #{@host}:#{@port}"
|
22
|
+
async.run
|
21
23
|
end
|
22
24
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
bind connection
|
27
|
-
end
|
28
|
-
self
|
25
|
+
def finalize
|
26
|
+
@server.close
|
27
|
+
info 'Rlyeh has sunk...'
|
29
28
|
end
|
30
29
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
30
|
+
def run
|
31
|
+
loop do
|
32
|
+
socket = @server.accept
|
33
|
+
async.handle_connection socket
|
34
|
+
end
|
34
35
|
end
|
35
36
|
|
36
|
-
def
|
37
|
-
|
37
|
+
def handle_connection(socket)
|
38
|
+
connection = Connection.new(self, socket)
|
39
|
+
connection.run
|
40
|
+
rescue Exception => e
|
41
|
+
crash e
|
42
|
+
ensure
|
43
|
+
connection.close rescue nil
|
38
44
|
end
|
39
45
|
|
40
|
-
def
|
41
|
-
|
42
|
-
session = connection.session
|
43
|
-
session.detach connection
|
44
|
-
|
45
|
-
if session.empty?
|
46
|
-
session.close
|
47
|
-
@sessions.delete session.id
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
puts 'unbind'
|
46
|
+
def load_session(session_id)
|
47
|
+
@sessions[session_id] ||= Rlyeh::Session.new(session_id)
|
52
48
|
end
|
53
|
-
|
54
|
-
include Rlyeh::Filters
|
55
|
-
define_filters :start, :stop, :bind, :unbind
|
56
49
|
end
|
57
50
|
end
|
51
|
+
|
data/lib/rlyeh/session.rb
CHANGED
@@ -1,42 +1,41 @@
|
|
1
|
-
require '
|
1
|
+
require 'celluloid'
|
2
|
+
require 'set'
|
3
|
+
require 'forwardable'
|
4
|
+
require 'rlyeh/logger'
|
2
5
|
|
3
6
|
module Rlyeh
|
4
7
|
class Session
|
5
|
-
|
8
|
+
include Celluloid
|
9
|
+
include Rlyeh::Logger
|
10
|
+
extend Forwardable
|
11
|
+
|
12
|
+
attr_reader :id, :connections
|
13
|
+
def_delegators :@connections, :include?, :empty?
|
6
14
|
|
7
15
|
def initialize(id)
|
8
16
|
@id = id
|
9
|
-
@
|
10
|
-
|
17
|
+
@connections = Set.new
|
18
|
+
debug "Session started: #{@id}"
|
11
19
|
end
|
12
20
|
|
13
|
-
def
|
14
|
-
|
15
|
-
|
16
|
-
@connections[connection] = @channel.subscribe do |msg|
|
17
|
-
connection.send_data msg
|
18
|
-
end
|
21
|
+
def close
|
22
|
+
debug "Session closed: #{@id}"
|
19
23
|
end
|
20
24
|
|
21
|
-
def
|
22
|
-
|
23
|
-
@
|
24
|
-
|
25
|
-
connection.detached self
|
25
|
+
def attach(connection)
|
26
|
+
connection.attach self
|
27
|
+
@connections.add connection
|
26
28
|
end
|
27
29
|
|
28
|
-
def
|
30
|
+
def detach(connection)
|
31
|
+
@connections.delete connection
|
32
|
+
connection.detach self
|
29
33
|
end
|
30
34
|
|
31
35
|
def send_data(data)
|
32
|
-
@
|
33
|
-
|
34
|
-
|
35
|
-
def empty?
|
36
|
-
@connections.empty?
|
36
|
+
@connections.each do |connection|
|
37
|
+
connection.send_data data, false
|
38
|
+
end
|
37
39
|
end
|
38
|
-
|
39
|
-
include Rlyeh::Filters
|
40
|
-
define_filters :attach, :detach, :close, :send_data
|
41
40
|
end
|
42
41
|
end
|
data/lib/rlyeh/target.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
module Rlyeh
|
2
|
+
class Target
|
3
|
+
def initialize(env, target)
|
4
|
+
@env = env
|
5
|
+
@target = target
|
6
|
+
end
|
7
|
+
|
8
|
+
def send_message(command, text, prefix)
|
9
|
+
prefix = {:nick => prefix.to_s} unless prefix.is_a?(Hash)
|
10
|
+
unless prefix.key? :servername
|
11
|
+
prefix[:nick] ||= 'rlyeh'
|
12
|
+
prefix[:user] ||= 'rlyeh'
|
13
|
+
prefix[:host] ||= @env.settings.server_name
|
14
|
+
end
|
15
|
+
|
16
|
+
@env.connection.send_message command, @target, ":#{text}", :prefix => prefix
|
17
|
+
end
|
18
|
+
|
19
|
+
def privmsg(text, prefix = nil)
|
20
|
+
send_message 'PRIVMSG', text, prefix
|
21
|
+
end
|
22
|
+
|
23
|
+
def notice(text, prefix = nil)
|
24
|
+
send_message 'NOTICE', text, prefix
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/rlyeh/version.rb
CHANGED
data/lib/rlyeh/worker.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'celluloid'
|
2
|
+
|
3
|
+
module Rlyeh
|
4
|
+
module Worker
|
5
|
+
class ThreadPool
|
6
|
+
include Celluloid
|
7
|
+
|
8
|
+
def invoke(*args, &block)
|
9
|
+
block.call *args if block
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class << self
|
14
|
+
def included(base)
|
15
|
+
base.extend ClassMethods
|
16
|
+
end
|
17
|
+
|
18
|
+
def setup(options = {})
|
19
|
+
@worker_pool = ThreadPool.pool options
|
20
|
+
end
|
21
|
+
|
22
|
+
def worker_pool
|
23
|
+
@worker_pool ||= setup
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module ClassMethods
|
28
|
+
def worker_pool
|
29
|
+
@worker_pool ||= Rlyeh::Worker.worker_pool
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def invoke(*args, &block)
|
34
|
+
self.class.worker_pool.invoke *args, &block
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
data/rlyeh.gemspec
CHANGED
@@ -15,8 +15,8 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = Rlyeh::VERSION
|
17
17
|
|
18
|
+
gem.add_dependency 'celluloid-io'
|
18
19
|
gem.add_dependency 'ircp'
|
19
|
-
gem.add_dependency 'eventmachine'
|
20
20
|
gem.add_development_dependency 'rake'
|
21
21
|
gem.add_development_dependency 'rspec'
|
22
22
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rlyeh::Environment do
|
4
|
+
before do
|
5
|
+
@env = Rlyeh::Environment.new
|
6
|
+
@env.foo = 1
|
7
|
+
@env.bar = 2
|
8
|
+
end
|
9
|
+
subject { @env }
|
10
|
+
|
11
|
+
describe '#respond_to?' do
|
12
|
+
it { should be_respond_to :foo }
|
13
|
+
it { should be_respond_to :bar }
|
14
|
+
it { should_not be_respond_to :buzz }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#method_missing' do
|
18
|
+
context 'fetch' do
|
19
|
+
its(:foo) { should eq 1 }
|
20
|
+
its(:bar) { should eq 2 }
|
21
|
+
it { lambda { subject.buzz }.should raise_error NoMethodError }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'assign' do
|
25
|
+
context 'foo' do
|
26
|
+
before { subject.foo = 'assigned' }
|
27
|
+
its(:foo) { should eq 'assigned' }
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'buzz' do
|
31
|
+
before { subject.buzz = 'assigned' }
|
32
|
+
its(:buzz) { should eq 'assigned' }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'has' do
|
37
|
+
it { should be_has_foo }
|
38
|
+
it { should be_has_bar }
|
39
|
+
it { should_not be_has_buzz }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rlyeh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-09-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement:
|
15
|
+
name: celluloid-io
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement:
|
31
|
+
name: ircp
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '0'
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: rake
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ! '>='
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '0'
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: rspec
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,7 +69,12 @@ dependencies:
|
|
54
69
|
version: '0'
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
58
78
|
description: Welcome to the deep sea
|
59
79
|
email:
|
60
80
|
- mail@mashiro.org
|
@@ -68,14 +88,19 @@ files:
|
|
68
88
|
- LICENSE
|
69
89
|
- README.md
|
70
90
|
- Rakefile
|
91
|
+
- examples/basic.rb
|
71
92
|
- examples/echo.rb
|
72
93
|
- examples/middleware.rb
|
73
|
-
- examples/
|
94
|
+
- examples/oauth.rb
|
74
95
|
- lib/rlyeh.rb
|
75
96
|
- lib/rlyeh/base.rb
|
76
97
|
- lib/rlyeh/connection.rb
|
77
98
|
- lib/rlyeh/deep_ones.rb
|
78
99
|
- lib/rlyeh/deep_ones/auth.rb
|
100
|
+
- lib/rlyeh/deep_ones/auth/base.rb
|
101
|
+
- lib/rlyeh/deep_ones/auth/basic.rb
|
102
|
+
- lib/rlyeh/deep_ones/auth/null.rb
|
103
|
+
- lib/rlyeh/deep_ones/auth/oauth.rb
|
79
104
|
- lib/rlyeh/deep_ones/builder.rb
|
80
105
|
- lib/rlyeh/deep_ones/closer.rb
|
81
106
|
- lib/rlyeh/deep_ones/logger.rb
|
@@ -84,15 +109,18 @@ files:
|
|
84
109
|
- lib/rlyeh/dispatcher.rb
|
85
110
|
- lib/rlyeh/environment.rb
|
86
111
|
- lib/rlyeh/filters.rb
|
112
|
+
- lib/rlyeh/logger.rb
|
87
113
|
- lib/rlyeh/numeric_reply.rb
|
88
|
-
- lib/rlyeh/
|
89
|
-
- lib/rlyeh/sendable.rb
|
114
|
+
- lib/rlyeh/sender.rb
|
90
115
|
- lib/rlyeh/server.rb
|
91
116
|
- lib/rlyeh/session.rb
|
92
117
|
- lib/rlyeh/settings.rb
|
118
|
+
- lib/rlyeh/target.rb
|
93
119
|
- lib/rlyeh/utils.rb
|
94
120
|
- lib/rlyeh/version.rb
|
121
|
+
- lib/rlyeh/worker.rb
|
95
122
|
- rlyeh.gemspec
|
123
|
+
- spec/rlyeh/environment_spec.rb
|
96
124
|
- spec/rlyeh/numeric_reply_spec.rb
|
97
125
|
- spec/rlyeh/server_spec.rb
|
98
126
|
- spec/rlyeh/settings_spec.rb
|
@@ -111,7 +139,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
139
|
version: '0'
|
112
140
|
segments:
|
113
141
|
- 0
|
114
|
-
hash: -
|
142
|
+
hash: -2088290763749664641
|
115
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
144
|
none: false
|
117
145
|
requirements:
|
@@ -120,10 +148,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
148
|
version: '0'
|
121
149
|
segments:
|
122
150
|
- 0
|
123
|
-
hash: -
|
151
|
+
hash: -2088290763749664641
|
124
152
|
requirements: []
|
125
153
|
rubyforge_project:
|
126
|
-
rubygems_version: 1.8.
|
154
|
+
rubygems_version: 1.8.21
|
127
155
|
signing_key:
|
128
156
|
specification_version: 3
|
129
157
|
summary: IRC gateway server framework
|
data/examples/simple.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# -*- coding: utf-8 -*-
|
3
|
-
$LOAD_PATH.unshift 'lib', '../lib'
|
4
|
-
require 'rlyeh'
|
5
|
-
|
6
|
-
class MyApp < Rlyeh::Base
|
7
|
-
use Rlyeh::DeepOnes::Logger, :level => 0
|
8
|
-
use Rlyeh::DeepOnes::Auth do |auth|
|
9
|
-
auth.nick if [auth.nick, auth.pass] == ['dankogai', 'kogaidan']
|
10
|
-
end
|
11
|
-
|
12
|
-
set :server_name, 'MyApp'
|
13
|
-
set :server_version, '1.0.0'
|
14
|
-
|
15
|
-
on :privmsg do |env|
|
16
|
-
puts "RECV: #{env.message}"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
Rlyeh.emerge MyApp, :host => '0.0.0.0'
|
data/lib/rlyeh/runner.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'rlyeh/utils'
|
2
|
-
|
3
|
-
module Rlyeh
|
4
|
-
module Runner
|
5
|
-
def self.included(base)
|
6
|
-
base.extend ClassMethods
|
7
|
-
end
|
8
|
-
|
9
|
-
module ClassMethods
|
10
|
-
def servers
|
11
|
-
@servers ||= []
|
12
|
-
end
|
13
|
-
|
14
|
-
def run(*args, &block)
|
15
|
-
default_options = {:signal_trap => true}.freeze
|
16
|
-
options = default_options.merge(Rlyeh::Utils.extract_options args)
|
17
|
-
signal_trap = options.delete(:signal_trap)
|
18
|
-
|
19
|
-
trap(:INT) { stop } if signal_trap
|
20
|
-
|
21
|
-
starter = proc do
|
22
|
-
server = Server.start *args, &block
|
23
|
-
servers << server
|
24
|
-
end
|
25
|
-
|
26
|
-
if EventMachine.reactor_running?
|
27
|
-
starter.call
|
28
|
-
else
|
29
|
-
EventMachine.run &starter
|
30
|
-
end
|
31
|
-
end
|
32
|
-
alias_method :emerge, :run
|
33
|
-
|
34
|
-
def stop
|
35
|
-
servers.each { |server| server.stop }
|
36
|
-
servers.clear
|
37
|
-
|
38
|
-
EventMachine.stop if EventMachine.reactor_running?
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
data/lib/rlyeh/sendable.rb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
require 'ircp'
|
2
|
-
require 'rlyeh/numeric_reply'
|
3
|
-
|
4
|
-
module Rlyeh
|
5
|
-
module Sendable
|
6
|
-
def send_numeric_reply(numeric, target, *args)
|
7
|
-
numeric = Rlyeh::NumericReply.to_value numeric
|
8
|
-
send_data Ircp::Message.new(target, *args, :command => numeric)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|