Что такое IRC?
IRC (Internet Relay Chat), созданный в начале 90-х годов, представляет собой систему синхронной коммуникации, позволяющую общаться в разных каналах (channels) и обмениваться информацией. Это виртуальное пространство, где собираются люди с общими интересами.
Почему IRC важен для разработчиков и программистов?
Поддержка сообщества Независимо от того, только ли вы начинаете программировать или уже опытный разработчик, IRC предоставляет место для вопросов, получения помощи и обмена знаниями.
Разнообразие тем Здесь можно найти каналы практически для каждого языка программирования и каждой области разработки. От Python до Java и C# и JavaScript — для каждого языка существует своя кмунитость.
Обсуждения в реальном времени В отличие от форумов или почтовых списков, IRC обеспечивает мгновенные ответы и дискуссии, что особенно полезно, когда нужна быстрая помощь с трудной задачей.
Построение сети контактов IRC отличное место для установления контактов и взаимодействия с единомышленниками со всего мира.
IRC и языки программирования
Python Python-разработчики используют IRC для обсуждения последних достижений и получения помощи по конкретным библиотекам.
Java Java-сообщества на IRC предоставляют поддержку и делятся best practices для всего, от Java SE до Java EE.
C# C#-разработчики находят на IRC каналы, сосредоточенные на .NET, ASP.NET и других технологиях Microsoft.
JavaScript С растущей популярностью веб-разработки и Node.js IRC становится идеальным местом для обсуждения JavaScript-фреймворков и frontend-технологий.
Как начать использовать IRC Для начала вам нужен IRC-клиент, например mIRC, HexChat или Irssi. После установки клиента подключитесь к IRC-сети, такой как Libera.Chat, EFnet или DALnet, и присоединитесь к каналам, соответствующим вашим интересам.
Если вас интересует тема IRC, посмотрите также эту страницу: IRC-Mania.de — ваш портал об IRC
Примеры ниже показывают, как на разных языках программирования установить простое TCP-соединение с IRC-сервером, зарегистрировать пользователя и присоединиться к каналу. Примеры намеренно простые и могут служить отправной точкой для собственного IRC-клиента или скрипта мониторинга.
Совет: Если вы хотите работать сразу с библиотеками и фреймворками, в статье IRC Bot Программирование: Фреймворки для Python, Node.js, Go и Rust найдёте подробное руководство по pydle, irc-framework, go-ircevent и Rust irc-crate.
Здесь вы найдёте и другие статьи о программировании для IRC.
Мы хотим показать вам, как просто подключиться к IRC-серверу практически на любом языке программирования. Как видно из примера IRC-BOT выше, вы можете расширить этот пример в бота для автоматизации многих операций.
Примеры кода: подключение к IRC-серверу на 10 языках
Python
import socket
import time
SERVER = "irc.IRC-Mania.net"
PORT = 6667
NICK = "MeinBot"
USER = "meinbot"
CHANNEL = "#test"
def connect():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((SERVER, PORT))
sock.sendall(f"NICK {NICK}\r\n".encode())
sock.sendall(f"USER {USER} 0 * :Mein einfacher Bot\r\n".encode())
time.sleep(2)
sock.sendall(f"JOIN {CHANNEL}\r\n".encode())
return sock
if __name__ == "__main__":
sock = connect()
while True:
data = sock.recv(1024).decode(errors="ignore")
if not data:
break
print(data.strip())
Объяснение: Пример использует модуль socket из стандартной библиотеки Python. Он открывает TCP-соединение с IRC-сервером, отправляет прозвище и идентификацию пользователя. После короткой паузы присоединяется к каналу и выводит все полученные данные в терминал.
C
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
int main() {
struct addrinfo hints = {0}, *res;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
getaddrinfo("irc.IRC-Mania.net", "6667", &hints, &res);
int sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
connect(sock, res->ai_addr, res->ai_addrlen);
freeaddrinfo(res);
char buffer[1024];
snprintf(buffer, sizeof(buffer), "NICK MeinBot\r\n");
send(sock, buffer, strlen(buffer), 0);
snprintf(buffer, sizeof(buffer), "USER meinbot 0 * :Mein einfacher Bot\r\n");
send(sock, buffer, strlen(buffer), 0);
sleep(2);
snprintf(buffer, sizeof(buffer), "JOIN #test\r\n");
send(sock, buffer, strlen(buffer), 0);
while (recv(sock, buffer, sizeof(buffer) - 1, 0) > 0) {
printf("%s", buffer);
memset(buffer, 0, sizeof(buffer));
}
close(sock);
return 0;
}
Объяснение: Пример на C использует API BSD-сокетов с getaddrinfo для разрешения имени хоста irc.IRC-Mania.net. Он создаёт TCP-сокет, подключается к серверу и отправляет команды регистрации IRC. После присоединения к каналу полученные сообщения выводятся в цикле.
C++
#include <iostream>
#include <boost/asio.hpp>
int main() {
try {
boost::asio::io_context io;
boost::asio::ip::tcp::socket socket(io);
boost::asio::ip::tcp::resolver resolver(io);
auto endpoints = resolver.resolve("irc.IRC-Mania.net", "6667");
boost::asio::connect(socket, endpoints);
auto send = [&](const std::string& msg) {
boost::asio::write(socket, boost::asio::buffer(msg + "\r\n"));
};
send("NICK MeinBot");
send("USER meinbot 0 * :Mein einfacher Bot");
std::this_thread::sleep_for(std::chrono::seconds(2));
send("JOIN #test");
char buffer[1024];
while (true) {
size_t len = socket.read_some(boost::asio::buffer(buffer));
std::cout.write(buffer, len);
}
} catch (std::exception& e) {
std::cerr << e.what() << std::endl;
}
return 0;
}
Объяснение: Пример на C++ использует Boost.Asio, широко используемую библиотеку для сетевых операций и асинхронного I/O. Он разрешает имя хоста, устанавливает соединение и отправляет команды IRC. Для чистых проектов C++20 можно использовать std::net из Networking TS, но он пока доступен не во всех компиляторах.
Java
import java.io.*;
import java.net.*;
public class IrcClient {
public static void main(String[] args) throws Exception {
String server = "irc.IRC-Mania.net";
int port = 6667;
String nick = "MeinBot";
String channel = "#test";
try (Socket socket = new Socket(server, port);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
out.println("NICK " + nick);
out.println("USER meinbot 0 * :Mein einfacher Bot");
Thread.sleep(2000);
out.println("JOIN " + channel);
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
}
}
}
Объяснение: Пример на Java использует java.net.Socket и потоки для входа и выхода. Он отправляет команды с помощью PrintWriter и читает ответы с помощью BufferedReader. Блок try-with-resources гарантирует, что соединение автоматически закроется в конце.
Node.js / JavaScript
const net = require('net');
const client = net.createConnection({ host: 'irc.IRC-Mania.net', port: 6667 }, () => {
console.log('Verbunden');
client.write('NICK MeinBot\r\n');
client.write('USER meinbot 0 * :Mein einfacher Bot\r\n');
setTimeout(() => {
client.write('JOIN #test\r\n');
}, 2000);
});
client.on('data', (data) => {
console.log(data.toString());
});
client.on('end', () => {
console.log('Verbindung geschlossen');
});
Пояснение: В примере Node.js используется модуль net. После установления соединения отправляются команды NICK и USER. Через две секунды происходит вход в канал. Входящие данные выводятся строками в консоль. Для браузерных приложений можно использовать WebSockets или IRC-прокси.
Rust
use std::io::{Read, Write};
use std::net::TcpStream;
use std::thread;
use std::time::Duration;
fn main() -> std::io::Result<()> {
let mut stream = TcpStream::connect("irc.IRC-Mania.net:6667")?;
stream.write_all(b"NICK MeinBot\r\n")?;
stream.write_all(b"USER meinbot 0 * :Mein einfacher Bot\r\n")?;
thread::sleep(Duration::from_secs(2));
stream.write_all(b"JOIN #test\r\n")?;
let mut buffer = [0u8; 1024];
loop {
let len = stream.read(&mut buffer)?;
if len == 0 {
break;
}
print!("{}", String::from_utf8_lossy(&buffer[..len]));
}
Ok(())
}
Пояснение: Пример на Rust использует std::net::TcpStream из стандартной библиотеки. Программа устанавливает соединение, отправляет IRC-команды и в цикле читает ответы. Функция String::from_utf8_lossy позволяет выводить даже неполные или повреждённые UTF-8-последовательности.
Go
package main
import (
"bufio"
"fmt"
"net"
"time"
)
func main() {
conn, err := net.Dial("tcp", "irc.IRC-Mania.net:6667")
if err != nil {
panic(err)
}
defer conn.Close()
fmt.Fprintln(conn, "NICK MeinBot")
fmt.Fprintln(conn, "USER meinbot 0 * :Mein einfacher Bot")
time.Sleep(2 * time.Second)
fmt.Fprintln(conn, "JOIN #test")
reader := bufio.NewReader(conn)
for {
line, err := reader.ReadString('\n')
if err != nil {
break
}
fmt.Print(line)
}
}
Пояснение: Пример на Go использует net.Dial и bufio.Reader. Функция fmt.Fprintln автоматически добавляет символ новой строки, который IRC-сервер ожидает в качестве признака конца строки. Оператор defer conn.Close() гарантирует закрытие соединения при выходе из программы.
C#
using System;
using System.IO;
using System.Net.Sockets;
using System.Threading;
class IrcClient
{
static void Main()
{
using var client = new TcpClient("irc.IRC-Mania.net", 6667);
using var stream = client.GetStream();
using var reader = new StreamReader(stream);
using var writer = new StreamWriter(stream) { AutoFlush = true };
writer.WriteLine("NICK MeinBot");
writer.WriteLine("USER meinbot 0 * :Mein einfacher Bot");
Thread.Sleep(2000);
writer.WriteLine("JOIN #test");
while (!reader.EndOfStream)
{
Console.WriteLine(reader.ReadLine());
}
}
}
Пояснение: Пример на C# использует TcpClient и обёртки потоков StreamReader/StreamWriter. Свойство AutoFlush = true гарантирует, что каждая строка сразу отправляется на сервер. Конструкция using обеспечивает корректное освобождение ресурсов.
Ruby
require 'socket'
server = 'irc.IRC-Mania.net'
port = 6667
nick = 'MeinBot'
channel = '#test'
socket = TCPSocket.new(server, port)
socket.puts "NICK #{nick}"
socket.puts "USER meinbot 0 * :Mein einfacher Bot"
sleep 2
socket.puts "JOIN #{channel}"
while line = socket.gets
puts line
end
socket.close
Пояснение: Ruby-пример использует TCPSocket из стандартной библиотеки. Метод puts автоматически добавляет символ новой строки при отправке. Цикл читает входящие строки до закрытия соединения. Ruby хорошо подходит для быстрого прототипирования и скриптов автоматизации.
PHP
<?php
$server = 'irc.IRC-Mania.net';
$port = 6667;
$nick = 'MeinBot';
$channel = '#test';
$socket = fsockopen($server, $port);
if (!$socket) {
die("Verbindung fehlgeschlagen\n");
}
fwrite($socket, "NICK $nick\r\n");
fwrite($socket, "USER meinbot 0 * :Mein einfacher Bot\r\n");
sleep(2);
fwrite($socket, "JOIN $channel\r\n");
while (!feof($socket)) {
echo fgets($socket, 1024);
}
fclose($socket);
Пояснение: Пример на PHP использует fsockopen для создания TCP-соединения. Функция fwrite отправляет IRC-команды, а fgets читает ответы построчно. Хотя PHP редко применяется для IRC-клиентов, он полезен в сценариях мониторинга и веб-интеграции.
IRC-Bouncer: идеи для программирования и актуальные решения
IRC-Bouncer это программа, которая постоянно подключена к IRC-серверу и работает как посредник между сервером и твоим клиентом. Вместо прямого подключения с ноутбука или телефона к IRC-сети, ты соединяешься с bouncer’ом. Он поддерживает соединение с сервером, сохраняет сообщения с периода, когда ты был в сети, и позволяет одновременно переписываться с нескольких устройств.
Что можно разработать на основе bouncer’а?
- Хранение истории: Сохраняй все сообщения каналов и личные сообщения в базе данных или файле, чтобы после переподключения можно было прочитать пропущенные сообщения.
- Веб-интерфейс: Создай простой веб-интерфейс для управления каналами, сообщениями и настройками прямо в браузере.
- Push-уведомления: Отправляй оповещения по электронной почте, в мессенджеры или на мобильные устройства, когда упоминается твой ник или приходит личное сообщение.
- Логирование и архив: Разработай поиск по старым логам с фильтрацией по каналу, дате или пользователю.
- Поддержка нескольких пользователей: Создай bouncer, обслуживающий одновременно несколько пользователей со своими никнеймами и каналами.
- TLS-прокси: Зашифруй соединение между клиентом и bouncer’ом, даже если сервер использует открытое соединение.
- Интеграция с bot’ами: Объедини bouncer и бота так, чтобы bouncer одновременно выполнял автоматизированные команды.
Популярные решения для bouncer
- ZNC: Самый известный и гибкий IRC-bouncer. Предлагает модули, логирование, поддержку нескольких пользователей и большое сообщество.
- The Lounge: Современный веб-ориентированный IRC-клиент и bouncer в одном. Работает в браузере и хранит историю на сервере.
- Soju: Компактный bouncer для разработчиков и технических пользователей, хорошо интегрируется в собственные настройки.
- pounce: Лёгкий bouncer с акцентом на простоту и многопользовательскую эксплуатацию.
- Quassel: Распределённый IRC-клиент, у которого core постоянно подключён, а различные клиенты подсоединяются позже.
Если ты хочешь установить или купить bouncer, на IRC-Mania.de/bouncer найдёшь инструкции по установке и текущие предложения.
Важные замечания к примерам
- Замени
MeinBot,meinbotи#testна свои значения. - Порт
6667— стандартный порт для незашифрованных IRC-соединений. Для TLS используй порт6697и зашифрованное соединение. - Многие серверы требуют адрес электронной почты или регистрацию для постоянных никнеймов. Детали уточни на сайте выбранной IRC-сети.
- Для полноценного IRC-клиента ещё нужны функции обработки PING-PONG, отправка сообщений, обработка ошибок и TLS.
Больше руководств, списки серверов и советы по IRC ты найдёшь на IRC-Mania.de.
Что такое IRCD и IRC-сервер?
IRCD расшифровывается как IRC Daemon и представляет собой серверное ПО, которое управляет IRC-сетью. IRCD принимает соединения от клиентов, управляет каналами и пользователями, а также маршрутизирует сообщения на другие серверы в той же сети. Без IRCD не может существовать IRC-сеть, так как он реализует протокол и координирует коммуникацию.
IRCD обычно пишут на системных языках, которые обеспечивают высокую производительность и поддержку множественных соединений:
- C: UnrealIRCd, Bahamut, Hybrid, ircd-ratbox, Charybdis, ircd-seven
- C++: InspIRCd, Anope (Services)
- Go: Ergo (ранее Oragono), современный IRCD с встроенными services и функциями, похожими на Matrix
- Rust: Несколько экспериментальных и современных реализаций
- Java: Отдельные старые или специализированные серверные проекты
Самые известные IRCD сегодня — это UnrealIRCd и InspIRCd, потому что они гибкие, широко распространённые и хорошо документированные. Bahamut долго был серверной основой DALnet. Ergo особенно интересен для новых проектов, так как уже встроены регистрация никнеймов и каналов.
Подробнее о разных IRCD, их установке и различиях читай на IRC-Mania.de/ircds.
Основные режимы IRC-канала
Режимы канала — это переключатели, которые определяют поведение пользователей в канале. Они устанавливаются командой MODE #kanal +.... Конкретные режимы могут слегка различаться между IRCD, но перечисленные ниже поддерживаются практически везде:
- +t (Topic-Lock): Только операторы канала могут изменять тему. Это предотвращает изменение темы обычными пользователями.
- +n (No External Messages): Пользователи вне канала не могут отправлять сообщения в канал. Так коммуникация ограничивается только членами канала.
- +m (Moderated): Писать в канал могут только пользователи со статусом оператора или голоса. Остальные только читают.
- +i (Invite-only): Канал видим и доступен только приглашённым пользователям. Присоединение требует команды
INVITE. - +k (Key): Канал защищен паролем. Присоединиться можно только с паролем:
JOIN #kanal Пароль. - +l (Limit): Ограничивает максимальное количество пользователей в канале. Дополнительные пользователи смогут присоединиться, только когда освободится место.
- +s (Secret): Канал скрыт и не отображается в общих списках.
WHOISтакже его не показывает. - +p (Private): Канал отмечен как приватный. Похож на +s, но может отображаться в списках с неполной информацией.
- +b (Ban): Блокирует присоединение определённых пользователей. Баны работают с масками вроде
*!*@host. - +v (Voice): Даёт пользователю право писать в модерируемом канале (+m). В чате пользователь отмечается знаком
+перед именем. - +o (Operator): Делает пользователя оператором канала. Операторы могут устанавливать баны, кикать пользователей, менять тему и управлять режимами. Они отмечаются знаком
@перед именем. - +r (Registered only): В канал могут войти только зарегистрированные и авторизованные пользователи.
- +c (No Colors): Блокирует цветное форматирование в канале для улучшения читаемости.
- +C (No CTCP): Блокирует CTCP-запросы к каналу, чтобы предотвратить злоупотребления типа CTCP-флуда.
- +N (No Nickchanges): Пользователи в канале не могут менять свой никнейм, пока находятся в канале.
- +u (No Unregistered): Только зарегистрированные пользователи могут писать и присоединяться к каналу.
- +z (Op-only messages): Сообщения от забанённых или отмьюченных пользователей видны только операторам.
- +O (Oper only): Только сетевые операторы могут присоединиться к каналу.
- +M (Registered speak): Только зарегистрированные пользователи могут писать в канал, но незарегистрированные могут присоединиться и читать.
Полный список всех режимов IRCD-канала с описаниями ты найдёшь на IRC-Mania.de/alle-ircd-channelmodes-deutsch.
IRC-Services: Anope, Atheme и другие
IRC-Services — это сервисы, которые работают отдельно от IRCD и предоставляют функции, которые сам IRCD не имеет. Самые известные services — это регистрация никнеймов и каналов, аутентификация и административные инструменты.
Основные пакеты IRC-Services:
- Anope: Самый распространённый пакет services. Включает NickServ, ChanServ, HostServ, MemoServ и OperServ. Написан на C++ и поддерживает множество IRCD.
- Atheme: Альтернативный, современный пакет services с акцентом на безопасность и гибкость. Содержит NickServ, ChanServ, HostServ и GroupServ.
- BitlBee: Специальный сервис, использующий IRC как шлюз к другим протоколам чата вроде XMPP, Matrix или Mastodon. Его можно также использовать как IRC-bouncer.
- ChatServices: Старый пакет services, который сегодня редко развёртывается для новых сетей.
- IRCServices: Ещё один исторический пакет, служивший основой для более поздних разработок.
Типичные сервисные аккаунты:
- NickServ: Управляет регистрацией и входом в никнеймы.
- ChanServ: Управляет регистрацией канала, правами, режимами и темой.
- HostServ: Выдаёт виртуальные хосты или vhosts.
- MemoServ: Позволяет оставлять сообщения для других пользователей.
- OperServ: Административные инструменты для сетевых операторов.
Обзор текущих IRC-Services, их установку и различия найдёшь на IRC-Mania.de/ircservices.
Основные IRC-команды
IRC управляется текстовыми командами. Вот самые важные команды для пользователей, разработчиков и администраторов:
- /connect или /server: Подключение к IRC-серверу.
- /nick: Смена никнейма.
- /user: Отправка информации о пользователе при входе, обычно автоматически от клиента.
- /join: Присоединение к каналу, например
/join #kanal. - /part: Выход из канала, опционально с причиной
/part #kanal До свидания. - /quit: Разрыв соединения с сервером, опционально с сообщением.
- /msg или /privmsg: Отправка приватного сообщения пользователю или каналу.
- /notice: Отправка сообщения, которое не требует ответа, часто для автоматических уведомлений.
- /whois: Вывод информации о пользователе.
- /whowas: Вывод информации о недавно использовавшемся никнейме.
- /mode: Установка режимов для пользователя или канала, например
/mode #kanal +o Nickname. - /topic: Установка или просмотр темы канала.
- /kick: Удаление пользователя из канала, только для операторов.
- /ban: Установка бана, обычно через ChanServ или
/mode #kanal +b Маска. - /invite: Приглашение пользователя в invite-only канал.
- /oper: Вход как сетевой оператор, требует настроенные права оператора.
- /ping и /pong: Поддержание активности соединения и проверка доступности.
- /pass: Отправка пароля при подключении, например для SASL или серверных паролей.
- /away: Отметить себя как отсутствующего со статусным сообщением.
- /list: Вывод списка открытых каналов.
- /names: Вывод пользователей в канале.
- /motd: Вывод Message of the Day сервера.
- /rules: Вывод правил сервера.
- /ns или /nickserv: Взаимодействие с NickServ, например для регистрации или входа.
- /cs или /chanserv: Взаимодействие с ChanServ, например для регистрации канала и управления правами.
Одну из самых старых и активно поддерживаемых немецких IRC-страниц с подробным справочником команд найдёшь на IRC-Mania.de/ircbefehle.
IRCv3, SASL и современные расширения
IRC далеко не мёртв. С появлением IRCv3 появился процесс стандартизации, который делает протокол актуальным для современных требований. Вот ключевые IRCv3-расширения, которые стоит знать:
- CAP (Capability Negotiation): Позволяет клиенту и серверу до авторизации согласовать, какие расширения поддерживаются. Без CAP нет SASL, нет extended-join и нет batch-сообщений.
- SASL: Аутентификация во время установления соединения. Основные механизмы: PLAIN и EXTERNAL. EXTERNAL использует клиентские сертификаты и особенно безопасен.
- away-notify: Сервер автоматически уведомляет клиент, когда другой пользователь меняет статус Away. Избавляет от постоянного использования
/whois. - account-notify: Сообщает, когда пользователь входит или выходит из сервис-аккаунта.
- extended-join: При входе в канал клиент сразу получает имя аккаунта и реальное имя пользователя.
- multi-prefix: Клиент видит все префиксы статуса пользователя, а не только самый высокий. Например,
@+Nickвместо просто@Nick. - batch: Несколько связанных сообщений можно объединить в batch, что особенно полезно для bridges и клиентов.
- message-tags: Позволяет добавлять метаданные к сообщениям, например reactions, edit-метки или custom-ID.
- reply-client-tag: Поддерживает thread-подобные ответы на сообщения, как в современных платформах.
- setname: Позволяет менять реальное имя во время сеанса без повторного подключения.
- account-tag: Помечает сообщения аккаунтом отправителя, что удобно для модерации и скриптов.
Если вы серьёзно работаете с IRC, подключайтесь с CAP LS 302 и целенаправленно согласовывайте возможности, которые предлагает сервер.
Топология сети: netsplits, U-Lines и linking
IRC-сеть это не один сервер, а распределённая структура из нескольких серверов, соединённых между собой. Это принципиальное отличие от централизованных платформ вроде Discord или Slack.
- Server-Link: Два IRCD соединяются через зашифрованный или незашифрованный канал. Конфигурация называется C:Lines, H:Lines или Connect-блоки, в зависимости от IRCD.
- U-Lines: Серверы, помеченные как сервис-серверы, имеют право выполнять специальные действия, например устанавливать modes. NickServ и ChanServ обычно работают на U-Line серверах.
- O-Lines: Определяют, кто является сетевым оператором. Права oper предназначены не для повседневного использования, а для администрирования сервера.
- Netsplit: Когда соединение между двумя серверами разрывается, сеть временно расщепляется. Пользователи на одной части исчезают для другой части. После переподключения серверы синхронизируют свои состояния, происходит netsplit-join.
- Split Riding: Атака, при которой кто-то во время netsplit входит в канал и захватывает права оператора, прежде чем серверы снова соединятся. Защитой служат TS (Timestamp) и различные механизмы защиты IRCd.
- Services-Server: Специальный сервер или процесс, подключённый через U-Lines, который предоставляет сервисы никнеймов, каналов и администратора.
Для администраторов понимание linking, netsplits и TS разница между стабильной сетью и хаотичным серверком.
Префиксы пользователей и каналов: Founder, Admin, Halfop, Voice
IRC-каналы имеют иерархию, которая выходит далеко за классические @ и +. Современные IRCD и сервисы поддерживают несколько уровней:
- ~ (Tilde): Founder. Владелец зарегистрированного канала, часто с особыми правами, например установка ChanServ-флагов.
- & (Ampersand): Admin. Может почти всё, как оператор, но не может деградировать других админов или founder.
- @ (At): Operator. Может кикать, банить, менять тему и режимы.
- % (Percent): Halfop. Может в случае необходимости говорить, кикать и временно модерировать, но имеет меньше прав, чем оператор.
- + (Plus): Voice. Может говорить в модерируемом канале (+m) и часто помечается как доверенный участник.
Соответствующие режимы:
- +q для Founder
- +a для Admin
- +o для Operator
- +h для Halfop
- +v для Voice
Не все IRCD поддерживают все эти уровни. InspIRCd и UnrealIRCd их знают, но более старые или компактные IRCD обходятся лишь +o и +v.
IRC-безопасность для профессионалов: Cloaks, CertFP и DNSBL
Если вы запускаете сервер или важного бота, переходите дальше базовых возможностей:
- Cloaking / Vhost: Cloak скрывает реальный IP или имя хоста пользователя. Вместо
user@123-45-67-89.example.netвидно что-то вродеuser@irc/member/MaxMustermann. Vhosts настраиваются через HostServ или на сервере. - CertFP: Certificate Fingerprint. Клиент подключается с TLS-клиентским сертификатом. Сервер или сервисы сохраняют отпечаток. Так можно аутентифицироваться без пароля, но безопасно.
- SASL EXTERNAL: Комбинирует SASL и CertFP. Особенно безопасно, потому что пароль не передаётся.
- DNSBL: DNS-based Blackhole List. Серверы проверяют IP против известных списков прокси или спама и отклоняют соединения из чёрных списков.
- Open Proxy Scanner: Многие сети сканируют входящие соединения на открытые прокси, чтобы предотвратить злоупотребления.
- K-Line, G-Line, Z-Line, D-Line: Разные уровни бана. K-Line банит на одном сервере, G-Line по всей сети, Z-Line блокирует диапазоны IP на уровне протокола, D-Line двойной бан или сетевой DNS-бан.
- Shun: “Тихий” бан, при котором пользователь остаётся подключённым, но не может отправлять сообщения. Полезно для мониторинга нарушителей.
- ConnThrottle: Многие IRCD имеют anti-flood механизмы, которые блокируют слишком много соединений за единицу времени с одного IP.
- Secure-Only: С пользовательским режимом
+zили режимом канала+zсерверы можно настроить так, чтобы участвовать могли только пользователи с TLS-шифрованием.
DCC, CTCP и общий доступ к файлам через IRC
Помимо обычного текстового чата IRC предлагает прямые клиент-клиентские соединения:
- CTCP (Client-to-Client Protocol): Специальные сообщения, которые обрабатывают клиенты, а не сервер. Примеры:
CTCP VERSION,CTCP TIME,CTCP PINGиCTCP ACTION. Последний используется для/me. - DCC CHAT: Прямой чат между двумя клиентами без участия сервера в доставке сообщений. Удобно для зашифрованных или независимых от сервера разговоров.
- DCC SEND: Позволяет прямую передачу файлов между двумя клиентами. Отправитель предлагает файл, получатель подтверждает и устанавливает прямое соединение.
- DCC RESUME: Позволяет продолжить прерванные передачи. Важно при больших файлах или нестабильных соединениях.
- DCC XMIT: Расширение для зашифрованной или сжатой передачи, но поддерживается только несколькими клиентами.
Сегодня DCC менее распространён, потому что NAT, firewalls и TLS-proxy затрудняют его. Для случайных файлов или прямых чатов он остаётся практичным решением.
IRC-скрипты и расширения клиентов
Большинство IRC-клиентов поддерживают расширения и автоматизацию. Для нас это одна из лучших сторон IRC:
- mIRC Scripting: mIRC имеет собственный язык скриптов. На нём можно создавать ботов, автоответы, темы, инструменты логирования и игры. Многие исторические IRC-скрипты написаны именно на mIRC.
- Irssi Perl: Irssi поддерживает Perl-скрипты. Существуют тысячи расширений для логирования, уведомлений, игр, интеграций и модерации.
- WeeChat Scripts: WeeChat предлагает скрипты на Python, Perl, Ruby, Lua, Tcl и JavaScript. Особенно популярны управление буферами, мосты Matrix и расширения для повседневной работы.
- ZNC-модули: ZNC написан на C++ и расширяется модулями на Python, Perl или C++. Модули могут реализовывать логирование, фильтры, push-уведомления или внешние интеграции.
- The Lounge-плагины: Экосистема The Lounge позволяет добавлять темы и расширения, хотя система плагинов не такая глубокая, как в Irssi или WeeChat.
- Eggdrop: Классический IRC-бот на C, расширяемый Tcl-скриптами. Часто используется одновременно как bouncer, бот и защита канала.
IRC против современных чат-платформ
IRC децентрализован, текстовый и открыт. Это фундаментально отличает его от современных платформ:
- Discord: Централизован, проприетарен, с голосовым чатом, общим экраном и мощными инструментами модерации. IRC легче, открытее и требует меньше ресурсов.
- Matrix: Децентрализован и федерирован, с современным сквозным шифрованием и поддержкой rich-медиа. Matrix сложнее, но ближе к современным требованиям. IRC проще и имеет меньше издержек.
- Slack: Ориентирован на бизнес, централизован, со множеством интеграций. IRC бесплатен, открыт и популярен в технических сообществах, которые ценят контроль.
- Telegram/Signal: Мессенджеры с централизованной или федерированной инфраструктурой. Они удобнее для пользователя, но менее открыты, чем IRC.
- Преимущества IRC: Регистрация не обязательна, открытые протоколы, легковесность, масштабируемость, много вариантов для самостоятельного хостинга, огромное историческое значение.
- Недостатки IRC: Нет встроенного общего экрана, нет встроенной истории без bouncer, часто крутая кривая обучения для новичков, меньше современных функций без IRCv3.
IRC-культура: netsplit, lurking и войны за OP
IRC имеет собственную культуру, выходящую за пределы чистой технологии:
- Lurking: Многие пользователи часами сидят в каналах, не активно участвуя. Они читают, иногда помогают и являются частью сообщества. Lurking полностью приемлем.
- Idling: Похоже на lurking, но ещё пассивнее. Целенаправленный idling может быть связан с системами вроде проектов FreeNode или каналов сообщества, чтобы показать присутствие.
- Netsplit: Если долго сидеть в IRC, их можно увидеть. Netsplit часто сопровождается мемами вроде “The Internet is broken”.
- OP-Wars: Исторически часто происходили конфликты из-за прав оператора, особенно в незарегистрированных каналах. С services и founder-статусом такие проблемы сейчас встречаются реже, но полностью не исчезли.
- ChanStats: Многие сети собирают статистику об активности, словах, строках и времени. Это приводит к внутренним рейтингам и конкурсам.
- История IRC: IRC разработан Jarkko Oikarinen в 1988 году, что делает его старше World Wide Web. Он значительно повлиял на раннюю интернет-культуру.
- Мем-культура: Многие интернет-мемы, такие как “lol”, “afk”, “brb”, “asl” или “rtfm”, берут начало в IRC.
Архитектура IRC-ботов: event-loop, парсер и плагины
Хороший IRC-бот это больше, чем простой socket-скрипт. Архитектура состоит из нескольких слоёв:
- Слой соединения: Отвечает за TCP-соединение, TLS-рукопожатие, PING/PONG и переподключение. Должен корректно обрабатывать разрывы соединения.
- Парсер: Преобразует входящие IRC-сообщения во внутренние события. Типичный формат
:nick!user@host COMMAND target :message. Парсер должен разделять префикс, команду, параметры и message. - Event-loop: Распределяет входящие события к обработчикам. Примеры:
on_message,on_join,on_part,on_nick_change,on_kickиon_disconnect. - Command-Router: Сопоставляет команды пользователей вроде
!helpили!weatherсоответствующим функциям. Часто с проверкой префикса и разрешений. - Plugin-система: Загружает внешние модули во время выполнения. Плагины должны быть изолированы и общаться с ботом через чёткий API.
- Слой базы данных: Хранит конфигурацию, логи, данные пользователей или статистику каналов. SQLite достаточна для небольших ботов, PostgreSQL для крупных развёрнутых систем.
- Rate-limiter: Предотвращает отправку ботом слишком большого количества сообщений, чтобы избежать flooding. Часто использует token-bucket-алгоритм.
- Система разрешений: Проверяет, может ли пользователь выполнять определённые команды. Каналы, статус оператора или регистрация nickname могут служить критериями.
Если хотите серьёзно запустить собственного бота, не стройте всё с нуля. Возьмите за основу установленный фреймворк и разрабатывайте собственные плагины сверху.
Развёртывание собственного IRCD: первые шаги
Для настоящих фанатов создание собственного IRC-сервера это один из обрядов посвящения. Типичные этапы:
- Выбор IRCD: Новички часто начинают с UnrealIRCd или InspIRCd, так как для них много туториалов. Ergo хороший выбор, если нужны интегрированные services.
- Установка сервера: Либо через package manager, Docker-образ либо ручная компиляция из исходного кода.
- Адаптация конфигурации: Основная конфигурация содержит имя сервера, информацию администратора, порты прослушивания, TLS-сертификаты, oper-линии и link-блоки.
- Интеграция services: Для регистрации nickname и канала устанавливаете Anope или Atheme и соединяете их через U-линии.
- Добавление bouncer: ZNC или The Lounge позволяют оставаться подключённым и чатить с нескольких устройств.
- Firewall и DNS: Откройте порты 6667 и 6697, установите DNS-записи для
irc.yourdomain.ruи опционально настройте reverse-DNS. - Тестирование и запуск: Сначала локальное тестирование, потом доступ для друзей, затем возможно публичное открытие. Всегда соблюдайте правила сервера и меры против спама.
- Мониторинг: Ротируйте логи, мониторьте соединения, регулярно обновляйте IRCD и services.
Собственный IRCD идеален для небольших сообществ, обучения или как изолированное пространство для общения команды.
Hall of Fame: люди, которые сформировали IRC и вдохновляли меня
IRC это не анонимный протокол, а результат десятилетий работы отдельных людей. Этот раздел маленький дань разработчикам, администраторам и визионерам, которые определили развитие IRC-экосистемы. Познакомился я с IRC очень рано, отчасти просто для обмена файлами и картинками, но тогда меня уже вдохновляли разработчики, которые создавали такие масштабные проекты. Codemastr, Andrew Church и другие. Вот мои фавориты:
- Jarkko Oikarinen: Создатель IRC. В 1988 году он разработал первую версию в Финском центре научных вычислений. Без него не было бы IRC, mIRC, ZNC и сообществ, которые мы знаем сегодня.
- Andrew Church: Ответственен за IRCServices, один из самых ранних и влиятельных пакетов IRC-services. Его работа заложила основу для регистрации nickname и канала, которую мы знаем от NickServ и ChanServ.
- Carsten V. Munk (stskeeps): Долгое время центральная фигура в UnrealIRCd. Он продвигал функции, логику сети и модульность, которые сделали UnrealIRCd одним из самых известных IRCD.
- codemastr: Один из ведущих разработчиков UnrealIRCd на протяжении многих лет. Он был решающим фактором в стабилизации и расширении кода, архитектуру которого много серверов всё ещё используют сегодня.
- Darren Reed: Разработчик ircd и позже DALnet Bahamut. Его работа сильно повлияла на серверную часть IRC в 1990-х годах.
- Roger Espel Llima: Создатель EPIC, одного из самых старых и гибких IRC-клиентов. EPIC был пионером для многих функций, которые позже появились в других клиентах.
- Khaled Mardam-Bey: Разработчик mIRC, Windows-клиента, который в 1990-х и 2000-х годах подарил IRC миллионам пользователей. mIRC Scripting повлиял на целое поколение IRC-ботов и скриптов.
- Timo Sirainen: Разработчик Irssi и позже Dovecot. Irssi по-прежнему один из самых популярных терминальных IRC-клиентов для нердов и администраторов серверов.
- Sébastien Helleu (FlashCode): Инициатор и главный разработчик WeeChat. Он создал один из самых современных и расширяемых терминальных клиентов.
- Robey Pointer: Оригинальный автор Eggdrop, классического IRC-бота на C с Tcl-скриптами. Eggdrop долгое время был стандартом для защиты канала и автоматизации.
- Команда Anope: Множество мейнтейнеров на протяжении лет сделали Anope самым распространённым пакетом services. Сегодня он соединяет почти каждый IRCD с надёжной инфраструктурой регистрации.
- Команда Atheme: С разработчиками вроде nenolod и jilles Atheme создали альтернативу Anope, которая особенно ориентирована на безопасность и современные функции.
- Daniel Oaks и команда Ergo: Daniel Oaks продвигал IRCv3 и современный IRCD Ergo (ранее Oragono). Ergo показывает, что IRC может развиваться и в 2026 году.
- Команда ZNC: Мейнтейнеры и соавторы вроде psychon и prozac сделали ZNC стандартным IRC-bouncer.
- Wilmer van der Gaast: Инициатор BitlBee, IRC-моста к другим чат-протоколам. BitlBee доказывает, что IRC может служить центральной точкой для всех коммуникаций.
- Команда The Lounge: Современные веб-разработчики, которые доказали с помощью The Lounge, что IRC в браузере может быть современным и удобным для пользователя.
Moxquiz тоже не должен быть пропущен в Hall of Fame: немецкий IRC-quiz-бот, который в многих каналах обеспечивал захватывающие раунды викторин и внутренние соревнования. Он показывает, что IRC-боты используются не только для администрирования или обмена файлами, но и как развлечение и совместное переживание.
Эта список, конечно, неполный. За каждым IRCD, каждым клиентом и каждым service стоят десятки или сотни соавторов, которые на протяжении лет вносили исправления ошибок, документацию, поддержку и идеи. Каждый, кто использует IRC сегодня, стоит на плечах этого сообщества.
На что обратить внимание при программировании IRC-клиентов и ботов
При разработке собственных IRC-клиентов или ботов есть несколько деталей, которые легко пропустить, но они критичны для стабильной работы:
- PING/PONG: сервер IRC периодически отправляет
PING-запросы. Если ты не ответишьPONG, сервер разорвёт соединение. Обработка PING/PONG обязательна. - Длина сообщения: IRC-сообщение вместе с
\r\nне может превышать 512 байт. Более длинные сообщения нужно разбивать. - Rate limiting: слишком много сообщений за короткий промежуток времени приводит к временному разъединению (Excess Flood). Добавь задержки между отправками, особенно для автоматических сообщений.
- Кодировка: большинство современных сетей используют UTF-8. Убедись, что входные и выходные данные кодируются консистентно.
- Предпочитай TLS: для production-окружения используй порт
6697с TLS/SSL, чтобы защитить соединение и учётные данные. - Обработка ошибок: сетевые соединения могут разрываться. Логика переподключения и надёжная обработка ошибок делают бота устойчивым.
- Соблюдай правила сервера: каждая IRC-сеть имеет собственные правила для ботов, никнеймов и каналов. Придерживайся их, чтобы избежать кика или бана.
- Никогда не храни secrets в коде: пароли, API-ключи и учётные данные для сервисов никнеймов должны быть в переменных окружения или отдельной системе управления конфигурацией.
Больше туториалов, списков серверов и советов по IRC найдёшь на IRC-Mania.de. По вопросам протокола, команд и поведения серверов полезно заглянуть на IRC-FAQ.de.
FAQ: IRC, программирование и безопасность (Internet Relay Chat)
1. Что такое IRC-бот?
2. Как подключиться к IRC-серверу на Python?
socket для создания TCP-соединения, а затем отправить IRC-команды NICK, USER и JOIN. Проще это сделать с помощью библиотек вроде pydle.3. Какие фреймворки существуют для IRC-ботов на Python?
4. Какие фреймворки существуют для IRC-ботов на Node.js?
net. irc-framework особенно гибкий и современный.5. Какие фреймворки существуют для IRC-ботов на Go?
6. Какие фреймворки существуют для IRC-ботов на Rust?
irc это самая известная Rust-библиотека для IRC. Она обеспечивает асинхронные соединения, TLS, SASL и высокую типобезопасность.7. Что такое pydle?
8. Что такое irc-framework?
9. Что такое go-ircevent?
10. Что такое Rust irc crate?
irc это Rust-библиотека, предоставляющая все основные IRC-функции, включая TLS, SASL, парсинг сообщений и асинхронное общение.11. Как отправить сообщение в IRC-боте?
PRIVMSG #kanal :Привет всем. Двоеточие обозначает начало текста сообщения.12. Как реагировать на личные сообщения в IRC-боте?
PRIVMSG МойБот :Сообщение. Бот проверяет, совпадает ли получатель с его собственным никнеймом, и отвечает непосредственно отправителю.13. Что такое PING/PONG в IRC?
PING клиенту для проверки соединения. Клиент должен ответить PONG. Без этого ответа сервер разорвёт соединение.14. Как присоединиться к каналу в IRC-боте?
JOIN #kanal позволяет боту присоединиться к каналу. Большинство фреймворков предоставляют для этого метод вроде join("#kanal").15. Почему использовать фреймворк для IRC-ботов?
16. Что такое IRC?
17. Как работает IRC?
18. Что такое IRC-канал?
#.19. Что такое IRC-сеть?
20. Что такое никнейм?
21. Что такое сервис никнеймов?
22. Что такое оператор канала?
@ перед именем.23. Что такое IRC-Op?
24. Что такое BNC?
25. Что такое IRC-клиент?
26. Что такое IRC-Bouncer?
27. Что такое DCC?
28. Что такое CTCP?
/me.29. Что такое IRC-сервер?
30. Что такое порт в IRC?
31. В чём разница между портом 6667 и 6697?
32. Что такое TLS/SSL в IRC?
33. Что такое SASL?
34. Что такое маска в IRC?
nickname!username@host. Она используется для банов, списков доступа и модерации.35. Что такое бан в IRC?
36. Что такое кик в IRC?
37. Что такое Mute или Quiet в IRC?
+q или +b ~q:.38. Что такое тема канала?
TOPIC.39. Что такое канал с ограничением приглашений?
+i.40. Что такое канал с ключом?
+k устанавливается вместе с ключом.

