Ruby-IRC 1.0.3 → 1.0.6
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/README +23 -18
- data/lib/#IRCEvent.rb# +89 -0
- data/lib/IRC.rb +24 -8
- data/lib/IRC.rb.~1.4.~ +138 -0
- data/lib/IRCChannel.rb +9 -0
- data/lib/IRCConnection.rb +25 -7
- data/lib/IRCConnection.rb.~1.2.~ +59 -0
- data/lib/IRCEvent.rb +17 -268
- data/lib/IRCEvent.rb.~1.5.~ +89 -0
- data/lib/IRCUser.rb +4 -1
- data/lib/IRCUtil.rb +49 -0
- data/lib/eventmap.yml +247 -0
- metadata +8 -2
data/README
CHANGED
@@ -1,18 +1,23 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
#
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
1
|
+
= Ruby-IRC
|
2
|
+
|
3
|
+
Framework for IRC clients
|
4
|
+
|
5
|
+
== What is it?
|
6
|
+
|
7
|
+
Ruby-IRC is a simple framework for creating clients for IRC. It will
|
8
|
+
monitor multiple IO sockets for data. Allows user defined handlers
|
9
|
+
for IRC events.
|
10
|
+
|
11
|
+
== A simple usage example
|
12
|
+
|
13
|
+
bot = IRC.new("Nickname", "server.example.com", "6667", "Realname")
|
14
|
+
IRCEvent.add_callback('endofmotd') { |event| bot.add_channel('#eris') }
|
15
|
+
IRCEvent.add_callback('join') { |event|
|
16
|
+
bot.send_message(event.channel, "Hello #{event.from}")
|
17
|
+
}
|
18
|
+
bot.connect
|
19
|
+
|
20
|
+
== Author
|
21
|
+
Chris Boyer
|
22
|
+
|
23
|
+
email: cboyer@musiciansfriend.com
|
data/lib/#IRCEvent.rb#
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
# This is a lookup class for IRC event name mapping
|
4
|
+
class EventLookup
|
5
|
+
@@lookup = YAML.load_file("#{File.dirname(__FILE__)}/eventmap.yml")
|
6
|
+
|
7
|
+
# returns the event name, given a number
|
8
|
+
def EventLookup::find_by_number(num)
|
9
|
+
return @@lookup[num.to_i]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
# Handles an IRC generated event.
|
15
|
+
# Handlers are for the IRC framework to use
|
16
|
+
# Callbacks are for users to add.
|
17
|
+
# Both handlers and callbacks can be called for the same event.
|
18
|
+
class IRCEvent
|
19
|
+
@@handlers = { 'ping' => lambda {|event| IRCConnection.send_to_server("PONG #{event.message}") } }
|
20
|
+
@@callbacks = Hash.new()
|
21
|
+
attr_reader :hostmask, :message, :event_type, :from, :channel, :target, :mode, :stats
|
22
|
+
def initialize (line)
|
23
|
+
line.sub!(/^:/, '')
|
24
|
+
mess_parts = line.split(':', 2);
|
25
|
+
# mess_parts[0] is server info
|
26
|
+
# mess_parts[1] is the message that was sent
|
27
|
+
@message = mess_parts[1]
|
28
|
+
@stats = mess_parts[0].scan(/[-\w.\#\@]+/)
|
29
|
+
puts "Event: #{line}"
|
30
|
+
if @stats[0].match(/^PING/)
|
31
|
+
@event_type = 'ping'
|
32
|
+
elsif @stats[1] && @stats[1].match(/^\d+/)
|
33
|
+
@event_type = EventLookup::find_by_number(@stats[1]);
|
34
|
+
@channel = @stats[3]
|
35
|
+
else
|
36
|
+
@event_type = @stats[2].downcase if @stats[2]
|
37
|
+
end
|
38
|
+
|
39
|
+
if @event_type != 'ping'
|
40
|
+
@from = @stats[0]
|
41
|
+
@user = IRCUser.create_user(@from)
|
42
|
+
end
|
43
|
+
@hostmask = @stats[1] if %W(privmsg join).include? @event_type
|
44
|
+
@channel = @stats[3] if @stats[3] && !@channel
|
45
|
+
@target = @stats[5] if @stats[5]
|
46
|
+
@mode = @stats[4] if @stats[4]
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
# Unfortunatly, not all messages are created equal. This is our
|
51
|
+
# special exceptions section
|
52
|
+
if @event_type == 'join'
|
53
|
+
@channel = @message
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
# Adds a callback for the specified irc message.
|
59
|
+
def IRCEvent.add_callback(message_id, &callback)
|
60
|
+
@@callbacks[message_id] = callback
|
61
|
+
end
|
62
|
+
|
63
|
+
# Adds a handler to the handler function hash.
|
64
|
+
def IRCEvent.add_handler(message_id, proc=nil, &handler)
|
65
|
+
if block_given?
|
66
|
+
@@handlers[message_id] = handler
|
67
|
+
elsif proc
|
68
|
+
@@handlers[message_id] = proc
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Process this event, preforming which ever handler and callback is specified
|
73
|
+
# for this event.
|
74
|
+
def process
|
75
|
+
handled = nil
|
76
|
+
if @@handlers[@event_type]
|
77
|
+
@@handlers[@event_type].call(self)
|
78
|
+
handled = 1
|
79
|
+
end
|
80
|
+
if @@callbacks[@event_type]
|
81
|
+
@@callbacks[@event_type].call(self)
|
82
|
+
handled = 1
|
83
|
+
end
|
84
|
+
if !handled
|
85
|
+
puts "No handler for event type #@event_type in #{self.class}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
data/lib/IRC.rb
CHANGED
@@ -4,12 +4,12 @@ require 'IRCConnection'
|
|
4
4
|
require 'IRCEvent'
|
5
5
|
require 'IRCChannel'
|
6
6
|
require 'IRCUser'
|
7
|
+
require 'IRCUtil'
|
7
8
|
|
8
9
|
|
9
10
|
|
10
11
|
# Class IRC is a master class that handles connection to the irc
|
11
12
|
# server and pasring of IRC events, through the IRCEvent class.
|
12
|
-
|
13
13
|
class IRC
|
14
14
|
@channels = nil
|
15
15
|
# Create a new IRC Object instance
|
@@ -39,81 +39,97 @@ class IRC
|
|
39
39
|
|
40
40
|
|
41
41
|
end
|
42
|
+
|
42
43
|
attr_reader :nick, :server, :port
|
44
|
+
|
43
45
|
# Join a channel, adding it to the list of joined channels
|
44
46
|
def add_channel channel
|
45
47
|
join(channel)
|
46
48
|
self
|
47
49
|
end
|
50
|
+
|
48
51
|
# Returns a list of channels joined
|
49
52
|
def channels
|
50
53
|
@channels
|
51
54
|
end
|
55
|
+
|
52
56
|
# Alias for IRC.connect
|
53
57
|
def start
|
54
58
|
self.connect
|
55
59
|
end
|
60
|
+
|
56
61
|
# Open a connection to the server using the IRC Connect
|
57
62
|
# method. Events yielded from the IRCConnection handler are
|
58
63
|
# processed and then control is returned to IRCConnection
|
59
64
|
def connect
|
60
|
-
IRCConnection.handle_connection(@server, @port) do
|
61
|
-
|
62
|
-
IRCConnection.send_to_server "USER #{@nick} 8 * :#{@realname}"
|
65
|
+
IRCConnection.handle_connection(@server, @port, @nick, @realname) do
|
66
|
+
# Log in information moved to IRCConnection
|
63
67
|
IRCConnection.main do |event|
|
64
68
|
event.process
|
65
69
|
end
|
66
70
|
end
|
67
71
|
end
|
72
|
+
|
68
73
|
# Joins a channel on a server.
|
69
74
|
def join(channel)
|
70
75
|
if (IRCConnection.send_to_server("JOIN #{channel}"))
|
71
76
|
@channels.push(IRCChannel.new(channel));
|
72
77
|
end
|
73
78
|
end
|
79
|
+
|
74
80
|
# Leaves a channel on a server
|
75
81
|
def part(channel)
|
76
82
|
if (IRCConnection.send_to_server("PART #{channel}"))
|
77
83
|
@channels.delete_if {|chan| chan.name == channel }
|
78
84
|
end
|
79
85
|
end
|
86
|
+
|
80
87
|
# Sends a private message, or channel message
|
81
88
|
def send_message(to, message)
|
82
|
-
IRCConnection.send_to_server("privmsg #{to}
|
89
|
+
IRCConnection.send_to_server("privmsg #{to} :#{message}");
|
83
90
|
end
|
91
|
+
|
84
92
|
# Sends a notice
|
85
93
|
def send_notice(to, message)
|
86
|
-
IRCConnection.send_to_server("NOTICE #{to}
|
94
|
+
IRCConnection.send_to_server("NOTICE #{to} :#{message}");
|
87
95
|
end
|
88
|
-
|
96
|
+
|
97
|
+
# performs an action
|
89
98
|
def send_action(to, action)
|
90
99
|
send_ctcp(to, 'ACTION', action);
|
91
100
|
end
|
92
|
-
|
101
|
+
|
102
|
+
# send CTCP
|
93
103
|
def send_ctcp(to, type, message)
|
94
104
|
IRCConnection.send_to_server("privmsg #{to} :\001#{type} #{message}");
|
95
105
|
end
|
106
|
+
|
96
107
|
# Quits the IRC Server
|
97
108
|
def send_quit
|
98
109
|
IRCConnection.send_to_server("QUIT : Quit ordered by user")
|
99
110
|
end
|
111
|
+
|
100
112
|
# Ops selected user.
|
101
113
|
def op(channel, user)
|
102
114
|
IRCConnection.send_to_server("MODE #{channel} +o #{user}")
|
103
115
|
end
|
116
|
+
|
104
117
|
# Changes the current nickname
|
105
118
|
def ch_nick(nick)
|
106
119
|
IRCConnection.send_to_server("NICK #{nick}")
|
107
120
|
@nick = nick
|
108
121
|
end
|
122
|
+
|
109
123
|
# Removes operator status from a user
|
110
124
|
def deop(channel, user)
|
111
125
|
IRCConnection.send_to_server("MODE #{channel} -o #{user}")
|
112
126
|
end
|
127
|
+
|
113
128
|
# Changes target users mode
|
114
129
|
def mode(channel, user, mode)
|
115
130
|
IRCConnection.send_to_server("MODE #{channel} #{mode} #{user}")
|
116
131
|
end
|
132
|
+
|
117
133
|
# Retrievs user information from the server
|
118
134
|
def get_user_info(user)
|
119
135
|
IRCConnection.send_to_server("WHO #{user}")
|
data/lib/IRC.rb.~1.4.~
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
|
2
|
+
require 'socket'
|
3
|
+
require 'IRCConnection'
|
4
|
+
require 'IRCEvent'
|
5
|
+
require 'IRCChannel'
|
6
|
+
require 'IRCUser'
|
7
|
+
require 'IRCUtil'
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
# Class IRC is a master class that handles connection to the irc
|
12
|
+
# server and pasring of IRC events, through the IRCEvent class.
|
13
|
+
class IRC
|
14
|
+
@channels = nil
|
15
|
+
# Create a new IRC Object instance
|
16
|
+
def initialize( nick, server, port, realname='RBot')
|
17
|
+
@nick = nick
|
18
|
+
@server = server
|
19
|
+
@port = port
|
20
|
+
@realname = realname
|
21
|
+
@channels = Array.new(0)
|
22
|
+
# Some good default Event handlers. These can and will be overridden by users.
|
23
|
+
# Thses make changes on the IRCbot object. So they need to be here.
|
24
|
+
|
25
|
+
# Topic events can come on two tags, so we create on proc to handle them.
|
26
|
+
|
27
|
+
topic_proc = Proc.new { |event|
|
28
|
+
self.channels.each { |chan|
|
29
|
+
puts "Examine channel #{chan.name} for #{event.channel}"
|
30
|
+
if chan == event.channel
|
31
|
+
puts "Setting topic: #{event.message}"
|
32
|
+
chan.topic = event.message
|
33
|
+
end
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
IRCEvent.add_handler('332', topic_proc)
|
38
|
+
IRCEvent.add_handler('topic', topic_proc)
|
39
|
+
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
attr_reader :nick, :server, :port
|
44
|
+
|
45
|
+
# Join a channel, adding it to the list of joined channels
|
46
|
+
def add_channel channel
|
47
|
+
join(channel)
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns a list of channels joined
|
52
|
+
def channels
|
53
|
+
@channels
|
54
|
+
end
|
55
|
+
|
56
|
+
# Alias for IRC.connect
|
57
|
+
def start
|
58
|
+
self.connect
|
59
|
+
end
|
60
|
+
|
61
|
+
# Open a connection to the server using the IRC Connect
|
62
|
+
# method. Events yielded from the IRCConnection handler are
|
63
|
+
# processed and then control is returned to IRCConnection
|
64
|
+
def connect
|
65
|
+
IRCConnection.handle_connection(@server, @port) do
|
66
|
+
IRCConnection.send_to_server "NICK #{@nick}"
|
67
|
+
IRCConnection.send_to_server "USER #{@nick} 8 * :#{@realname}"
|
68
|
+
IRCConnection.main do |event|
|
69
|
+
event.process
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Joins a channel on a server.
|
75
|
+
def join(channel)
|
76
|
+
if (IRCConnection.send_to_server("JOIN #{channel}"))
|
77
|
+
@channels.push(IRCChannel.new(channel));
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Leaves a channel on a server
|
82
|
+
def part(channel)
|
83
|
+
if (IRCConnection.send_to_server("PART #{channel}"))
|
84
|
+
@channels.delete_if {|chan| chan.name == channel }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Sends a private message, or channel message
|
89
|
+
def send_message(to, message)
|
90
|
+
IRCConnection.send_to_server("privmsg #{to} :#{message}");
|
91
|
+
end
|
92
|
+
|
93
|
+
# Sends a notice
|
94
|
+
def send_notice(to, message)
|
95
|
+
IRCConnection.send_to_server("NOTICE #{to} :#{message}");
|
96
|
+
end
|
97
|
+
|
98
|
+
# performs an action
|
99
|
+
def send_action(to, action)
|
100
|
+
send_ctcp(to, 'ACTION', action);
|
101
|
+
end
|
102
|
+
|
103
|
+
# send CTCP
|
104
|
+
def send_ctcp(to, type, message)
|
105
|
+
IRCConnection.send_to_server("privmsg #{to} :\001#{type} #{message}");
|
106
|
+
end
|
107
|
+
|
108
|
+
# Quits the IRC Server
|
109
|
+
def send_quit
|
110
|
+
IRCConnection.send_to_server("QUIT : Quit ordered by user")
|
111
|
+
end
|
112
|
+
|
113
|
+
# Ops selected user.
|
114
|
+
def op(channel, user)
|
115
|
+
IRCConnection.send_to_server("MODE #{channel} +o #{user}")
|
116
|
+
end
|
117
|
+
|
118
|
+
# Changes the current nickname
|
119
|
+
def ch_nick(nick)
|
120
|
+
IRCConnection.send_to_server("NICK #{nick}")
|
121
|
+
@nick = nick
|
122
|
+
end
|
123
|
+
|
124
|
+
# Removes operator status from a user
|
125
|
+
def deop(channel, user)
|
126
|
+
IRCConnection.send_to_server("MODE #{channel} -o #{user}")
|
127
|
+
end
|
128
|
+
|
129
|
+
# Changes target users mode
|
130
|
+
def mode(channel, user, mode)
|
131
|
+
IRCConnection.send_to_server("MODE #{channel} #{mode} #{user}")
|
132
|
+
end
|
133
|
+
|
134
|
+
# Retrievs user information from the server
|
135
|
+
def get_user_info(user)
|
136
|
+
IRCConnection.send_to_server("WHO #{user}")
|
137
|
+
end
|
138
|
+
end
|
data/lib/IRCChannel.rb
CHANGED
@@ -1,23 +1,32 @@
|
|
1
1
|
require "IRCUser"
|
2
2
|
|
3
|
+
# Represents an IRC Channel
|
3
4
|
class IRCChannel
|
4
5
|
def initialize(name)
|
5
6
|
@name = name
|
6
7
|
@users = Array.new(0)
|
7
8
|
end
|
8
9
|
attr_reader :name
|
10
|
+
|
11
|
+
# set the topic on this channel
|
9
12
|
def topic=(topic)
|
10
13
|
@topic = topic
|
11
14
|
end
|
15
|
+
|
16
|
+
# get the topic on this channel
|
12
17
|
def topic
|
13
18
|
if @topic
|
14
19
|
return @topic
|
15
20
|
end
|
16
21
|
return "No Topic set"
|
17
22
|
end
|
23
|
+
|
24
|
+
# add a user to this channel's userlist
|
18
25
|
def add_user(username)
|
19
26
|
@users.push(IRCUser.create_user(username))
|
20
27
|
end
|
28
|
+
|
29
|
+
# returns the current user list for this channel
|
21
30
|
def users
|
22
31
|
@users
|
23
32
|
end
|
data/lib/IRCConnection.rb
CHANGED
@@ -5,18 +5,32 @@ class IRCConnection
|
|
5
5
|
@@readsockets = Array.new(0)
|
6
6
|
@@events = Hash.new()
|
7
7
|
# Creates a socket connection and then yields.
|
8
|
-
def IRCConnection.handle_connection(server, port)
|
9
|
-
|
10
|
-
|
8
|
+
def IRCConnection.handle_connection(server, port, nick='ChangeMe', realname='MeToo' )
|
9
|
+
socket = create_tcp_socket(server, port)
|
10
|
+
add_IO_socket(socket) {|sock| IRCEvent.new(sock.readline.chomp) }
|
11
|
+
send_to_server "NICK #{nick}"
|
12
|
+
send_to_server "USER #{nick} 8 * :#{realname}"
|
13
|
+
if block_given?
|
14
|
+
yield
|
15
|
+
@@socket.close
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def IRCConnection.create_tcp_socket(server, port)
|
11
20
|
@@socket = TCPsocket.open(server, port)
|
12
|
-
|
13
|
-
|
14
|
-
|
21
|
+
if block_given?
|
22
|
+
yield
|
23
|
+
@@socket.close
|
24
|
+
return
|
25
|
+
end
|
26
|
+
return @@socket
|
15
27
|
end
|
28
|
+
|
16
29
|
# Sends a line of text to the server
|
17
30
|
def IRCConnection.send_to_server(line)
|
18
31
|
@@socket.write(line + "\n")
|
19
32
|
end
|
33
|
+
|
20
34
|
# This loop monitors all IO_Sockets IRCConnection controls
|
21
35
|
# (including the IRC socket) and yields events to the IO_Sockets
|
22
36
|
# event handler.
|
@@ -27,6 +41,7 @@ class IRCConnection
|
|
27
41
|
}
|
28
42
|
end
|
29
43
|
end
|
44
|
+
|
30
45
|
# Makes one single loop pass, checking all sockets for data to read,
|
31
46
|
# and yields the data to the sockets event handler.
|
32
47
|
def IRCConnection.do_one_loop
|
@@ -35,16 +50,19 @@ class IRCConnection
|
|
35
50
|
yield @@events[sock.to_i].call(sock)
|
36
51
|
}
|
37
52
|
end
|
53
|
+
|
38
54
|
# Ends connection to the irc server
|
39
55
|
def IRCConnection.quit
|
40
56
|
@@quit = 1
|
41
57
|
end
|
58
|
+
|
42
59
|
# Retrieves user info from the server
|
43
60
|
def IRCConnection.get_user_info(user)
|
44
61
|
IRCConnection.send_to_server("WHOIS #{user}")
|
45
62
|
end
|
63
|
+
|
64
|
+
# Adds a new socket to the list of sockets to monitor for new data.
|
46
65
|
def IRCConnection.add_IO_socket(socket, &event_generator)
|
47
|
-
# Adds a new socket to the list of sockets to monitor for new data.
|
48
66
|
@@readsockets.push(socket)
|
49
67
|
@@events[socket.to_i] = event_generator
|
50
68
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
|
2
|
+
# Handles connection to IRC Server
|
3
|
+
class IRCConnection
|
4
|
+
@@quit = 0
|
5
|
+
@@readsockets = Array.new(0)
|
6
|
+
@@events = Hash.new()
|
7
|
+
# Creates a socket connection and then yields.
|
8
|
+
def IRCConnection.handle_connection(server, port)
|
9
|
+
@@server = server
|
10
|
+
@@port = port
|
11
|
+
@@socket = TCPsocket.open(server, port)
|
12
|
+
add_IO_socket(@@socket) {|sock| IRCEvent.new(sock.readline.chomp) }
|
13
|
+
yield
|
14
|
+
@@socket.close
|
15
|
+
end
|
16
|
+
|
17
|
+
# Sends a line of text to the server
|
18
|
+
def IRCConnection.send_to_server(line)
|
19
|
+
@@socket.write(line + "\n")
|
20
|
+
end
|
21
|
+
|
22
|
+
# This loop monitors all IO_Sockets IRCConnection controls
|
23
|
+
# (including the IRC socket) and yields events to the IO_Sockets
|
24
|
+
# event handler.
|
25
|
+
def IRCConnection.main
|
26
|
+
while(@@quit == 0)
|
27
|
+
do_one_loop { |event|
|
28
|
+
yield event
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Makes one single loop pass, checking all sockets for data to read,
|
34
|
+
# and yields the data to the sockets event handler.
|
35
|
+
def IRCConnection.do_one_loop
|
36
|
+
read_sockets = select(@@readsockets, nil, nil, nil);
|
37
|
+
read_sockets[0].each {|sock|
|
38
|
+
yield @@events[sock.to_i].call(sock)
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
# Ends connection to the irc server
|
43
|
+
def IRCConnection.quit
|
44
|
+
@@quit = 1
|
45
|
+
end
|
46
|
+
|
47
|
+
# Retrieves user info from the server
|
48
|
+
def IRCConnection.get_user_info(user)
|
49
|
+
IRCConnection.send_to_server("WHOIS #{user}")
|
50
|
+
end
|
51
|
+
|
52
|
+
# Adds a new socket to the list of sockets to monitor for new data.
|
53
|
+
def IRCConnection.add_IO_socket(socket, &event_generator)
|
54
|
+
@@readsockets.push(socket)
|
55
|
+
@@events[socket.to_i] = event_generator
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
|
data/lib/IRCEvent.rb
CHANGED
@@ -1,286 +1,32 @@
|
|
1
|
+
require 'yaml'
|
1
2
|
|
2
3
|
# This is a lookup class for IRC event name mapping
|
3
4
|
class EventLookup
|
4
|
-
@@lookup =
|
5
|
-
|
6
|
-
|
7
|
-
'001' => "welcome",
|
8
|
-
'002' => "yourhost",
|
9
|
-
'003' => "created",
|
10
|
-
'004' => "myinfo",
|
11
|
-
'005' => "map", # Undernet Extension, Kajetan@Hinner.com, 17/11/98
|
12
|
-
'006' => "mapmore", # Undernet Extension, Kajetan@Hinner.com, 17/11/98
|
13
|
-
'007' => "mapend", # Undernet Extension, Kajetan@Hinner.com, 17/11/98
|
14
|
-
|
15
|
-
'008' => "snomask", # Undernet Extension, Kajetan@Hinner.com, 17/11/98
|
16
|
-
|
17
|
-
'009' => "statmemtot", # Undernet Extension, Kajetan@Hinner.com, 17/11/98
|
18
|
-
|
19
|
-
'010' => "statmem", # Undernet Extension, Kajetan@Hinner.com, 17/11/98
|
20
|
-
|
21
|
-
|
22
|
-
'200' => "tracelink",
|
23
|
-
'201' => "traceconnecting",
|
24
|
-
'202' => "tracehandshake",
|
25
|
-
'203' => "traceunknown",
|
26
|
-
'204' => "traceoperator",
|
27
|
-
'205' => "traceuser",
|
28
|
-
'206' => "traceserver",
|
29
|
-
'208' => "tracenewtype",
|
30
|
-
'209' => "traceclass",
|
31
|
-
'211' => "statslinkinfo",
|
32
|
-
'212' => "statscommands",
|
33
|
-
'213' => "statscline",
|
34
|
-
'214' => "statsnline",
|
35
|
-
'215' => "statsiline",
|
36
|
-
'216' => "statskline",
|
37
|
-
'217' => "statsqline",
|
38
|
-
'218' => "statsyline",
|
39
|
-
'219' => "endofstats",
|
40
|
-
'220' => "statsbline", # UnrealIrcd, Hendrik Frenzel
|
41
|
-
'221' => "umodeis",
|
42
|
-
'222' => "sqline_nick", # UnrealIrcd, Hendrik Frenzel
|
43
|
-
'223' => "statsgline", # UnrealIrcd, Hendrik Frenzel
|
44
|
-
'224' => "statstline", # UnrealIrcd, Hendrik Frenzel
|
45
|
-
'225' => "statseline", # UnrealIrcd, Hendrik Frenzel
|
46
|
-
'226' => "statsnline", # UnrealIrcd, Hendrik Frenzel
|
47
|
-
'227' => "statsvline", # UnrealIrcd, Hendrik Frenzel
|
48
|
-
'231' => "serviceinfo",
|
49
|
-
'232' => "endofservices",
|
50
|
-
'233' => "service",
|
51
|
-
'234' => "servlist",
|
52
|
-
'235' => "servlistend",
|
53
|
-
'241' => "statslline",
|
54
|
-
'242' => "statsuptime",
|
55
|
-
'243' => "statsoline",
|
56
|
-
'244' => "statshline",
|
57
|
-
'245' => "statssline", # Reserved, Kajetan@Hinner.com, 17/10/98
|
58
|
-
'246' => "statstline", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
59
|
-
'247' => "statsgline", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
60
|
-
### TODO: need numerics to be able to map to multiple strings
|
61
|
-
### 247' => "statsxline", # UnrealIrcd, Hendrik Frenzel
|
62
|
-
'248' => "statsuline", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
63
|
-
'249' => "statsdebug", # Unspecific Extension, Kajetan@Hinner.com, 17/10/98
|
64
|
-
'250' => "luserconns", # 1998-03-15 -- tkil
|
65
|
-
'251' => "luserclient",
|
66
|
-
'252' => "luserop",
|
67
|
-
'253' => "luserunknown",
|
68
|
-
'254' => "luserchannels",
|
69
|
-
'255' => "luserme",
|
70
|
-
'256' => "adminme",
|
71
|
-
'257' => "adminloc1",
|
72
|
-
'258' => "adminloc2",
|
73
|
-
'259' => "adminemail",
|
74
|
-
'261' => "tracelog",
|
75
|
-
'262' => "endoftrace", # 1997-11-24 -- archon
|
76
|
-
'265' => "n_local", # 1997-10-16 -- tkil
|
77
|
-
'266' => "n_global", # 1997-10-16 -- tkil
|
78
|
-
'271' => "silelist", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
79
|
-
'272' => "endofsilelist", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
80
|
-
'275' => "statsdline", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
81
|
-
'280' => "glist", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
82
|
-
'281' => "endofglist", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
83
|
-
'290' => "helphdr", # UnrealIrcd, Hendrik Frenzel
|
84
|
-
'291' => "helpop", # UnrealIrcd, Hendrik Frenzel
|
85
|
-
'292' => "helptlr", # UnrealIrcd, Hendrik Frenzel
|
86
|
-
'293' => "helphlp", # UnrealIrcd, Hendrik Frenzel
|
87
|
-
'294' => "helpfwd", # UnrealIrcd, Hendrik Frenzel
|
88
|
-
'295' => "helpign", # UnrealIrcd, Hendrik Frenzel
|
89
|
-
|
90
|
-
'300' => "none",
|
91
|
-
'301' => "away",
|
92
|
-
'302' => "userhost",
|
93
|
-
'303' => "ison",
|
94
|
-
'304' => "rpl_text", # Bahamut IRCD
|
95
|
-
'305' => "unaway",
|
96
|
-
'306' => "nowaway",
|
97
|
-
'307' => "userip", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
98
|
-
'308' => "rulesstart", # UnrealIrcd, Hendrik Frenzel
|
99
|
-
'309' => "endofrules", # UnrealIrcd, Hendrik Frenzel
|
100
|
-
'310' => "whoishelp", # (July01-01)Austnet Extension, found by Andypoo <andypoo@secret.com.au>
|
101
|
-
'311' => "whoisuser",
|
102
|
-
'312' => "whoisserver",
|
103
|
-
'313' => "whoisoperator",
|
104
|
-
'314' => "whowasuser",
|
105
|
-
'315' => "endofwho",
|
106
|
-
'316' => "whoischanop",
|
107
|
-
'317' => "whoisidle",
|
108
|
-
'318' => "endofwhois",
|
109
|
-
'319' => "whoischannels",
|
110
|
-
'320' => "whoisvworld", # (July01-01)Austnet Extension, found by Andypoo <andypoo@secret.com.au>
|
111
|
-
'321' => "liststart",
|
112
|
-
'322' => "list",
|
113
|
-
'323' => "listend",
|
114
|
-
'324' => "channelmodeis",
|
115
|
-
'329' => "channelcreate", # 1997-11-24 -- archon
|
116
|
-
'331' => "notopic",
|
117
|
-
'332' => "topic",
|
118
|
-
'333' => "topicinfo", # 1997-11-24 -- archon
|
119
|
-
'334' => "listusage", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
120
|
-
'335' => "whoisbot", # UnrealIrcd, Hendrik Frenzel
|
121
|
-
'341' => "inviting",
|
122
|
-
'342' => "summoning",
|
123
|
-
'346' => "invitelist", # UnrealIrcd, Hendrik Frenzel
|
124
|
-
'347' => "endofinvitelist", # UnrealIrcd, Hendrik Frenzel
|
125
|
-
'348' => "exlist", # UnrealIrcd, Hendrik Frenzel
|
126
|
-
'349' => "endofexlist", # UnrealIrcd, Hendrik Frenzel
|
127
|
-
'351' => "version",
|
128
|
-
'352' => "whoreply",
|
129
|
-
'353' => "namreply",
|
130
|
-
'354' => "whospcrpl", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
131
|
-
'361' => "killdone",
|
132
|
-
'362' => "closing",
|
133
|
-
'363' => "closeend",
|
134
|
-
'364' => "links",
|
135
|
-
'365' => "endoflinks",
|
136
|
-
'366' => "endofnames",
|
137
|
-
'367' => "banlist",
|
138
|
-
'368' => "endofbanlist",
|
139
|
-
'369' => "endofwhowas",
|
140
|
-
'371' => "info",
|
141
|
-
'372' => "motd",
|
142
|
-
'373' => "infostart",
|
143
|
-
'374' => "endofinfo",
|
144
|
-
'375' => "motdstart",
|
145
|
-
'376' => "endofmotd",
|
146
|
-
'377' => "motd2", # 1997-10-16 -- tkil
|
147
|
-
'378' => "austmotd", # (July01-01)Austnet Extension, found by Andypoo <andypoo@secret.com.au>
|
148
|
-
'379' => "whoismodes", # UnrealIrcd, Hendrik Frenzel
|
149
|
-
'381' => "youreoper",
|
150
|
-
'382' => "rehashing",
|
151
|
-
'383' => "youreservice", # UnrealIrcd, Hendrik Frenzel
|
152
|
-
'384' => "myportis",
|
153
|
-
'385' => "notoperanymore", # Unspecific Extension, Kajetan@Hinner.com, 17/10/98
|
154
|
-
'386' => "qlist", # UnrealIrcd, Hendrik Frenzel
|
155
|
-
'387' => "endofqlist", # UnrealIrcd, Hendrik Frenzel
|
156
|
-
'388' => "alist", # UnrealIrcd, Hendrik Frenzel
|
157
|
-
'389' => "endofalist", # UnrealIrcd, Hendrik Frenzel
|
158
|
-
'391' => "time",
|
159
|
-
'392' => "usersstart",
|
160
|
-
'393' => "users",
|
161
|
-
'394' => "endofusers",
|
162
|
-
'395' => "nousers",
|
163
|
-
|
164
|
-
'401' => "nosuchnick",
|
165
|
-
'402' => "nosuchserver",
|
166
|
-
'403' => "nosuchchannel",
|
167
|
-
'404' => "cannotsendtochan",
|
168
|
-
'405' => "toomanychannels",
|
169
|
-
'406' => "wasnosuchnick",
|
170
|
-
'407' => "toomanytargets",
|
171
|
-
'408' => "nosuchservice", # UnrealIrcd, Hendrik Frenzel
|
172
|
-
'409' => "noorigin",
|
173
|
-
'411' => "norecipient",
|
174
|
-
'412' => "notexttosend",
|
175
|
-
'413' => "notoplevel",
|
176
|
-
'414' => "wildtoplevel",
|
177
|
-
'416' => "querytoolong", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
178
|
-
'421' => "unknowncommand",
|
179
|
-
'422' => "nomotd",
|
180
|
-
'423' => "noadmininfo",
|
181
|
-
'424' => "fileerror",
|
182
|
-
'425' => "noopermotd", # UnrealIrcd, Hendrik Frenzel
|
183
|
-
'431' => "nonicknamegiven",
|
184
|
-
'432' => "erroneusnickname", # This iz how its speld in thee RFC.
|
185
|
-
'433' => "nicknameinuse",
|
186
|
-
'434' => "norules", # UnrealIrcd, Hendrik Frenzel
|
187
|
-
'435' => "serviceconfused", # UnrealIrcd, Hendrik Frenzel
|
188
|
-
'436' => "nickcollision",
|
189
|
-
'437' => "bannickchange", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
190
|
-
'438' => "nicktoofast", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
191
|
-
'439' => "targettoofast", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
192
|
-
'440' => "servicesdown", # Bahamut IRCD
|
193
|
-
'441' => "usernotinchannel",
|
194
|
-
'442' => "notonchannel",
|
195
|
-
'443' => "useronchannel",
|
196
|
-
'444' => "nologin",
|
197
|
-
'445' => "summondisabled",
|
198
|
-
'446' => "usersdisabled",
|
199
|
-
'447' => "nonickchange", # UnrealIrcd, Hendrik Frenzel
|
200
|
-
'451' => "notregistered",
|
201
|
-
'455' => "hostilename", # UnrealIrcd, Hendrik Frenzel
|
202
|
-
'459' => "nohiding", # UnrealIrcd, Hendrik Frenzel
|
203
|
-
'460' => "notforhalfops", # UnrealIrcd, Hendrik Frenzel
|
204
|
-
'461' => "needmoreparams",
|
205
|
-
'462' => "alreadyregistered",
|
206
|
-
'463' => "nopermforhost",
|
207
|
-
'464' => "passwdmismatch",
|
208
|
-
'465' => "yourebannedcreep", # I love this one...
|
209
|
-
'466' => "youwillbebanned",
|
210
|
-
'467' => "keyset",
|
211
|
-
'468' => "invalidusername", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
212
|
-
'469' => "linkset", # UnrealIrcd, Hendrik Frenzel
|
213
|
-
'470' => "linkchannel", # UnrealIrcd, Hendrik Frenzel
|
214
|
-
'471' => "channelisfull",
|
215
|
-
'472' => "unknownmode",
|
216
|
-
'473' => "inviteonlychan",
|
217
|
-
'474' => "bannedfromchan",
|
218
|
-
'475' => "badchannelkey",
|
219
|
-
'476' => "badchanmask",
|
220
|
-
'477' => "needreggednick", # Bahamut IRCD
|
221
|
-
'478' => "banlistfull", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
222
|
-
'479' => "secureonlychannel", # pircd
|
223
|
-
### TODO: see above todo
|
224
|
-
### 479' => "linkfail", # UnrealIrcd, Hendrik Frenzel
|
225
|
-
'480' => "cannotknock", # UnrealIrcd, Hendrik Frenzel
|
226
|
-
'481' => "noprivileges",
|
227
|
-
'482' => "chanoprivsneeded",
|
228
|
-
'483' => "cantkillserver",
|
229
|
-
'484' => "ischanservice", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
230
|
-
'485' => "killdeny", # UnrealIrcd, Hendrik Frenzel
|
231
|
-
'486' => "htmdisabled", # UnrealIrcd, Hendrik Frenzel
|
232
|
-
'489' => "secureonlychan", # UnrealIrcd, Hendrik Frenzel
|
233
|
-
'491' => "nooperhost",
|
234
|
-
'492' => "noservicehost",
|
235
|
-
|
236
|
-
'501' => "umodeunknownflag",
|
237
|
-
'502' => "usersdontmatch",
|
238
|
-
'511' => "silelistfull", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
239
|
-
'513' => "nosuchgline", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
240
|
-
'513' => "badping", # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
241
|
-
'518' => "noinvite", # UnrealIrcd, Hendrik Frenzel
|
242
|
-
'519' => "admonly", # UnrealIrcd, Hendrik Frenzel
|
243
|
-
'520' => "operonly", # UnrealIrcd, Hendrik Frenzel
|
244
|
-
'521' => "listsyntax", # UnrealIrcd, Hendrik Frenzel
|
245
|
-
'524' => "operspverify", # UnrealIrcd, Hendrik Frenzel
|
246
|
-
|
247
|
-
'600' => "rpl_logon", # Bahamut IRCD
|
248
|
-
'601' => "rpl_logoff", # Bahamut IRCD
|
249
|
-
'602' => "rpl_watchoff", # UnrealIrcd, Hendrik Frenzel
|
250
|
-
'603' => "rpl_watchstat", # UnrealIrcd, Hendrik Frenzel
|
251
|
-
'604' => "rpl_nowon", # Bahamut IRCD
|
252
|
-
'605' => "rpl_nowoff", # Bahamut IRCD
|
253
|
-
'606' => "rpl_watchlist", # UnrealIrcd, Hendrik Frenzel
|
254
|
-
'607' => "rpl_endofwatchlist", # UnrealIrcd, Hendrik Frenzel
|
255
|
-
'610' => "mapmore", # UnrealIrcd, Hendrik Frenzel
|
256
|
-
'640' => "rpl_dumping", # UnrealIrcd, Hendrik Frenzel
|
257
|
-
'641' => "rpl_dumprpl", # UnrealIrcd, Hendrik Frenzel
|
258
|
-
'642' => "rpl_eodump", # UnrealIrcd, Hendrik Frenzel
|
259
|
-
|
260
|
-
'999' => "numericerror", # Bahamut IRCD
|
261
|
-
];
|
5
|
+
@@lookup = YAML.load_file("#{File.dirname(__FILE__)}/eventmap.yml")
|
6
|
+
|
7
|
+
# returns the event name, given a number
|
262
8
|
def EventLookup::find_by_number(num)
|
263
|
-
return @@lookup[num]
|
9
|
+
return @@lookup[num.to_i]
|
264
10
|
end
|
265
11
|
end
|
266
12
|
|
267
13
|
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
14
|
+
# Handles an IRC generated event.
|
15
|
+
# Handlers are for the IRC framework to use
|
16
|
+
# Callbacks are for users to add.
|
17
|
+
# Both handlers and callbacks can be called for the same event.
|
272
18
|
class IRCEvent
|
273
19
|
@@handlers = { 'ping' => lambda {|event| IRCConnection.send_to_server("PONG #{event.message}") } }
|
274
20
|
@@callbacks = Hash.new()
|
275
|
-
attr_reader :message, :event_type, :from, :channel, :target, :mode, :stats
|
21
|
+
attr_reader :hostmask, :message, :event_type, :from, :channel, :target, :mode, :stats
|
276
22
|
def initialize (line)
|
277
23
|
line.sub!(/^:/, '')
|
278
24
|
mess_parts = line.split(':', 2);
|
279
25
|
# mess_parts[0] is server info
|
280
26
|
# mess_parts[1] is the message that was sent
|
281
27
|
@message = mess_parts[1]
|
282
|
-
@stats = mess_parts[0].scan(/[-\w
|
283
|
-
|
28
|
+
@stats = mess_parts[0].scan(/[-\w.\#\@\+]+/)
|
29
|
+
|
284
30
|
if @stats[0].match(/^PING/)
|
285
31
|
@event_type = 'ping'
|
286
32
|
elsif @stats[1] && @stats[1].match(/^\d+/)
|
@@ -294,7 +40,7 @@ class IRCEvent
|
|
294
40
|
@from = @stats[0]
|
295
41
|
@user = IRCUser.create_user(@from)
|
296
42
|
end
|
297
|
-
@hostmask = @stats[1] if @event_type
|
43
|
+
@hostmask = @stats[1] if %W(privmsg join).include? @event_type
|
298
44
|
@channel = @stats[3] if @stats[3] && !@channel
|
299
45
|
@target = @stats[5] if @stats[5]
|
300
46
|
@mode = @stats[4] if @stats[4]
|
@@ -307,11 +53,13 @@ class IRCEvent
|
|
307
53
|
@channel = @message
|
308
54
|
end
|
309
55
|
|
310
|
-
|
56
|
+
end
|
57
|
+
|
311
58
|
# Adds a callback for the specified irc message.
|
312
59
|
def IRCEvent.add_callback(message_id, &callback)
|
313
60
|
@@callbacks[message_id] = callback
|
314
61
|
end
|
62
|
+
|
315
63
|
# Adds a handler to the handler function hash.
|
316
64
|
def IRCEvent.add_handler(message_id, proc=nil, &handler)
|
317
65
|
if block_given?
|
@@ -320,6 +68,7 @@ class IRCEvent
|
|
320
68
|
@@handlers[message_id] = proc
|
321
69
|
end
|
322
70
|
end
|
71
|
+
|
323
72
|
# Process this event, preforming which ever handler and callback is specified
|
324
73
|
# for this event.
|
325
74
|
def process
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
# This is a lookup class for IRC event name mapping
|
4
|
+
class EventLookup
|
5
|
+
@@lookup = YAML.load_file("#{File.dirname(__FILE__)}/eventmap.yml")
|
6
|
+
|
7
|
+
# returns the event name, given a number
|
8
|
+
def EventLookup::find_by_number(num)
|
9
|
+
return @@lookup[num.to_i]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
# Handles an IRC generated event.
|
15
|
+
# Handlers are for the IRC framework to use
|
16
|
+
# Callbacks are for users to add.
|
17
|
+
# Both handlers and callbacks can be called for the same event.
|
18
|
+
class IRCEvent
|
19
|
+
@@handlers = { 'ping' => lambda {|event| IRCConnection.send_to_server("PONG #{event.message}") } }
|
20
|
+
@@callbacks = Hash.new()
|
21
|
+
attr_reader :hostmask, :message, :event_type, :from, :channel, :target, :mode, :stats
|
22
|
+
def initialize (line)
|
23
|
+
line.sub!(/^:/, '')
|
24
|
+
mess_parts = line.split(':', 2);
|
25
|
+
# mess_parts[0] is server info
|
26
|
+
# mess_parts[1] is the message that was sent
|
27
|
+
@message = mess_parts[1]
|
28
|
+
@stats = mess_parts[0].scan(/[-\w.\#\@]+/)
|
29
|
+
puts "Event: #{line}"
|
30
|
+
if @stats[0].match(/^PING/)
|
31
|
+
@event_type = 'ping'
|
32
|
+
elsif @stats[1] && @stats[1].match(/^\d+/)
|
33
|
+
@event_type = EventLookup::find_by_number(@stats[1]);
|
34
|
+
@channel = @stats[3]
|
35
|
+
else
|
36
|
+
@event_type = @stats[2].downcase if @stats[2]
|
37
|
+
end
|
38
|
+
|
39
|
+
if @event_type != 'ping'
|
40
|
+
@from = @stats[0]
|
41
|
+
@user = IRCUser.create_user(@from)
|
42
|
+
end
|
43
|
+
@hostmask = @stats[1] if %W(privmsg join).include? @event_type
|
44
|
+
@channel = @stats[3] if @stats[3] && !@channel
|
45
|
+
@target = @stats[5] if @stats[5]
|
46
|
+
@mode = @stats[4] if @stats[4]
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
# Unfortunatly, not all messages are created equal. This is our
|
51
|
+
# special exceptions section
|
52
|
+
if @event_type == 'join'
|
53
|
+
@channel = @message
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
# Adds a callback for the specified irc message.
|
59
|
+
def IRCEvent.add_callback(message_id, &callback)
|
60
|
+
@@callbacks[message_id] = callback
|
61
|
+
end
|
62
|
+
|
63
|
+
# Adds a handler to the handler function hash.
|
64
|
+
def IRCEvent.add_handler(message_id, proc=nil, &handler)
|
65
|
+
if block_given?
|
66
|
+
@@handlers[message_id] = handler
|
67
|
+
elsif proc
|
68
|
+
@@handlers[message_id] = proc
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Process this event, preforming which ever handler and callback is specified
|
73
|
+
# for this event.
|
74
|
+
def process
|
75
|
+
handled = nil
|
76
|
+
if @@handlers[@event_type]
|
77
|
+
@@handlers[@event_type].call(self)
|
78
|
+
handled = 1
|
79
|
+
end
|
80
|
+
if @@callbacks[@event_type]
|
81
|
+
@@callbacks[@event_type].call(self)
|
82
|
+
handled = 1
|
83
|
+
end
|
84
|
+
if !handled
|
85
|
+
puts "No handler for event type #@event_type in #{self.class}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
data/lib/IRCUser.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
-
|
1
|
+
# Represents IRC Users
|
2
2
|
class IRCUser
|
3
3
|
@@users = Hash.new()
|
4
4
|
@modes = Hash.new()
|
5
|
+
|
5
6
|
def IRCUser.create_user(username)
|
6
7
|
username.sub!(/^[\@\%]/,'')
|
7
8
|
|
@@ -11,8 +12,10 @@ class IRCUser
|
|
11
12
|
@@users[username] = self.new(username)
|
12
13
|
@@users[username]
|
13
14
|
end
|
15
|
+
|
14
16
|
attr_reader :username, :mask
|
15
17
|
attr_writer :mask
|
18
|
+
|
16
19
|
private
|
17
20
|
def initialize (username)
|
18
21
|
@username = username
|
data/lib/IRCUtil.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
#
|
2
|
+
# IRCUtil is a module that contains utility functions for use with the
|
3
|
+
# rest of Ruby-IRC. There is nothing required of the user to know or
|
4
|
+
# even use these functions, but they are useful for certain tasks
|
5
|
+
# regarding IRC connections.
|
6
|
+
#
|
7
|
+
|
8
|
+
module IRCUtil
|
9
|
+
#
|
10
|
+
# Matches hostmasks against hosts. Returns t/f on success/fail.
|
11
|
+
#
|
12
|
+
# A hostmask consists of a simple wildcard that describes a
|
13
|
+
# host or class of hosts.
|
14
|
+
#
|
15
|
+
# f.e., where the host is 'bar.example.com', a host mask
|
16
|
+
# of '*.example.com' would assert.
|
17
|
+
#
|
18
|
+
|
19
|
+
def assert_hostmask(host, hostmask)
|
20
|
+
return !!host.match(quote_regexp_for_mask(hostmask))
|
21
|
+
end
|
22
|
+
|
23
|
+
module_function :assert_hostmask
|
24
|
+
|
25
|
+
#
|
26
|
+
# A utility function used by assert_hostmask() to turn hostmasks
|
27
|
+
# into regular expressions.
|
28
|
+
#
|
29
|
+
# Rarely, if ever, should be used by outside code. It's public
|
30
|
+
# exposure is merely for those who are interested in it's
|
31
|
+
# functionality.
|
32
|
+
#
|
33
|
+
|
34
|
+
def quote_regexp_for_mask(hostmask)
|
35
|
+
# Big thanks to Jesse Williamson for his consultation while writing this.
|
36
|
+
#
|
37
|
+
# escape all other regexp specials except for . and *.
|
38
|
+
# properly escape . and place an unescaped . before *.
|
39
|
+
# confine the regexp to scan the whole line.
|
40
|
+
# return the edited hostmask as a string.
|
41
|
+
hostmask.gsub(/([\[\]\(\)\?\^\$])\\/, '\\1').
|
42
|
+
gsub(/\./, '\.').
|
43
|
+
gsub(/\*/, '.*').
|
44
|
+
sub(/^/, '^').
|
45
|
+
sub(/$/, '$')
|
46
|
+
end
|
47
|
+
|
48
|
+
module_function :quote_regexp_for_mask
|
49
|
+
end
|
data/lib/eventmap.yml
ADDED
@@ -0,0 +1,247 @@
|
|
1
|
+
# 001 ne 1 for the purpose of hash keying apparently.
|
2
|
+
001 : welcome
|
3
|
+
002 : yourhost
|
4
|
+
003 : created
|
5
|
+
004 : myinfo
|
6
|
+
005 : map # Undernet Extension, Kajetan@Hinner.com, 17/11/98
|
7
|
+
006 : mapmore # Undernet Extension, Kajetan@Hinner.com, 17/11/98
|
8
|
+
007 : mapend # Undernet Extension, Kajetan@Hinner.com, 17/11/98
|
9
|
+
008 : snomask # Undernet Extension, Kajetan@Hinner.com, 17/11/98
|
10
|
+
009 : statmemtot # Undernet Extension, Kajetan@Hinner.com, 17/11/98
|
11
|
+
010 : statmem # Undernet Extension, Kajetan@Hinner.com, 17/11/98
|
12
|
+
200 : tracelink
|
13
|
+
201 : traceconnecting
|
14
|
+
202 : tracehandshake
|
15
|
+
203 : traceunknown
|
16
|
+
204 : traceoperator
|
17
|
+
205 : traceuser
|
18
|
+
206 : traceserver
|
19
|
+
208 : tracenewtype
|
20
|
+
209 : traceclass
|
21
|
+
211 : statslinkinfo
|
22
|
+
212 : statscommands
|
23
|
+
213 : statscline
|
24
|
+
214 : statsnline
|
25
|
+
215 : statsiline
|
26
|
+
216 : statskline
|
27
|
+
217 : statsqline
|
28
|
+
218 : statsyline
|
29
|
+
219 : endofstats
|
30
|
+
220 : statsbline # UnrealIrcd, Hendrik Frenzel
|
31
|
+
221 : umodeis
|
32
|
+
222 : sqline_nick # UnrealIrcd, Hendrik Frenzel
|
33
|
+
223 : statsgline # UnrealIrcd, Hendrik Frenzel
|
34
|
+
224 : statstline # UnrealIrcd, Hendrik Frenzel
|
35
|
+
225 : statseline # UnrealIrcd, Hendrik Frenzel
|
36
|
+
226 : statsnline # UnrealIrcd, Hendrik Frenzel
|
37
|
+
227 : statsvline # UnrealIrcd, Hendrik Frenzel
|
38
|
+
231 : serviceinfo
|
39
|
+
232 : endofservices
|
40
|
+
233 : service
|
41
|
+
234 : servlist
|
42
|
+
235 : servlistend
|
43
|
+
241 : statslline
|
44
|
+
242 : statsuptime
|
45
|
+
243 : statsoline
|
46
|
+
244 : statshline
|
47
|
+
245 : statssline # Reserved, Kajetan@Hinner.com, 17/10/98
|
48
|
+
246 : statstline # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
49
|
+
247 : statsgline # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
50
|
+
### TODO: need numerics to be able to map to multiple strings
|
51
|
+
### 247 : statsxline # UnrealIrcd, Hendrik Frenzel
|
52
|
+
248 : statsuline # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
53
|
+
249 : statsdebug # Unspecific Extension, Kajetan@Hinner.com, 17/10/98
|
54
|
+
250 : luserconns # 1998-03-15 -- tkil
|
55
|
+
251 : luserclient
|
56
|
+
252 : luserop
|
57
|
+
253 : luserunknown
|
58
|
+
254 : luserchannels
|
59
|
+
255 : luserme
|
60
|
+
256 : adminme
|
61
|
+
257 : adminloc1
|
62
|
+
258 : adminloc2
|
63
|
+
259 : adminemail
|
64
|
+
261 : tracelog
|
65
|
+
262 : endoftrace # 1997-11-24 -- archon
|
66
|
+
265 : n_local # 1997-10-16 -- tkil
|
67
|
+
266 : n_global # 1997-10-16 -- tkil
|
68
|
+
271 : silelist # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
69
|
+
272 : endofsilelist # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
70
|
+
275 : statsdline # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
71
|
+
280 : glist # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
72
|
+
281 : endofglist # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
73
|
+
290 : helphdr # UnrealIrcd, Hendrik Frenzel
|
74
|
+
291 : helpop # UnrealIrcd, Hendrik Frenzel
|
75
|
+
292 : helptlr # UnrealIrcd, Hendrik Frenzel
|
76
|
+
293 : helphlp # UnrealIrcd, Hendrik Frenzel
|
77
|
+
294 : helpfwd # UnrealIrcd, Hendrik Frenzel
|
78
|
+
295 : helpign # UnrealIrcd, Hendrik Frenzel
|
79
|
+
300 : none
|
80
|
+
301 : away
|
81
|
+
302 : userhost
|
82
|
+
303 : ison
|
83
|
+
304 : rpl_text # Bahamut IRCD
|
84
|
+
305 : unaway
|
85
|
+
306 : nowaway
|
86
|
+
307 : userip # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
87
|
+
308 : rulesstart # UnrealIrcd, Hendrik Frenzel
|
88
|
+
309 : endofrules # UnrealIrcd, Hendrik Frenzel
|
89
|
+
310 : whoishelp # (July01-01)Austnet Extension, found by Andypoo <andypoo@secret.com.au>
|
90
|
+
311 : whoisuser
|
91
|
+
312 : whoisserver
|
92
|
+
313 : whoisoperator
|
93
|
+
314 : whowasuser
|
94
|
+
315 : endofwho
|
95
|
+
316 : whoischanop
|
96
|
+
317 : whoisidle
|
97
|
+
318 : endofwhois
|
98
|
+
319 : whoischannels
|
99
|
+
320 : whoisvworld # (July01-01)Austnet Extension, found by Andypoo <andypoo@secret.com.au>
|
100
|
+
321 : liststart
|
101
|
+
322 : list
|
102
|
+
323 : listend
|
103
|
+
324 : channelmodeis
|
104
|
+
329 : channelcreate # 1997-11-24 -- archon
|
105
|
+
331 : notopic
|
106
|
+
332 : topic
|
107
|
+
333 : topicinfo # 1997-11-24 -- archon
|
108
|
+
334 : listusage # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
109
|
+
335 : whoisbot # UnrealIrcd, Hendrik Frenzel
|
110
|
+
341 : inviting
|
111
|
+
342 : summoning
|
112
|
+
346 : invitelist # UnrealIrcd, Hendrik Frenzel
|
113
|
+
347 : endofinvitelist # UnrealIrcd, Hendrik Frenzel
|
114
|
+
348 : exlist # UnrealIrcd, Hendrik Frenzel
|
115
|
+
349 : endofexlist # UnrealIrcd, Hendrik Frenzel
|
116
|
+
351 : version
|
117
|
+
352 : whoreply
|
118
|
+
353 : namreply
|
119
|
+
354 : whospcrpl # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
120
|
+
361 : killdone
|
121
|
+
362 : closing
|
122
|
+
363 : closeend
|
123
|
+
364 : links
|
124
|
+
365 : endoflinks
|
125
|
+
366 : endofnames
|
126
|
+
367 : banlist
|
127
|
+
368 : endofbanlist
|
128
|
+
369 : endofwhowas
|
129
|
+
371 : info
|
130
|
+
372 : motd
|
131
|
+
373 : infostart
|
132
|
+
374 : endofinfo
|
133
|
+
375 : motdstart
|
134
|
+
376 : endofmotd
|
135
|
+
377 : motd2 # 1997-10-16 -- tkil
|
136
|
+
378 : austmotd # (July01-01)Austnet Extension, found by Andypoo <andypoo@secret.com.au>
|
137
|
+
379 : whoismodes # UnrealIrcd, Hendrik Frenzel
|
138
|
+
381 : youreoper
|
139
|
+
382 : rehashing
|
140
|
+
383 : youreservice # UnrealIrcd, Hendrik Frenzel
|
141
|
+
384 : myportis
|
142
|
+
385 : notoperanymore # Unspecific Extension, Kajetan@Hinner.com, 17/10/98
|
143
|
+
386 : qlist # UnrealIrcd, Hendrik Frenzel
|
144
|
+
387 : endofqlist # UnrealIrcd, Hendrik Frenzel
|
145
|
+
388 : alist # UnrealIrcd, Hendrik Frenzel
|
146
|
+
389 : endofalist # UnrealIrcd, Hendrik Frenzel
|
147
|
+
391 : time
|
148
|
+
392 : usersstart
|
149
|
+
393 : users
|
150
|
+
394 : endofusers
|
151
|
+
395 : nousers
|
152
|
+
401 : nosuchnick
|
153
|
+
402 : nosuchserver
|
154
|
+
403 : nosuchchannel
|
155
|
+
404 : cannotsendtochan
|
156
|
+
405 : toomanychannels
|
157
|
+
406 : wasnosuchnick
|
158
|
+
407 : toomanytargets
|
159
|
+
408 : nosuchservice # UnrealIrcd, Hendrik Frenzel
|
160
|
+
409 : noorigin
|
161
|
+
411 : norecipient
|
162
|
+
412 : notexttosend
|
163
|
+
413 : notoplevel
|
164
|
+
414 : wildtoplevel
|
165
|
+
416 : querytoolong # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
166
|
+
421 : unknowncommand
|
167
|
+
422 : nomotd
|
168
|
+
423 : noadmininfo
|
169
|
+
424 : fileerror
|
170
|
+
425 : noopermotd # UnrealIrcd, Hendrik Frenzel
|
171
|
+
431 : nonicknamegiven
|
172
|
+
432 : erroneusnickname # This iz how its speld in thee RFC.
|
173
|
+
433 : nicknameinuse
|
174
|
+
434 : norules # UnrealIrcd, Hendrik Frenzel
|
175
|
+
435 : serviceconfused # UnrealIrcd, Hendrik Frenzel
|
176
|
+
436 : nickcollision
|
177
|
+
437 : bannickchange # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
178
|
+
438 : nicktoofast # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
179
|
+
439 : targettoofast # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
180
|
+
440 : servicesdown # Bahamut IRCD
|
181
|
+
441 : usernotinchannel
|
182
|
+
442 : notonchannel
|
183
|
+
443 : useronchannel
|
184
|
+
444 : nologin
|
185
|
+
445 : summondisabled
|
186
|
+
446 : usersdisabled
|
187
|
+
447 : nonickchange # UnrealIrcd, Hendrik Frenzel
|
188
|
+
451 : notregistered
|
189
|
+
455 : hostilename # UnrealIrcd, Hendrik Frenzel
|
190
|
+
459 : nohiding # UnrealIrcd, Hendrik Frenzel
|
191
|
+
460 : notforhalfops # UnrealIrcd, Hendrik Frenzel
|
192
|
+
461 : needmoreparams
|
193
|
+
462 : alreadyregistered
|
194
|
+
463 : nopermforhost
|
195
|
+
464 : passwdmismatch
|
196
|
+
465 : yourebannedcreep # I love this one...
|
197
|
+
466 : youwillbebanned
|
198
|
+
467 : keyset
|
199
|
+
468 : invalidusername # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
200
|
+
469 : linkset # UnrealIrcd, Hendrik Frenzel
|
201
|
+
470 : linkchannel # UnrealIrcd, Hendrik Frenzel
|
202
|
+
471 : channelisfull
|
203
|
+
472 : unknownmode
|
204
|
+
473 : inviteonlychan
|
205
|
+
474 : bannedfromchan
|
206
|
+
475 : badchannelkey
|
207
|
+
476 : badchanmask
|
208
|
+
477 : needreggednick # Bahamut IRCD
|
209
|
+
478 : banlistfull # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
210
|
+
479 : secureonlychannel # pircd
|
211
|
+
### TODO: see above todo
|
212
|
+
### 479 : linkfail # UnrealIrcd, Hendrik Frenzel
|
213
|
+
480 : cannotknock # UnrealIrcd, Hendrik Frenzel
|
214
|
+
481 : noprivileges
|
215
|
+
482 : chanoprivsneeded
|
216
|
+
483 : cantkillserver
|
217
|
+
484 : ischanservice # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
218
|
+
485 : killdeny # UnrealIrcd, Hendrik Frenzel
|
219
|
+
486 : htmdisabled # UnrealIrcd, Hendrik Frenzel
|
220
|
+
489 : secureonlychan # UnrealIrcd, Hendrik Frenzel
|
221
|
+
491 : nooperhost
|
222
|
+
492 : noservicehost
|
223
|
+
501 : umodeunknownflag
|
224
|
+
502 : usersdontmatch
|
225
|
+
511 : silelistfull # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
226
|
+
513 : nosuchgline # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
227
|
+
513 : badping # Undernet Extension, Kajetan@Hinner.com, 17/10/98
|
228
|
+
518 : noinvite # UnrealIrcd, Hendrik Frenzel
|
229
|
+
519 : admonly # UnrealIrcd, Hendrik Frenzel
|
230
|
+
520 : operonly # UnrealIrcd, Hendrik Frenzel
|
231
|
+
521 : listsyntax # UnrealIrcd, Hendrik Frenzel
|
232
|
+
524 : operspverify # UnrealIrcd, Hendrik Frenzel
|
233
|
+
|
234
|
+
600 : rpl_logon # Bahamut IRCD
|
235
|
+
601 : rpl_logoff # Bahamut IRCD
|
236
|
+
602 : rpl_watchoff # UnrealIrcd, Hendrik Frenzel
|
237
|
+
603 : rpl_watchstat # UnrealIrcd, Hendrik Frenzel
|
238
|
+
604 : rpl_nowon # Bahamut IRCD
|
239
|
+
605 : rpl_nowoff # Bahamut IRCD
|
240
|
+
606 : rpl_watchlist # UnrealIrcd, Hendrik Frenzel
|
241
|
+
607 : rpl_endofwatchlist # UnrealIrcd, Hendrik Frenzel
|
242
|
+
610 : mapmore # UnrealIrcd, Hendrik Frenzel
|
243
|
+
640 : rpl_dumping # UnrealIrcd, Hendrik Frenzel
|
244
|
+
641 : rpl_dumprpl # UnrealIrcd, Hendrik Frenzel
|
245
|
+
642 : rpl_eodump # UnrealIrcd, Hendrik Frenzel
|
246
|
+
|
247
|
+
999 : numericerror # Bahamut IRCD
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: Ruby-IRC
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.0.
|
7
|
-
date: 2006-
|
6
|
+
version: 1.0.6
|
7
|
+
date: 2006-12-08 00:00:00 -08:00
|
8
8
|
summary: An IRC Client library
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -33,6 +33,12 @@ files:
|
|
33
33
|
- lib/IRCChannel.rb
|
34
34
|
- lib/IRCConnection.rb
|
35
35
|
- lib/IRCUser.rb
|
36
|
+
- lib/IRCUtil.rb
|
37
|
+
- lib/eventmap.yml
|
38
|
+
- lib/IRCEvent.rb.~1.5.~
|
39
|
+
- lib/IRCConnection.rb.~1.2.~
|
40
|
+
- lib/#IRCEvent.rb#
|
41
|
+
- lib/IRC.rb.~1.4.~
|
36
42
|
- README
|
37
43
|
test_files: []
|
38
44
|
|