1. Startujemy

Uwaga! Informacje na tej stronie mają ponad 5 lat. Nadal je udostępniam, ale prawdopodobnie nie odzwierciedlają one mojej aktualnej wiedzy ani przekonań.

1. Startujemy

1.1. Wstęp

Witaj w kursie programowania IRCowego bota eggdrop w języku TCL. Jeśli lubisz IRC i jesteś zainteresowany programowaniem, jeśli masz różne ciekawe pomysły na funkcje, jakie mógłby pełnić twój bot, to jest to tekst dla ciebie.

1.2. Od autora

Należę do grupy ProgrameX. Na codzień zajmuję się "prawdziwym" programowaniem w C++ i Delphi. Postanowiłem jednak zrobić sobie nietypową przerwę. Przed powrotem z tych "wakacji" do koderskiej rzeczywistości stwierdziłem, że najlepszym pożytkiem z mojej wiedzy będzie przekazanie jej innym. Dlatego efektem ostatniego etapu mojej wakacyjnej przygody z językiem TCL jest ten oto kurs. Mam nadzieję, że dzięki niemu choć jedna osoba dostrzeże zalety programowania bota IRCowego i wejdzie w ten fascynujący świat, do którego niełatwo jest dotrzeć programując w tradycyjny sposób.

1.3. Wymagania

  1. Zainteresowanie IRCem
  2. Posiadanie konta shellowego
  3. Znajomość podstawowych poleceń Linuxa
  4. Znajomość jakiegoś języka programowania (umiejętność programowania)
  5. Znajomość języka angielskiego

Nie przejmuj się, jeśli nie spełniasz wielu spośród tych wymagań. Mimo tego nie powinieneś mieć problemu ze zrozumieniem i opanowaniem opisanego materiału.

1.4. Podstawy

Zacznę od wyjaśnienia podstawowych pojęć. Mimo tego mam nadzieję, że nie są ci obce.

1.4.1. Co to jest IRC?

IRC (ang. "Internet Relay Chat") to kolejna, obok stron WWW i poczty elektronicznej e-mail, usługa Internetu. Umożliwia komunikację synchroniczną w czasie rzeczywistym poprzez krótkie wypowiedzi tekstowe, podobnie jak popularne chaty realizowane przez WWW oraz komunikatory, jak Gadu-Gadu. Przeciwieństwem jest komunikacja asynchroniczna - czyli taka, której uczestnicy pozostawiają w wyznaczonym miejscu dłuższe wypowiedzi, np. e-mail, grupy dyskusyjne czy forum.

Aby korzystać z IRCa, musisz użyć jednego z programów - klientów tej usługi. Pod Windows może to być mIRC, a pod Linux np. BitchX.

1.4.2. Co to jest bot?

Bot to skrót od "robot". Można się domyślić, że jest to pewien automat, który ma w jakiś sposób wyręczać lub nawet udawać człowieka. Faktycznie bot to program komputerowy, który łączy się z serwerem IRC i przebywa na nim pod jakimś pseudonimem zupełnie jak zwykły użytkownik.

Czy to znaczy, że rozmawia zupełnie tak jak człowiek?

Oczywiście, że nie! Boty wyposażone w sztuczną inteligencję i przeznaczone do rozmowy istnieją i są to tzw. "chatterboty". Bot IRCowy może jednak pełnić bardziej przyziemne funkcje.

Jakie mogą to być funkcje?

Najczęściej bot pilnuje kanału. W sieciach IRC bez usług (ang. "services"), które pozwalałyby na rejestrowanie kanałów (np. IRCNET) panuje zasada, że ten ma opa, kto pierwszy wejdzie na kanał. Potrzebny jest tzw. botnet, czyli kilka połączonych ze sobą botów, które będą siedziały cały czas na kanale utrzymując status operatora i dając go zaufanym osobom. Zapobiega to tzw. takeoverom, czyli przejęciom kanałów przez IRCowych wandali mieniących siebie (o zgrozo!) hackerami.

