Protokół IRC
Repartee implementuje pełną obsługę protokołu IRC obejmującą RFC 2812 oraz szeroki zakres rozszerzeń IRCv3, negocjowanych automatycznie w momencie połączenia.
Podstawowy protokół
Podstawowa warstwa IRC obsługuje wszystkie standardowe operacje protokołu zdefiniowane w RFC 2812:
- Rejestracja połączenia -- NICK, USER, PASS i negocjacja możliwości
- Operacje kanałowe -- JOIN, PART, KICK, INVITE, TOPIC, MODE, listy banów
- Wiadomości -- PRIVMSG, NOTICE do kanałów i użytkowników
- Zapytania serwerowe -- MOTD, LUSERS, VERSION, STATS, INFO, ADMIN, TIME, LINKS
- Zapytania użytkowników -- WHO, WHOIS, WHOWAS, NAMES, LIST
- CTCP -- VERSION, PING, TIME, ACTION oraz niestandardowe zapytania CTCP
Możliwości IRCv3
Repartee negocjuje możliwości IRCv3 podczas połączenia za pomocą CAP LS/REQ/ACK. Następujące możliwości są żądane, gdy serwer je obsługuje:
| Możliwość | Opis |
|---|---|
multi-prefix | Wiele prefiksów trybu na nick (np. @+nick) |
extended-join | Nazwa konta i realname w wiadomościach JOIN |
ircnet.com/extended-join | Rozszerzenie ircd 2.12 z IRCnetu -- JOIN niesie także UID, IP i flagę netjoin |
server-time | Znaczniki czasu wiadomości od serwera |
account-tag | Nazwa konta przy każdej wiadomości |
cap-notify | Powiadomienia o zmianach możliwości po stronie serwera |
away-notify | Zmiany statusu away w czasie rzeczywistym |
account-notify | Powiadomienia o logowaniu/wylogowaniu konta |
chghost | Zmiany ident/hostname w czasie rzeczywistym |
setname | Zmiana realname na żywo (/setname) |
echo-message | Autorytatywne echo wysłanych wiadomości |
labeled-response | Korelacja żądań i odpowiedzi dla pojedynczych wiadomości oraz batchy |
invite-notify | Powiadomienia o zaproszeniach na kanał |
batch | Zgrupowane partie wiadomości (netsplit/netjoin, multiline, chathistory, search) |
userhost-in-names | Pełny user@host w odpowiedziach NAMES |
no-implicit-names | Wycisza niejawne NAMES przy JOIN, gdy wynegocjowane (no-implicit-names, draft/no-implicit-names, soju.im/no-implicit-names) |
message-tags | Dowolne metadane wiadomości IRCv3 (w tym msgid) oraz tagi klienta w TAGMSG |
extended-monitor | Śledzenie dostępności nicków MONITOR (/monitor) wraz z powiadomieniami away/account/host/realname (extended-monitor / draft/extended-monitor) |
draft/chathistory | Historia serwera/bouncera: odkrywanie rozmów CHATHISTORY TARGETS, stronicowanie scroll-back, gap-fill po reconnect, BETWEEN i AROUND |
draft/event-playback | Odtwarzanie JOIN/PART/zmian trybu wewnątrz partii historii |
draft/multiline | Wiadomość wieloliniowa wysyłana jako jedna logiczna wiadomość |
draft/read-marker | Synchronizacja znaczników przeczytania między klientami (MARKREAD oraz soju.im/read) |
draft/message-redaction | Usuwanie wiadomości (REDACT przez /redact) |
draft/account-registration | Rejestracja i weryfikacja konta bezpośrednio w połączeniu (/account) |
draft/metadata-2 | Metadane konwersacji (pin, mute, block) i synchronizacja na żywo (/bmeta) |
draft/extended-isupport | Rozszerzona negocjacja parametrów RPL_ISUPPORT |
draft/channel-context | Tag klienta kontekstu kanału (+draft/channel-context / channel-context) |
draft/webpush | Powiadomienia przeglądarkowe WebPush przez bouncer (draft/webpush / soju.im/webpush) |
soju.im/bouncer-networks | Wykrywanie sieci bouncera, aktualizacje na żywo (soju.im/bouncer-networks-notify) oraz BOUNCER BIND (/bouncer) |
soju.im/search | Wyszukiwanie wiadomości po stronie serwera (/bsearch) |
soju.im/client-cert | Przypinanie i generowanie certyfikatów klienta TLS na bouncerze (/bcert) |
Ratyfikowany tag klienta +typing podróżuje w TAGMSG dzięki message-tags, więc nie wymaga własnej cap.
Pierwszoklasowa obsługa bouncerów (Soju i Lurker)
Repartee traktuje nowoczesne bouncery IRCv3 — Soju oraz Lurker — jako obywateli pierwszej kategorii:
- Połączenia sterujące i automatyczne wykrywanie sieci -- Ustaw
bouncer_control = true(lub/server add ... -bouncer-control), aby wynegocjowaćsoju.im/bouncer-networks, pobrać listę wszystkich sieci nadrzędnych i automatycznie otwierać połączenia potomne dla każdej skonfigurowanej sieci. Zarządzaj sieciami na żywo poleceniem/bouncer(list,refresh,connect,add,change,delete). - Jawne i klasyczne bindowanie sieci -- Zbinduj połączenie bezpośrednio z ID sieci bouncera przez
bouncer_network_id(BOUNCER BIND <id>) lub zachowaj tradycyjne selektory sieci wusername/PASS(user/net@client). Autojoin jest wyciszany na zbindowanych połączeniach, dzięki czemu bouncer czysto odtwarza własne dołączone kanały. - Wykrywanie rozmów i historia po stronie serwera -- Wykrywa aktywne kanały i query przez
CHATHISTORY TARGETS, stronicuje historię na żądanie i utrzymuje historię bouncera po stronie serwera (bez duplikowania wiadomości w lokalnej bazie SQLite). - Synchronizacja znaczników przeczytania -- Negocjuje
draft/read-markerorazsoju.im/read(MARKREAD), dzięki czemu stan przeczytania jest synchronizowany między TUI Repartee, interfejsem webowym i innymi klientami bouncera. - Komendy bouncera -- Przeszukuj historię po stronie serwera przez
/bsearch(soju.im/searchlubCHATHISTORY BETWEEN/AROUND), zarządzaj metadanymipin/mute/blockprzez/bmeta, zarządzaj certyfikatami klienta TLS przez/bcert, uwierzytelniaj konta nadrzędne przez/authi/accountoraz wysyłaj pliki do 64 MiB przez usługęFILEHOSTpoleceniem/upload.
Historia serwera i multiline
Gdy serwer lub bouncer (soju, lurker, ergo, …) ogłasza draft/chathistory, Repartee pobiera historię przez sieć: przewiń kanał ku górze, aby stronicować starsze wiadomości (CHATHISTORY BEFORE), otwórz pusty bufor query na bouncerze, aby pobrać jego ostatni backlog, a po ponownym połączeniu luka od czasu twojej ostatniej wiadomości zostanie uzupełniona automatycznie (CHATHISTORY AFTER/LATEST). Bezpośrednie połączenia IRC zapisują historię w lokalnej bazie SQLite, natomiast połączenia bouncerowe utrzymują historię w pamięci jako zarządzaną przez serwer. Historia jest deduplikowana po msgid i renderowana dyskretnie (bez zalewu powiadomień).
draft/multiline pozwala, aby wklejona lub złożona wiadomość wieloliniowa przemieszczała się jako pojedyncza logiczna wiadomość — obudowana w jeden BATCH, składana ponownie po drugiej stronie i bezpieczna E2E, tak aby zaszyfrowany blok pozostał jedną jednostką RPE2E. W TUI Alt+Enter wstawia podział linii. Zobacz referencje obsługi IRCv3, aby poznać pełne zachowanie.
Wskaźniki pisania
Repartee implementuje ratyfikowany tag klienta IRCv3 +typing, dzięki czemu widzisz, kto właśnie tworzy wiadomość w bieżącym kanale lub query — pokazywane jako element status line w TUI i odpowiadający mu wskaźnik w interfejsie webowym (alice and bob are typing…).
Powiadomienia są ograniczane tempem do jednego co 3 sekundy i wygasają samoczynnie (6 s po active, 30 s po paused), więc rozmówca, który zniknie w połowie zdania, nigdy nie zostawia zawieszonego wskaźnika. Wysłanie wiadomości wycofuje wskaźnik. Szkic z /me liczy się jako pisanie; szkic /command już nie. Ramki pisania są wliczane do zwykłego flood budget, a TAGMSG nigdy nie otwiera bufora, nie trafia do twojego logu ani nie zwiększa licznika nieprzeczytanych.
Wysyłanie jest domyślnie włączone. Od razu po instalacji osoby na twoich kanałach i w query widzą, kiedy tworzysz wiadomość. Wyłącz to za pomocą /set typing.send_channels false i /set typing.send_queries false; /set typing.show false zatrzymuje wyświetlanie wskaźników wszystkich pozostałych osób. Zobacz konfigurację [typing].
Uwierzytelnianie SASL
Repartee obsługuje sześć mechanizmów SASL do uwierzytelniania w serwisach IRC i bouncerach:
- EXTERNAL -- uwierzytelnianie oparte na certyfikacie klienta TLS (
client_cert_pathz łańcuchem PEM i kluczem) - ECDSA-NIST256P-CHALLENGE -- uwierzytelnianie kluczem publicznym NIST P-256 metodą wyzwanie-odpowiedź
- SCRAM-SHA-512, SCRAM-SHA-256, SCRAM-SHA-1 -- solone uwierzytelnianie wyzwanie-odpowiedź z weryfikacją podpisu serwera i bez przesyłania hasła otwartym tekstem
- PLAIN -- uwierzytelnianie nickiem i hasłem
- OAUTHBEARER -- uwierzytelnianie tokenem bearer OAuth 2.0 wg RFC 7628 (jawny wybór przez
sasl_mechanism = "OAUTHBEARER"dla bouncerów obsługujących OAuth)
Wskazówka: Uwierzytelnianie SASL jest konfigurowane per serwer w pliku config.toml. Gdy sasl_mechanism zostanie pominięte, Repartee automatycznie wybiera najsilniejszy dostępny mechanizm oferowany przez serwer.
Obsługa WHOX
WHOX (rozszerzony WHO) jest automatycznie wykrywany, gdy serwer ogłasza go przez ISUPPORT. Repartee używa zapytań WHOX do uzupełniania nazw kont i pełnych informacji user@host dla wpisów nicków, dostarczając bogatsze dane użytkowników w liście nicków i umożliwiając funkcje oparte na kontach, takie jak extbany.
Pełna zgodność na serwerach z rodziny ircu oraz w IRCnecie. /who — i metadane listy nicków zasilane przez automatyczne WHO przy wejściu na kanał — rozumie odpowiedzi ze świadomością SID/UID wysyłane przez te ircd, więc stan away, nazwy kont, ident i prawdziwe hostnamy uzupełniają się tam poprawnie, zamiast wracać puste. Repartee dobiera właściwy selektor pól dla danej linii serwerów, rozróżnia układ odpowiedzi po liczbie argumentów i usuwa dodatkowy token SID z IRCnetu, dzięki czemu nie jest już renderowany sklejony z realname. Zwykłe WHO (352) także aktualizuje wpisy nicków, więc nawet serwery bez WHOX dostarczają stan away i prawdziwe hostnamy.
Extban
Repartee obsługuje rozszerzony typ bana $a:account, który banuje użytkowników po nazwie konta serwisów zamiast po masce hosta. Jest to bardziej niezawodne niż bany po masce hosta, ponieważ konta utrzymują się między ponownymi połączeniami i zmianami hosta.
Użyj skrótu /ban -a, aby szybko ustawić ban oparty na koncie na użytkowniku w bieżącym kanale.
DCC CHAT
Repartee obsługuje bezpośrednie połączenia czatu peer-to-peer za pomocą protokołu DCC CHAT:
- Tryby aktywny i pasywny -- inicjowanie bezpośrednich połączeń lub użycie odwróconego (pasywnego) DCC dla użytkowników za NAT
- Konwencja bufora
=nick-- czaty DCC pojawiają się jako=Alicena liście buforów, zgodnie z zachowaniem irssi - Automatyczne wykrywanie IP -- z gniazda IRC, z ręcznym nadpisaniem przez
/set dcc.own_ip - Maski automatycznej akceptacji -- konfiguracja zaufanych masek hostów do automatycznego akceptowania żądań DCC
- Polecenia z uzupełnianiem Tab --
/dcc chat,/dcc close,/dcc list,/dcc reject
Ochrona przed floodem
Repartee zawiera wbudowaną ochronę przed floodem, aby zapobiec rozłączeniu za wysyłanie zbyt wielu wiadomości zbyt szybko. Wiadomości wychodzące są ograniczane tempem, aby przestrzegać progów floodu po stronie serwera (w tym limitów SAFERATE ogłaszanych w ISUPPORT przez bouncery i dostawców), z automatycznym kolejkowaniem i opróżnianiem.
Wykrywanie netsplitów
Zdarzenia netsplit (awarie połączeń serwer-serwer) są automatycznie wykrywane i wyświetlane jako zwinięte, czytelne podsumowania zamiast zalewania kanału pojedynczymi wiadomościami QUIT i JOIN. Wykorzystuje to możliwość IRCv3 batch, gdy jest dostępna, z heurystycznym wykrywaniem opartym na wzorcach jako rozwiązaniem awaryjnym.
Obsługa wielu sieci
Repartee obsługuje jednoczesne połączenie z wieloma sieciami IRC. Dodaj wiele sekcji [servers.*] w pliku konfiguracyjnym, a każda sieć otrzyma własne połączenie, zestaw buforów kanałów i niezależny stan. Wszystkie połączenia współdzielą jedną pętlę zdarzeń dla wydajnego wykorzystania zasobów.
Dalej: Zobacz referencje obsługi IRCv3, aby uzyskać szczegółowe informacje o pokryciu protokołu, lub przewodnik konfiguracji, aby skonfigurować połączenia serwerowe.