5. Na zakończenie

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

5. Na zakończenie

5.1. Operacje na plikach

Na zakończenie musimy sobie powiedzieć o jeszcze jednej ważnej rzeczy. Twój skrypt może zapisywać i odczytywać pliki tekstowe. Jest to bardzo użyteczna możliwość i wykorzystaliśmy ją już w projekcie z poprzedniej części. Poza tym operacje na plikach w TCL są bardzo proste.

5.1.1. Otwarcie pliku

Na początku trzeba otworzyć plik. Służy do tego polecenie:

Otwarcie pliku:

open <nazwa-pliku> <rodzaj-dostępu>

Jako nazwę pliku musisz podać łańcuch składający się z opcjonalnej ścieżki oraz nazwy i rozszerzenia pliku. Ścieżka może być względna i liczona jest od katalogu głównego Eggdropa.

Rodzaj dostępu określa możliwość odczytu i zapisu, pozycję kursora w pliku zaraz po otwarciu oraz zachowanie skryptu w sytuacji, jeśli podany plik nie istnieje. Możliwe rodzaje dostępu:

r
Tylko do odczytu, kursor na początku, otwierany plik musi istnieć
r+
Jak wyżej, ale do odczytu i zapisu
w
Tylko do zapisu, jeśli plik nie istnieje - zostaje utworzony, jeśli istnieje - zostaje opróżniony
w+
Jak wyżej, ale do zapisu i odczytu
a
Tylko do zapisu, plik musi istnieć, kursor na końcu pliku w celu dopisywania kolejnych wierszy tekstu

Polecenie to zwraca uchwyt do otwartego pliku, zwany w dokumentacji TCL kanałem (ang. "channel").

5.1.2. Zamknięcie pliku

Otwarty plik obowiązkowo trzeba zamknąć. Służy do tego polecenie:

Zamknięcie pliku:

close <uchwyt>

5.1.3. Zapisywanie i odczytywanie

Do zapisania wiersza tekstu do pliku służy polecenie:

Zapisywanie:

puts <uchwyt> <tekst>

Do odczytania wiersza tekstu z pliku służy zwracające odczytany tekst polecenie:

Odczytywanie:

gets <uchwyt>

Istnieje też funkcja, która odczytuje i zwraca całą zawartość pliku:

Odczytywanie całego pliku:

read <uchwyt>

Do sprawdzenia, czy podczas odczytywania kursor osiągnął koniec pliku służy zwracające wartość logiczną 1 lub 0 polecenie:

Sprawdzanie końca pliku:

eof <uchwyt>

5.1.4. Inne operacje

Przed otwarciem pliku tylko do odczytu warto sprawdzić, czy plik istnieje, by uniknąć ewentualnego błędu:

Sprawdzanie, czy plik istnieje:

file exists <nazwa-pliku>

Polecenie file posiada dużo więcej możliwości związanych z operacjami na podanym pliku, jak np. zmiana atrybutów, czy odczytywanie rozmiaru. Po szczegóły odsyłam do opisu tego polecenia w dokumentacji TCL.

Istnieje też szereg innych poleceń, które pozwalają zarządzać plikami. np.:

glob
Pozwala wylistować pliki znajdujące się w podanym katalogu
seek
Ustawia pozycję kursora do zapisu/odczytu w otwartym pliku
tell
Pozwala odczytać tą pozycję
compressfile
uncompressfile
iscompressed
Polecenia Eggdropa służące do kompresji i dekompresji plików

5.2. Co jeszcze?

Opisałem tylko te polecenia, które znam i których sam używam. Możliwości, w jakie wyposażony został język TCL i jego rozszerzenie w Eggdrop, jest dużo dużo więcej. Warto wspomnieć m.in. o:

binary
Pozwala zapisywać i odczytywać łańcuchy traktowane jako dane binarne. Dzięki temu możesz np. odczytywać i zapisywać binarne pliki oszczędzając miejsce na dysku, jeśli przetwarzanych danych jest bardzo dużo.
dde
Wykonuje polecenie DDE. DDE (ang. "Dynamic Data Exchange") to sposób komunikacji między uruchomionymi aplikacjami w systemie Windows.
encoding
Konwertuje łańcuchy pomiędzy różnymi sposobami kodowania znaków. Domyślnie TCL używa unikodu UTF-16.
error
Generuje błąd. Fajne polecenie, co nie? :)
format
Pozwala szybko i wygodnie skonstruować łańcuch zawierający wstawione w wybrane miejsca informacje różnych typów sformatowane w zadany sposób np. liczbę z określoną ilością miejsc po przecinku. Działa podobnie jak funkcja sprintf z języka C++ czy Format z Delphi.
http
Klient usługi WWW, dzięki któremu twój bot może przeglądać strony internetowe!
registry
Pozwala operować na Rejestrze Windows.
trace
Doskonałe narzędzie do debugowania. Zakłada "haki", które wykonują podane polecenie w reakcji na podane zdarzenie, np. wykonanie innego polecenia czy dostęp do zmiennej.
upvar
Tworzy połączenie ze zmienną z innego niż lokalny zakresu ważności; to elastyczne polecenie jest dużo potężniejsze niż global czy variable, ponieważ pozwala na przekazywanie do procedur czegoś w rodzaju referencji
encrypt
decrypt
Polecenia Eggdropa służące do szyfrowania i deszyfrowania podanego łańcucha przez podane hasło - klucz
encpass
Szyfruje łańcuch (zwykle hasło) metodą jednokierunkową