W sieciach posiadających usługi, gdzie kanały oraz nicki można rejestrować (np. POLNET) nie ma takiej potrzeby. Mimo tego bot zawsze może się przydać do różnych rzeczy

IRCNET ma domenę "irc.pl", a POLNET - "ircnet.pl"?!

Tak. Trochę to zakręcone, ale można się przyzwyczaić :)

1.4.3. Co to jest Eggdrop?

Eggdrop to chyba najlepszy i najpopularniejszy spośród botów. Stworzony w 1993 roku przez Robeya Pointera, obecnie rozwijany jest przez Eggheads Development Team. Rozpowszechniany jest na licencji GNU GPL razem z kodem źródłowym i można go swobodnie i za darmo używać. Znajdziesz go na stronie http://www.eggheads.org/.

Dla jakiej wersji Eggdropa dedykowany jest ten kurs?

Podczas mojej nauki TCL korzystałem z Eggdropa w wersji 1.6.15. Jest jednak prawie pewne że wszystko tutaj opisane będzie działało także w nowszych wersjach a także wielce prawdopodobne, że duża część nawet w starszych.

1.4.4. Co to jest TCL?

TCL to skryptowy, intepretowany język programowania. W istocie jest on całkiem potężny i można w nim pisać różne rzeczy. Programy wykorzystują go, aby umożliwić pisanie skryptów rozszerzających ich funkcjonalność. Jednym z takich programów jest właśnie Eggdrop.

1.5. Pierwsze kroki w Eggdrop

1.5.1. Konto shellowe

Zapewne wiesz co to jest konto. Konto to pewne uprawnienie dające danej osobie dostęp do danych zasobów. Przykładem może być konto w banku, na którym możesz gromadzić pieniądze.

Konto shellowe to dostęp do powłoki systemu (najczęściej Linuxa lub innego Unixa) jakiegoś serwera w Internecie. Posiadając takie konto możesz używać zainstalowanych tam programów (np. managera plików Midnight Commander uruchamianego poleceniem mc lub klienta IRC BitchX uruchamianego poleceniem BitchX -n <nick> <serwer>). Możesz także wydawać standardowe polecenia systemowe, a nawet ściągać lub uploadować, kompilować i instalować nowe programy. Wszystko to robi się poprzez tekstową usługę Telnet lub SSH. Możesz do tego użyć np. darmowego programu Putty. Razem z kontem shellowym jest zwykle konto FTP, a czasem także WWW.

Skąd wziąć konto shellowe?

Niestety, w przeciwieństwie do kont WWW czy e-mail, kont shellowych żaden serwis raczej nie oferuje za darmo. Trzeba sobie takie konto po prostu wykupić. Jedną z firm oferujących takie usługi jest RISP.pl. Przejrzyj ceny w ofercie a przekonasz się, że na wykupienie takiego komercyjnego konta może uskładać każdy, nawet z niskiego kieszonkowego :)

Dlaczego Eggdrop musi być na koncie shellowym?

Nie musi być. Możesz go postawić na swoim własnym komputerze, nawet pod Windows. Tyle tylko, że pożytek z takiego bota będzie wątpliwy. Założeniem czynionym prawie zawsze podczas stawiania bota i pisania do niego skryptów jest jego nieprzerwana praca przez całą dobę. Jeśli masz własny serwer (np. w sieci osiedlowej) lub nie wyłączasz na noc ani nie restartujesz swojego komputera i posiadasz łącze stałe do Internetu, to nie ma sprawy. W przeciwnym wypadku konto shellowe jest jak najbardziej potrzebne.

1.5.2. Instalacja

Kiedy masz już konto shellowe, trzeba sobie postawić bota. W tym celu wyślij przez FTP na swoje konto archiwum z najnowszą wersją Eggdropa lub ściągnij je bezpośrednio poleceniem wget.

Następnym krokiem będzie właściwa instalacja. Opis tej czynności bez trudu znajdziesz w Sieci, dlatego nie będę jej tutaj opisywał. Szczególnie, że sam dobrze tego nie umiem. W tym miejscu gorące podziękowania należą się GoQ za pomoc w postawieniu mojego Eggdropa.

1.5.3. Konfiguracja

Zanim uruchomisz zainstalowanego Eggdropa, musisz go skonfigurować. W tym celu otwórz plik tekstowy eggdrop.conf i dokonaj w nim potrzebnych ustawień. Przy dobrej znajomości języka angielskiego i odrobinie programistycznego zmysłu poradzisz sobie bez problemu.

Twoją uwagę chciałem zwrócić w stronę ustawienia rodzaju sieci IRC. Właściwe ustawienie jest bowiem warunkiem poprawnego działania bota, a niewłaściwe powodować może dziwne i trudne do znalezienia błędy w działaniu pisanych skryptów. Konkretnie powiem, że mój bot pracujący w sieci POLNET ustawiony miał początkowo typ sieci na 1, czyli "IRCnet". Wszystko działało bez zarzutu do chwili, kiedy zapragnąłem użyć w moim skrypcie funkcji zwracającej listę osób obecnych na podanym kanale. Zwracana lista najczęściej (choć nie zawsze!) była pusta. Długo męczyłem się z tym problemem, aż dzięki pomocy ludzi z forum http://forum.egghelp.org/ i Xiona (pozdrowienia!) stwierdziłem, że prawidłowym typem sieci jest "Others", czyli:

Prawidłowy rodzaj sieci (wiersz 790):

set net-type 5

Dodatkowo przy tym rodzaju sieci ustawić trzeba kilka innych opcji. Są to:

Ustawienie 1 (wiersz 928):

set check-mode-r 0

- ponieważ w sieci POLNET nie ma restrykcji +r

Ustawienie 2 (wiersz 933):

set nick-len 24

- ponieważ taka maksymalna długość nicka obowiązuje w tej sieci.

1.5.4. Uruchamianie

Aby uruchomić swojego bota, znajdując się w katalogu gdzie jest zainstalowany musisz wydać polecenie:

Uruchamianie Eggdropa:

./eggdrop [plik]

Jako parametr podać możesz nazwę pliku z konfiguracją (oczywiście bez nawiasu kwadratowego!). Jeśli go nie podasz, domyślnie przyjęty zostanie plik eggdrop.conf.

Aby używać kilku różnych plików konfiguracyjnych, musiałbyś wykonać z jakimiś modyfikacjami kopie eggdrop.conf w tym samym katalogu pod różnymi nazwami. Możliwość uruchomienia Eggdropa wiele razy z różnymi konfiguracjami daje możliwość postawienia kilku różnych botów jednocześnie.

1.5.5. Telnet

Ze swoim botem możesz łączyć się poprzez Telnet. Nie jest to to samo połączenie, co do konta shellowego. Eggdrop nasługuje na innym porcie i posiada własne polecenia.

Wybór portu to ważna sprawa. Jeśli jesteś za firewallem lub współużytkujesz łącze internetowe w sieci lokalnej (np. osiedlowej), niektóre numery portów mogą być zablokowanie. Także serwer po drugiej stronie - ten, na którym masz bota - może nieprzepuszczać pewnych portów lub niektóre mogą być już po prostu zajęte przez inne aplikacje serwerowe. W takim wypadku połączenie będzie niemożliwe. Mnie udało się trafić na działający port o numerze 3344.

Skoro nie można wtedy połączyć się do swojego bota i wydawać mu poleceń, jedynym sposobem na zakończenie jego działania (w celu zmiany w konfiguracji portu na inny i ponownego uruchomienia) jest wydanie na shellu brutalnego i niezbyt zalecanego polecenia:

Zabijamy bota:

kill <pid>

PID to numer uruchomionego procesu. Otrzymujesz go po uruchomieniu Eggdropa w ostatniej linii o treści np. Launched into the background (pid: 32110). Możesz go także znaleźć później w pliku pid.nazwa, gdzie "nazwa" to nazwa twojego bota.

Te same polecenia co przez Telnet, można także wydawać za pomocą DCC Chat z IRCa. Mnie jednak nie udało się połączyć do mojego bota w ten sposób.

Osoby połączone przez Telnet i DCC Chat do twojego bota stanowią tzw. "partyline". Mogą ze sobą rozmawiać wpisując normalny tekst. Aby wpisany tekst potraktowany został jako polecenie dla bota, rozpoczynać się musi od... kropki!

1.5.6. Polecenia

Listę dostępnych poleceń uzyskasz wpisując .help. Omówię teraz te najistotniejsze z punktu widzenia twórcy skryptów.

1.5.6.1. .rehash

Polecenie to powoduje ponowne załadowanie pliku konfiguracyjnego i wszystkich skryptów. Musisz przy tym zapamiętać (na razie możesz nie rozumieć), że nie usuwa on niczego ani nie wychodzi znikąd. Wartości ustawionych zmiennych pozostają, bot pozostaje na kanałach IRC itd. Kod każdego skryptu zostaje ponownie wykonany, ale stare wartości zmiennych, o ile nie zostają przez ten kod zmienione, nie ulegają straceniu.

Abstrakcyjnie można powiedzieć, że polecenie to powoduje "nadpisanie" nowych ustawień (jeśli plik konfiguracyjny lub któryś ze skryptów się zmienił) na istniejące. Przykładowo oznacza to, że bot wchodzi na nowe kanały dopisane do konfiguracji. Nie wychodzi natomiast z tych na których przebywa nawet, jeśli wykasowałeś odpowiadający im wpis.

1.5.6.2. .restart

To polecenie powoduje faktyczny restart bota tak, że obecne ustawienia zostają zapomniane, a wczytywane są nowe. Bot wychodzi z kanałów i rozłącza się z siecią IRC, po czym ponownie łączy. Wartości zmiennych zostają utracone. Jedynie połączenie Telnet zostaje zachowane.

1.5.6.3. .die

To polecenie nakazuje Eggdropowi zakończenie swojego działania. Bot wychodzi z IRC, a sesja Telnet zostaje zakończona. Trzeba go potem uruchomić z shella ręcznie.

1.5.7. Użytkownicy i flagi

Eggdrop posiada system kont. Zalogowałeś się do niego przez Telnet, ponieważ jesteś jego właścicielem. Możesz tworzyć i usuwać konta poleceniami .+user i .-user.

Osoby na IRCu rozpoznawane są nie przez sam ich nick (pseudonim), ale przez wzór nick!user@host. To jest ta informacja, którą widzisz po wydaniu wobec kogoś polecenia /whois <nick> w swoim kliencie IRC. Na przykład kiedy robię whois sam sobie, otrzymuję Regedit is ~sawickiap@frodo.i.czest.pl. Oznacza to, że moim wzorem będzie Regedit!~sawickiap@frodo.i.czest.pl. Mogę jednak zmienić nick i nadal będzie przez mojego bota rozpoznawany.

Każdy zarejestrowany w Eggdropie użytkownik ma zbiór flag. Flagi oznaczane są pojedynczymi małymi literami. Każdy może mieć dowolną ich liczbę. Ktoś może mieć wszystkie, a ktoś inny żadnej. Jedne są dobre (np. a - auto-op), inne złe (np. k - auto-kick). Flagi przypisane użytkownikom twojego bota możesz zmieniać poleceniem .chattr. Zaraz po instalacji bota, jako jego właściciel (ang. "owner"), masz prawdopodobnie takie flagi: hjmnoptx.

Więcej informacji na temat użytkowników i flag znadziesz w dokumentacji swojego Eggdropa, w pliku eggdrop/doc/html/users.html.

1.6. Pierwsze kroki w TCL

