english version
Die !Channel (ein Feature von IRCNet ircd 2.10)
Eine benutzerfreundliche Erklärung von Kaspar
'Kasi' Landsberg
Rückübersetzung ins Deutsche von Rico
'mc' Glöckner
Ein wenig komplettiert durch Mario
'BitKoenig' Holbe
Vorwort
Die folgende Erklärung setzt ein gewisses Grundwissen des Internet
Relay Chat (IRC) voraus, u.a. Begriffe wie "Channel", "Nicks",
"Server" und "Clients".
Einleitung
Die IRC-Server Version ircd2.10 (hauptsächlich im
IRCNet verwendet)
brachte einen neuen Typ von Channels mit sich: Eindeutige, nicht
kollidierbare Channel, die "!Channel".
Um den Sachverhalt besser verstehen zu können, die Situation vor
ircd2.10 vorweg:
Die Vergangenheit
Wie du sicher weißt, existiert ein Channel nur, wenn mindestens
ein Client in diesem Channel ist. Wie du sicher auch weißt, existiert
ein Channel auf allen Servern eines spezifischen IRC-Netzes; das bedeutet,
daß man auf jedem dieser Server diesen Channel joinen kann und trotzdem
immer auf die selben Clients (Nutzer) stößt (falls der Channel schon
vor deinem Join existierte, natürlich). Aber was passierte, wenn ein
Server temporär vom Netz weggesplitted ist, also dieser Server für
eine gewisse Zeit nicht mehr mit dem Rest des Netzes verbunden war?
Auf dem Server der weggesplittet ist und dann allein war, passierte
grob gesehen folgendes: Alle Channel wurden zerstört (sie hörten auf zu
existieren), außer denen natürlich, auf denen noch mindestens ein Client
auf dem Server war, der weggesplittet ist. Auf der anderen Seite des
Netzes passierte respektive das selbe.
Falls vor dem Split Clients auf demselben Channel auf beiden Seiten
waren (also ein Teil der Clients auf der einen, der andere Teil der
Clients auf der anderen Seite des Splits), dann existierten direkt
nach dem Split zwei Channels mit exakt demselben Namen, aber mit
verschiedenen Clients (und vielleicht verschiedenen Modes) auf beiden
Seiten. Mit diesem Wissen im Hinterkopf betrachten wir die Situation,
die sich ergibt, wenn beide Seiten des Netzes (bis dahin getrennt) sich
wieder verbunden haben, um wieder ein gemeinsames IRC-Netz zu formen.
Die verschiedenen Stati (Clients, Modes, etc) für denselben Channel auf
beiden Seiten des Splits mußten nun zusammengefügt (synchronisiert)
werden, damit auf den vormals getrennten Seiten des Splits der Channel
wieder den gleichen Status hat (die gleichen Clients, die gleichen Modes).
Dies wurde von den betroffenen Servern erledigt, und ist das, was du
gesehen hast, wenn ein Server einen User oppte ("Server-Op") oder
einen anderen Mode setzte ("Server-Modes"). Das passiert üblicherweise auch
bei so genannten "Channel Takeovers", mit denen du vermutlich schon
konfrontiert wurdest. Diese "Channel Takeover" waren ein offensichtliches
Problem des vorherigen Channel Designs, da Channel in dem oben
aufgezeigten Weg "kollidierbar" waren. Nun schauen wir uns einmal die
Situation mit ircd2.10 an.
Die Gegenwart
Ein neuer ChannelTyp
Der IRCNet ircd in der Version 2.10 gibt uns die Möglichkeit von
"unkollidierbaren Channels" durch Einführung eines neuen Channel-Typs,
den ID-Channels ("!Channel"). Ein ID-Channel (oder einfach nur "!Channel",
im Gegensatz zu "#Channel") ist nicht mehr, als ein Channel mit einer
eindeutigen ID. Die Channel, die du kennst, haben die Form: #Channel_Name.
Die neuen !Channel haben die Form: !<ID>Channel_kurzName, wobei
<ID> eine eindeutige ID ist, die vom IRC Server nach einem mehr
oder minder zufälligen Prinzip ausgewählt wird.
Ein Beispiel eines solchen Channels könnte "!ABC23France" sein; dabei
ist "!" der Channel-Prefix, der den ChannelTyp kennzeichnet, "ABC23" ist
die eindeutige Channel-ID und "France" der kurze Channelname. Die
Channel-ID hat
immer eine Länge von 5 Zeichen, dies macht es
unter anderem einfacher, den kurzen Channelnamen von der Channel-ID zu
trennen.
Da jeder !Channel eine eindeutige ID hat, ist es "unmöglich", identische
!Channel zu haben und dies macht die !Channel unkollidierbar. Hier
die Grundregeln, die man beim Gebrauch von !Channels im Hinterkopf
behalten sollte:
- Man kann einen neuen !Channel nur erstellen, wenn noch kein Channel
mit dem selben Kurznamen existiert.
Beispiel: Wenn du versuchst, den !Channel mit dem Kurznamen "foo"
(Kommando-Syntax siehe unten) zu erstellen, dann wird das nur
funktionieren, wenn es noch keinen !Channel mit dem Kurznamen "foo"
gibt; die ID ist dabei irrelevant. Es wird dir nicht möglich sein,
einfach einen anderen Channel mit dem selben Kurznamen, aber einer
anderen Channel-ID zu erstellen.
- Wenn in einem Netsplit (das IRC-Netz wird in zwei oder mehr Teile
geteilt) ein existierender !Channel weggesplittet ist (also
in der anderen Seite des Netsplits "verloren gegangen ist"), wird
sein Name (ID+Kurzname) für eine gewisse Zeit gespeichert. Wenn du so
einen Channel joinst, während der Name noch gespeichert ist, dann
wirst du keinen Channel-Op auf diesem Channel bekommen.
Wenn du den Channel nach dieser Zeit joinst, dann erstellst du einen
Channel mit demselben Kurznamen, aber mit einer anderen Channel-ID.
- Unter gewissen Umständen (siehe oben) können verschiedene !Channel
mit dem selben Kurznamen, aber verschiedenen Channel-IDs existieren.
Falls es nur einen !Channel mit dem selben angegebenen Kurznamen
gibt, dann kann man diesen Channel ohne Angabe der Channel-ID
joinen (siehe unten).
- Nur das JOIN und das LIST Kommando akzeptieren den Kurznamen des !Channel.
Alle anderen Kommandos benötigen den vollständigen !Channel
Namen
("!<ID><Kurzname>")
(N.B.: Der IRC Client sollte dieses Benehmen natürlich erleichtern).
- Wenn mehrere !Channel mit dem selben Kurznamen, aber einer
jeweils anderen Channel-ID existieren, dann kannst du dich beim
JOIN Kommando durch Angabe der Channel-ID für einen der Channel
entscheiden.
Jetzt, da du die Grundregeln bezüglich !Channels kennst, laß uns
die dazu gehörigen Kommandos (speziell das JOIN Kommando) untersuchen.
Eine Grundregel trifft auf die gesamte Kommando-Sektion zu:
Es ist möglich, daß dein IRC Client die !Channels (noch) nicht
(vollständig) unterstützt. Falls eines der folgenden Kommandos also
nicht funktioniert oder seltsames Verhalten hervorruft, dann ist es
vermutlich der "Fehler" deines IRC Clients.
Hier eine Liste von grundsätzlichen Kommandos in Gebrauch mit
!Channels:
- /JOIN !!foo
Dies erstellt einen neuen !Channel mit dem Kurznamen "foo" und mit
einer vom Server erstellten ID. Der vollständige Name des Channels
wird dann "!<ID>foo" sein. Dies wird nur funktionieren, wenn
vorher kein !Channel mit dem selben Kurznamen ("foo") existierte.
- /JOIN !foo
Versucht den bereits existierenden !Channel mit dem Kurznamen "foo"
zu joinen. Das wird nur funktionieren, wenn a) bereits ein !Channel
mit diesem Kurznamen existiert und b) es nicht mehr als einen
Channel mit diesem Namen gibt.
Wenn es mehrere !Channel mit dem Kurznamen "foo", aber mit
verschiedenen IDs gibt, dann wird dies nicht funktionieren.
- /JOIN !<ID>foo
Versucht den bereits existierenden Channel mit dem Kurznamen "foo"
mit dieser Channel-ID zu joinen. Funktioniert nur, wenn es
einen !Channel mit diesem Kurznamen und exakt dieser
Channel-ID gibt.
- /LIST !<ID>foo
Gibt die Ausgabe des LIST Kommandos für den !Channel "foo" mit
der übergebenen Channel-ID aus. Funktioniert nur, wenn es diesen
Channel (ID + Kurzname) gibt.
- /LIST !foo
Zeigt alle existierenden Channel mit dem Kurznamen 'foo'.
Dies ist speziell dann nützlich, wenn /JOIN !foo
fehlschlägt und du erfahren willst, welche spezielle
Channel-ID du mit /JOIN !<ID>foo benutzen kannst.
- /NAMES !<ID>foo
Das selbe wie mit /LIST.
Wie du sehen kannst, funktionieren die gewohnte
Kommandos mit !Channels wie gewohnt, solange man den vollen Namen
(also ID + Kurzname) mit angibt.
Ein neuer User Mode
Zusammen mit den !Channels wurde ein neuer Usermode eingeführt, der eng
mit den !Channels verbunden ist. Dieser neue Usermode wird automatisch
demjenigen zugeteilt, der den !Channel
erstellt hat; er wird
damit zum "!Channel-Creator". Der !Channel-Creator wird mit dem
Channelmode "+O" (auch als UNIQUE_OP bekannt) bezeichnet (nicht mit
dem normalen Channel Operator "+o" verwechseln).
Der Server gibt dir den "+O" Mode
in jedem !Channel den du erstellt
hast. Also, wenn du einen !Channel "foo" erstellst, dann bekommst du
--wie gewohnt-- den Mode "+o" (Channel Operator) und du bekommst auch den
Mode "+O" (!Channel Creator) für den !Channel "!<ID>foo".
Hier die Charakteristiken des neuen !Channel-Creator Modes (+O):
- Er kann nicht manuell entfernt werden.
- Ein !Channel-Creator kann den "+O" Status nur verlieren, wenn
er den Channel verläßt (/part, /quit) oder wenn er auf diesem
Channel deopt wird.
- Wenn ein !Channel-Creator einen !Channel verläßt und wieder
neu betritt, dann wird er den "+O" Mode nicht zurück erhalten.
- Wenn ein !Channel-Creator deopt und wieder reopt wird, dann
wird er den "+O" Mode nicht zurück erhalten.
- Wenn du wissen möchtest, ob der !Channel-Creator noch seinen
"+O" Status hat, dann gibst du ein: /MODE !<ID>Channel O
. Wenn die Antwort des Servers "-O" enthält, dann hat der Creator
den Creator Modus verloren und kann es nicht wiedergewinnen.
- Ein !Channel-Creator kann den Channel Mode "r" setzen und löschen.
(siehe unten)
Ein neuer Channelmode
Zusammen mit den !Channels wurde ein neuer !Channel Mode, der "+r"
("reop") Mode, eingeführt. Nur ein Channel-Creator kann diesen Mode
mit dem /MODE Kommando setzen oder löschen. Der Zweck dieses Modes
ist es, oplose Channel zu vermeiden. Da !Channel eindeutig und
unkollidierbar sind, ist es unmöglich "Server-Ops" in einem
!Channel durch eine Channel-Kollision
zu erhalten (Im Gegensatz zu normalen #Channels), wenn sie oplos werden.
Wenn der Channel also nicht oplos bleiben soll, wenn er es einmal war,
dann muß der Channel-Creator den Channelmode "+r" auf diesem Channel
setzen. Wenn dieser Modus gesetzt ist und der !Channel oplos wird und
eine Weile bleibt, dann wird der Server automatisch und zufällig
einige (oder auch alle) Clients in dem Channel re-oppen.
Der Zufälligkeits-Algorithmus ist so programmiert, daß er die Chance,
reoppt zu werden, nicht erhöht, wenn man viele Clones/Bots/Freunde
den !Channel joinen läßt.
Die Zukunft
Das Hauptproblem des
IRCNet -
Nick Kollisionen - wurde bisher nicht behoben, wird aber in dem nah
anstehenden Release 2.11 des IRCNet ircd angesprochen werden.
Die Implementation der Lösung wurde in einem frühen Draft von
Piotr "Beeth" Kucharski niedergeschrieben und kann
hier
gefunden werden.
Übrigens, die gesamte IRC Software sollte neu geschrieben werden :-)