EPIC4 Manual


raw_irc

Ma tak wiele zastosowań, że trudno podać chodźby część. Każda informacja przychodząca do nas od servera może zostać przechwycona przez ON raw_irc (choć w większośći sa one ONs nazwanymi lub numerkami). ON raw_irc jest jednak rozpatrywane jako pierwsze i daje nam to duże pole do popisu.

$0nadawca komuniaktu - typ '1' lub '2', zobacz niżej
$1polecenie zgodne z protokołem które zostało nam przesłane
$2-argumenty - różne w zależności od rodzaju polecenia

Najważniejsze jest to, że nie można używać mode '^' (silent) w połączeniu z ON raw_irc, gdyż client zgłupieje.


Najprostsza metoda do rozwalenia clienta:

on ^raw_irc '$servernick() JOIN *' #

Gdy z czymś takim wejdziemy na jakiś kanał client nie przeskanuje kanału, nie będzie wiedział kto jest na kanale, kto ma @, jakie są user@hosts ludzi, a nawet nie będzie wiedział, że sam się na tym kanale znajduje.

Jak wpomniałem, są dwa typy poleceń otrzymywanych przez ON raw_irc:

  1. $0 to nazwa IRC servera nadającego komunikat (zwykle jest to Twoj IRC server). Do tego typu należą wszystkie ONs posiadające swoje własne numerki
  2. $0 to 'nick!user@host' osoby, która wykonuje jakaś akcje. Należą tu: Czyli zdarzenia nie oznaczone żadnym numerkiem w protkole IRC z tej racji, że mogą posiadać różne texty, a ich nadawcami są ludzie, a nie server (który tlko w tej komunikacji pośredniczy).

Drugą ważną sprawą jest fakt, iż ON raw_irc zawsze (w zasadzie tylko z wyjątkiem MODE) posiada ':' (dwukropek) przed argumentem określającym jakiś zmienny text:


on -raw_irc "% PRIVMSG % *" {
   echo *** To jest MSG do $0 do $2 i text $3-
}

Po otrzymaniu MSG od 'Pikachu' z textem 'Hey you Pikachu' zobaczymy:

*** To jest MSG od Pikachu!pika@pokemon.com do Twoj_nick i text :Hey you Pikachu!


Tak samo poprawnie (z ':') należy wysyłać polecenia za pomocą quote. Dodatkowo zwróćmy uwagę, iż PRIVMSG jest taki sam dla MSG przeznaczonych dla nas jak i przeznaczonch dla jakiegoś kanału, czyli tzw public. Różnią się tylko adresatem ($2) -- w publics jest tam nazwa kanału.

Kolejną sprawą, na którą warto zwócić uwagę, jest fakt iż przy ON raw_irc nie działa funkcja $userhost(). Nie jest to jednak szczególnie dolegliwe, gdyż ON raw_irc typu drugiego posiada nick!user@host jako argument '$0', a w przypadku ON raw_irc typu pierwszego, nie potrzebujemy tego rodzaju informacji bo informacje są wysyłane przez IRC server i dotyczą tylko nas.

Inaczej troche wyglądają ON raw_irc typu pierwszego, czyli oznaczone także swoimi numrkami. Tam ważny jest tylko odpowieni numer zdarzenia oraz ew pare następnych argumentów (które są zmienne). Dalszy text jest często mało ważny, gdyż jest on zawsze tak iam dla konkretnego numeru.


Np. komunikat oznajmiający koniec listy //names:

on -raw_irc "% 366 *" echo *** $0-

Będzie to dla kanału '#blah'

*** #blah :End of NAMES list.


Na koniec o paru wyjątkach. Wyżej przestrzegałem przed konstrukacjami z 'ON ^raw_irc'. Jednak czasem są one konieczne, aby osiągnąc zamierzony przez nas cel. Np. aby uzyskać listę banów na kanale czy też móc operować na liscie //WHO. EpiC obie możliwości zarezerował dla siebie, nie dając nam zbyt dużego pola manewru. Dlatego czasem trzeba korzystać z ^raw_irc, aczkowiek zawsze z możliwie szeroką maską match i natychmiast po uzyskaniu interesujących nasz informacji -- kasować tego ONa żeby client mógł pracować poprawnie.


Np w celu sprawdzenia czy jakieś bany na kanale '#blah' pasują do maski 'Pikachu!pika@pokemons.com':

Ustalmy dwie zmienne globlalne, żeby to nam gdzieś nie przepadło.. zobacz bless.

@ bchan = [#blah]
@ bmask = [Pikachu!pika@pokemons.com]

Otrzymując listę banów dodajemy je po kolei do zmiennej '$bbans':

on ^raw_irc "% 367 % $bchan *" push bbans $4

A gdy server oznajmi, iż jest to koniec listy banów (numer 368 właśnie o tym mówi), skasujmy nasze ^raw_irc i zobaczmy wyniki.

on ^raw_irc "% 368 % $bchan *" {
   ^on ^raw_irc -"% 367 % $bchan *"
   ^on ^raw_irc -"% 368 % $bchan *"
   @ :bany = pattern($bmask $bbans))
   echo *** ${(bany)?[Znaleziono $bany]:[Nie ma pasujących banów]}
   ^assign -bchan
   ^assign -bmask
   ^assign -bbans
}

Ne rozumiesz przykładu? Zobacz: Zmienne, Zasady Składni, $pattern()

Podobnie trzebaby postępować w przypadku obrabiania listy //WHO, ale w zasadzie to rzadki przypadek, gdyż EpiC dostarcza różnego rodzaju potrzebych informacji z wewnętrznego cache`u, czyli funkcji: $chanusers(), $userhost(), $ischanop(), $ischanvoice(), itd.

Zobacz także: quote, ON odd_server_stuff



Lista Named ONs Home Następny Paragraf