1.6.1. Skrypty

Skrypt - tym słowem ogólnie określa się najczęściej kod w jednym z intepretowanych języków skryptowych, np. JavaScript czy VBScript. Skrypt TCL ma typowo postać pojedynczego pliku tekstowego o rozszerzeniu .tcl, w którym znajduje się bezpośrednio kod źródłowy. Plik taki należy umieścić w katalogu eggdrop/scipts, a w pliku konfiguracyjnym dopisać na końcu instrukcję source scripts/<nazwa>.tcl. Wtedy po najbliższym przeładowaniu bota (rehash lub restart) skrypt zostanie załadowany i wykonany.

Aby wyłączyć skrypt, linijkę z poleceniem "source" w pliku konfiguracyjnym możesz usunąć lub wykomentować stawiając na jej początku haszczyk: #. Pamiętaj jednak, że po rehash skrypt nie zostaje wyładowany i nie przestaje działać! Dopiero restart spowoduje wyczyszczenie całego aktualnego stanu bota i ponowne wczytanie tylko tych skryptów, które chcesz.

1.6.2. Składnia

Omówimy sobie teraz podstawowe zasady składniowe języka TCL. Musisz dobrze je zrozumieć i zapamiętać, ponieważ język ten jest bardzo nietypowy. Nawet jeśli programowałeś wcześniej w wielu innych językach, składniowe dziwactwa TCL jeszcze przez jakiś czas po rozpoczęciu programowania będą dawały ci się we znaki.

1.6.2.1. Polecenia

TCL to skrót od angielskiego "Tool Command Language" - czyli narzędziowy język poleceń. Narzędziowy zapewne dlatego, że służy jako narzędzie do pisania skryptów dla różnych wykorzystujących go programów. Język dlatego, że bez wątpienia jest pełnoprawnym językiem programowania (w przeciwieństwie np. do HTML, który jest językiem opisu).

Większość języków programowania oparta jest na wyrażeniach. Ciało każdej funkcji składa się z wyrażeń i instrukcji, a te z kolei (np. instrukcja warunkowa "if") także posiadają własne miejsca na dodatkowe wyrażenia. Każde wywołanie funkcji jest wyrażeniem, każdy przekazywany do funkcji parametr także jest wyrażeniem. Wyrażenia można zagnieżdżać i każde zwraca jakąś wartość jakiegoś typu.

Mówimy, że TCL jest językiem poleceń, ponieważ cały opiera się na poleceniach. Właściwie możnaby powiedzieć, że w TCL wszystko jest poleceniem. Nie znaczy to, że przestają obowiązywać tu reguły wyrażeń. Polecenia także posiadają parametry, zwracają wartość i można je zagnieżdżać. Inna jest jednak składnia. W TCL do tego stopnia wszystko jest poleceniem, że za polecenie uznać można nawet instrukcje warunkowe, pętle czy deklaracje procedur. Nic więc dziwnego, że opisane są one właśnie w ten sposób - jako jedne z dostępnych poleceń.

Dla przykładu weźmy jakiś kod w języku C++:

Kod w C++:

Wypisz_na_ekran("Twoja szczęśliwa liczba to: ", Szczesliwa_liczba(666));

Równoważny kod w TCL wyglądałby tak:

Kod w TCL:

Wypisz_na_ekran "Twoja szczęśliwa liczba to: " [Szczesliwa_liczba 666]

Wygląda to dziwnie dopóki nie zrozumie się podstawowych zasad. Oto pierwsze z nich:

Możemy więc zauważyć następujące różnice względem składni języków takich, jak C++ czy Pascal/Delphi:

Podobnie jak w innych językach programowania procedury, funkcje czy klasy, tak w TCL istnieją predefiniowane polecenia oraz można tworzyć własne (zwane procedurami), które wywołuje się potem w taki sam sposób. Dodatkowo wyróżnić można polecenia wbudowane w sam język TCL i charakterystyczne dla Eggdropa (związane z IRCem). Opisane są one w różnych dokumentacjach. W dalszej części kursu nie będę ich jednak rozróżniał.

