Skip to content

Instantly share code, notes, and snippets.

@Nakilon

Nakilon/.rb Secret

Last active May 7, 2023 22:00
Show Gist options
  • Save Nakilon/8b019e2ecb3e052b11c1a09657c90e11 to your computer and use it in GitHub Desktop.
Save Nakilon/8b019e2ecb3e052b11c1a09657c90e11 to your computer and use it in GitHub Desktop.
irc socket loop
require "socket"
socket = Module.new do
@server = server
@port = port
@socket = nil
def self.rescue_socket
yield
rescue SocketError, Errno::ENETDOWN, Errno::ENETUNREACH
@socket = nil
sleep 5
retry
end
private_class_method :rescue_socket
def self.socket
@socket ||= rescue_socket do
TCPSocket.new(@server, @port)
end
end
private_class_method :socket
@buffer = ""
def self.read
until i = @buffer.index(?\n)
@buffer.concat( rescue_socket do
return unless select [socket], nil, nil, 1
@socket.read(@socket.nread).tap{ |_| raise SocketError if _.empty? }
end )
end
@buffer.slice!(0..i).chomp
end
def self.write str
socket.send str + "\n", 0
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment