Jabber - komunikačný protokol (6)

30. 8. 2004
Doba čtení: 6 minut

Sdílet

Účelom dnešnej časti bude predstaviť Multi User Chat, teda vytváranie diskusných skupín na Jabber serveroch. Multi User Chat Obsahuje niekoľko vylepšení oproti podobnej službe IRC.

Jabber umožňuje vytváranie diskusných miestností podobne ako IRC. Protokol na začiatku vývoja umožňoval len jednoduchú komunikáciu v skupine (groupchat 1.0). Neskôr ho nahradil Multi User Chat (JEP-45), ktorý pridal niekoľko zaujímavých vlastností. Multi User Chat (MUC) je spätne kompatibilný tak, aby umožňoval fungovanie klientov vytvorených na základe pôvodneho protokolu.

V súčasnosti existujú implementácie obidvoch verzii protokolu. Pôvodný protokol groupchat 1.0 umožňuje vytvorenie a zrušenie miestnosti, získanie zoznamu účastníkov a ich dostupnosti, odosielanie a prijímanie správ v miestnosti. Umožňuje tiež pozvať používateľa do miestnosti. MUC pridáva vlastnosti ako delenie účastníkov na tých, ktorí môžu posielať príspevky, a tých, ktorí nemôžu. Ďalej umožňuje vytváranie moderovaných miestností a vytváranie tzv. whitelistov a banlistov, tj. zoznamov používateľov, ktorí môžu a ktorí nemôžu vstúpiť do miestnosti.

Diskusné miestnosti majú vlastný JID. Napr. miestnosť o implementovaní XMPP má JID jdev@conference.jabber.org. Jdev je názov miestnosti, conference je názov služby na serveri jabber.org. JID konkrétneho účastníka diskusie je rozšírený o jeho nick (napr. jdev@conference.jabber.org/root). Účastník má teda dva rôzne JID – jeden svoj vlastný a jeden v miestnosti. Podľa nastavenia miestnosti môžu mať ostatní účastníci možnosť vidieť aj reálny JID. Miestnosti podľa toho delíme na anonymné, semi-anonymné a neanonymné. V neanonymných miestnostiach účastníci zverejňuje aj vlastný JID, v semi-anonymných ho môže vidieť iba moderátor miestnosti.

Vytvorenie miestnosti

Požívateľ vytvára miestosť tak, že na JID budúceho účastníka pošle Presence paket. Element <x/> signalizuje, že klient podporuje MUC protokol. Ak by sa neuviedol, služba by predpokladala, že klient pozná len pôvodný protokol groupchat 1.0.

<presence
  from='psivak@jabber.sk'
  to='testroom@conference.jabber.org/root'>
  <x xmlns='http://jabber.org/protocol/muc'/>

</presence>

Po úspešnom vytvorení miestnosti sa vráti Presence paket:

<presence
  from='testroom@conference.jabber.org/root '
  to='psivak@jabber.sk'>
  <x xmlns='http://jabber.org/protocol/muc#user'>
    <item affiliation='owner'
      role='moderator'/>

    <status code='201'/>
  </x>
</presence>

V tejto chvíli je vytvorená miestnosť zamknutá (locked). Ostatní používatelia zatiaľ do nej nemôžu vstúpiť. Očakáva sa, že Owner (ten kto miestnosť vytvoril) nastaví vlastnosti novej miestnosti a potom sa miestnosť odomkne. Vlastnosti môžu byť rôzne – moderovaná/ne­moderovaná miestnosť, ukladanie histórie, max. počet účastníkov, heslo na vstup, či je nevyhnutné pozvanie do miestnosti, kto môže meniť predmet diskusie apod. Aby tieto vlastnosti nemuseli byť napevno definované v protokole, používa sa tzv. Data Forms (JEP-4). Data Forms umožňujú, aby služba poslala Ownerovi zoznam vlastností. Owner k nim priradí hodnoty a pošle ich späť službe. Takéto miestnosti sa volajú rezervované.

Niekedy je vhodnejšie, aby mohol klient akceptovať implicitné hodnoty bez toho, aby poznal Data Forms. Miestnosť s implicitnými vlastnosťami sa volá instantná a vytvorí sa odoslaním IQ paketu:

<iq from='psivak@jabber.sk' id='1'
  to='testroom@conference.jabber.org/root'
  type='set'>
  <query xmlns='http://jabber.org/protocol/muc#owner'>
    <x xmlns='jabber:x:data' type='submit'/>
  </query>
</iq>

Smack obsahuje triedu MultiUserChat, ktorá implementuje MUC. Objavila sa až v poslednej verzii Smacku 1.4.0. Vytvorenie instantnej miestnosti v Smacku ilustruje príklad:

MultiUserChat muc = new MultiUserChat
  (con, "testroom@conference.jabber.org");
muc.create("root");
muc.sendConfigurationForm(new Form(Form.TYPE_SUBMIT)); 

Vstúpenie do miestnosti

Ak chceme vstúpiť do miestnosti, ktorá už existuje, tak jej pošleme Presence paket – rovnaký aký sme poslali na začiatku vytvárania miestnosti. Služba vie, že miestnosť existuje, a tak sa nebude pokúšať vytvoriť novú. V Smacku na to slúži metóda

join(String nickname)

Odoslanie správy

Správu do miestnosti môžeme poslať tak, že odošleme Message paket typu groupchat na JID miestnosti:

<message
  from='psivak@jabber.sk'
  to='testroom@conference.jabber.org'
  type='groupchat'>
  <body>Správa</body>
</message>

V Smacku na to slúži metóda sendMessage(String text).

Nasleduje príklad na registrovanie metódy na obsluhu príchodzej správy:

PacketListener listener =
  new PacketListener() {
    public void processPacket(Packet packet) {
      // ...
    }
};
muc.addMessageListener(listener); 

Účastníci diskusie môžu chatovať aj súkromne:

Chat muc.createPrivateChat();

Metódou sendMessage(String text) takto vytvoreného objektu triedy Chat odošleme súkromnú správu.

Zmena nicku a predmetu diskusie

Zmena nicku po prihlásení sa v MUC robí odoslaním Presence paketu s novým nickom účastníka. Služba vie, že používateľ je prihlásený, a keď od neho dostane Presence paket s odlišným nickom, tak ho zmení.

<presence
  from='psivak@jabber.sk '
  to='testroom@conference.jabber.org/newbie'/>

Predmet diskusie sa mení zaslaním Message paketu obsahujúceho element subject:

<message
  from='psivak@jabber.sk'
  to='testroom@conference.jabber.org'
  type='groupchat'>
  <subject>Predmet diskusie</subject>

</message>

Práva účastníka diskusie

MUC definuje dve premenné, pomocou ktorých možno vyjadriť postavenie účastníka v diskusii – sú to Role (možné hodnoty sú Moderator, Participant, Visitor) a Affiliation (Owner, Admin, Member, Outcast, None). Budeme používať anglické názvy. Kým Affiliation je perzistentná vlastosť (pretrváva aj po odchode z diskusnej miestnosti), obsah Role je dočasný a po odchode z miestnosti sa neukladá. Neexistuje žiadne mapovanie medzi Role a Affiliation.

Najmenej možností má Visitor. Nemá právo posielať správy do diskusie, ale môže posielať súkromné správy. Môže tiež sledovať diskusiu a pozvať iných používateľov do miestnosti. Participant môže okrem toho meniť predmet diskusie a má vždy právo písať príspevky do diskusie. Najviac možností má Moderator. Ten môže vyhadzovať účastníkov z miestnosti. Ak ide o moderovanú diskusiu, stará sa tiež o prideľovanie a odoberanie možnosti posielať príspevky.

Keď nový používateľ vstúpi do moderovanej miestnosti, stane sa Visitorom (nemá právo posielať príspevky). Ak vstúpi do nemoderovanej miestnosti, stane sa Participantom. Admin určuje, kto je Moderatorom a kto nie.

Vytvorením miestnosti sa používateľovi nastaví Affiliation na Owner. Affiliation je hierarchická vlastnosť – Owner môže všetko a Outcast nič. Owner má právo nastavovať vlastnosti miestnosti, rušiť miestnosť a pridávať či odoberať Ownerov a Adminov. Admin toto nemôže, ale môže určovať zoznam Moderatorov. Admin tiež registruje účastníkov diskusie. Ak je účastník so svojim nickom registrovaný (je Member), nikto nemôže použiť jeho nick v jeho neprítomnosti v diskusnej skupine. Admin ešte rozhoduje, ktorý účastník sa stane Outcastom, tj. používateľom, ktorý nemôže vstúpiť do miestnosti.

Zmena Role a Affiliation sa dosiahne zaslaním IQ paketu s príslušným menným priestorom. Podrobnosti sú tu. V Smacku dosiahneme zmenu Role pomocou štyroch metód:

grantVoice(String nickname)
revokeVoice(String nickname)
grantModerator(String nickname)
revokeModerator(String nickname)

Tieto metódy menia Role medzi dvoma susednými hodnotami v hierarchí. Priradením práva na písanie príspevkov (grantVoice) zmeníme Visitora na Participanta. RevokeVoice funguje opačne. GrantModerator zmení Participanta na Moderatora a revokeModerator opačne. Ak chceme zmeniť Visitora na Moderatora, zavoláme najprv gratVoice a potom grantModerator.

Rovnakým spôsobom môžeme zmeniť Affiliation. Na to sú určené metódy:

grantMembership(string JID)
grantAdmin(string JID)
grantOwnership(string JID)
revokeMembership(string JID)
revokeAdmin(string JID)
revokeOwnership(string JID)

Na zakázanie vstupu do miestnosti používateľovi slúží metóda

bitcoin školení listopad 24

banUser(String jid, String reason)

Na druhej strane účastník diskusie, ktorému sa zmenila Role alebo Affiliation, potrebuje často o tom byť informovaný. V Smacku sa to robí napísaním obslužnej metódy a jej registrácií v inštancii MultiUserChatu. Ako príklad slúži informovanie o zmene Role:

muc.addUserStatusListener(
  new DefaultUserStatusListener() {
    public void voiceGranted() {
      // ...
    }
    public void voiceRevoked() {
      // ...
    }
  }); 

Záver

Multi User Chat je rozšírením protokolu XMPP. Oproti iným protokolom na vytváranie diskusných skupín (napr. IRC) ponúka niekoľko užitočných vylepšení najmä v súvislosti s určovaním práv jednotlivým účastníkom. Umožňuje tiež registrovanie nicku v konkrétnej diskusnej miestnosti a teda rieši problém so zámenami nickov.