1.6.2.2. Koniec wiersza

W przeciwieństwie do wspomnianych wyżej języków, w TCL miejsce zakończenia wiersza (lub jak kto woli - linii) ma znaczenie. Nie możesz robić sobie ot tak, przejścia do kolejnego wiersza kiedy chcesz. Nie możesz także wpisywać w jednej wszystkiego, na co masz ochotę.

Podstawowa zasada mówi, że w jednej linii wpisujemy jedno polecenie. Sprawa nieco się komplikuje w przypadku poleceń złożonych, jak instrukcje warunkowe. Szczególnie istotne jest umieszczanie w odpowiednim miejscu nawiasów klamrowych rozpoczynających i kończących blok kodu. Przykład:

Nawiasy muszą być umieszczone dokładnie tak:

if {$a > 0} {
  Output "a jest większe od zera"
} elseif {$a < 0} {
  Output "a jest mniejsze od zera"
} else {
  Output "a jest równe zero"
}

Jak widać, nie można otwierających nawiasów napisać w nowej linii. Muszą się one znaleźć jeszcze w tej samej, co wyrażenie warunku.

1.6.2.3. Komentarze

W każdym języku programowania i opisu muszą występować komentarze. TCL nie jest tutaj wyjątkiem. Zaskakujące może być jednak dla niektórych (bo nie dla wszystkich), że rozpoczynają się one od... haszczyka # ! Są to komentarze jednowierszowe i trwają do końca wiersza. Innych komentarzy w TCL nie ma.

Istotne jest, by komentarz stanowił osobny wiersz, który po ewentualnym wcięciu złożonym z odstępów (spacji i tabulacji) rozpoczynał się od tego haszczyka. Nie możesz postawić sobie komentarza za poleceniem w tym samym wierszu licząc, że od tego znaku do końca będzie komentarz, a wcześniej zwykły kod.

1.6.2.4. Łańcuchy i niełańcuchy

W językach kompilowanych istnieje kontrola typów. Inaczej zapisuje się i inaczej traktowane są liczby całkowite, inaczej liczby rzeczywiste (zmiennoprzecinkowe), inaczej pojedyncze znaki, łańcuchy znaków i jeszcze inne rodzaje danych. W językach skryptowych, dla uproszczenia, kontroli typów zwykle nie ma. Nie ma też konieczności deklarowania zmiennych przed ich użyciem. TCL nie jest tu wyjątkiem i w nim również obowiązują wspomniane dwie zasady. Właściwie każdą wartość (np. przechowywaną przez zmienną, przekazywaną do procedury jako argument, zwracaną przez polecenie itd.) traktować możemy jako łańcuch znaków. Dokładnie o rodzajach przechowywanych danych powiemy sobie w osobnej części tego kursu.

Ciekawą cechą TCL jest fakt, że użycie cudzysłowu "" często nie jest wymagane i niczego logicznie nie zmienia w kodzie. Jego jedyną funkcją jest potraktowanie ciągu znaków zawierającego odstępy (np. spacje) jako jeden element (np. argument polecenia). Jeśli odstęp nie występuje, cudzysłowy nie są potrzebne (ale mogą być). Przykład:

Zastosowanie cudzysłowów:

# Tutaj cudzysłów będzie potrzebny
Output "Twoja szczęśliwa liczba to:"
# A tutaj nie jest konieczny
Output 666

Dla czytelności kodu radzę jednak ujmować w cudzysłowy każdy ciąg znaków traktowany jako tekst nawet, jeśli nie zawiera on odstępów. Nie ujmować natomiast liczb i wartości innego rodzaju (pamiętamy, że w TCL nie ma kontroli typów, rodzaj danych to sprawa umowna).

