EPIC4 Manual


ONs

To chyba będzie najmętniejsza strona w tym manualu....

Dzięki ONs można definiować reakcję skrytpu na różne wydarzenia (tzw 'hooks') - na tym głównie opierają się skrypty. Warto zapamiętać, iż wyrazenia takie jak ON, zdarzenia, hooks oznaczają dokładnie to samo - czyli jakieś zdarzenie, na które client może reagować w jakiś określony przez nas sposób, lub standardowo (jeżeli tego nie zdefiniujemy).

Składnia:

ON [modes]hook [serial#] match {akcja}


Aby wylistować interesujące nas ONy wraz z ich zawartością należy czynić tak:


/on

Pokaze wszystko -- straszny smnietnik


/on join

Pokaże wszystkie ONy związane z 'ON join'


No to jazda po kolei z tą składnią. :-)


modes

Istnieje sześć rodzajów modes pogrupowanych w trzech kategoriach. Tylko jeden mode z danej kategorii może być naraz użyty, ale można naraz używać różnych typów z różnych kategorii.
Kategorie i typy modes oraz odpowiadające im znaki to:


Podstawowe rodzaje modes (tylko jeden z tych trzech znaków może być użyty w jednym ON, gdyż wzajemnie się one wykluczają)

Jeżeli nie użyjemy żadnego z powyższych podstawowych modes client będzie się zachowywał jak gdzieś pomiędzy '+' (noisy) a '-' (silent).

Wszystkie poniższe przykłady będą przykładami zasosowania ON join:

$0nick osoby, która weszła na kanał
$1nazwa tego kanału
$2user@host osoby, która weszła na kanał


on +join "*" if (rmatch($2 *!*.pl)) {echo *** Polski Pokemon $0 wlazł na $1}

Jeżeli chemy sprawdzić, czy ten hook rzeczywiście działa, używamy mode '+':

*** JOIN actived by "Raichu #pokemons pika@pokemons.from.pl "
*** Polski pokemon Raichu wlazl na #pokemons
*** Raichu (pika@pokemons.from.pl) has joined channel #pokemons



on -join "*" echo *** Hey you Pikachu!

Nie ingerujemy w standardowe zachowanie clienta, dodajemy tylko swój jeden text. Pojawi się zatem np:

*** Hey you Pikachu!
*** Raichu (pika@pokemon.biz) has joined channel #pokemons



on ^join "*" echo *** $1 JOIN $0 \($2\)

Jeżeli w ogóle chcemy zmienić sposób wyświetlania komunikatów, używamy '^', co wygląda np. tak:

*** #pokemons JOIN Raichu (pika@pokemons.net)


Nie rozumiesz przykładu? Zobacz $rmatch(), Zasady cytowania


Dodatkowo można powyższe typy podstawowe modes łączyć z typami dodatkowymi (nazwijmy je lokalnymi). Tytlko jeden z tych dwóch poniższych typów lokalnych może być naraz użyty, gdyż wzajemnie się wykluczają.


on ^&join "*" echo $1 local-JOIN $1 \($2\)

Zdefiniowaliśmy local mode dla JOINs przy użyciu silent mode.
'Raichu' jest połączony z naszym iRC serverem, a 'Ash' z jakimś innym. I wygląda to np tak:

*** #poksmons local-JOIN Raichu (pika@pokemon.com)
*** Ash (ash@masters.pokemon.int) has joined channel #pokemons

Ostatnią kategorią modes jest serial (wymaga podania dodatkowego argumentu 'serial#', czyli numeru porządkowego, zaraz po nazwie hooka -- opis poniżej). Dzięki tej kategorii (oczywiście może być dowolnie łączona z dwoma poprzednimi kategorami modes) można określić w jakiej kolejności client ma interpretować poszczególne ONs odpowiadające temu samemu zdarzeniu. Oznaczamy go symbolem # (hash):

Przykład niżej.


hook

