Introduction
In this blog post, we’ll walk through the steps of creating an Internet Relay Chat (IRC) server using the Ruby programming language. IRC is a protocol for real-time communication over the internet, and is often used for chat rooms and online communities.
Prerequisites
Before we get started, you’ll need to have a few things installed on your machine:
- Ruby: You’ll need to have Ruby installed on your machine to follow along with this tutorial. If you don’t already have Ruby installed, you can download it from the official website (https://www.ruby-lang.org/en/downloads/) or use a package manager like Homebrew (for macOS) or apt-get (for Linux).
- Bundler: We’ll be using Bundler to manage our dependencies, so you’ll need to have it installed as well. You can install it by running
gem install bundler
on the command line.
Step 1: Set up the project
First, let’s create a new directory for our project and navigate to it in the terminal. We’ll call our project “irc-server”:
$ mkdir irc-server
$ cd irc-server
Next, let’s create a Gemfile to manage our dependencies. This file will specify the libraries we need for our project, and Bundler will handle installing them for us.
Create a new file called Gemfile
in the irc-server
directory and add the following contents:
source "https://rubygems.org"
gem "eventmachine"
gem "em-irc"
The eventmachine
and em-irc
gems will provide us with the necessary tools to build our IRC server.
Step 2: Write the server code
Now that we have our dependencies set up, let’s start building the actual server. Create a new file called server.rb
in the irc-server
directory and add the following code:
# Load the necessary libraries
require "eventmachine"
require "em-irc"
# Define the server hostname and port
HOSTNAME = "localhost"
PORT = 6667
# Create a new instance of the IRC server
EventMachine.run do
# Set up the connection
EventMachine::IRC::Server.new do
# Set the hostname and port
hostname HOSTNAME
port PORT
# When a client connects...
on :connect do |client|
puts "Client #{client.inspect} connected"
end
# When a client disconnects...
on :disconnect do |client|
puts "Client #{client.inspect} disconnected"
end
# When a client sends a message...
on :privmsg do |client, message|
puts "Client #{client.inspect} sent message: #{message}"
end
end
end
This code sets up a new instance of an IRC server using the EventMachine
and em-irc
libraries. It listens for connections on the specified hostname and port (in this case, localhost
and 6667
), and logs messages when a client connects, disconnects, or sends a message.
Step 3: Start the server
To start the server, simply run the server.rb
file from the command line:
$ ruby server.rb
You should see a message in the terminal indicating that the server is listening on the specified hostname and port.
Now that the server is running, you can connect to it using an IRC client. Some popular IRC clients include mIRC (for Windows) and HexChat (for macOS and Linux).
To connect to the server using an IRC client, simply enter the hostname and port (in this case, localhost
and 6667
) in the client’s connection settings. Once connected, you should be able to join channels and start chatting with other users.
Relaying chat messages
To relay chat messages using em-irc
and Ruby, you can use the on :privmsg
event to listen for messages from clients and the send_raw
method to send messages to clients.
Here’s an example of how you can implement channels in your IRC server:
# Load the necessary libraries
require "eventmachine"
require "em-irc"
# Define the server hostname and port
HOSTNAME = "localhost"
PORT = 6667
# Create a new instance of the IRC server
EventMachine.run do
# Set up the connection
EventMachine::IRC::Server.new do
# Set the hostname and port
hostname HOSTNAME
port PORT
# When a client connects...
on :connect do |client|
puts "Client #{client.inspect} connected"
end
# When a client disconnects...
on :disconnect do |client|
puts "Client #{client.inspect} disconnected"
end
# When a client sends a message...
on :privmsg do |client, message|
# Split the message into command and parameters
command, *params = message.split(" ")
# If the command is "JOIN"
if command == "JOIN"
# Get the channel name
channel = params[0]
# Join the channel
client.send_raw("JOIN #{channel}")
With these basic building blocks, you can start building your own custom IRC server and chat application.
# Send a message to the channel announcing the client's presence
client.send_raw("PRIVMSG #{channel} :#{client.nick} has joined the channel")
# If the command is "PRIVMSG"
elsif command == "PRIVMSG"
# Get the target (either a channel or a user) and the message
target, message = params[0], params[1..-1].join(" ")
# Relay the message to the target
client.send_raw("PRIVMSG #{target} :#{message}")
end
end
end
end
In this code, we listen for messages from clients using the on :privmsg
event. If the message is a JOIN
command, we add the client to the specified channel and send a message announcing their presence. If the message is a PRIVMSG
command, we relay the message to the specified target (either a channel or a user).
Conclusion
In this tutorial, we learned how to create an IRC server using Ruby and the eventmachine
and em-irc
libraries. We set up the project, wrote the server code, and started the server, and were able to connect to it using an IRC client. With these basic building blocks, you can build more advanced features such as channel moderation, user lists, and more.