W językach kompilowanych tekst ujmowany w cudzysłowy traktowany jest jako łańcuch i pozostawiany w większości bez zmian. Pozostały tekst natomiast używa różnych znaków na oznaczenie różnych rzeczy. Skoro w TCL nie ma między nimi różnicy, jakie specjalne znaki uwzględniane są w zapisywanych łańcuchach?

Nawiasy kwadratowe []
Oznaczają zagnieżdżone polecenie. Wartością objętego w nie polecenia będzie wartość zwrócona przez to polecenie.
Znak dolara $
Rozpoczyna nazwę zmiennej, której wartość chcemy pobrać. Kryje się tutaj pewna pułapka, której zrozumienie uznać można za najważniejszy element nauki składni tego języka. Powiemy o niej więcej w części poświęconej zmiennym.
Średnik ;
Oddzielać nim można polecenia, aby zawrzeć ich kilka w jednym wierszu. Sam nigdy tego nie używałem. Pamiętamy, że normalnie w TCL poleceń nie kończymy średnikiem.
Haszczyk #
Rozpoczyna komentarz. Mówiliśmy o tym wyżej.
Nawiasy klamrowe: {}
Używane są często i znaczenie mają takie same jak w języku C++ czy jak begin i end w Pascalu. Ograniczają blok kodu. Potrafią także tworzyć listy. (Jeśli potraktować cały kod TCL jako zbiór poleceń, to taki fragment objęty w nawiasy klamrowe także można uznać za listę. Mniejsza z tym...) Przypominam, że nawiasy muszą być odpowiednio umieszczane w wierszach z poleceniami i nie można przenosić ich do następnego wiersza.
Backslash \
Podobnie jak w C++, możemy zapisywać różne specjalne znaki rozpoczynając je od tego odwróconego ukośnika. Mogą to być m.in.:
\n
Znak końca wiersza (0x0A - 10 - LF)
\r
Tzw. powrót karetki (0x0D - 13 - CR)
\t
Tabulacja (0x09 - 9 - HT)
\\
Zwykły backslash - tak trzeba go zapisać żeby wystąpił jako normalny znak
\---
Znak o podanym w miejsce "---" kodzie zapisanym jako liczba jedno-, dwu- lub trzycyfrowa w systemie dziesiętnym.
\x--
\x----
Znak o podanym kodzie zapisanym jako liczba w systemie szesnastkowym.

Bardziej zaawansowani twórcy stron WWW z pewnością poznają pewne podobieństwa do języka PHP. Faktycznie składnia jest nieco podobna, szczególnie rozpoczynanie zmiennych od znaku dolara. Dzięki temu wartość zmiennej czy wyrażenia wstawić można bezpośrednio do łańcucha, np.:

Wstawiamy wartość do łańcucha:

Output "Twoja szczęśliwa liczba to: $Zmienna"
Output "Kwadrat tej liczby to: [kwadrat $Zmienna]"

Mam jeszcze dwie wiadomości: dobrą i złą. Jedna jest taka, że wielkość liter w nazwach procedur i zmiennych jest rozróżniana. Druga jest taka, że w nazwach zmiennych i procedur można stosować polskie litery i dowolne inne znaki (nawet spacje! - wystarczy wtedy objąć taką nazwę w cudzysłowy). Która jest która? To już zależy od twojego podejścia :)

1.6.2.5. Znaki końca wiersza

Pozwolę sobie wtrącić kilka słów na temat znaków końca wiersza. Panują w tej kwestii dwa różne standardy. W Windows koniec wiersza zaznacza się w plikach sekwencją dwóch znaków: \r\n. W Linux natomiast samym znakiem \n.

Z kompatybilnością między tymi formatami bywa różnie. W Linux najczęściej podwójny koniec wiersza zinterpretowany zostanie prawidłowo, o ile wiersz może kończyć się odstępem i ten odstęp zostanie zignorowany (bo \r w każdym systemie uznawany jest, obok \n, tabulacji i spacji, za znak odstępu - ang. "whitespace").

