on_irc 2.0.0 → 2.0.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/VERSION +1 -1
- data/examples/bot.rb +14 -23
- data/examples/regex_bot.rb +8 -8
- data/examples/relay.rb +16 -17
- data/lib/on_irc.rb +34 -34
- data/lib/on_irc/callback.rb +12 -17
- data/lib/on_irc/config.rb +34 -8
- data/lib/on_irc/connection.rb +13 -39
- data/lib/on_irc/event.rb +1 -1
- data/lib/on_irc/parser.rb +1 -1
- data/lib/on_irc/server.rb +41 -29
- data/on_irc.gemspec +2 -2
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.
|
1
|
+
2.0.1
|
data/examples/bot.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require File.join(File.dirname(__FILE__), '..', 'lib', 'on_irc')
|
3
3
|
|
4
|
-
IRC.
|
4
|
+
bot = IRC.new do
|
5
5
|
nick 'on_irc'
|
6
6
|
ident 'on_irc'
|
7
7
|
realname 'on_irc Ruby IRC library'
|
@@ -9,41 +9,32 @@ IRC.configure do
|
|
9
9
|
server :eighthbit do
|
10
10
|
address 'irc.eighthbit.net'
|
11
11
|
end
|
12
|
-
|
13
|
-
server :freenode do
|
14
|
-
address 'irc.freenode.org'
|
15
|
-
end
|
16
12
|
end
|
17
13
|
|
18
14
|
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
IRC[:eighthbit].on :'001' do |e|
|
24
|
-
IRC.send(e.server, :join, '#offtopic')
|
15
|
+
bot[:eighthbit].on '001' do
|
16
|
+
join '#bots'
|
25
17
|
end
|
26
18
|
|
27
|
-
|
28
|
-
case
|
19
|
+
bot.on :privmsg do
|
20
|
+
case params[1]
|
29
21
|
when '!ping'
|
30
|
-
|
22
|
+
msg(params[0], prefix.split('!').first + ': pong')
|
31
23
|
when /^!echo (.*)/
|
32
|
-
|
33
|
-
IRC.send(e.server, :privmsg, e.params[0], e.prefix.split('!').first + ': ' + s)
|
24
|
+
msg(params[0], prefix.split('!').first + ': ' + $1)
|
34
25
|
when /^!join (.*)/
|
35
|
-
|
26
|
+
join $1
|
36
27
|
end
|
37
28
|
end
|
38
29
|
|
39
|
-
|
40
|
-
|
30
|
+
bot.on :ping do
|
31
|
+
pong params[0]
|
41
32
|
end
|
42
33
|
|
43
|
-
|
44
|
-
|
45
|
-
puts "#{
|
34
|
+
bot.on :all do
|
35
|
+
p = "(#{prefix}) " unless prefix.empty?
|
36
|
+
puts "#{server.name}: #{p}#{command} #{params.inspect}"
|
46
37
|
end
|
47
38
|
|
48
|
-
|
39
|
+
bot.connect
|
49
40
|
|
data/examples/regex_bot.rb
CHANGED
@@ -5,26 +5,26 @@ MAX_BANGS = 3
|
|
5
5
|
CH_USER_MEMORY = {}
|
6
6
|
CHANNEL_MEMORY = {}
|
7
7
|
|
8
|
-
IRC.
|
8
|
+
bot = IRC.new do
|
9
9
|
nick 'reggie'
|
10
10
|
ident 'reggie'
|
11
11
|
realname 'uses on_irc Ruby IRC library'
|
12
|
-
|
12
|
+
|
13
13
|
server :eighthbit do
|
14
14
|
address 'irc.eighthbit.net'
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
# server :freenode do
|
18
18
|
# address 'irc.freenode.org'
|
19
19
|
# end
|
20
20
|
end
|
21
21
|
|
22
|
-
|
22
|
+
bot[:eighthbit].on :'001' do
|
23
23
|
join '#programming'
|
24
24
|
join '#offtopic'
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
bot.on :privmsg do
|
28
28
|
next unless params[0][0,1] == '#' # make sure regex replace only happens in channels
|
29
29
|
channel = params[0]
|
30
30
|
nick = prefix.split('!').first
|
@@ -85,14 +85,14 @@ IRC.on :privmsg do
|
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
-
|
88
|
+
bot.on :ping do
|
89
89
|
pong params[0]
|
90
90
|
end
|
91
91
|
|
92
|
-
|
92
|
+
bot.on :all do
|
93
93
|
prefix_str = "(#{prefix}) " unless prefix.empty?
|
94
94
|
puts "#{server}: #{prefix_str}#{command} #{params.inspect}"
|
95
95
|
end
|
96
96
|
|
97
|
-
|
97
|
+
bot.connect
|
98
98
|
|
data/examples/relay.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require File.join(File.dirname(__FILE__), '..', 'lib', 'on_irc')
|
3
3
|
|
4
|
-
IRC.
|
4
|
+
bot = IRC.new do
|
5
5
|
nick 'on_irc-relay'
|
6
6
|
ident 'on_irc'
|
7
7
|
realname 'on_irc Ruby IRC library - relay example'
|
@@ -16,32 +16,31 @@ IRC.configure do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
bot[:freenode].on '001' do
|
20
|
+
join '#botters'
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
bot[:eighthbit].on '001' do
|
24
|
+
join '#offtopic'
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
case
|
27
|
+
bot.on :privmsg do
|
28
|
+
case params[1]
|
29
29
|
when /^fn> (.*)/
|
30
|
-
|
31
|
-
IRC.send(:freenode, :privmsg, '#botters', "<8b:#{e.prefix.split('!').first}> #{msg}") if e.params[0] == '#offtopic' && e.server == :eighthbit
|
30
|
+
bot[:freenode].send_cmd(:privmsg, '#botters', "<8b:#{prefix.split('!').first}> #{$1}") if params[0] == '#offtopic' && server.name == :eighthbit
|
32
31
|
when /^8b> (.*)/
|
33
|
-
|
34
|
-
IRC.send(:eighthbit, :privmsg, '#offtopic', "<fn:#{e.prefix.split('!').first}> #{msg}") if e.params[0] == '#botters' && e.server == :freenode
|
32
|
+
bot[:eighthbit].send_cmd(:privmsg, '#offtopic', "<fn:#{prefix.split('!').first}> #{$1}") if params[0] == '#botters' && server.name == :freenode
|
35
33
|
end
|
36
34
|
end
|
37
35
|
|
38
|
-
|
39
|
-
|
36
|
+
bot.on :ping do
|
37
|
+
pong params[0]
|
40
38
|
end
|
41
39
|
|
42
|
-
|
43
|
-
|
44
|
-
puts "#{
|
40
|
+
bot.on :all do
|
41
|
+
p = "(#{prefix}) " unless prefix.empty?
|
42
|
+
puts "#{server.name}: #{p}#{command} #{params.inspect}"
|
45
43
|
end
|
46
44
|
|
47
|
-
|
45
|
+
bot.connect
|
46
|
+
|
data/lib/on_irc.rb
CHANGED
@@ -3,45 +3,45 @@
|
|
3
3
|
require File.join(File.dirname(__FILE__), 'on_irc', lib)
|
4
4
|
end
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
config_accessor :nick, :ident, :realname, :servers
|
10
|
-
|
11
|
-
def configure(&block)
|
12
|
-
@config = ConfigDSL.run(&block)
|
13
|
-
@handlers = {}
|
14
|
-
end
|
6
|
+
class IRC
|
7
|
+
attr_accessor :config, :handlers, :servers
|
8
|
+
config_accessor :nick, :ident, :realname
|
15
9
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
servers[server_id]
|
22
|
-
end
|
23
|
-
|
24
|
-
def send(server, cmd, *args)
|
25
|
-
cmd = cmd.to_s.upcase
|
26
|
-
args[-1] = ':' + args[-1]
|
27
|
-
IRC[server].connection.command(cmd, *args)
|
10
|
+
def initialize(&block)
|
11
|
+
@config = ConfigDSL.run(&block)
|
12
|
+
@servers = {}
|
13
|
+
@config.servers.each do |server_id, server_conf|
|
14
|
+
@servers[server_id] = Server.new(self, server_id, server_conf)
|
28
15
|
end
|
16
|
+
@handlers = {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def on(event, &block)
|
20
|
+
@handlers[event.to_s.downcase.to_sym] = Callback.new(block)
|
21
|
+
end
|
29
22
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
23
|
+
def [](server_id)
|
24
|
+
servers[server_id]
|
25
|
+
end
|
26
|
+
|
27
|
+
def send_cmd(server_id, cmd, *args)
|
28
|
+
servers[server_id].send_cmd(cmd, *args)
|
29
|
+
end
|
30
|
+
|
31
|
+
def connect
|
32
|
+
EventMachine.run do
|
33
|
+
servers.values.each do |server|
|
34
|
+
server.connection = EM.connect(server.address, server.port, Connection, server)
|
35
35
|
end
|
36
36
|
end
|
37
|
-
|
38
|
-
# for ssl
|
39
|
-
# require 'openssl'
|
40
|
-
# ssl_context = OpenSSL::SSL::SSLContext.new
|
41
|
-
# ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
42
|
-
# @socket = OpenSSL::SSL::SSLSocket.new(socket, ssl_context)
|
43
|
-
# @socket.sync = true
|
44
|
-
# @socket.connect
|
45
37
|
end
|
38
|
+
|
39
|
+
# for ssl
|
40
|
+
# require 'openssl'
|
41
|
+
# ssl_context = OpenSSL::SSL::SSLContext.new
|
42
|
+
# ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
43
|
+
# @socket = OpenSSL::SSL::SSLSocket.new(socket, ssl_context)
|
44
|
+
# @socket.sync = true
|
45
|
+
# @socket.connect
|
46
46
|
end
|
47
47
|
|
data/lib/on_irc/callback.rb
CHANGED
@@ -1,21 +1,22 @@
|
|
1
|
-
|
1
|
+
class IRC
|
2
2
|
class Callback
|
3
3
|
def initialize(block)
|
4
4
|
@block = block
|
5
5
|
end
|
6
6
|
|
7
|
-
def call(event)
|
8
|
-
CallbackDSL.run(event, @block)
|
7
|
+
def call(irc, event)
|
8
|
+
CallbackDSL.run(irc, event, @block)
|
9
9
|
end
|
10
10
|
|
11
11
|
class CallbackDSL
|
12
|
-
def self.run(event, block)
|
13
|
-
callbackdsl = self.new(event)
|
12
|
+
def self.run(irc, event, block)
|
13
|
+
callbackdsl = self.new(irc, event)
|
14
14
|
block.arity < 1 ? callbackdsl.instance_eval(&block) : block.call(callbackdsl)
|
15
15
|
end
|
16
16
|
|
17
|
-
def initialize(event)
|
17
|
+
def initialize(irc, event)
|
18
18
|
@event = event
|
19
|
+
@irc = irc
|
19
20
|
end
|
20
21
|
|
21
22
|
# @event accessors
|
@@ -36,28 +37,22 @@ module IRC
|
|
36
37
|
end
|
37
38
|
|
38
39
|
# commands
|
39
|
-
def
|
40
|
-
|
41
|
-
IRC.send(@event.server, *args) # now we don't have to do send(e.server, ...) all the time
|
42
|
-
else
|
43
|
-
IRC.send(*args)
|
44
|
-
end
|
40
|
+
def send_cmd(cmd, *args)
|
41
|
+
@event.server.send_cmd(cmd, *args)
|
45
42
|
end
|
46
43
|
|
47
|
-
alias raw send
|
48
|
-
|
49
44
|
def privmsg(target, message)
|
50
|
-
|
45
|
+
send_cmd(:privmsg, target, message)
|
51
46
|
end
|
52
47
|
|
53
48
|
alias msg privmsg
|
54
49
|
|
55
50
|
def join(channel)
|
56
|
-
|
51
|
+
send_cmd(:join, channel)
|
57
52
|
end
|
58
53
|
|
59
54
|
def pong(msg)
|
60
|
-
|
55
|
+
send_cmd(:pong, msg)
|
61
56
|
end
|
62
57
|
|
63
58
|
end
|
data/lib/on_irc/config.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
class IRC
|
2
2
|
class ConfigError < StandardError; end
|
3
3
|
|
4
4
|
Config = Struct.new(:nick, :ident, :realname, :servers)
|
@@ -6,29 +6,55 @@ module IRC
|
|
6
6
|
class ConfigDSL
|
7
7
|
dsl_accessor :nick, :ident, :realname
|
8
8
|
attr_accessor :servers
|
9
|
-
|
9
|
+
|
10
10
|
def self.run(&block)
|
11
11
|
confdsl = self.new
|
12
12
|
block.arity < 1 ? confdsl.instance_eval(&block) : block.call(confdsl)
|
13
|
-
|
13
|
+
|
14
14
|
raise ConfigError, 'no nick' unless confdsl.nick
|
15
15
|
raise ConfigError, 'no servers' unless confdsl.servers
|
16
|
-
|
16
|
+
|
17
17
|
conf = Config.new
|
18
|
-
|
18
|
+
|
19
19
|
conf.nick = confdsl.nick
|
20
20
|
conf.ident = confdsl.ident || confdsl.nick
|
21
21
|
conf.realname = confdsl.realname || confdsl.nick
|
22
22
|
conf.servers = confdsl.servers
|
23
|
-
|
23
|
+
|
24
24
|
conf
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def server(id, &block)
|
28
28
|
@servers ||= {}
|
29
|
-
@servers[id] =
|
29
|
+
@servers[id] = ServerConfigDSL.run(&block)
|
30
30
|
@servers[id]
|
31
31
|
end
|
32
32
|
end
|
33
|
+
|
34
|
+
ServerConfig = Struct.new(:address, :port, :nick, :ident, :realname, :ssl)
|
35
|
+
|
36
|
+
class ServerConfigDSL
|
37
|
+
dsl_accessor :address, :port, :nick, :ident, :realname
|
38
|
+
bool_dsl_accessor :ssl
|
39
|
+
|
40
|
+
def self.run(&block)
|
41
|
+
confdsl = self.new
|
42
|
+
block.arity < 1 ? confdsl.instance_eval(&block) : block.call(confdsl)
|
43
|
+
|
44
|
+
raise ConfigError, 'no address' unless confdsl.address
|
45
|
+
|
46
|
+
conf = ServerConfig.new
|
47
|
+
|
48
|
+
conf.address = confdsl.address
|
49
|
+
# If not supplied, the port defaults to 6667, or 6697 if ssl is used
|
50
|
+
conf.port = confdsl.port || (confdsl.ssl? ? 6697 : 6667)
|
51
|
+
conf.ssl = confdsl.ssl?
|
52
|
+
conf.nick = confdsl.nick
|
53
|
+
conf.ident = confdsl.ident
|
54
|
+
conf.realname = confdsl.realname
|
55
|
+
|
56
|
+
conf
|
57
|
+
end
|
58
|
+
end
|
33
59
|
end
|
34
60
|
|
data/lib/on_irc/connection.rb
CHANGED
@@ -1,51 +1,25 @@
|
|
1
|
-
|
1
|
+
class IRC
|
2
2
|
class Connection < EventMachine::Connection
|
3
3
|
include EventMachine::Protocols::LineText2
|
4
|
-
|
5
|
-
def initialize(
|
6
|
-
@server =
|
7
|
-
end
|
8
|
-
|
9
|
-
def config
|
10
|
-
IRC[@server].config
|
11
|
-
end
|
12
|
-
|
13
|
-
def command(*cmd)
|
14
|
-
send_data(cmd.join(' ') + "\r\n")
|
15
|
-
end
|
16
|
-
|
17
|
-
def handle_event(event)
|
18
|
-
if IRC[@server].handlers[:all]
|
19
|
-
IRC[@server].handlers[:all].call(event)
|
20
|
-
elsif IRC.handlers[:all]
|
21
|
-
IRC.handlers[:all].call(event)
|
22
|
-
end
|
23
|
-
|
24
|
-
if IRC[@server].handlers[event.command]
|
25
|
-
IRC[@server].handlers[event.command].call(event)
|
26
|
-
elsif IRC.handlers[event.command]
|
27
|
-
IRC.handlers[event.command].call(event)
|
28
|
-
end
|
4
|
+
|
5
|
+
def initialize(server)
|
6
|
+
@server = server
|
29
7
|
end
|
30
|
-
|
8
|
+
|
31
9
|
## EventMachine callbacks
|
32
10
|
def post_init
|
33
|
-
|
34
|
-
|
11
|
+
send_data("USER #{@server.ident || @server.irc.ident} * * #{@server.realname || @server.irc.realname}\r\n")
|
12
|
+
send_data("NICK #{@server.nick || @server.irc.nick}\r\n")
|
13
|
+
rescue => e
|
14
|
+
p e
|
35
15
|
end
|
36
|
-
|
16
|
+
|
37
17
|
def receive_line(line)
|
38
|
-
|
39
|
-
event = Event.new(@server, parsed_line[:prefix], parsed_line[:command].downcase.to_sym, parsed_line[:params])
|
40
|
-
|
41
|
-
handle_event(event)
|
18
|
+
@server.receive_line(line)
|
42
19
|
end
|
43
|
-
|
20
|
+
|
44
21
|
def unbind
|
45
|
-
|
46
|
-
reconnect(config.address, config.port)
|
47
|
-
post_init
|
48
|
-
end
|
22
|
+
@server.unbind
|
49
23
|
end
|
50
24
|
end
|
51
25
|
end
|
data/lib/on_irc/event.rb
CHANGED
data/lib/on_irc/parser.rb
CHANGED
data/lib/on_irc/server.rb
CHANGED
@@ -1,40 +1,52 @@
|
|
1
|
-
|
1
|
+
class IRC
|
2
2
|
class Server
|
3
|
-
attr_accessor :config, :connection, :handlers
|
3
|
+
attr_accessor :config, :connection, :handlers, :name, :irc
|
4
4
|
config_accessor :address, :port, :nick, :ident, :realname, :ssl
|
5
|
-
|
6
|
-
def initialize(config)
|
5
|
+
|
6
|
+
def initialize(irc, name, config)
|
7
|
+
@irc = irc
|
8
|
+
@name = name
|
7
9
|
@config = config
|
8
10
|
@handlers = {}
|
9
11
|
end
|
10
|
-
|
12
|
+
|
13
|
+
def send_cmd(cmd, *args)
|
14
|
+
# prepend last arg with : only if it exists. it's really ugly
|
15
|
+
args[-1] = ":#{args[-1]}" if args[-1]
|
16
|
+
connection.send_data(cmd.to_s.upcase + ' ' + args.join(' ') + "\r\n")
|
17
|
+
end
|
18
|
+
|
11
19
|
def on(event, &block)
|
12
20
|
@handlers[event.to_s.downcase.to_sym] = Callback.new(block)
|
13
21
|
end
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
22
|
+
|
23
|
+
def handle_event(event)
|
24
|
+
if @handlers[:all]
|
25
|
+
@handlers[:all].call(@irc, event)
|
26
|
+
elsif @irc.handlers[:all]
|
27
|
+
@irc.handlers[:all].call(@irc, event)
|
28
|
+
end
|
29
|
+
|
30
|
+
if @handlers[event.command]
|
31
|
+
@handlers[event.command].call(@irc, event)
|
32
|
+
elsif @irc.handlers[event.command]
|
33
|
+
@irc.handlers[event.command].call(@irc, event)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Eventmachine callbacks
|
38
|
+
def receive_line(line)
|
39
|
+
parsed_line = Parser.parse(line)
|
40
|
+
event = Event.new(self, parsed_line[:prefix],
|
41
|
+
parsed_line[:command].downcase.to_sym,
|
42
|
+
parsed_line[:params])
|
43
|
+
handle_event(event)
|
44
|
+
end
|
45
|
+
|
46
|
+
def unbind
|
47
|
+
EM.add_timer(3) do
|
48
|
+
connection.reconnect(config.address, config.port)
|
49
|
+
connection.post_init
|
38
50
|
end
|
39
51
|
end
|
40
52
|
end
|
data/on_irc.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{on_irc}
|
8
|
-
s.version = "2.0.
|
8
|
+
s.version = "2.0.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Scott Olson"]
|
12
|
-
s.date = %q{2009-12-
|
12
|
+
s.date = %q{2009-12-27}
|
13
13
|
s.description = %q{An event driven IRC library with an easy to use DSL}
|
14
14
|
s.email = %q{scott@scott-olson.org}
|
15
15
|
s.extra_rdoc_files = [
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: on_irc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Olson
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-12-
|
12
|
+
date: 2009-12-27 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|