Interaktívne programy
Interaktívne programy si od užívateľa sami vypýtajú dáta, ktoré potrebujú. Ako príklad použijeme program na ankety. Po spustení si od nás program vyžiada otázku, čas trvania a odpovede ankety. Táto funkcia bude pozostávať z viacerých skriptov. Prvý bude príkaz na spustenie ankety (!anketa start). Súbor anketa v zložke commands:
<?php
if (preg_match("/^\!anketa start$/", $message)){
if (!$vyhlasena_anketa){
$vyhlasena_anketa = TRUE;
$anketa_nick = $sender;
$anketa_kanal = $act_chan;
} else sendmsg($act_chan, "Prave prebieha ina anketa");
}
if (preg_match("/^\!anketa stop$/", $message)){
$vyhlasena_anketa = FALSE;
$poslany_dotaz = FALSE;
unset($anketa_cas);
unset($anketa_dlzka);
unset($anketa_odpovede);
unset($anketa_otazka);
unset($poslany_dotaz);
unset($anketa_moznost);
unset($anketa_kanal);
unset($anketa_hlas);
unset($hlasy);
}
?>
Pri spustení príkazu s parametrom start sa zmení obsah premennej $vyhlasena_anketa, podľa čoho zistíme v module anketa, že si máme vypýtať od užívateľa dáta na začatie ankety. Parameter stop bude slúžiť na zastavenie ankety. Okrem toho si zapíšeme nick užívateľa, ktorý spustil anketu. Modul anketa (vysvetlený pomocou komentárov):
<?php
if (isset($vyhlasena_anketa)){
if ($vyhlasena_anketa==TRUE){
if (!isset($anketa_cas)){//Ak este anketa nieje nastavena
if (!isset($anketa_otazka)){//ak nieje definovana otazka
if (!$poslany_dotaz){//ak nieje poslany dotaz. to znamena ze program necaka na zaidne data od uzivatela
sendmsg($act_chan, "$anketa_nick: zadaj otázku ankety");
$poslany_dotaz = TRUE;
} else {//ak je dotaz poslany a uzivatel odpovie, to znamena ze nam odpovedal na nasu otazku
if ($sender==$anketa_nick){
$anketa_otazka = $message;
$poslany_dotaz = FALSE;
}
}
} else {
if (!isset($anketa_dlzka)){//ak este nieje nastavena dlzka ankety. to iste ako s otazkou ankety
if (!$poslany_dotaz){
sendmsg($act_chan, "$anketa_nick: zadaj dĺžku trvania ankety (v sekundách)");
$poslany_dotaz = TRUE;
} else {
if ($sender==$anketa_nick && is_numeric($message)){
$anketa_dlzka = $message;
$poslany_dotaz = FALSE;
}
}
} else {//ak je nastavena dlzka ankety, potrebujeme este mozne otazky
if (!isset($anketa_odpovede)){
if (!$poslany_dotaz){
sendmsg($act_chan, "$anketa_nick: zadaj odpovede ankety(oddelené znakom ; )");
$poslany_dotaz = TRUE;
} else {
if ($sender==$anketa_nick){
$anketa_odpovede = $message;
$poslany_dotaz = FALSE;
$anketa_cas = time()+$anketa_dlzka;//nastavime si cas zaciatku ankety
}
}
}
}
}
} else {
if (time()<$anketa_cas){//ak este neuplynul cas trvania nkety
if (!$poslany_dotaz){//ak necakame ziadne data od uzivatela, posleme otaku
sendmsg($anketa_kanal, "Otazka ankety: $anketa_otazka");
$anketa_odpovede = explode(";", $anketa_odpovede);
$c = 1;
foreach ($anketa_odpovede as $moznost){
$anketa_moznost[$c] = $moznost;
sendmsg($anketa_kanal, "$c. $moznost");
++$c;
}
$poslany_dotaz = TRUE;//budeme cakat hlasy od uzivatelov
} else {
if ($channel==$anketa_kanal){//ak je hlas z rovnakeho kanalu, v ktorom bola spustena anketa, pripocitame ho
if (!empty($message) && is_numeric($message) && $act_chan==$anketa_kanal){
$anketa_hlas[$sender] = $message;//davame do pola s uzivatelovym nickom, aby uzivatel nemohol posielat viac hlasov (ale je mozne zmenit si nick)
}
}
}
} else {//ak uplynul cas, vypiseme vysledok ankety
sendmsg($anketa_kanal, "Vysledok ankety: $anketa_otazka");
foreach ($anketa_hlas as $hlas){
if (isset($hlasy[$hlas])) $hlasy[$hlas]++;
else $hlasy[$hlas] = 1;
}
foreach ($anketa_moznost as $cislo=>$moznost){
if (!isset($hlasy[$cislo])) $hlasy[$cislo] = 0;
sendmsg($anketa_kanal, "$cislo. (hlasov {$hlasy[$cislo]}) $moznost");
}
$vyhlasena_anketa = FALSE;
$poslany_dotaz = FALSE;
unset($anketa_cas);
unset($anketa_dlzka);
unset($anketa_odpovede);
unset($anketa_otazka);
unset($poslany_dotaz);
unset($anketa_moznost);
unset($anketa_kanal);
unset($anketa_hlas);
unset($hlasy);
}
}
}
}
?>
Funguje to vlastne tak, že keď sa skript opakovane spúšťa, postupne získava ďalšie dáta. Napríklad najprv požiada užívateľa o zadanie otázky ankety, pri každom spustení skontroluje, či užívateľ, ktorý spustil anketu, už zadal otázku a po jej zadaní si zase vypýta čas trvania ankety a tak ďalej.
Tento modul nám ukazuje možnosti získavania dát od užívateľa. Samozrejme si ho môžete upraviť, napr. vylepšiť zdanlivú inteligenciu alebo vyriešiť paralelné ankety vo viacerých kanáloch. Z užitočných vecí ma napadlo napr. vypísanie aktuálnej ankety po zavolaní príkazu anketa bez parametrov. Iba upravíme súbor anketa v zložke commands.
if (preg_match("/^\!anketa$/", $message)){
if ($vyhlasena_anketa){
sendmsg($act_chan, "Otazka ankety: $anketa_otazka");
$anketa_odpovede = explode(";", $anketa_odpovede);
foreach ($anketa_moznost as $cislo=>$moznost){
if (!isset($hlasy[$cislo])) $hlasy[$cislo] = 0;
sendmsg($act_chan, "$cislo. (hlasov {$hlasy[$cislo]}) $moznost");
}
sendmsg($act_chan, "Anketa prebieha v kanali $anketa_kanal");
} else sendmsg($act_chan, "Nepriebeha ziadna anketa");
}