Notatnik Windows nie odczyta poprawnie dokumentu zapisanego ze znakami końca wiersza w stylu linuxowym. Na prawidłowe jego wyświetlenie możesz za to liczyć w programie Lister wbudowanym w Total Commandera.

Aby edytować i zapisywać pod Windows dokumenty ze znakami końca wiersza w stylu linuxowym, możesz użyć jednego z edytorów tekstowych HTML, np. HomeSite lub Pajączek. Trzeba tylko uaktywnić specjalną opcję w konfiguracji. Nazywa się ona najczęściej zapisywaniem znaków końca wiersza w stylu Unix.

Programem Pajączek NxG 5.0.2 Professional warto zainteresować się tym bardziej, że potrafi on kolorować składnię języka TCL, posiada wbudowanego klienta FTP umożliwiającego edycję dokumentów bezpośrednio na serwerze, wygodną obsługę wielu standardów kodowania polskich liter i dużo innych funkcji. Moim zdaniem jest naprawdę świetny.

1.6.3. Wrażenia

Po zapoznaniu się ze składnią języka możnaby zapytać:

Jaki właściwie jest ten język?

1.6.4. Zastosowania

Być może zastanawiasz się teraz, jak wygląda programowanie IRCowego bota w takim języku i jakie przykładowe zastosowania mógłby mieć napisany w nim skrypt. Oto niektóre z nich:

Mam nadzieję, że masz też własne pomysły na ciekawe skrypty. Po ukończeniu kursu będziesz mógł je zrealizować!

1.6.5. Źródła

Nawet w dotychczasowych rozważaniach wstępnych nie udało się uniknąć odwołań do oryginalnej dokumentacji. Zanim zakończymy tą część i przejdziemy do prawdziwej nauki, musisz nauczyć się z tej dokumentacji w sposób pełny korzystać. Kurs bowiem ma na celu jedynie wprowadzić cię w temat i ułatwić zrozumienie poszczególnych zagadnień. Nigdy nie staram się opisywać wszystkiego, co możliwe jest w danej chwili. Już podczas nauki z tego kursu i własnej praktyki korzystanie z dokumentacji będzie konieczne. Oto najważniejsze źródła:

Eggdrop Documentation Index
eggdrop/doc/html
W tym katalogu we własnym Eggdropie znajdziesz informacje na jego temat, w szczególności opis poleceń wprowadzonych do języka TCL przez samego Eggdropa i służących do operowania na IRCu.
Tcl8.4/Tk8.4 Manual
http://www.eggfaq.com/docs/tcl/contents.htm
Podręcznik języka TCL. Wejdź do "TCL Commands" aby zobaczyć spis wszystkich poleceń.
Guide to TCL scripting for Eggdrop 1.6
http://www.suninet.nl/tclguide/
Kurs TCL po angielsku. To właśnie od niego zaczynałem moją naukę.
RFC1459
Opis protokołu IRC. Możesz znaleźć go za pomocą Google.
egghelp.org community
http://forum.egghelp.org/
Forum na temat Eggdropa. Tu możesz szukać pomocy, jeśli wszystkie inne metody zawiodą.

1.7. PROJEKT

Na końcu każdej części kursu będzie projekt - jakiś dłuższy kod, który będziemy analizowali lub zadanie dla ciebie. Tym razem będzie to zadanie.

Jesteśmy ambitni i chcemy pisać własne skrypty do Eggdropa. Pomijając funkcje, które ten bot standardowo posiada trzeba powiedzieć, że w Sieci aż roi się od różnorodnych skryptów gotowych do wykorzystania. Twoje zadanie do tej części jest więc następujące:

Wyszukać w Internecie i poprawnie uruchomić na swoim Eggdropie jakieś ciekawe skrypty, a także spróbować przeanalizować ich kod.

Adam Sawicki
[Download] [Dropbox] [pub] [Mirror] [Privacy policy]
Copyright © 2004-2022