-
Notifications
You must be signed in to change notification settings - Fork 0
/
ircclient.rb
115 lines (105 loc) · 2.99 KB
/
ircclient.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
require 'socket'
require 'thread'
class IrcClient
attr_reader :nickname, :channel, :server, :port, :socket
attr_accessor :log, :nickauth
def initialize (nickname, channel, server, port, log=false)
@nickname = nickname
@channel = channel
@server = server
@port = port
@log = LogWriter.new(log)if log
end
#
# Creates a connection to irc-server and
# starts the messageparser
#
def connect
begin
@socket = TCPSocket.open(@server, @port)
@socket.puts 'USER '+@nickname+' * irc.freenode.net :'+@nickname
@socket.puts 'NICK '+@nickname
if @nickauth
@socket.puts "PRIVMSG NickServ :identify "+@nickauth
sleep 3
end
@socket.puts 'JOIN '+@channel
#TODO Do the encoding right!!
while line = @socket.gets.chop
begin
@socket.puts 'PONG' if line.start_with? 'PING'
p line if DEBUG
retString = parseMessage line
@log.write retString if (!retString.nil? && @log)
rescue Exception=>e
puts "<Time="+Time.now.to_s + "> " + e.to_s + " " + e.backtrace.to_s
end
end
rescue Exception=>e
puts "<Time="+Time.now.to_s + "> " + e.to_s + " " + e.backtrace.to_s
ensure
disconnect
end
end
#
# Method to close open sockets and end all running threads
#
def disconnect
if !@socket.nil?
@socket.puts "PRIVMSG "+CHANNEL+" :Good night, and good luck."
@socket.flush
sleep 1
@socket.close
@socket = nil
end
end
#
# This method unterstands what the IRC-Server sends
# responds correctly or calls the logwriter
#
def parseMessage input
action = input.split[1]
nickname = input.split(':')[1].split('!')[0]
msg = ''
unless input.split(' :').nil?
payload = input.slice(input.split(' :')[0].length + 2, input.length - input.split(' :')[0].length + 2)
end
case input.split[1]
when 'PRIVMSG'
if input.split[2] == @channel then
if payload.start_with?(["\x01"][0]+'ACTION') then
msg += '* ' + nickname + payload.delete(["\x01"][0]).delete(["\x01"][0]+'ACTION')
else
if payload.start_with?("!") then
msg = handleCommand payload, nickname
end
msg += '<'+nickname+'> ' + payload
end
elsif input.split[2] == @nickname then
# handleCommand input
end
when 'TOPIC'
msg += "! " + nickname + " has changed the topic: " + payload
when 'JOIN'
msg += "! " + nickname + " has joined."
when 'PART'
msg += "! " + nickname + " has left the channel."
msg += " (" + payload + ")" unless payload.nil? or payload.empty?
when 'QUIT'
msg += "! " + nickname + " has quit."
msg += " (" + payload + ")" unless payload.empty?
when 'KICK'
msg += "! " + input.split[3] + ' got kicked by ' + nickname
msg += " (" + payload + ")" unless payload.empty?
when 'NICK'
msg += "! " + nickname + " is now known as " + payload
when '353' ## NAMES List
msg += "! Users in channel: " + payload.split.sort.join(' ')
end
unless msg.empty?
msg = "["+("%02d"%Time.now.hour)+":"+("%02d"%Time.now.min)+":"+("%02d"%Time.now.sec)+"] "+msg
p msg if DEBUG
return msg
end
end
end