Ruby-IRC 1.0.7 → 1.0.10
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/IRC.rb +26 -6
- data/lib/IRC.rb.~1.8.~ +153 -0
- data/lib/IRCConnection.rb +38 -15
- data/lib/IRCConnection.rb.~1.4.~ +97 -0
- data/lib/IRCEvent.rb +2 -1
- metadata +6 -3
data/lib/IRC.rb
CHANGED
@@ -66,13 +66,17 @@ class IRC
|
|
66
66
|
|
67
67
|
IRCConnection.handle_connection(@server, @port, @nick, @realname) do
|
68
68
|
# Log in information moved to IRCConnection
|
69
|
-
threads = []
|
69
|
+
@threads = []
|
70
70
|
IRCConnection.main do |event|
|
71
|
-
|
72
|
-
|
73
|
-
|
71
|
+
if event.kind_of?(Array)
|
72
|
+
event.each {|event|
|
73
|
+
thread_event(event)
|
74
|
+
}
|
75
|
+
else
|
76
|
+
thread_event(event)
|
77
|
+
end
|
74
78
|
end
|
75
|
-
threads.each {|thr| thr.join }
|
79
|
+
@threads.each {|thr| thr.join }
|
76
80
|
end
|
77
81
|
end
|
78
82
|
|
@@ -89,7 +93,17 @@ class IRC
|
|
89
93
|
@channels.delete_if {|chan| chan.name == channel }
|
90
94
|
end
|
91
95
|
end
|
92
|
-
|
96
|
+
|
97
|
+
# kicks a user from a channel (does not check for operator privledge)
|
98
|
+
def kick(channel, user, message)
|
99
|
+
IRCConnection.send_to_server("KICK #{channel} #{user} :#{message || user || 'kicked'}")
|
100
|
+
end
|
101
|
+
|
102
|
+
# sets the topic of the given channel
|
103
|
+
def set_topic(channel, topic)
|
104
|
+
IRCConnection.send_to_server("TOPIC #{channel} :#{topic}");
|
105
|
+
end
|
106
|
+
|
93
107
|
# Sends a private message, or channel message
|
94
108
|
def send_message(to, message)
|
95
109
|
IRCConnection.send_to_server("privmsg #{to} :#{message}");
|
@@ -140,4 +154,10 @@ class IRC
|
|
140
154
|
def get_user_info(user)
|
141
155
|
IRCConnection.send_to_server("WHO #{user}")
|
142
156
|
end
|
157
|
+
private
|
158
|
+
def thread_event (event)
|
159
|
+
@threads << Thread.new(event) {|localevent|
|
160
|
+
localevent.process
|
161
|
+
}
|
162
|
+
end
|
143
163
|
end
|
data/lib/IRC.rb.~1.8.~
ADDED
@@ -0,0 +1,153 @@
|
|
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
|
+
if chan == event.channel
|
30
|
+
chan.topic = event.message
|
31
|
+
end
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
IRCEvent.add_handler('332', topic_proc)
|
36
|
+
IRCEvent.add_handler('topic', topic_proc)
|
37
|
+
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
attr_reader :nick, :server, :port
|
42
|
+
|
43
|
+
# Join a channel, adding it to the list of joined channels
|
44
|
+
def add_channel channel
|
45
|
+
join(channel)
|
46
|
+
self
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns a list of channels joined
|
50
|
+
def channels
|
51
|
+
@channels
|
52
|
+
end
|
53
|
+
|
54
|
+
# Alias for IRC.connect
|
55
|
+
def start
|
56
|
+
self.connect
|
57
|
+
end
|
58
|
+
|
59
|
+
# Open a connection to the server using the IRC Connect
|
60
|
+
# method. Events yielded from the IRCConnection handler are
|
61
|
+
# processed and then control is returned to IRCConnection
|
62
|
+
def connect
|
63
|
+
quithandler = lambda { send_quit(); IRCConnection.quit }
|
64
|
+
trap("INT", quithandler)
|
65
|
+
trap("TERM", quithandler)
|
66
|
+
|
67
|
+
IRCConnection.handle_connection(@server, @port, @nick, @realname) do
|
68
|
+
# Log in information moved to IRCConnection
|
69
|
+
threads = []
|
70
|
+
IRCConnection.main do |event|
|
71
|
+
threads << Thread.new(event) {|localevent|
|
72
|
+
localevent.process
|
73
|
+
}
|
74
|
+
end
|
75
|
+
threads.each {|thr| thr.join }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Joins a channel on a server.
|
80
|
+
def join(channel)
|
81
|
+
if (IRCConnection.send_to_server("JOIN #{channel}"))
|
82
|
+
@channels.push(IRCChannel.new(channel));
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Leaves a channel on a server
|
87
|
+
def part(channel)
|
88
|
+
if (IRCConnection.send_to_server("PART #{channel}"))
|
89
|
+
@channels.delete_if {|chan| chan.name == channel }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# kicks a user from a channel (does not check for operator privledge)
|
94
|
+
def kick(channel, user, message)
|
95
|
+
IRCConnection.send_to_server("KICK #{channel} #{user} :#{message || user || 'kicked'}")
|
96
|
+
end
|
97
|
+
|
98
|
+
# sets the topic of the given channel
|
99
|
+
def set_topic(channel, topic)
|
100
|
+
IRCConnection.send_to_server("TOPIC #{channel} :#{topic}");
|
101
|
+
end
|
102
|
+
|
103
|
+
# Sends a private message, or channel message
|
104
|
+
def send_message(to, message)
|
105
|
+
IRCConnection.send_to_server("privmsg #{to} :#{message}");
|
106
|
+
end
|
107
|
+
|
108
|
+
# Sends a notice
|
109
|
+
def send_notice(to, message)
|
110
|
+
IRCConnection.send_to_server("NOTICE #{to} :#{message}");
|
111
|
+
end
|
112
|
+
|
113
|
+
# performs an action
|
114
|
+
def send_action(to, action)
|
115
|
+
send_ctcp(to, 'ACTION', action);
|
116
|
+
end
|
117
|
+
|
118
|
+
# send CTCP
|
119
|
+
def send_ctcp(to, type, message)
|
120
|
+
IRCConnection.send_to_server("privmsg #{to} :\001#{type} #{message}");
|
121
|
+
end
|
122
|
+
|
123
|
+
# Quits the IRC Server
|
124
|
+
def send_quit
|
125
|
+
IRCConnection.send_to_server("QUIT : Quit ordered by user")
|
126
|
+
end
|
127
|
+
|
128
|
+
# Ops selected user.
|
129
|
+
def op(channel, user)
|
130
|
+
IRCConnection.send_to_server("MODE #{channel} +o #{user}")
|
131
|
+
end
|
132
|
+
|
133
|
+
# Changes the current nickname
|
134
|
+
def ch_nick(nick)
|
135
|
+
IRCConnection.send_to_server("NICK #{nick}")
|
136
|
+
@nick = nick
|
137
|
+
end
|
138
|
+
|
139
|
+
# Removes operator status from a user
|
140
|
+
def deop(channel, user)
|
141
|
+
IRCConnection.send_to_server("MODE #{channel} -o #{user}")
|
142
|
+
end
|
143
|
+
|
144
|
+
# Changes target users mode
|
145
|
+
def mode(channel, user, mode)
|
146
|
+
IRCConnection.send_to_server("MODE #{channel} #{mode} #{user}")
|
147
|
+
end
|
148
|
+
|
149
|
+
# Retrievs user information from the server
|
150
|
+
def get_user_info(user)
|
151
|
+
IRCConnection.send_to_server("WHO #{user}")
|
152
|
+
end
|
153
|
+
end
|
data/lib/IRCConnection.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
|
2
2
|
# Handles connection to IRC Server
|
3
3
|
class IRCConnection
|
4
|
-
@@quit
|
5
|
-
@@readsockets
|
6
|
-
@@
|
4
|
+
@@quit = 0
|
5
|
+
@@readsockets = Array.new(0)
|
6
|
+
@@output_buffer = Array.new(0)
|
7
|
+
@@events = Hash.new()
|
8
|
+
@@last_send = Time.now.to_f
|
9
|
+
@@message_delay = 0.2 # Default delay to 1 fifth of a second.
|
7
10
|
# Creates a socket connection and then yields.
|
8
11
|
def IRCConnection.handle_connection(server, port, nick='ChangeMe', realname='MeToo' )
|
9
12
|
@server = server;
|
@@ -45,6 +48,12 @@ class IRCConnection
|
|
45
48
|
@@socket.write(line + "\n")
|
46
49
|
end
|
47
50
|
|
51
|
+
# Adds data an output buffer. This let's us keep a handle on how
|
52
|
+
# fast we send things. Yay.
|
53
|
+
def IRCConnection.output_push(line)
|
54
|
+
@@output_buffer.push(line)
|
55
|
+
end
|
56
|
+
|
48
57
|
# This loop monitors all IO_Sockets IRCConnection controls
|
49
58
|
# (including the IRC socket) and yields events to the IO_Sockets
|
50
59
|
# event handler.
|
@@ -59,24 +68,38 @@ class IRCConnection
|
|
59
68
|
# Makes one single loop pass, checking all sockets for data to read,
|
60
69
|
# and yields the data to the sockets event handler.
|
61
70
|
def IRCConnection.do_one_loop
|
62
|
-
read_sockets = select(@@readsockets, nil, nil,
|
63
|
-
read_sockets
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
+
read_sockets = select(@@readsockets, nil, nil, 0.1);
|
72
|
+
if !read_sockets.nil?
|
73
|
+
read_sockets[0].each {|sock|
|
74
|
+
if sock.eof? && sock == @@socket
|
75
|
+
p "Detected Socket Close"
|
76
|
+
remove_IO_socket(sock)
|
77
|
+
sleep 10
|
78
|
+
handle_connection(@server, @port, @nick, @realname)
|
79
|
+
else
|
80
|
+
yield @@events[sock.to_i].call(sock)
|
81
|
+
end
|
82
|
+
}
|
83
|
+
end
|
84
|
+
if @@output_buffer.length > 0
|
85
|
+
timer = Time.now.to_f
|
86
|
+
if (timer > @@last_send + @@message_delay)
|
87
|
+
message = @@output_buffer.shift();
|
88
|
+
if !message.nil?
|
89
|
+
IRCConnection.send_to_server(message);
|
90
|
+
@@last_send = timer
|
91
|
+
end
|
71
92
|
end
|
72
|
-
|
93
|
+
end
|
73
94
|
end
|
74
95
|
|
75
96
|
# Ends connection to the irc server
|
76
97
|
def IRCConnection.quit
|
77
98
|
@@quit = 1
|
78
99
|
end
|
79
|
-
|
100
|
+
def IRCConnection.delay=(delay)
|
101
|
+
@@message_delay = delay.to_f
|
102
|
+
end
|
80
103
|
# Retrieves user info from the server
|
81
104
|
def IRCConnection.get_user_info(user)
|
82
105
|
IRCConnection.send_to_server("WHOIS #{user}")
|
@@ -88,7 +111,7 @@ class IRCConnection
|
|
88
111
|
@@events[socket.to_i] = event_generator
|
89
112
|
end
|
90
113
|
|
91
|
-
def IRCConnection.remove_IO_socket(
|
114
|
+
def IRCConnection.remove_IO_socket(sock)
|
92
115
|
sock.close
|
93
116
|
@@readsockets.delete_if {|item| item == sock }
|
94
117
|
end
|
@@ -0,0 +1,97 @@
|
|
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, nick='ChangeMe', realname='MeToo' )
|
9
|
+
@server = server;
|
10
|
+
@port = port
|
11
|
+
@nick = nick
|
12
|
+
@realname = realname
|
13
|
+
socket = create_tcp_socket(server, port)
|
14
|
+
add_IO_socket(socket) {|sock|
|
15
|
+
begin
|
16
|
+
IRCEvent.new(sock.readline.chomp)
|
17
|
+
rescue Errno::ECONNRESET
|
18
|
+
# Catches connection reset by peer, attempts to reconnect
|
19
|
+
# after sleeping for 10 second.
|
20
|
+
remove_IO_socket(sock)
|
21
|
+
sleep 10
|
22
|
+
handle_connection(@server, @port, @nick, @realname)
|
23
|
+
end
|
24
|
+
}
|
25
|
+
send_to_server "NICK #{nick}"
|
26
|
+
send_to_server "USER #{nick} 8 * :#{realname}"
|
27
|
+
if block_given?
|
28
|
+
yield
|
29
|
+
@@socket.close
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def IRCConnection.create_tcp_socket(server, port)
|
34
|
+
@@socket = TCPsocket.open(server, port)
|
35
|
+
if block_given?
|
36
|
+
yield
|
37
|
+
@@socket.close
|
38
|
+
return
|
39
|
+
end
|
40
|
+
return @@socket
|
41
|
+
end
|
42
|
+
|
43
|
+
# Sends a line of text to the server
|
44
|
+
def IRCConnection.send_to_server(line)
|
45
|
+
@@socket.write(line + "\n")
|
46
|
+
end
|
47
|
+
|
48
|
+
# This loop monitors all IO_Sockets IRCConnection controls
|
49
|
+
# (including the IRC socket) and yields events to the IO_Sockets
|
50
|
+
# event handler.
|
51
|
+
def IRCConnection.main
|
52
|
+
while(@@quit == 0)
|
53
|
+
do_one_loop { |event|
|
54
|
+
yield event
|
55
|
+
}
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Makes one single loop pass, checking all sockets for data to read,
|
60
|
+
# and yields the data to the sockets event handler.
|
61
|
+
def IRCConnection.do_one_loop
|
62
|
+
read_sockets = select(@@readsockets, nil, nil, nil);
|
63
|
+
read_sockets[0].each {|sock|
|
64
|
+
if sock.eof? && sock == @@socket
|
65
|
+
p "Detected Socket Close"
|
66
|
+
remove_IO_socket(sock)
|
67
|
+
sleep 10
|
68
|
+
handle_connection(@server, @port, @nick, @realname)
|
69
|
+
else
|
70
|
+
yield @@events[sock.to_i].call(sock)
|
71
|
+
end
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
75
|
+
# Ends connection to the irc server
|
76
|
+
def IRCConnection.quit
|
77
|
+
@@quit = 1
|
78
|
+
end
|
79
|
+
|
80
|
+
# Retrieves user info from the server
|
81
|
+
def IRCConnection.get_user_info(user)
|
82
|
+
IRCConnection.send_to_server("WHOIS #{user}")
|
83
|
+
end
|
84
|
+
|
85
|
+
# Adds a new socket to the list of sockets to monitor for new data.
|
86
|
+
def IRCConnection.add_IO_socket(socket, &event_generator)
|
87
|
+
@@readsockets.push(socket)
|
88
|
+
@@events[socket.to_i] = event_generator
|
89
|
+
end
|
90
|
+
|
91
|
+
def IRCConnection.remove_IO_socket(socket)
|
92
|
+
sock.close
|
93
|
+
@@readsockets.delete_if {|item| item == sock }
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
|
data/lib/IRCEvent.rb
CHANGED
@@ -40,7 +40,8 @@ class IRCEvent
|
|
40
40
|
@from = @stats[0]
|
41
41
|
@user = IRCUser.create_user(@from)
|
42
42
|
end
|
43
|
-
|
43
|
+
# FIXME: this list would probably be more accurate to exclude commands than to include them
|
44
|
+
@hostmask = @stats[1] if %W(topic privmsg join).include? @event_type
|
44
45
|
@channel = @stats[3] if @stats[3] && !@channel
|
45
46
|
@target = @stats[5] if @stats[5]
|
46
47
|
@mode = @stats[4] if @stats[4]
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.
|
2
|
+
rubygems_version: 0.9.0
|
3
3
|
specification_version: 1
|
4
4
|
name: Ruby-IRC
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.0.
|
7
|
-
date:
|
6
|
+
version: 1.0.10
|
7
|
+
date: 2007-11-07 00:00:00 -08:00
|
8
8
|
summary: An IRC Client library
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -25,16 +25,19 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
25
25
|
platform: ruby
|
26
26
|
signing_key:
|
27
27
|
cert_chain:
|
28
|
+
post_install_message:
|
28
29
|
authors:
|
29
30
|
- Chris Boyer
|
30
31
|
files:
|
31
32
|
- lib/IRCEvent.rb
|
32
33
|
- lib/IRC.rb
|
34
|
+
- lib/IRC.rb.~1.8.~
|
33
35
|
- lib/IRCChannel.rb
|
34
36
|
- lib/IRCConnection.rb
|
35
37
|
- lib/IRCUser.rb
|
36
38
|
- lib/IRCUtil.rb
|
37
39
|
- lib/eventmap.yml
|
40
|
+
- lib/IRCConnection.rb.~1.4.~
|
38
41
|
- README
|
39
42
|
test_files: []
|
40
43
|
|