H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Obsah Prohá ení Pod kování Obsah Teoretická ást
1. IRC ............................................................................................3 1.1. Co je IRC ............................................................................................ 3 1.2. Princip komunikace ............................................................................. 3 1.3. Funkce IRC sítí .................................................................................... 3 1.4. Komunikace z pohledu u ivatele ......................................................... 5 1.4.1. Výb r serveru ............................................................................... 5 1.4.2. P ezdívka ...................................................................................... 5 1.4.3. Kanál ............................................................................................ 6 1.4.4. Topic ............................................................................................ 6 1.4.5. Privátní komunikace – query ........................................................ 6 1.5. Typy u ivatel ..................................................................................... 6 1.5.1. Bot ................................................................................................ 6 1.5.2. IRC operátor ................................................................................. 6 1.5.3. Operátor kanálu ............................................................................ 6 1.6. Voice ................................................................................................... 7 1.7. Módy kanál ........................................................................................ 7 1.8. Ban ...................................................................................................... 8 1.9. Módy u ivatel .................................................................................... 8 1.10. NickServ – server p ezdívek .............................................................. 9 1.11. ChanServ – server kanál .................................................................. 9 1.12. Netsplit .............................................................................................. 9
2. PHP .........................................................................................11 2.1. Co je PHP .......................................................................................... 11 2.2. Historie PHP...................................................................................... 11
3. OOP ........................................................................................13 3.1. Koncepce OOP .................................................................................. 13 3.2. Teorie objekt ................................................................................... 14 3.3. Atomizace metod ............................................................................... 15 3.4. Objektov orientované programovací jazyky ..................................... 15 3.5. OOP v PHP5...................................................................................... 15 3.5.1. Úrovn p ístupu .......................................................................... 15 3.5.2. Konstruktor a destruktor ............................................................. 17 3.5.3. D di nost .................................................................................... 17 3.5.4. Abstraktní t ídy ........................................................................... 19 3.5.5. Statické vlastnosti a metody ........................................................ 20
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
3.5.6. T ídy typu final ........................................................................... 20 Praktická ást
1. Instalace ..................................................................................23 1.1. Instalace na web serveru Apache ....................................................... 23 1.2. Instalace bez serveru Apache ............................................................. 25 1.2.1. Instalace ve Windows XP ........................................................... 25 1.2.2. Instalace na OS Linux ................................................................. 25
2. Konfigurace.............................................................................26 2.1. Config.php ......................................................................................... 26 2.1.1. Atributy souboru a jejich význam ............................................... 28
3. Spu
ní ...................................................................................30
3.1. Spu ní p es server APACHE .......................................................... 30 3.1.1. Komplikace p i spou ní a chodu .............................................. 30 3.2. Spou ní na PHP interpretu .............................................................. 30 3.2.1. Komplikace p i spu ní a chodu ................................................ 31 3.3. ení problému ................................................................................ 31
4. Logování .................................................................................32 4.1. Co je to logování ............................................................................... 32 4.2. Logování v aplikaci bota ................................................................... 32 4.3. P íklady logování............................................................................... 34
5. Objektový model .....................................................................35 5.1. T ída IRC .......................................................................................... 36 5.1.1. Atributy ...................................................................................... 36 5.2. Metody .............................................................................................. 37
6.
ída Log.................................................................................39 6.1. Atributy ............................................................................................. 39 6.2. Metody .............................................................................................. 39
7.
ída IRCBot...........................................................................41 7.1. Atributy ............................................................................................. 41 7.2. Metody .............................................................................................. 41
8.
ída ConfFile a odvozené ......................................................43 8.1. Atributy ............................................................................................. 43 8.2. Metody .............................................................................................. 44 8.3. T ída UserFile ................................................................................... 44 8.4. EventsFile.......................................................................................... 45 8.5. CommandFile .................................................................................... 45
9. Události – Events ....................................................................46 9.1. Trigger............................................................................................... 46 9.2. Command – p íkaz ............................................................................ 47 9.3. Obslu ný kód..................................................................................... 48 9.4. CodeEvent ......................................................................................... 49
10. Tvorba vlastních obsluh událostí a p íkaz ..............................50
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
10.1. Vlastní obsluha události krok za krokem ......................................... 50 10.1.1. P íklad obsluhy události KICK ................................................. 50 10.2. Vlastní p íkaz krok za krokem ......................................................... 51 10.2.1. P íklad p íkazu op ..................................................................... 51 10.3. Obecn ............................................................................................ 52 10.3.1. D le ité funkce ve t íd Event .................................................. 52 Záv r Anotace Seznam pou ité literatury
.d o
m
w
o
.c
C
m o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Úvod Tato absolventská práce si klade za cíl vytvo ení snadno programovatelného bota pro sí IRC. V sou asné dob p edpokládá v ina takových aplikací znalost speciálních skriptovacích jazyk a n kdy i administrátorský p ístup k opera nímu systému serveru, na kterém taková aplikace má b et. Co je samoz ejm pro b ného u ivatele nesplnitelné, pop ípad zbyte finan náro né. Moje realizace vychází z toho, e v sou asné dob se stále více prosazuje populární skriptovací jazyk PHP. Proto bude také tato aplikace psána v jazyce PHP. Základní my lenkou práce je vytvo it silné jádro aplikace, kterou si bude moci ka dý u ivatel snadno dotvo it ke svému obrazu. Aplikace bude koncipována tak, aby co nejvíce usnad ovala práci lidem, je budou programovat svá roz ení, ale zárove by jim m la dávat co nejv í volnost a p ehled nad komunikací s IRC serverem. Cht l bych dosáhnout toho, aby si ka dý u ivatel IRC s minimálními znalostmi programování a protokolu IRC mohl vytvo it svého unikátního IRC bota, bez toho ani by musel v novat n kolik týdn studiu a úprav hotových ení.
1
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Teoretická ást
2
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
1. IRC 1.1.Co je IRC IRC je zkratka anglických slov Internet Relay Chat, co ve volném p ekladu znamená internetový p enos rozhovoru. IRC bylo v minulosti mimo BBS a unixového TALKu jedinou mo ností ivé (real-time) komunikace mezi ivateli internetu. IRC je víceu ivatelský, mnohokanálový systém pro komunikaci na internetu. U ivatel si zvolí p ezdívku a pak komunikuje s ostatními u ivateli bu hromadn k IRC kanálu, nebo soukrom . Zkratka IRC je dnes nej ast ji pou ívána ve spojitosti s protokolem IRC, který je v základní form definován normou RFC 1459 (http://www.faqs.org/rfcs/rfc1459.htm).
1.2.Princip komunikace Komunikace p i IRC probíhá na základ modelu klient-server. U ivatel tedy komunikuje p ímo se serverem a nemusí p i hromadné diskuzi posílat svou zprávu v em zú astn ným. Obrázek 1-I – Princip komunikace v síti IRC
Výhodou tohoto ení je, e data jsou odesílána v em p esn v takovém po adí, jako dorazila na server. Tím je zabezpe eno, e se u jednotlivých ivatel nebudou data zobrazovat r zn .
1.3.Funkce IRC sítí IRC komunikace funguje na principu klient-server-klient. U ivatelé, kte í spolu cht jí komunikovat, se p ipojí k serveru a ve kerou komunikaci provád jí prost ednictvím serveru. Z toho vyplývá, e je nutné, aby oba ivatelé byli p ipojeni ke stejnému serveru. Jeliko zp sob, ve kterém by se ivatelé, je spolu cht jí komunikovat, musí p ipojit na jeden server je limitován mo nostmi serveru – jeho hardwarovým a softwarovým vybavením, vytí ením, propustností sít a dal ími, toto ení se nepou ívá.
3
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
ením pro zvý ení maximálního po tu p ipojených u ivatel je tvorba tzv. IRC sítí. Mezi neznám í pat í nap íklad EFnet a IRCnet. ehled hlavních IRC sítí viz Tabulka 1-I. Tabulka 1-I – P ehled hlavních IRC sítí
Sí Po et kanál , nebo u ivatel Server ezdívek Server kanál Hlavní server, port Domovská stránka
EFnet
IRCnet
Undernet
Dalnet
cca. 45.000
cca. 40.000
cca. 40.000
cca. 25.000
ne
ne
ne
ano
ne irc.efnet.net, 6667
ne
ano us.undernet.org, 6667
ano irc.dal.net, 7000
www.undernet.org
www.dal.net
www.irchelp.org
není www.ircnet.cz
* Údaje p evzaty z http://irc.diary.cz/b3nets.html dne 20. 4. 2007
IRC sí ozna uje propojení n kolika IRC server do celku, který umo ní komunikaci u ivatel p ipojených na r zných serverech v rámci jedné sít . Schéma segmentu sít podle RFC 1459 (Obrázek 1-II). Obrázek 1-II – Schéma segmentu sít IRC server podle RFC 1459
V IRC síti v echny servery sdílejí a mají p ístup ke stejným informacím. To znamená, e u ivatel p ipojený k libovolnému serveru v síti, m e komunikovat s u ivateli p ipojenými i k jinému serveru v síti. Dal ím d vodem, pro budovat nové IRC servery ke stávající síti, je geografické rozlo ení. U ivatel si tak vybere server, který je mu geograficky nejblí e a s velkou pravd podobností na n j bude mít nejlep í spojení.
4
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
1.4.Komunikace z pohledu u ivatele ivatel, který chce komunikovat v síti IRC, pot ebuje k p ipojení n kterého z IRC klient . Tabulka 1-II - P ehled n kterých IRC klient
Název mIRC zkrv xChat AdiIRC Irsek
Platforma
Licence
Domácí stránka
Win Win Lin/Win Win Lin – terminál
Shareware Freeware Demo - 30 dní Freeware Open-source
www.mirc.com http://www.zirc.sk/ http://www.xchat.org http://www.adiirc.com http://irssi.org/
V nastavení Vámi zvoleného klienta je v dy nutné vyplnit tyto údaje: - server a port serveru, na který se chcete p ipojit (viz 1.4.1) - skute né jméno - e-mail ezdívka
1.4.1.Výb r serveru Pokud se p ipojujeme k IRC síti s více ne jedním serverem, doporu uje se obecn vybrat server, který je geograficky nejblí e. Lokální (blízké) servery inou pracují rychle a nabízejí neomezený p ístup. V p ípad , e se p ipojení n kolikrát nezda í, vyzkou íme n který ze vzdálen ích server . Port IRC je v inou 6667 (v síti DalNet 7000), n kdy v ak z r zných vod není tento port pro IRC uvoln n. V takovém p ípad se obvykle pou ívají porty v rozmezí 6665-6670.
1.4.2.P ezdívka Na IRC u ivatelé vystupují výhradn pod svými p ezdívkami. M ete si vybrat libovolnou, do 9 znak dlouhou. Nepou ívejte mezery a eské znaky v p ezdívce. Je také velmi asté najít lov ka se stejnou p ezdívkou a m e vám být proto nabídnuto a si svou p ezdívku zm níte, aby si vás nikdo nemohl splést. V n kterých IRC sítích mohou být p ezdívky vlastn ny. To znamená, e ezdívku m e pou ívat pouze u ivatel, který si ji zaregistroval. Z velkých sítí toto funguje pouze na síti DalNet.
5
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
1.4.3.Kanál Po p ipojení na server m e u ivatel vstoupit do libovolného po tu kanál . Kanál je místo, kde probíhá skupinová konverzace. Ve velkých IRC sítích (EFnet) je více ne 10000 kanál , v malých sítích je mén . Kanály na IRC jsou dynamické, to znamená, e ka dý m e zalo it nový kanál. Ke zru ení kanálu dojde, pokud jej opustí poslední osoba. Názvu kanálu v dy p edchází znak '#'.
1.4.4.Topic Topic neboli téma je vlastností kanálu. Je zde uvedeno, na jaké téma se hovo í. Topic mohou obvykle m nit (nastavovat) pouze operáto i kanálu.
1.4.5.Privátní komunikace – query Query je ozna ení pro komunikaci pouze mezi dv ma u ivateli sít , bez ítomnosti ostatních. Data odeslaná do query (pomocí p íkazu msg), jsou ur ena p ímo jinému ivateli, který je identifikován p ezdívkou (nick).
1.5.Typy u ivatel ivatele IRC sít lze rozd lit do dvou skupin. První, nejpo etn í skupinou jsou b ní u ivatelé, kte í se do sít ipojí, zakládají kanály, chatují. Druhou skupinou jsou správci IRC sít tzv. IRC operáto i (viz 1.5.2). ivatele je také mo né rozd lit na " ivé" a boty (viz 1.5.1).
1.5.1.Bot Bot je zkratka slova robot. IRC bot je program, p ipojený k IRC síti, b ící obvykle na n jakém serveru. Bot m e slou it r zným ú el m, jako jsou nap íklad: udr ování a správa kanál , zaznamenávání komunikace, nebo tvo ení statistik.
1.5.2.IRC operátor IRC operátor je lov k, nebo Bot, který se stará o provoz serveru. IRC operátor m e vstoupit do libovolného kanálu, a provést libovolné zm ny, ani by se musel stát operátorem kanálu. IRC operáto i pomáhají p edev ím v situaci, kdy z n jakého d vodu nezbude ádný operátor kanálu.
1.5.3.Operátor kanálu Operátorem kanálu se stane u ivatel, který kanál zalo í a poté ka dý, koho který ze sou asných operátor ur í, na serverech s registrací kanál zaregistrovaný u ivatel po p íhodu. 6
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Operátor je ozna en symbolem '@' p ed jménem. Po et operátor v kanálu není omezen, existují kanály, kde jsou v ichni ivatelé zárove operátory, a m e se stát, e kanál nemá operátora ádného. Mezi hlavní práva operátoru nad kanálem pat í: - zm na módu kanálu id lení voice (viz mód kanálu +m) - ud lat libovolného u ivatele operátorem - vyhodit libovolného u ivatele z kanálu - zakázat p ístup libovolnému u ivateli (zabanovat ho) Práva kanálových operátor se vztahují v dy p ímo ke kanálu. To znamená, e kdy u ivatel, který je operátorem i n kolika kanál se ipojí na Vá kanál, nemá operátorská práva, dokud mu je sami nedáte.
1.6.Voice Voice se vztahuje k módu +m kanálu. P i nastaveném módu +m mohou v kanálu mluvit pouze operáto i a u ivatele s voice. Voice nastavuje v dy jen operátor kanálu.
1.7.Módy kanál Kanály mohou mít dodate né vlastnosti, které se nastavují pomocí p íkazu mode. Kanály mohou být moderované, tajné, soukromý, s omezeným po tem ivatel , anonymní, jen na pozvání, zamknuté klí em, s omezeným tématem, se seznamem zakázaných (zabanovanych) u ivatel . Tabulka 1-III - Módy kanálu
Mód +i +k +l +m +n +p +s +t
Význam kanál je jen na pozvání kanál je zam ený, pro p ístup musíte zadat správný klí kanál je omezený maximálním po tem u ivatel v kanále kanál je moderovaný, pouze operáto i kanálu a ostatní s voice mohou mluvit externí zpráv do kanálu nejsou povoleny kanál je soukromý kanál je tajný omezené téma - jen operáto i kanálu mohou m nit topic
7
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Kanál má výchozí nastavení jako ve ejný. Kdokoliv m e posílat oznámení do takového kanálu, vid t jeho u ivatele a p ijít konverzovat. V seznamu kanál m ete vid t témata ve ejných kanál . Kdy je n kdo ve ve ejném kanále, m e být snadno nalezen ostatními u ivateli, kdy nemá osobní mód nastaven na neviditelný (viz. 1.9 - Módy u ivatel ). Do kanál jen na pozvání m e u ivatel p ijít, jen kdy je pozván jakým z operátor daného kanálu. Soukromé kanály jsou viditelné v seznamu kanál . Ostatní u ivatelé mohou u ivatele v soukromém kanále vid t, ale nevidí v jakém soukromém kanále u ivatel je. Tajné kanály se nezobrazují v seznamu kanál a nelze zjistit jejich téma, dokud do kanálu nep ijdete. Pokud je u ivatel v tajném kanále, ostatní, kte í nejsou ve stejném kanále, ho nemohou vid t. Pokud je u ivatel jen v tajných kanálech, jeho jméno se nezobrazí v seznamu lidí na IRC.
1.8.Ban Ban neboli zákaz. Ozna uje zákaz vstupu do kanálu nebo p ipojení na server. Ban na vstup do kanálu m e nastavit jeho operátor. Ban p ipojení k serveru nastavuje IRC Operátor. Tento zákaz se také ozna uje K-line. Ban je v dy aplikován na IP, nebo hostmask u ivatele.
1.9.Módy u ivatel Stejn jako kanály, i u ivatelé mohou mít své módy. Ka dý u ivatel m e nit mód pouze sob . Tabulka 1-IV - Módy u ivatel
Mód +i +r +o +s +w
Význam iní u ivatele neviditelným pro ka dého, kdo nezná jeho ezdívku nastaví u ivateli omezený p ístup nastaví u ivatele jako IRC-Operátora, mohou nastavovat jen IRC operáto i u ivatel bude dostávat oznámení serveru u ivatel bude dostávat wallopy - zprávy pro IRC operátory
Vá u ivatelský mód m ete nastavit jako neviditelný, co znamená, e vás ostatní lidé na IRC nebudou moci najít, kdy neznají p esn va i ezdívku. Kdy máte omezený p ístup, nem ete získat práva normálního operátora kanál a nem ete si m nit p ezdívku. Ale chatovat m ete normáln . 8
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
1.10.NickServ – server p ezdívek Na EFnetu NickServ byla registra ní slu ba pro p ezdívky v N mecku. Byl to bot, který hlídal, aby registrovanou p ezdívku pou íval jen její majitel. NickServ byl vypnut na podzim roku 1994. Av ak p ezdívky jsou vlastn ny v mnoha IRC sítích. V IRC síti Dalnet je NickServ stále aktivní. V mnoha nových sítích, jak t eba Dalnet, je stále aktivní n jaká podoba NickServ. NickServ Dalnetu umo uje u ivatel m efektivn "vlastnit" ezdívky. Tato verze slu eb je mnohem výkonn í ne p edch dce na EFnetu a jeho kapacita umo uje odpojit kohokoliv, kdo se bude sna it pou ívat n í registrovanou p ezdívku. Podrobnosti jak registrovat p ezdívky jsou dostupné na mnoha www stránkách sítí.
1.11.ChanServ – server kanál V mnoha IRC sítích m ete registrovat sv j kanál n jakou slu bou, v inou nazývanou Chanserv. Kdy vlastníte kanál, m ete se stát operátorem kdykoliv chcete anebo init operátorem n koho jiného. Ostatní módy kanálu jako témata, klí e anebo voice jsou voliteln spravované t mito Chanserv boty, s výjimkou ban . Podrobnosti, jak registrovat kanál, jsou dostupné na mnoha www stránkách sítí.
1.12.Netsplit Netsplit je slo enina anglických slov net - sí a split - rozd lení. Jak ji název napovídá, jedná se o rozd lení sít v d sledku výpadku n kterého z klí ových server , nebo p eru ení spojení mezi servery. Obrázek 1-III – Klasická malá IRC sí
9
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Obrázek 1-IV – Sí odolná proti NetSplit
Pokud v klasické síti (Obrázek 1-III) dojde k p eru ení spojení mezi servery 2 a 3, sí se roz pí na dv . U ivatelé na serveru 3 a 4 nemohou komunikovat s u ivateli na serveru 1 a 2 a naopak. Netsplit je velice nep íjemnou zále itostí pro u ivatele, jeliko b hem výpadku serveru je p eru ena jejich komunikace nap sítí. Aby se p ede lo mto problém m, je server provázán s více servery (Obrázek 1-IV). Po netsplitu, b hem propojování sít , servery na obou stranách splitu zkou í aktualizovat v echny chyb jící informace - nové u ivatele, jejich ezdívky, kanály a nastavení kanál . Servery na obou stranách se také esv í, zda ve v ech kanálech jsou stejní operáto i. Tomuto procesu se íká server-opování. Server-opy jsou známé tím, e je vyu ívají hacke i kanál . Ti mohou vyu ít netsplity k nastavení sebe jako operátora v kanálu na jedné stran splitu a v okam iku propojení sít de-opovat právoplatné operátory. Sí Undernet má vylep ený server-server protokol, který p edchází server-op kv li desynchronizaci kanál a p ípadným kolizím p ezdívek.
10
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
2. PHP 2.1.Co je PHP PHP (rekurzivní zkratka PHP: Hypertext Preprocessor, „PHP: Hypertextový preprocesor“, p vodn Personal Home Page) je skriptovací programovací jazyk, ur ený p edev ím pro programování dynamických internetových stránek. Nej ast ji se za le uje p ímo do struktury jazyka HTML, XHTML i WML, co je velmi výhodné pro tvorbu webových aplikací. PHP lze ov em také pou ít i k tvorb konzolových a desktopových aplikací. PHP skripty jsou provád ny na stran serveru, k u ivateli je p ená en a výsledek jejich innosti. Syntaxe jazyka kombinuje hned n kolik programovacích jazyk (Perl, C, Pascal a Java). PHP je nezávislý na platform , skripty fungují bez úprav na mnoha zných opera ních systémech. Obsahuje rozsáhlé knihovny funkcí pro zpracování textu, grafiky, práci se soubory, p ístup k v in databázových server (mj. MySQL, ODBC, Oracle, PostgreSQL, MSSQL), podporu celé ady internetových protokol (HTTP, SMTP, SNMP, FTP, IMAP, POP3, LDAP, …) PHP se stalo velmi oblíbeným p edev ím díky jednoduchosti pou ití a tomu, e kombinuje vlastnosti více programovacích jazyk a nechává tak vývojá i áste nou svobodu v syntaxi. V kombinaci s databázovým serverem (p edev ím s MySQL nebo PostgreSQL) a webovým serverem Apache je asto vyu íván k tvorb webových aplikací. Díky velmi astému nasazení na serverch se v ila zkratka LAMP – tedy spojení Linux, Apache, MySQL a PHP nebo Perl. S verzí PHP 5 se výrazn zlep il p ístup k objektov orientovanému programování podobný Jav .
2.2.Historie PHP Od roku 1994 je PHP jedním z nejpou ívan ích zp sob tvorby dynamicky generovaných WWW stránek. Jeho tv rce (Rasmus Lerdorf) jej vytvo il pro svou osobní pot ebu, epsáním z Perlu do jazyka C. Sada skript byla vydána je v tém e roce pod názvem Personal Home Page Tools, zkrácen PHP.
11
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
V polovin roku se systém PHP spojil s programem Form Interpreter stejného autora. Tak vzniklo PHP/FI 2.0. Zeev Suraski a Andi Gutmans v roce 1997 p epsali parser a zformovali tak základ PHP3. Sou asn byl název zm n na dne ní podobu PHP hypertext procesor. PHP3 vy lo v roce 1998, bylo rychlej í, obsahovalo více funkcí. Také b elo i pod opera ním systémem Windows. V roce 2000 vychází PHP verze 4, o ty i roky pozd ji pak verze 5 s vylep eným objektovým p ístupem, podobným jazyku Java.
12
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
3. OOP OOP je zkratka anglického Object-oriented programming. OOP je metodika návrhu a vývoje software zalo ená na objektech a jejich instancích. Termín OOP znamená objektov orientované programování, co je zp sob programování, kdy chápeme procesy jako entity. Tedy zkrácen eno, nepot ebujeme v t, jak daný program funguje, ale musíme v t, jak tento program pou ívat. Na rozdíl od procedurálního programování, v OOP jsou data a funkce navzájem svázány do struktury, nazývané objekt. T ída je ablonou objektu, volání t ídy se pak ozna uje jako instance. Pojmy instance a objekt jsou v podstat synonyma. asto v ak mluvíme o konkrétním objektu jako o instanci, termín objekt se pou ívá, pokud mluvíme o objektech obecn . S oblibou se pak rozdíl mezi objektem a t ídou vysv tluje tak, e objekt je vyjád ením t ídy v reálném sv (i kdy to m e být trochu zavád jící).
3.1.Koncepce OOP Koncepce OOP se skládá z t chto ástí: - Objekty – jednotlivé prvky modelované reality (jak data, tak související funk nost) jsou v programu seskupeny do entit, nazývaných objekty. Objekty si pamatují sv j stav a navenek poskytují operace (p ístupné jako metody pro volání). - Abstrakce – programátor, pota mo program, který vytvá í, m e abstrahovat od n kterých detail práce jednotlivých objekt . Ka dý objekt pracuje jako erná sk ka, která doká e provád t ur ené innosti a komunikovat s okolím, ani by vy adovala znalost zp sobu, kterým vnit pracuje. - Zapouzd ení – zaru uje, e objekt nem e p ímo p istupovat k „vnit nostem“ jiných objekt , co by mohlo vést k nekonzistenci. Ka dý objekt navenek zp ístup uje rozhraní, pomocí kterého (a nijak jinak) se s objektem pracuje. - Skládání – Objekt m e vyu ívat slu eb jiných objekt tak, e je po ádá o provedení operace.
13
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
-
di nost – objekty jsou organizovány stromovým zp sobem, kdy objekty n jakého druhu mohou d dit z jiného druhu objekt , ím ebírají jejich schopnosti, ke kterým pouze p idávají svoje vlastní roz ení. Tato my lenka se obvykle implementuje pomocí rozd lení objekt do t íd, p em ka dý objekt je instancí n jaké t ídy. Ka dá ída pak m e d dit od jiné t ídy (v n kterých programovacích jazycích i z n kolika jiných t íd).
- Polymorfismus – odkazovaný objekt se chová podle toho, jaký je jeho skute ný typ. Pokud n kolik objekt poskytuje stejné rozhraní, pracuje se s nimi stejným zp sobem, ale jejich konkrétní chování se li í. V praxi se tato vlastnost projevuje nap . tak, e na místo, kde je ekávána instance n jaké t ídy, m eme dosadit i instanci libovolné její podt ídy (t ídy, která p ímo i nep ímo z této t ídy d dí), která se e chovat jinak, ne by se chovala instance rodi ovské t ídy, ov em v rámci mantinel , daných popisem rozhraní. které z t chto vlastností jsou pro OOP unikátní, jiné (nap . abstrakce) jsou b nou vlastností i jiných vývojových metodik. OOP je n kdy ozna ováno jako programátorské paradigma, nebo popisuje nejen zp sob vývoje a zápisu programu, ale i zp sob, jakým návrhá programu o problému emý lí. Základním paradigmatem OOP je snaha modelovat p i ení úloh principy reálného sv ta v po íta i pokud mo no jedna ku jedné. V praktickém ivot otevíráme dve e po ád stejn , bez ohledu na to, zda jsou d ev né nebo laminované, zda mají kukátko, bezpe nostní vlo ku nebo etízek navíc. Stejn tak se m eme dívat na televizi, p epínat programy a docela dob e ji ovládat, esto e nevíme v bec nic o principech jejího fungování. Analogicky p i vývoji slo itých informa ních systém mohou vývojá i pou ívat ji vytvo ené komponenty, podle pot eby si je trochu upravit nebo je pou ívat jako stavebnici pro sestavování d mysln ích a slo it ích objekt .
3.2.Teorie objekt Krom vlastních implementací objekt v n jakém programovacím jazyce, existuje i obecná teorie, je se objekty a jejich vlastnostmi zabývá. Základním pojmem je objekt. Objekt si „pamatuje“ sv j stav (v podob dat ili atribut ) a poskytuje rozhraní operací, aby se s ním mohlo pracovat (nazývané metody). P i pou ívání objektu nás zajímá, jaké operace (slu by) poskytuje, ale ne, jakým zp sobem to provádí - to je princip zapouzd ení. Jestli to provádí sám nebo vyu ije slu eb jiných objekt , není podstatné. Vlastní implementaci pak m eme zm nit (nap . zefektivnit), ani by se to dotklo v ech, kte í objekt pou ívají. 14
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Abstrakce objektu, která v architektu e programu podchycuje na obecné úrovni podstatu v ech objekt podobného typu, se nazývá t ída. T ída je edpis, jak vyrobit objekt daného typu.
3.3.Atomizace metod Zodpov dnost objektu je to, co objekt umí, o co se stará. Objekt by nem l um t sám p íli mnoho a nemusí to d lat sám (viz skládání objekt ). Znakem kvalitního návrhu softwaru je to, e t ídy v projektu obsahují pokud mo no atomické metody, které í pouze jeden konkrétní problém.
3.4.Objektov orientované programovací jazyky Existuje velké mno ství programovacích jazyk umo ujících objektov orientované programování, nap . Smalltalk, Java, C++, Object Pascal, C#, Lisp, PHP, Python, Ruby… Tyto jazyky m eme roz lenit do skupin: -
ist objektové jazyky, n kdy nazývané objektové, ve kterých se programuje pouze pomocí objekt . Sem pat í nap . Smalltalk.
- Hybridní jazyky, nebo také objektov orientované, ve kterých programátor m e a nemusí dodr ovat principy OOP, které je inou implementováno nekompletn (základní typy). Mezi takové jazyky pat í nap . C++, Python. - Objektová roz ení p vodn neobjektových jazyk , nap . Object Pascal, který vznikl jako roz ení neobjektového jazyka Pascal.
3.5.OOP v PHP5 Práce s objekty byla ji v omezené mí e dostupná ji v PHP3, av ak její pou ití bylo zna neefektivní a neposkytovalo v inu po adovaných funkcí. V PHP5 je pln podporováno objektové programování podobné bázi jako v Jav , nebo C++.
3.5.1.Úrovn p ístupu PHP 5 umo uje definovat vlastnostem i metodám viditelnost pomocí zvlá tních klí ových slov. PHP tedy d lí atributy (vlastnosti) a metody na public, protected a private. Vlastnost nebo metoda ur ená pomocí public je p ístupná v em ivatel m t ídy. 15
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Klí ové slovo protected (z anglického "chrán ný") p ed metodou nebo vlastností t ídy znamená, e je vlastnost p ístupná u ivatel m t ídy (rodi e) a podt ídy, která tuto t ídu d dí. Soukromá metoda nebo vlastnost p edzna ená klí ovým slovem private je p ístupná pouze uvnit t ídy. Viditelnost není nutné definovat, pokud tak neu iníme, pak nabývá implicitní hodnoty public. Kód 3-I
verejna; echo $this->chranena; echo $this->soukroma; } } $instance = new Trida(); $instance->volatVlastnosti(); echo $instance->verejna; //echo $instance->chranena; //echo $instance->soukroma; ?>
Kdy voláme metodu $instance->volatVlastnosti(), vypí í se v echny vlastnosti definované uvnit metody volatVlastnosti() (uvnit rodi ovské t ídy jsou v echny vlastnosti viditelné), kdy v ak voláme jednotlivé vlastnosti postupn , dochází k n kolika zm nám. Zápis echo $instance->verejna; bude bez problém fungovat, vlastnost je ve ejná, m eme ji volat kdekoli. Zápisy echo $instance->chranena; a echo $instance->soukroma; budou nefunk ní, nejsou viditelné mimo t ídu. Viditelnost vlastností a metod je jedna z nejv ích výhod objektov orientovaného programovaní a p i návrhu objektov orientovaných aplikací je jednou z nejd le it ích ástí návrhu. Obecn se nedoporu uje pou ívat vlastnosti s p ístupem public.
16
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
3.5.2.Konstruktor a destruktor Mezi speciální metody objekt pou itelných v PHP pat í konstruktory a destruktory. Konstruktory jsou definovány klí ovým slovem __construct, destruktory klí ovým slovem __destruct. Konstruktor je automaticky spu n p i tvorb instance pomocí klí ového slova new. Konstruktor m e mít parametry, které budou p edány p i tvorb objektu pomocí new. Destruktor je spou n p i uvol ovaná instance. Instance objektu je uvoln na automaticky p i ukon ení skriptu, nebo v p ípad e na ni ji neexistují ádné reference nap íklad po pou ití metody unset() na instanci t ídy. Destruktor nemá ádné parametry. Konstruktor i destruktor musí být definovány v úrovni p ístupu public. Kód 3-II – Konstruktory a destruktory
vek = $vek; } public function __destruct(){ return $this->vek; } } $instance = new Trida(20); ?>
V p ede lém p íklad (Kód 3-II) dojde p i volání $instance = new Trida(20); k nastavení privátní prom nné $vek na hodnotu 20. Poté, co je vytvo ena instance t ídy do prom nné $instance, provede se kód konstruktoru a následuje konec skriptu. i ukon ování skriptu jsou uvol ovány v echny prom nné (v na em ípad pouze $instance). i uvol ování instance t ídy Trida dochází ke spu ní destruktoru, který vypí e hodnotu $vek, tedy 20.
3.5.3.D di nost di nost t ídy je ozna ována klí ovým slovem extends. P vodní t ída se ozna uje jako bázová nebo jako rodi . T ída odvozená ze t ídy bázové je ozna ována jako odvozená nebo potomek. 17
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Speciálním p ípadem bázové t ídy je t ída abstraktní viz 3.5.4. i d ní (odvozování) se v PHP5 automaticky ned dí konstruktor a destruktor, jak tomu bylo v ni ích verzích. Kód 3-III
prom = $prom; } public function EchoProm(){ echo $this->prom; } } class ETrida extends Trida{ public $prom2; public function __construct($prom,$prom2){ parent::__construct($prom2); $this->prom2 = $prom2; } public function EchoProm(){ echo 'prom: '; parent::EchoProm(); echo proms: '; echo $this->prom2; } } $instance = new ETrida(5,8); $instance->EchoProm(); ?>
ída ETrida, zd dí funkci EchoProm() z bázové t ídy, tuto je v ak pot eba p etí it funkcí novou, která pomocí klí ového slova parent:: p istoupí i k p etí en funkci. i zavolání EchoProm() se tedy spustí i EchoProm() bázové t ídy. Konstruktor musí být definován v ka dé odvozené t íd znovu i v p ípad , e by jeho kód m l pouze volat konstruktor p edch dce.
18
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
3.5.4.Abstraktní t ídy Abstraktní t ída je t ída, která obsahuje abstraktní metody. Abstraktní t ídy nesm jí vytvá et instance, pou ívají se ale pro d ní a jejich potomci po implementaci pot ebných metod instance vytvá et mohou. Metody ozna ené jako abstraktní nemohou definovat obsah, pouze specifikují název a p ípadné argumenty. ídy, které následn abstraktní metody zahrnují a dále uvád jí jejich definici, musí být ozna eny s viditelností stejnou nebo men í ne abstraktní metody. Je-li tedy metoda v abstraktní t íd ozna ena jako protected, potomek abstraktní t ídy m e metodu uvád t jako public nebo protected. ída, která obsahuje alespo jednu abstraktní metodu, musí být uvád na klí ovým slovem abstract. Abstraktní t ída m e definovat i neabstraktní metody. Kód 3-IV
Metoda(); $instance->AMetoda(); ?>
V abstraktní t íd ATrida je definována jedna metoda Metoda() a jedna abstraktní metoda AMetoda(). V odvozené t íd Potomek je vynucen definována i metoda Ametoda(), aby se vyhov lo podmínce, e v odvozené t íd musí být definován obsah ech abstraktních metod. Abstraktní t ídy jsou pou ívány p edev ím tam, kde je pot eba vytvo it bázovou t ídu podobným objekt m.
19
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
3.5.5.Statické vlastnosti a metody PHP dovoluje definovat metodu nebo vlastnost jako statickou. Znamená to, e se vá e na p ímo t ídu a nikoli na instanci. Statická metoda se definuje klí ovým slovem 'static', které se uvádí ihned po klí ových slovech public, protected, nebo private. Ke statické metod i vlastnosti není mo né p istupovat pomocí pseudoprom nné $this. Statické metody se volají zásadn pomocí zápisu Trida::StatickaMetoda(), vlastnosti pomocí syntaxe Trida::$StatickaVlastnost. Pokud chceme p istupovat ke statickým metodám i vlastnostem uvnit ídy, m eme pou ít místo jména t ídy klí ová slova self::. V p ípad e chceme ze t ídy p istupovat ke statické metod nebo objektu bázové t ídy (p edka), lze pou ít klí ové slovo parent::. Kód 3-V - Statické metody a t ídy
id = self::$pocitadlo++; } } $instance1 = new Trida(); $instance2 = new Trida(); ?>
3.5.6.T ídy typu final ídy definované s klí ovým slovem final, nelze d dit. Jedná se o ochranu rodi ovských t íd u ívanou p edev ím v rozsáhlej ích projektech. Kód 3-VI - Final t ídy
20
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Pokus o definování nové odvozené t ídy (v Kód 3-VI) ATrida zp sobí fatální chybu, jeliko bázová t ída je definována jako Final.
21
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Praktická ást
22
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
1. Instalace Pro chod aplikace je nutné mít p ístup k interpretu PHP5. Interpret m eme pou ít bu na n kterém webovém serveru, na kterém máme hosting stránek s podporou PHP5, nebo k n mu alespo máme p ístup. Pokud p ístup k ádnému serveru s PHP5 a apache nemáme, posta í nám pro ú ely testování a nastavování vlastní po íta s p ipojením na internet, do kterého nainstalujeme samotný PHP interpret bez nutnosti p ede lé instalace web serveru.
1.1.Instalace na web serveru Apache Instalace na web serveru spo ívá pouze v nakopírování celého adresá e do slo ky, ve které máme na serveru b webové stránky. Pro správný chod aplikace v ak nejd íve zkontrolujeme nastavení serveru, zda odpovídá na im po adavk m na provoz bota. Vytvo íme si proto jednoduchý skript, který pojmenujeme phpinfo.php. Kód 1-I – phpinfo.php
* tento skript naleznete na p ilo eném CD - umíst ní ./phpinfo.php
Skript spustíme p es webový prohlí tak, e se na n j odká eme pomocí odpovídající adresy. Nap íklad http://www.mojedoména.cz/m jadresá /phpinfo.php. Výstup by mohl vypadat obdobn jako na Obrázek 1-I. Pokud se místo tabulek a informací o PHP zobrazil zdrojový kód, znamená to, e nemáte na serveru nainstalovánu podporu PHP, pop ípad je interpret p azen k jiným koncovkám, nebo je aktivní pouze v n jakém adresá i. V takovém p ípad kontaktujte svého poskytovatele hostingu, aby Vám pomohl problém vy it.
23
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Obrázek 1-I – Výstup phpinfo()
Tento skript nám vygeneroval velké mno ství informací o PHP interpretu, webovém serveru a jejich konfiguraci. Pro nás jsou d le ité p edev ím tyto údaje: - Verze PHP Obrázek 1-II - Verze php v phpinfo()
Pro bezproblémový b h je vy adována verze 5.1.2 a vy í. - Bezpe ný re im Pro chod aplikace je nutné, aby server m l vypnutý tak zvaný bezpe ný re im. Tento re im zabra uje mimo jiné b hu skriptu po neomezenou dobu, nebo po uzav ení spojení ze strany u ivatele. Direktiva informující o tomto re imu je ozna ena jako safe_mode. Pro b h aplikace je vy adováno, aby direktiva byla v hodnot Off Direktivu obvykle nalezneme v sekci PHP Core. Toto jsou dva nutné po adavky pro funkci aplikace. Jestli e Vá server který z nich nespl uje, není zde provoz bota mo ný.
24
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
1.2.Instalace bez serveru Apache V tomto p ípad nainstalujeme pouze PHP interpret a aplikaci nakopírujeme do libovolného adresá e.
1.2.1.Instalace ve Windows XP Pro instalaci PHP ve Windows vyu ijeme instala ního balí ku pro Microsoft platformu, kterou nalezneme na http://php.net/downloads.php#v5. Instala ní balí ek ve verzi 5.1.2 je pop ípad p ilo en i na CD – umíst ní ./php-5.2.1-win32-installer.msi. i instalaci z .msi balí ku postupujte jako p i instalaci standardního programu. Zvolte adresá , do kterého chcete nainstalovat PHP interpret. Pro u et ení místa zvolte ji p i instalaci, e si nep ejete instalovat podporu ádného z webových server . Obrázek 1-III – Instalace PHP CLI
Instalace bude zabírat kolem 6MB.
1.2.2.Instalace na OS Linux i instalaci na systému Linux postupujeme podle dokumentace k p íslu né distribuci. Dodate né informace a zdroje nalezneme na http://www.php.net/downloads.php.
25
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
2. Konfigurace 2.1.Config.php Konfigurace bota se provádí pomocí souboru config.php. Kód 2-I – config.php
Formát souboru je zalo en na konfigura ních souborech známých z opera ního systému Linux. Soubor se skládá z oblastí (sekcí) uvozenými znaky [ a ] a z atribut , u kterých je uvedeno jejich ozna ení, poté znak = a hodnota atributu. Od b ného konfigura ního souboru se v ak li í koncovkou (.php) a prvním a posledním ádkem. První a poslední ádek zaji ují ochranu souboru. asto se stane, e celá aplikace je umíst na na n jakém z internetu viditelném míst – nap íklad na webovém serveru. Tím, e soubor pojmenujeme koncovkou PHP, zajistíme, aby soubor p ed odesláním u ivateli byl interpretován PHP interpretem.
26
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
i interpretaci "holého" konfigura ního souboru by v ak do lo k syntaktické chyb , která by zbyte p ilákala pozornost. Proto je p i interpretaci souboru pomocí hlavi ky Location po adavek p esm rován na jinou stránku, která m e informovat o neoprávn ném p ístupu k souboru. Nebo, jako v na em p ípad , p esm rujeme po adavek na neexistující stránku, ím navodíme z pohledu potencionálního úto níka dojem, e soubor s tímto názvem neexistuje.
27
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
2.1.1.Atributy souboru a jejich význam Tabulka 2-I - Atributy config.php
Sekce connect
Atribut server
>1 Význam a Vý et IRC server , ke kterým se bot pokusí ipojit. Server musí být uveden ve formátu server:port. a Vý et p ezdívek (nick ), které se bot pokusí pou ít p i ipojení. Pokud se nepoda í pou ít ani jednu (nap íklad jsou v echny obsazeny) pou ije první v po adí a vygeneruje k ní náhodné íslo v rozsahu 0-1000. a Vý et kanál na kterých má bot operovat. a P i p ipojení na IRC server se u ivatel registruje svou USER message, pokud pole nevyplníte, nebo ádná z Vámi zadaných mo ností nebude serverem akceptována, aplikace vygeneruje vlastní. n Definuje dobu ve vte inách, po kterou se bude ekat na sestavení spojení s IRC serverem. Pokud hodnotu nezadáte, pou ije se defaultní hodnota 10. n Definuje dobu ve vte inách, po kterou se bude ekat na odpov serveru ohledn va í USER message. Pokud hodnotu nezadáte, pou ije se defaultní hodnota 5.
nick
channel user_message
connect_timeout
user_message_timeout
28
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
connect
users
events
user-defined
nick_message_timeout
n
Definuje dobu ve vte inách, po kterou se bude ekat na odpov serveru ohledn va í NICK message. Pokud hodnotu nezadáte, pou ije se defaultní hodnota 5. user_file n Definuje cestu k souboru, ve kterém jsou ulo ena data o u ivatelích, vyu ívaná ve t íd userFile. cache_file n Definuje cestu k souboru, ve kterém jsou ulo ena data o registrovaných událostech (Event). events_dir n Definuje adresá , ve kterém jsou umíst ny zdrojové kódy obsluhy událostí (Event). default_timeout n Definuje defaultní hodnotu timeoutu pro spou (Trigger) b ících a dynamických událostí (CodeEvent) V této sekci si m ete definovat libovolné mno ství vlastních atribut . ístup k nim potom získáte pomocí reference user-defined v poli konfigurací (lze získat nap íklad pomocí $GLOBALS['Bot']->GetConfig()).
29
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
3. Spu
ní
3.1.Spu
ní p es server APACHE
V p ípad , e jsme se rozhodli provozovat aplikaci na serveru APACHE, sta í pro spu ní bota v oblíbeném prohlí i vstoupit na adresu, kde se nachází soubor bot.php. Nap íklad tedy http://bot.mojedomena.cz/bot.php.
3.1.1.Komplikace p i spou
ní a chodu
Vzhledem k tomu, e na Va em hostigu v inou nemáte v echny pot ebné informace o serveru, m e dojít p i spu ní pop ípad provozu bota k n kolika problém m. Nej ast í problémy a jejich ení shrnuje následující tabuka. Tabulka 3-I -
ení problému p i provozu aplikace na web. serveru
Problém i spu ní je hlá eno: Warning: set_time_limit() [function.set-time-limit]: Cannot set time limit in safe mode in …
i zav ení okna prohlí e se bot odpojí
Bot funguje, ale po ur ité dob (v inou +-30 minut) se odpojí. Bot se nem e ipojit Bot se nep ipojil na server
3.2.Spou
ení Vá server má aktivován bezpe ný mód (safe-mod) ve kterém nelze spou t skripty s neomezenou dobou b hu. Kontaktujte svého správce serveru, nebo nainstaluje PHP interpret na jiný (sv j) po íta . Zkontrolujte, zda jste v soboru bot.php nezakomentovali ádek Ignore_User_Abort(1);, pokud pou íváte prohlí Internet Explorer, zkuste pou ít FireFox. Zkontrolujte nastavení Apache serveru, pop ípad po ádejte o zru ení skript timeoutu.
Zkontrolujte, zda je mo né vytvá et na va em serveru sockety – kontaktujte správce serveru. Zkuste zadat do konfigura ního souboru config.php více server v po adované IRC síti.
ní na PHP interpretu
Spu ní na PHP interpretu ve Windows se provádí p es p íkazový ádek, ve kterém sta í zadat cestu k souboru bot.php jako parametr php.exe v p íslu ném adresá i – tedy nap íklad: php.exe c:\phpbot\bot.php.
30
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Po startu aplikace se m e stát, e vá firewall bude chtít povolit komunikaci pro CLI. CLI je interpret jazyka PHP, tedy tuto komunikaci povolte, aby se mohl bot p ipojit k serveru. Spu ní na systému Linux probíhá obdobn jako na Windows, tudí není t eba jej popisovat.
3.2.1.Komplikace p i spu
ní a chodu
Pokud jste instalovali interpreta podle p edchozího návodu, m l by start prob hnout bez potí í. Mo né komplikace shrnuje následující tabulka. Tabulka 3-II - Problémy p i spou
Problém Bot se nem e ipojit
Bot se nep ipojil na server
3.3.
ní a provozu na interpretu
ení Zkontrolujte nastavení firewallu – není CLI zakázán? Zkontrolujte, zda je mo né vytvá et sockety – ve Windows musí být povolen winsock. Zkuste zadat do konfigura ního souboru config.php více server v po adované IRC síti.
ení problému
i ení problém s b hem resp. provozem bota, vyu ívejte prosím logování. V logu (záznamu) lze nalézt u ite né informace, které Vám pomohou identifikovat problém. Více o logování naleznete v sekci Logování.
31
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
4. Logování 4.1.Co je to logování Log nebo také urnál je název pro záznam nebo soubor záznam , které si programy vytvá ejí pro ukládání informací o své innosti a b hu. Logy slou í p i zp tné analýze k rozpoznání, zda do lo k n jaké chyb . Pakli e ano, pak pomáhají ur it, k jaké chyb do lo a pro . Mohou také obsahovat informace o tom, jak a kým byla daná aplikace i slu ba vyu ívána.
4.2.Logování v aplikaci bota O logování v této aplikaci se stará t ída Log. T ída Log má globální instanci stejného jména ($Log). Pokud chcete nastavit automatické logování ihned po spu ní aplikace, eme toto provést ve zdrojovém kódu t ídy IRCBot. Definice t ídy IRCBot se nachází v souboru bot.php. Do konstruktoru t ídy IRCBot p idáme (pop . zm níme) zp sob logování. Logování p idáváme v dy jako první p íkaz v konstruktoru. Pomocí instance $GLOBALS['Log'] p idáme metodu logování. K dispozici máme n kolik metod v závislosti na po adovaném výstupu. ehled t chto metod nalezneme v tabulce: Tabulka 4-I.
32
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Tabulka 4-I - Metody logování
Metoda ToFile($filename,$items)
ToOutput($items) ToSQLite($filename,$items)
Význam Log bude generován do souboru $filename. Pokud soubor neexistuje, bude vytvo en. Pokud soubor existuje, log bude p ipsán na jeho konec. Log bude generován na standardní výstup. Log bude generován do databáze SQLite v souboru $filename. Pokud databáze neexistuje, nebo neexistuje tabulka Logs, bude vytvo ena. Pokud chcete vyu ít databázi SQLite, je nutné mít nainstalován modul SQLite v PHP. Více naleznete v dokumentaci k PHP.
Polo ka $items ur uje, jaký typ informací chceme zaznamenávat. K dispozici jsou typy uvedené v tabulce: . Tabulka 4-II - Typy logovaných informací
Typ Log_TypeMsg Log_TypeMsgQuery Log_TypeMode Log_TypeOthers Log_TypeSys Log_TypeDebug Log_TypeRaw
Log_TypeAll
Význam Zprávy v kanálech Soukromé zprávy mezi u ivatelem a botem Mode zprávy Ostatní zprávy ze serveru Systémové informa ní zprávy Debug zprávy – hodí se p i lad ní modul echny zprávy ze serveru (Log_TypeMsg + Log_TypeMsgQuery + Log_TypeMode + Log_TypeOthers) echny zprávy serveru a bota (Log_TypeRaw + Log_TypeSys + Log_TypeDebug)
Jednotlivé typy lze kombinovat a spojovat pomocí logického sou tu ( | ).
33
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
4.3.P íklady logování Tabulka 4-III - P íklady logování
Význam Logování ve keré komunikace mezi serverem a botem do souboru raw.log Logování soukromé komunikace a komunikace v kanálech na standardní výstup Logování v ech událostí a komunikace do SQLite databáze do souboru all.db
Zápis $GLOBALS['Log']-> ToFile('raw.log',Log_TypeRaw); $GLOBALS['Log']-> ToOutput(Log_TypeMsg | Log_TypeMsgQuery); $GLOBALS['Log']-> ToSQLite('all.db',Log_TypeAll);
34
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
5. Objektový model Obrázek 5-I – Zjednodu ený objektový model
35
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
5.1.T ída IRC ída IRC slou í p edev ím pro: - komunikaci se serverem - uchovávání informací o p ipojení - sestavení a udr ení socketu - automatickou ping/pong reakci - zjednodu ení programování modul - udr ování informací o p ipojených u ivatelích a kanálech pro rychlé vyu ití v obsluze událostí i, modulech ída IRC má globální instanci $IRC. Vytvá ení jiných instancí se obecn s p ihlédnutím na p ehlednost nedoporu uje. T ída operuje s otev eným socketem, který je p ístupný v public prom nné $Socket. Zápis do prom nné $Socket se obecn nedoporu uje, prom nná je ístupná pouze z d vodu mo ných úprav v budoucích systémových modulech. ída includuje (zavádí) také definici konstant protokolu IRC na základ názv z norem RFC 2812 a RFC 1459. Tyto definice pro p ehlednost ulo eny v souboru class_irc_definitions.php.
5.1.1.Atributy ída IRC obsahuje tyto atributy: public private private private private private private
$Socket $Server $MyHostName $Nick $LastLine $Channels $Reply_path
$Socket udr uje informace o sestaveném socketu na IRC server. $Server hostname serveru, na kterém je bot p ipojen. Tímto hostname se server hlásí p i serverových zprávách. $MyHostName hostname bota z pohledu serveru. $Nick aktuální nick (p ezdívka), kterou bot pou ívá. $LastLine obsahuje neupraveny, neparserovaný poslední do lý ádek IRC protokolu – hodí se p i debugování. $Channels seznam kanál , ve kterých je bot p ítomen, jejich mod , ivatel v nich p ítomných a jejich flagu. $Reply_path odpov dní ablona pou ívaná ve funkci Reply. 36
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
5.2.Metody Tabulka 5-I - Metody t ídy IRC
public function IsConnected()
public function GetLastLine() public function EOF() public function UnSetAttrib($AttribName) , public function SetAttrib($AttribName, $Value) public function Connect($URL,$Port,&$ErrNo = NULL, &$ErrStr = NULL, $Timeout='n/a') public function ScWrite($Text,$SecureWrite=true) private function IsChannelMode($mode) private function IsUserMode($mode) public function ScReadLine() public function GetNick() public function Join($Channel) public function Part($Channel) public function SetNick($Nick) public function Mode($mode, $channel,$param) public function Op($nick, $channel) public function Deop($nick, $channel) public function Voice($nick, $channel) public function Devoice($nick, $channel) public function Reply($Text,$Reply_path='n/a') public function GetReplyPath()
37
vrací TRUE, pokud je sestaven socket s IRC severem vrací poslední do lý ádek IRC protokolu vrací TRUE, pokud byl socket uzav en nastavení vnit ních atribut t ídy IRC – tyto metody pou ívá jen jádro pokusí se sestavit spojení na základ zadaných informací zápis do socketu vrací TRUE, pokud se jedná o mód kanálu vrací TRUE, pokud se jedná o mód kanálu te jeden ádek se socketu – vrátí aktuální nick (p ezdívku) vstoupí do kanálu opustní kanál zm ní nick nastaví mode kanálu nastaví operátora kanálu opak Op nastaví u ivateli voice opak Voice po le odpov podle Reply_path vrátí sou asný Reply_path
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
public function Message($Target,$Text) public function Notice($Target,$Text) public function Action($Target,$Text) public function IsOper($Nick,$Channel) public function HasVoice($Nick,$Channel) public function GetFlags($Nick,$Channel) public function IsJoinedIn($Nick,$Channel) public function GetTopic($Channel) public function JoinedIn($Channel)
public function GetChanMode($Channel) public function GetUsers($Channel)
38
po le zprávu po le notice po le action vrací TRUE, pokud je ivatel operátorem vrací TRUE, pokud má ivatel voice vrátí aktuální flagy ivatele vrací TRUE, pokud je ivatel p ítomen v kanálu vrací topic kanálu vrací TRUE, pokud je ivatel p ítomen v kanálu vrací aktuální módy kanálu vrací pole u ivatel ítomných v kanálu
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
6.
ída Log
ída Log je ur ena pro udr ování záznam (Log ) o innosti bota. Její instance m e obsahovat libovolný po et metod záznamu, proto není nutné vytvá et pro ka dý typ vytvá et vlastní instanci. ída Log má jednu globální instanci $Log. P i startu bota je nastavena implicitní metoda logování v konstruktoru t ídy IRCBot – více v 4-Logování (str.32).
6.1.Atributy ída Log obsahuje tyto atributy: private $Methods private $Prefix $Methods je nehomogenní pole obsahující informace o logovaných datech a metodách logování. $Prefix je pole prefix (uvozujících znak ) pou ívaných p i zápisu zných typ záznam na standardní výstup, nebo do souboru pro v í ehlednost.
6.2.Metody Tabulka 6-I - Metody t ídy Log
public function ToFile($filename,$items) public function ToOutput($items)
public function ToSQLite($filename,$items)
private function GetNewMID()
39
nastaví metodu zapisování logu do souboru nastaví metodu zapisování logu na výstup nastaví metodu zapisování logu do databáze SQLite – je nutné nainstalovat modul SQLite do PHP! generuje jedine ný identifikátor metody logování
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
private function DataType($data)
public function In($data) public function Out($data) public function Sys($data) public function Debug($data) private function Write($data,$MID,$direction=Log_Di rectionIn) private function SQLiteWrite($settings, $direction, $data) private function FileWrite($filename,$data)
vrací typ dat, ve formátu slu ujícím se s $items vlo í log typu vstup vlo í log typu výstup vlo í systémový log vlo í debug log zaji tuje vyhodnocení a zápis logu fyzický zápis do databáze typu SQLite fyzický zápis do souboru
Více o nastavování metod logování naleznete v 4-Logování (str.32).
40
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
7.
ída IRCBot
ída IRCBot je nejd le it í ástí bota. Jedná se ve své podstat o low-level jádro celé aplikace. ída IRCBot má globální instanci $Bot. Tvorba jiných instancí je nesmyslná a nedoporu uje se pro velké pam ové nároky.
7.1.Atributy ída IRCBot má tyto atributy: private $Events private $RunningEvent private $Config $Events je pole informací o obsluze událostí (event), na tené pomocí funkce LoadEvents(). $RunningEvent je pole referencí na b ící obsluhy událostí (event) tj. eventy, které mají aktivní n kterou ze spou tí (trigger). $Config obsahuje informace z konfigura ního souboru config.php. Tato data lze získat pomocí metody GetConfig().
7.2.Metody Následuje výpis n kterých metod t ídy IRCBot, které jsou d le ité pro práci s botem, pop ípad pochopení jeho funkce. Tabulka 7-I - Metody t ídy IRCBot
public function GetConfig($section=NULL, $value=NULL) public function LoadConfig()
public function LoadEvents()
public function Start()
41
vrací aktuální konfigura ní informace provede znovuna tení konfigura ních informací provede znovuna tení informací o obsluze událostí provede start bota – ipojení k IRC serveru a odeslání USER a NICK zprávy
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
výkonnostní metoda starající se o tení ze socketu nejd le it í metoda – zpracovává p icházející informace z IRC serveru p edané metodou Engine(), vyhodnocuje a spou tí obsluhy událostí a ostatní reakce idá manuáln obsluhu události (event) mezi ící události
private function Engine()
private function ProcessLine($IRCLine)
public function NewRunningEvent($Event)
42
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
8.
ída ConfFile a odvozené
ída ConfFile slou í práci s konfigura ními soubory pou ívaných aplikací. Konfigura ní soubory vyházejí z konfigura ních soubor obvyklých v opera ním systému Linux a INI soubor z Windows. Navíc jsou roz eny o ochranu p ed pokusem o neoprávn ný p ístup pomocí PHP interpretace. Soubor se skládá z oblastí (sekcí) uvozenými znaky [ a ] a z atribut , u kterých je uvedeno jejich ozna ení, poté znak = a hodnota atributu. Od b ného konfigura ního souboru se v ak li í koncovkou (.php) a prvním a posledním ádkem. První a poslední ádek zaji ují ochranu souboru. asto se stane, e celá aplikace je umíst na na n jakém z internetu viditelném míst – nap íklad na webovém serveru. Tím, e soubor pojmenujeme koncovkou PHP, zajistíme, aby soubor p ed odesláním u ivateli byl interpretován PHP interpretem. Kód 8-I – Formát konfigura ního souboru
[
] = = = . . [] =
Dal í odli nost od b ných konfigura ních soubor spo ívá v mo nosti duplicitních názv atribut – ty jsou pak dostupné v homogenním poli.
8.1.Atributy Ve t íd ConfFile a odvozených jsou k dispozici tyto atributy: protected $File protected $Data $File obsahuje handler (rukoje ) k otev enému souboru. $Data obsahuje pole informací na tených ze souboru.
43
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
8.2.Metody Tabulka 8-I - Metody t íd ConfFile a odvozených
public function GetData() public function Open($filename) public function Close() public function Load() public function AddItem($block,$parametr,$value) public function EditItem($block, $item, $index, $new_value) public function DeleteItem($block, $item, $index) public function AddBlock($block) public function DeleteBlock($block) public function RenameBlock($block, $newblock) public function Save()
otev e soubor zav e soubor na te data ze souboru idá polo ku upraví polo ku vyma e polo ku idá sekci (blok) vyma e sekci (blok) ejmenuje sekci (blok) ulo í zm ny do konfigura ního souboru
8.3.T ída UserFile UserFile je odvozená t ída od t ídy ConfFile, která slou í pro uchovávání dat o u ivatelích bota. le ité nové metody: Tabulka 8-II - D le ité metody t ídy UserFile
public function ShortMask($mask) vygeneruje obecnou masku po ívanou pro rozpoznání u ivatele z jeho aktuální kompletní masky na základ algoritmu pou ívaného boty eggdrop public function MaskToUser($who) vyhledá, zda zadaná maska odpovídá kterému z u ivatel a vrátí jeho jméno, jinak vrací FALSE public function vrací údaje o u ivateli GetUserInfo($user) na základ jeho jména
44
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
public function HasFlag($user,$flags, $channel='only_global') public function Flags($mask, $kde="global")
vrací TRUE, pokud má u ivatel n který z flag pro ur ený kanál vrací v echny flagy ivatele na základ jeho masky
8.4.EventsFile ída EvetsFile je potomkem t ídy ConfFile. Je ur ena pro manipulaci s konfigura ním souborem událostí. Jeliko spou ní událostí je v cí jádra, ivatel s instancemi této t ídy nep ijde b do styku.
8.5.CommandFile ída CommandsFile je potomkem t ídy ConfFile. Je ur ena pro manipulaci s konfigura ním souborem p íkaz . Jeliko spou ní obsluhy p íkaz je pod ízeno speciálnímu eventu (evetns/command.php), u ivatel se s instancemi této t ídy b nesetká.
45
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
9. Události – Events Jednou z hlavních funkcí aplikace je mo nost vytvá et obsluhy r zných událostí. Událost je v aplikaci ozna ována pojmem Event. Ka dý Event má definován libovolný kladný, nenulový po et regexp . Regexp je regulární výraz p i kterém bude kód eventu spu n. Regexpy se mohou p ekrývat, to znamená, e na jeden ádek p icházející z IRC serveru m e reagovat libovolný po et event . Eventy jsou spou ny v po adí, odpovídajícímu pozici v konfigura ním souboru event , který je ur en direktivou cache_file v sekci events v konfigura ním souboru – více o konfigura ním souboru na str. 26.
9.1.Trigger Trigger, neboli spou je speciální ástí eventu. asto pot ebujeme v obsluze události (nap íklad, kdy se n kdo p ipojí do kanálu), poslat n jaký po adavek na server (v na em p ípad m e nap íklad chtít v t, masku ivatele) a získat jeho odpov , na základ které provedeme n jakou akci (nap íklad napí eme „ahoj u ivateli!“). Event v ak zareaguje pouze na p azený regexp – tedy vstup u ivatele. I kdy vy leme po adavek na server, aby nám sd lil jeho masku, a server odpoví, obsluha Eventu se nespustí, jeliko p íchozí ádek neodpovídá jeho regexpu. Tento problém by se dal it tak, e bychom na emu eventu p adili echny mo né regexpy, s tím e v kódu bychom na základ znalosti ádku, který event spustil, rozhodli, jak s ním nalo íme. Toto ení je v ak velice nehospodárné, jeliko p i p íchodu jakéhokoli ádku ze serveru by se provád lo vyhodnocení zbyte ných regexp . Proto event obsahuje tzv. triggery. Triggery jsou dynamicky p azené regexpy, které jsou vyhodnocovány jen v p ípad , e je event zaregistrován jako ící (RunningEvent). Event se mezi b ící zaregistruje automaticky v dy, pokud po provedení jeho obslu ného kódu je zaregistrován n jaký trigger. i spu ní kódu triggeru nedochází automaticky k jeho vypu ní. To znamená, e pokud v obsluze triggeru neodstraníme v echny triggery íslu ného eventu, z stane event v re imu b hu (run) a triggery se vyhodnocují znovu a znovu. Ka dý b ící event má definovanou maximální dobu b hu (standardn 180 vte in). Tím se zabra uje tomu, aby se pam zaplnila zapomenutými eventy. Tento as je automaticky prodlou en p i provedení libovolného triggeru.
46
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Je mo né definovat OnTimeout trigger, který se spustí p ed ukon ením hu eventu. V obsluze tohoto triggeru m eme p istoupit k prom nné TTL aktuální instance eventu pomocí pseudoprom nné $this a zm nit dobu hu. Prom nná TTL v event objektu je unixstamp (po et vte in od 1. 1. 1970), navý ený o as po který má event b et. Aktuální unixstamp m eme v PHP získat pomocí funkce time().
9.2.Command – p íkaz Command je speciálním p íkazem eventu. Je navr en pro zjednodu ení programování reakcí na p íkazy. íkaz je et zec odeslaný p es query, nebo do kanálu, za ínající znakem "!". Obsluha command není nic jiného, ne event reagující na v echny odpovídající zprávy, který podle konfigura ního souboru command (commands.php) vyhledá p íslu ný kód, který spustí stejn , jako kdyby se jednalo o event. Kód 9-I - Struktura commands.php
[hostmask] alias=mask [mask] file=mask.php syntax= version=0.0.2 help=Funkce vracející masku u ivatele
V konfigura ním soubor command (commands.php) odpovídá název bloku p íkazu, který command vyvolá. Nap íklad tedy !mask vyvolá obsluhu commandu popsaného v bloku [mask]. Direktiva file ur uje soubor v adresá i commands/, ve kterém je umíst n obslu ný kód pro p íkaz. Direktiva syntax specifikuje, zda jsou po adovány n jaké parametry. Názvy parametr jsou uvozeny znaky < a >. Direktivy version a help jsou nepovinné, a byli vytvo eny pro spolupráci se systémovým (implementovaným) p íkazem !help. Pokud uvedeme direktivu alias, znamená to, e se spustí obsluha commandu, ur eného v této direktiv . V na em p ípad to tedy znamená, e p íkaz !hosmask má stejný význam jako p íkaz !mask.
47
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
9.3.Obslu ný kód Obslu ný kód Eventu (commandu) je ulo en v souboru definovaném v konfigura ním souboru event (command ), direktiv file p íslu ného eventu (commandu). Obslu ný kód je chrán n PHP interpretem stejn jako konfigura ní soubory. Strukturu souboru s kódem si vysv tlíme na p íklad jednoduchého commandu !mask, který na základ p edaného parametru, kterým je nick ivatele, zjistí pomocí IRC p íkazu USERHOST u ivatelovu masku a následn pomocí funkce, je mu poskytuje globální prom nná $Users (instance UserFile) vygeneruje univerzální masku podle zvyklostí pou ívaných nap íklad boty eggdrop. Kód 9-II - Mask command $this->Data['Reply_path']=$GLOBALS['IRC']->GetReplyPath(); eregi('.*!mask (.*)',$GLOBALS['IRC']->GetLastLine(),$tmp); $nick=$tmp[1]; $this->AddTrigger('userhost_reply',"^:[^ ]+ ".RPL_USERHOST." .*"); $GLOBALS['IRC']->ScWrite("USERHOST $nick",false); eregi("^:[^ ]+ ".RPL_USERHOST."( [^ ]+) :(.*)",$GLOBALS['IRC']->GetLastLine(),$tmp); $nick=explode(' ',$tmp[2]); foreach($nick as $val) { ereg('([^ \*]+)\*?=.([^ ]+)',$val,$tmp); $GLOBALS['IRC']->Reply('Generated mask for '.$tmp[1].'('.$tmp[2].') is: '.$GLOBALS['Users']->ShortMask($tmp[2]),$this->Data['Reply_path']); } $this->DestroyAllTriggers();
*/?>
První a poslední ádek je ochranou souboru pomocí PHP interpretu, stejn jako tomu je u konfigura ních soubor . Základní ást obsluhy je zapsána mezi zna kami a
. Tento kód se spustí, pokud vyhoví regexp eventu resp. commandu. V tomto kód jsme pomocí $GLOBALS['IRC']->ScWrite("USERHOST $nick",false); po ádali server o sd lení masky u ivatele p edaného parametrem p i volání íkazu.
48
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Abychom v ak mohli na tuto odpov reagovat, museli jsme p idat trigger, který ji zpracuje. Trigger jsme zaregistrovali pomocí $this->AddTrigger('userhost_reply',"^:[^ ]+ ".RPL_USERHOST." .*");. Tento zápis znamená, e p i p íchozím ádku, který odpovídá regexpu "^:[^ ]+ ".RPL_USERHOST." .*", dojde k zavolání ásti kódu s ozna ením 'userhost_reply' v tomto souboru. Kód obsluhy triggeru je tedy uveden mezi a
. Na konci obsluhy triggeru je uvedeno: $this->DestroyAllTriggers();. Tento kód zajistí vypu ní v ech trigger a tedy ukon ení b hu eventu.
9.4.CodeEvent CodeEvent je odvozen z t ídy Event, jedná se o zcela dynamický event. Tedy event, který má v e, v etn svého obslu ného kódu ulo eno v pam ti. CodeEvent je vyu íván p edev ím pro obsluhu drobných operací nad t ídou IRC.
49
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
10. Tvorba vlastních obsluh událostí a p íkaz Na základ informací z p ede lé kapitoly bychom m li být schopni vytvo it obsluhu libovolné události, i p íkazu. Shrnutí a dopl ující informace nalezneme v této kapitole.
10.1.Vlastní obsluha události krok za krokem 1) vyberte událost, na kterou chcete reagovat a pomocí logu, pop ípad RFC normy navrhn te regulární výraz, který ji bude odpovídat 2) otev ete konfigura ní soubor event (direktiva cache_file v sekci events v konfigura ním souboru) a vepi te konfigura ní údaje pro va i obsluhu 3) vytvo te soubor v p íslu ném adresá i a vepi te do n j kód obsluhy 4) restartujte bota, pop ípad vynu te spu ní metody LoadEvents() v IRCBot
10.1.1.P íklad obsluhy události KICK Kick je generován p i vykopnutí u ivatele z kanálu n kterým z operátor . Na í událost pojmenujeme logicky "kick". Regexp odpovídající kick zpráv jsme navrhly jako: "^:[^ ]+ KICK.*". Do konfigura ního souboru evet tedy p idáme: Kód 10-I - Kick - zápis v cache
[kick] file=kick.php regexp=^:[^ ]+ KICK.*
V samotném kódu pak rozhodneme, zda jsme byli vykopnuti my, nebo kdo jiný. Pokud jsme byli vykopnuti my, pokusíme se o návrat do kanálu a napomeneme operátora, který nás vykopnul. Kód 10-II - Kick - kód
if (eregi(':([^!]+)!([^ ]+) KICK ([^ ]+) ([^ ]+) :?(.*)',$GLOBALS['IRC']->GetLastLine(),$tmp)) { $MyNick=$GLOBALS['IRC']->GetNick(); if (StrToLower($tmp[4])==StrToLower($MyNick)) { // Kicked.. $GLOBALS['IRC']->Join($tmp[3]); $this->Data['join_after_kicked']['Nick']=$tmp[1];
50
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
$this->Data['join_after_kicked']['Channel']=$tmp[3]; $this->AddTrigger('join_after_kicked',':'.$MyNick.' ![^ ]+ JOIN :?'.$tmp[3].'.*'); } } $GLOBALS['IRC']->Message($this->Data['join_after_kicked'] ['Channel'],$this->Data['join_after_kicked']['Nick'].': Uz to nedelej!'); $GLOBALS['IRC']->Action($this->Data['join_after_kicked'] ['Channel'],'ti nic nedela :/');
*/?>
10.2.Vlastní p íkaz krok za krokem 1) zvolte si název p íkazu 2) otev ete konfigura ní soubor command (commands.php) a vepi te konfigura ní údaje pro va i obsluhu 3) vytvo te soubor v p íslu ném adresá i (commands/) a vepi te do n j kód obsluhy
10.2.1.P íklad p íkazu op Následující p íklad uvádí jedno z mo ných ení velmi pou ívaného p íkazu !op. P íkaz nastaví podle parametr operátora ur itého kanálu. Mo né zp soby volání p íkazu: !op !op !op
ivatel ádá, stát se operátorem v aktuálním kanále ivatel ádá, aby se operátorem kanálu stal u ivatel s nickem ivatel ádá, aby se operátorem kanálu stal u ivatel s nickem
Bot nejd íve rozhodne, o jakou z verzí se p íkazu se jedná, poté ekontroluje, zda má u ivatel pot ebné flagy (o,m , nebo n). V p ípad e ano, pokusí se nastavit p íslu ného operátora. V souvislosti s tím vytvo í trigger, který o et í mo nost, e bot není operátorem kanálu. V p ípad , e u ivatel nemá pot ebná oprávn ní (flagy) je upozorn n a k pokusu o nastavení operátora nedojde.
51
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c
H F-XC A N GE
H F-XC A N GE
c u-tr a c k
N y bu to k lic
Kód p idaný do commands.php: Kód 10-III - Op - commands.php
[op] file=op.php syntax=[ []] version=0.0.2 help=Nastavi +o
Kód obsluhy pro jeho rozsáhlost naleznete v souboru commands/op.php.
10.3.Obecn i psaní obslu ného kódu je nutné si uv domit, e kód bude provád n v rámci instance t ídy Event, to znamená, e p ístup ke globálním prom nným je mo ný jen p es $GLOBALS, pop ípad m ete na za átku obsluhy pou ít klí ové slovo global. Kód 10-IV - Globální prom nné
global $IRC; … kód
Kdykoli v kódu nyní pou ijeme $IRC, je to stejné jako bychom napsali $GLOBALS['IRC']. Obslu ný kód je p ímo provád n p i b hu bota, to znamená, e pokud se v n m vyskytne syntaktická, nebo fatální chyba, m e to vést k ukon ení hu skriptu.
10.3.1.D le ité funkce ve t íd Event public function GetTTL() public function SetTTL($TTL) public function TriggerCount() protected function AddTrigger($Part, $RegExp, $OnTimeout = false) protected function AddTimeOutTrigger($Part) protected function DestroyAllTriggers() public function IsValid()
52
vrací TTL eventu nastaví TTL vrátí po et trigger idá trigger
idá OnTimeout trigger odstraní v echny triggery vrací TRUE, pokud je event aktivní (b í)
.d o
o
.c
m
C
m
w
o
.d o
w
w
w
w
w
C
lic
k
to
bu
y
N
O W !
PD
O W !
PD
c u-tr a c k
.c