Jest to nazwa zdarzenia (lub jak kto woli wydarzenia, ONs), które client ma interpretować w sposób przez nas określony. Lista (i to całkiem spora) zdarzeń ON wraz z linkami znajduje się poniżej, dlatego tutaj nie będziemy się tym zajmować. Jednakże mogą to być tzw serials -- zdarzenia opisane za pomocą numerów (zgodnych z protkołem RFC1495), gdyż ta część komunikatów wysyłanych przez IRC server, która nie została jakoś nazwana (z wyjątkiem raw_irc), posiada swój numer.
Zdarzenia zapisane za pomocą numerków (ONs nazwane zresztą też) można zamiennie opisać za pomocą raw_irc, przy czym składnia tych dwóch (lub trzech) rodzajów zapisów będzie zupełnie odmienna.

UWAGA: Ogormnie ważną sprawą jest kolejność analizowania przez clienta tych samych zdarzeń, ale zapisanych za pomocą różnych metod. Zablokowanie (za pomocą ^ - slient) rozpatrywanej wcześniej metody spowoduje zaprzestanie analizy innych zapisów. Czasem właśnie o to chodzi, a czasem wręcz przeciwnie. Datego trzeba uważać, bo na nic tu się nie zdadzą różne serial# (zobacz niżej).

Kolejność analizowania zdarzeń ON to:

  1. raw_irc
  2. numerki
  3. nazwane
  4. zachowanie standardowe w przypadku braku zdefiniowania jakiegokolwiek z powyższych

Ten sam efekt za pomocą różnych sposobów: zobaczmy listę /NAMES na kanale. Przypominam, że każdy z tych trzech posobów posiada odmienną składnie i niezależnie od kolejności ich definiowania, wynik zawsze będzie interpretowany w powyższym porządku.


on -353 "*" echo [353] [$2] $3-

on -names "*" echo [NAMES] [$0] $1-

on -raw_irc "% 353 *" echo [RAW] [$4] $5-


/names #blah

Otrzymamy takie oto wyniki:

[RAW] [#blah] :Pikachu Raichu Metapod     /* tak, przed pierwszym nickiem jest ':' */
[353] [#blah] Pikachu Raichu Metapod
[NAMES] [#blah] Pikachu Raichu Metapod
Pub: #blah    Pikachu Raichu Metapod

Jeżeli np. użylibyśmy znaku '^' (silent) przy definiowaniu ON 353 nie pokazałyby się dwa ostatnie texty. W sumie może być. Natomiast w żadnym wypadku niedopusczalne jest używanie '^' w połączeniu z ON raw_irc gdyż client zgłupieje i nie będzie już działać poprawnie.


serial#

Ten argument jest konieczny, jeżeli użliśmy kategorii modes nazywanej serial (czyli znak #). serial# jest dowolną liczbą całkowitą: ujemną, zero lub dodatnią, która określa kolejność interpretacji ONów opisujących to samo zdarzenie (czyli posiadających taki sam wzór match -- zobacz niżej).
Kolejność wykonywania przebiega od najmniejszej licznby ujemnej, przez zero aż do największej licznby dodatniej. Jeżeli nie użyjemy mode serial, standardowo jest to '0' (zero). Oczywiście istnieje pełna swosoba w wyborze numeru serial# - zależy to tylko i wyłącznie od pożądanej kolejności działania.


Oba zapisy są tożsame:

on -join "*" echo *** To ja, Pikachu się nazywam.
on #-join 0 "*" echo *** To ja, Pikachu się nazywam.

Przykład kolejności wykonywnaia serials:

on #-join -2 "*" echo *** To pojawi się pierwsze.
on -join "*" echo *** To pojawi się drugie.
on #-join 9 "*" echo *** To pojawi się trzecie.


Ten zapis jest niepoprawny -- zabrakło serial# i nie będzie w ogóle działać:

on #-join "*" echo *** To jest cośtam.



match

Ten element opisuje jakie warunki muszą być spełnione w danym ONie, aby nas to interesowało. Innymi słowy, określamy jakie słowa muszą się tam pojawić. Można stosować oczywiście dowolne skróty '*' (gwiazdka - cokolwiek), '%' (procent - jedno słowo) czy '?' (znak zapytania - jeden zkak) -- dokładny opis skótów w opisie Wyrażeń Specjalnych.

Zapis słów match musi znajdować się pomiędzy znakami '" "' (cudzysłów) - jest to tzw zapis na sztywno - dany match jest określany w momencie, gdy defiunujemy zachowanie tego ONa i jest tam podstawiana tylko i wyłącznie aktualna wartość ewentualnych zmiennych, kóte się tam znalazły.
Można jednakże stosować zapis słów match pomiędzy znakami '' '' (single quote) - wtedy słowa match są redefiniowane za każdym razem, gdy dane zdarzenie ma miejsce -- czyli np. można tam wstawiać zmienne, które zmieniają swoją wartość i od tego uzależniamy czy day ON nas interesuje czy nie.

Jeżeli match jest jednym słowem, np '*' (gwiazdka), nie trzeba stosować '" "' (cudzysłowów), o ile chodzi nam o zapis na sztywno. W przeciwnym przypadku (lub gdy w match jest więcej słów), zapis bez '"' jest niedozwolony.

Oczywiście w jednym zdarzeniu uaktywnić się może tylko jeden ON najlepiej pasujący do match z takim samym serial#. Oznacza to, że np. mając poniższe dwa zapisy, przy wejściu na kanał #pikachu ukatywni się tylko pierwszy ON:


on -join "% #pikachu *" echo *** Ja bardziej pasuje do tego zdarzenia.

on -join "*" echo *** Ja jestem bardziej globalny, więc ustępuję bardziej szczegółowym


Dodatkowo (nie jest to wymagane), zapis match można poprzedzić (przed " czy ') jednym z dwóch rodzjów znaków:


on ^join "% #pokemons *" echo *** Kolejny miłośnik Pokemonów to $0 \($2\)
on ^join * echo *** $0 JOIN $1 \($2\)

Pierwszy ON uaktywni się tylko wtedy, gdy ktoś wejdzie na kanał '#pokemons'. Jeżeli wejdzie na inny, zadziała drugi.
'Raichu' wchodzi na #pokemons i #blah:

*** Kolejny miłośnik Pokemonów to Raichu (pika@pokemon.com)
*** #blah JOIN Raichu (pika@pokemon.com)


Przykład działania matches z użyciem ''' (single quote) ma sens jedynie wtedy, gdy użyjemy tam jakiejś zmiennej lub funkcji. Niech będzie to zatem funkcja $servernick(), czyli nasz aktualny nick. I niezależnie od zmiany nicka, ten ON zawsze będzie działać. (bo gdybyśmy użyli " ", działałoby poprawnie tylko wtedy, gdybyśmy mieli taki sam nick, jak w momencie definiowania tego ONa, gdyż zostałby on ustalony na sztywno).


on ^join '$servernick() *' echo *** Wlazłeś na kanał $1
on ^join '*' echo *** $1 JOIN $0 \($2\)

Pierwszy ON zadziała, gdy to Ty wejdziesz na jakiś kanał, a drugi, gdy ktokolwiek inny.


Oczywiście w drugim przypadku można z powodzeniem stosować zapis z użyciem '" "', gdyż nie ma tam żadnych zmiennych, które trzeba każdorazowo podstawiać.

Przykład pomijania znaków " ":


on -join * echo *** Pikachu jest żółty.
on -join "*" echo *** Pikachu jest żółty.

Oba zapisy są tożsame -- match to jedno słowo, więc można pominąc '" "'.


on -join *#blah* echo ** Pikachu jest żółty na kanale #blah.

Tu też można to pominąć, ale w zasadzie można się też na tym troche przejechac w innych przypadkach.


Przykłady zastosowania znaków dodatkowych dla match (- i ^)


on -join "% #pikachu *" echo *** Ktoś wszedł na kanał #pikachu
on -join -"% #pikachu *"

Określamy jakiegoś ONa, a następnie go kasujemy.


Metody kasowania ONów:


on -join -

Kasuje wszystkie ONy związane z '-join': nakazujemy kasoanie bez podania konkretnego wzoru match.




Zdefiniujmy jakiś ON z '-join':

on -join "% #pikachu *" echo Costam.

... i spróbujmy go skasować. Wszystkie poniższe metody są niepoprawne:

on ^join -"% #pikachu *"    /* niewłaściwy rodzaj mode: jest '-' zamiast '^' */
on -join -'% #pikachu *'    /* definiowaliśmy przy użyciu '" "' a nie '' '' */
on #-join 4 -"% #pikachu *" /* kasujemy z serial# '4' a przecież jest '0' */
on -join -"*"               /* ten wzór match nie odpowiada dokładnie wzorowi w ONie */

Tworzenie wyjątków nieinterpretowanych przez clienta:


on ^join ^"blah *"
on ^join "blah *" #

Obie metody spowodują to samo: komunikat o wejsciu nicka 'blah' na jakikolwiek kanał nie pokaże się.




akcja

Czyli jakiś alias, który ma być wykonany gdy dane zdarzenie ma miejsce lub znak komentarza aby nic się nie działo, gdy zależy nam na ominięciu tego przypadku. Stosowanie znaków '{ }' (nawiasy klamrowe) nie jest konieczne, gdy chcemy wykonać jakiś jeden alias. Przy klilku aliasach lepiej już jest używać tych nawiasów zamiast średników (;) oddzielających komendy.

Przykład poniżej.



Jak widać wszystko to jest zakręcone jak słoik na zimę, ale tylko pozornie. Jak zwykle najlepiej ten cały bałagan uporządkują jakieś bardziej ambitne przykłady :-)
Jeżeli ich nie zrozumiesz, nie przejmuj się za bardzo -- operacje na ONs są najbardziej skomplikowane i należy się na nie zabierać gdy zna się już zasady działania clienta (zobacz Wstęp) i ważniejsze Funkcje i podstawowe Polecenia języka EpiC. Czyli prawie wszystko :->

Bo np. wiesz o co tu chodzi?


Załóżmy, że mamy jakieś dwie zmienne '$protlist' i '$shitlist' z jakimiś tam maskami.

on ^join * {
   if (rmatch($0!$2 $protlist)) {
      @ :flags = [PROT]
   } elsif (rmatch($0!$2 $shistlist)) {
      @ :flags = [SHIT]
   }
   echo *** $1 JOIN $0 \($2\)${(flags)?[ [$flags]]:[]}
}

Jeżeli ktoś pasuje do lsity '$protlist' lub '$shitlist', komunikat o jego wejściu na kanał zostanie wyróżniony odpowiednim napisem '[SHIT]' lub '[PROT]', lub gdy nie pasuje do żadnej z tych list, napis się nie pojawi.

*** #pikachu Jessie (jessie@rocket.team.com) [SHIT]
*** #pikachu Ash (ash@masters.pokemon.int) [PROT]
*** #pikachu SpaM (zapytaj@ppp-milion.kukuryki-kamienne.tpnet.pl)

Można także od razu skrócić zapis ONa używając warunku zapisanego od razu w części match:


on -join '% % \\[${protlist}\\]' {
   echo *** $0 napewno jest u nas na ProtLiscie.
}

Ten ON uaktywni się tylko, gdy czyjś 'user@host' będzie pasowac do listy '$protlist'


Nie rozumiesz przykładu? Zobacz: Zasady Składni


Jak działają poszczególne ONs można przeczytać w linkach podanych poniżej.


Lista ONs nazwanych
Lista numerów ONs (EN)




Poprzedni Paragraf Home Następny Paragraf