...a także wiele innych poleceń, szczególnie dużo związanych z samym interpreterem TCL.

W dokumencie "Eggdrop TCL Commands" znajdziesz też wiele poleceń związanych z IRCem i samym Eggdropem, m.in. do manipulacji kontami zajegestrowanych użytkowników bota, do DCC i notatek (ang. "notes").

Także poleceń, które omawialiśmy, nie opisałem w sposób wyczerpujący. W oryginalnej dokumentacji znajdziesz dużo więcej różnych przełączników i opcjonalnych parametrów do prawie każdego z nich.

5.3. Wyrażenia regularne

Mówiliśmy swego czasu o maskach, czyli dopasowywanych do różnych innych łańcuchów łańcuchach, które mogą zawierać tzw. znaki zastępcze (ang. "wildcards"). Ich zastosowanie w TCL jest dużo szersze, niż tylko podczas bindowania zdarzeń.

Oprócz masek istnieje jednak dużo potężniejszy mechanizm. Są nim wyrażenia regularne (ang. "regular expressions", w skrócie "regexps"). Ich opis znajdziesz w dokumentacji języka TCL pod hasłem "re_syntax".

Wiele poleceń (jak np. switch) potrafi przypasowywać łańcuchy zarówno do masek, jak i do wyrażeń regularnych, zależnie od wpisanych przełączników.

5.4. Zakończenie

Trudno pisze się wstępniaki, ale zakończenia jeszcze trudniej. Właściwie nie wiem, co powinienem tu napisać...

Chciałem, aby ten kurs stanowił dobre wprowadzenie dla każdego, kto lubi IRC, potrafi postawić bota i chce pisać rozszerzenia do niego w postaci skryptów TCL. Najbardziej cieszyłbym się, gdyby ktoś przeczytawszy cały ten dokument poznał i polubił TCL oraz zaczął pisać własne ciekawe skrypty. Niezależnie, czy będzie to doświadczony w normalnych kompilowanych językach programista, czy też ktoś, kto dopiero z tego kursu dowie się, czym jest zmienna i pętla.

5.5. PROJEKT

Można powiedzieć, że znasz już język TCL. Jeśli miałbyś wątpliwości to zapewniam cię, że jesteś gotów do pisania całkiem dużych i poważnych skryptów. Oczywiście - masz rację - nie jest to łatwe. Sam język TCL do skomplikowanych nie należy, ale jego natura (szczególnie brak możliwości programowania zorientowanego obiektowo) może niektórym przeszkadzać.

Jednakże jeśli oprócz dokładnego przeczytania tego kursu i jakiegoś doświadczenia praktycznego będziesz często sięgał do oryginalnej dokumentacji oraz przede wszystkim będziesz miał zapał do programowania, jakieś cele do zrealizowania i zachowasz motywację, możesz już teraz zdziałać naprawdę dużo.

Projektem kończącym kurs będzie zadanie najtrudniejsze, ale i najciekawsze. Podczas nauki TCL z pewnością przyszedł ci do głowy niejeden pomysł na ciekawy skrypt. Aby zainspirować cię do dalszego poszukiwania pomysłów, zaproponuję kilka moich, tych najbardziej odjechanych, na jakie wpadłem:

Przeglądarka WWW pod IRC
Bot pozwalałby na przeglądanie stron WWW wypisując na kanał czy na priv fragmenty treści strony i pozwalał na przewijanie i nawigowanie po stronie poprzez odpowiednie polecenia.
Chatterbot
Bot, który potrafi normalnie rozmawiać w języku polskim dzięki jakiemuś zapamiętywaniu zasłyszanych wyrazów i zwrotów, kojarzeniu, uczeniu się i innym algorytmom sztucznej inteligencji.
Tekstowa gra RPG
Gra z gatunku MUD, w której gracze rejestrują się zakładając konta, a następnie chodzą między lokacjami, zbierają przedmioty, zabijają potwory, walczą między sobą i podnoszą swoje współczynniki odpowiednimi poleceniami.

Twoim zadaniem jest napisać taki skrypt, o jakim marzysz najbardziej!

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