Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env ruby
- require 'socket'
- # Don't allow use of "tainted" data by potentially dangerous operations
- $SAFE=1
- # The irc class, which talks to the server
- # and holds the main event loop
- class Irc
- def initialize(server, port, nick, channel)
- @server = server
- @port = port
- @nick = nick
- @channel = channel
- end
- def send(s)
- # sends a message to the irc server and print
- # it to the screen
- puts "--> #{s}"
- @irc.send "#{s}\n", 0
- end
- def connect()
- # Connect to the irc server
- @irc = TCPSocket.open(@server, @port)
- send "User blah blah blah :blah blah"
- send "NICK #{@nick}"
- send "JOIN #{@channel}"
- end
- def evaluate(s)
- if s =~ /^[-+*\/\d\s\eE.()]*$/ then
- begin
- s.untaint
- return eval(s).to_s
- rescue Exception => detail
- puts detail.message()
- end
- end
- return "Error"
- end
- def handle_server_input(s)
- case s.strip
- when/^PING :(.+)$/i
- puts "[ Server ping]"
- send "PONG :#{$1}"
- when /^:(.+?)!(.+?)@(.+?)\sPRIVMSG\s.+\s:[\001]PING (.+)[\001]$/i
- puts "[ CTCP PING from #{$1}!#{$2}@#{$3} ]"
- send "NOTICE #{$1} :\001VERSION Ruby-irc v0.042\001"
- when /^:(.+?)!(.+?)@(.+?)\sPRIVMSG\s(.+)\s:EVAL (.+)$/i
- puts "[ EVAL #{$5} from #{$1}!#{$2}@#{$3} ]"
- send "PRIVMSG #{(($4==@nick)?$1:$4)} :#{evaluate($5)}"
- else
- puts s
- end
- end
- def main_loop()
- #Just keep on truckin
- while true
- ready = select([@irc, $stdin], nil, nil, nil)
- next if !ready
- for s in ready[0]
- if s == $stdin then
- return if $stdin.eof
- s = $stdin.gets
- send s
- elsif s == @irc then
- return if @irc.eof
- s = @irc.gets
- handle_server_input(s)
- end
- end
- end
- end
- end
- # Main Program If we get an exception print and keep going
- # WE DO NOT WANT TO DISCONNECT UNEXPECTEDLY!
- irc = Irc.new('irc.paraphysics.net', 6667, 'addyracerb0t1', '#ironflag')
- irc.connect()
- begin
- irc.main_loop()
- rescue Interrupt
- rescue Exception => detail
- puts detail.message()
- print detail.backtrace.join("\n")
- retry
- end
Advertisement
Add Comment
Please, Sign In to add comment