Tcl scripting
Kadu
| Moduł TCL scripting nie działa z wersjami Kadu 0.5.0 i wyżej. Trzeba by dostosować ten moduł do najnowszej wersji Kadu, jeżeli chcesz i możesz to zrobić to to zrób. |
Opis
Jest to moduł Kadu, który uruchamia obsługę języka skryptowego Tcl. Oprócz obsadzenia interpretera Tcl w Kadu, dodaje on również nowe komendy tego języka, które pozwalają w łatwy sposób zintegrować skrypty z rdzeniem aplikacji.
Jeśli potrzebujesz wprowadzić pewną drobną, acz niekonwencjonalną funkcjonalność do Kadu, to ten moduł doskonale się do tego nadaje. Zarazem - jak to można zauważyć na przykładzie KaduPro - moduł ten równie dobrze nadaje się do pisania rozbudowanych skryptów.
Instalacja
Moduł najlepiej instalować z gotowych paczek binarnych, o ile są takowe dostępne dla twojej dystrybucji. Jeśli nie, to trzeba kompilować moduł ze źródeł. Do tego potrzebne są źródła Kadu. Po rozpakowaniu źródeł Kadu, należy wyedytować plik .config i w nim ustawić wartość:
module_tcl_scripting=m
Wartość y jest stanowczo odradzana (z wielu powodów). Pozostałe moduły poustawiaj według własnych preferencji, ale pamiętaj, że te moduły które teraz wybierzesz, zastąpią te, które miałeś dotychczas zainstalowane! (jeśli dany moduł był już zainstalowany wcześniej, a teraz wybierzesz dla niego n, to zostanie on skasowany!) Następnie należy wyjść z trybu edycji, zapisując zmiany, wejść do katalogu modules/ i wydać polecenie make. Nastąpi kompilacja wszystkich wybranych modułów. Później trzeba już tylko wydać polecenie make install, aby zainstalować moduły, ale pamiętaj, że musisz to robić z uprawnieniami administratora, więc jeśli takowych jeszcze nie masz, to uzyskaj je poleceniem su.
Wszystko to można osiągnąć ta samo, używając skryptu instalacyjnego Instaluj i ustawiając w nim tryb kompilacji dynamicznej dla tego modułu.
Często spotykane problemy
- Problem: Podczas konfiguracji dostaję komunikat, że "tcl.h not found" czy coś takiego. Co robić?
- Rozwiązanie: Nie masz zainstalowanego pakietu tcl lub tcl-devel (o ile takowy istnieje w twojej dystrybucji). Ewentualnie nagłówki tego pakietu nie mogą być odnalezione. W takim wypadku użyj opcji --with-includes i --with-libs polecenia configure i podaj przy nich katalogi gdzie znajdują się nagłówki i biblioteka Tcl.
- Problem: Podczas konfiguracji dostaję komunikat, że "TCL version is too old! It is X.Y and required is at least 8.4."
- Rozwiązanie: Zaktualizuj Tcl! Masz za starą wersję. Moduł działa z wersją co najmniej 8.4.0.
- Problem: Podczas kompilacji dostaję komunikat: "error: invalid conversion from 'constchar*' to 'char*'"
- Rozwiązanie: Masz za starą wersję Tcl, a konfigurator jakimś cudem tego nie wykrył. Zaktualizuj Tcl.
- Problem: Mam Tcl w wersji 8.4.x, wszystko się ładnie kompiluje, ale przy próbie załadowania modułu dostaję komunikat: "Nie mogę aładować biblioteki modułu tcl_scripting: /usr/local/bin/../share/kadu/modules/tcl_scripting.so: undefined symbol: Tcl_GetString" (lub coś innego zamiast Tcl_GetString).
- Rozwiązanie: Prawdopodobnie w twoim systemie są 2 wersje Tcl, jedna ma wersję odpowiednią, a druga jest zbyt stara. Moduł kompiluje się z nagłówkami tej nowszej, a przy uruchamianiu próbuje załadować starszą. Znajdź i usuń starą wersję - jeśli jest to pakiet z dystrybucji, to usuń pakiet za pomocą odpowiedniego menadżera, a jeśli nie, to postaraj się znaleźć pliki: libtcl8.X.so (gdzie X to jakaś liczba mniejsza od 4, bo ten z liczbą 4 jest tą nowszą wersją), lub jego odpowiednik - libtcl8X.so, oraz nagłówek tcl.h, tyle że sprawdź jego zawartość w poszukiwaniu definicji wersji, żeby nie usunąć nagłowka dla Tcl >= 8.4, a także tclsh8.4, który będzie się znajdował w /usr/bin lub /usr/local/bin.
- Problem: Przy ładowaniu jednego ze skryptów Tcl, dostaję komunikat: "can't find package Tk" (lub inna nazwa, zamiast Tk)
- Rozwiązanie: Wszystko jest generalnie w porządku. Po prostu nie masz danego rozszerzenia do Tcl. Można je doinstalować lub zrezygnować z danego skryptu skoro ma on dodatkowe wymagania. Jeśli chodzi o rozszerzenie Tk to jest ono niejako standardem i zwykle instaluje się go razem z samym Tcl - Tk to graficzny interfejs dla Tcl, używa go zdecydowana większość aplikacji Tcl, tak że to jedno rozszerzenie warto doinstalować, zwłaszcza, że zwykle paczki binarne z nim są gotowe razem z paczkami Tcl w każdej dystrybucji (pamiętaj, żeby zachować zgodność wersji Tk z Tcl).
- Problem: Mam Mandrive na procesor 64-bitowy i zainstalowane w niej tcl i tk, ale nadal przy ładowaniu jednego ze skryptów Tcl, np. KaduPro, dostaję komunikat: "can't find package Tk w lini 154"
- Rozwiązanie: Twój Tcl nie widzi paczki Tk. Należy wykonać dowiązanie symboliczne ln -s /usr/lib64/tk8.4/pkgIndex.tcl /usr/lib/tk8.4/pkgIndex.tcl i wtedy wszystko zacznie działać.
Dostępne skrypty
Aktualnie znane są następujące skrypty Tcl dla Kadu:
- KaduPro - autorstwa Googiego, Sad Mephisto, oraz Ciucia
- KaduChess - autorstwa Sad Mephisto
- TCL-Firewall - autorstwa Attisa
- AntyBot - autorstwa Sir_Yaro
- Inteligence2 - autorstwa Miszcza (pierwsza wersja była autorstwa Nazgula)
- mimeTex - autorstwa drogusa
- massMsg - autorstwa Miszcza
Proste przykłady
Wszystkie użyte komendy oraz niuanse języka są wyjaśnione na stronie domowej języka Tcl, oraz w dokumentacji modułu.
Echo
Oto, jak w 4 liniach kodu Tcl napisać odpowiednik modułu echo:
proc doEcho {uins text time} {
msg $uins $text
}
on chat2 doEcho
To wszystko :) Po załadowaniu takiego skryptu, nasze Kadu będzie odpowiadać automatycznie wszystkim, a treść tej odpowiedzi będzie dokładnie taka sama, jaką ktoś nam przyśle.
Automatyczna sekretarka
Na potrzeby przykładu przyjmijmy, że nasza automatyczna sekretarka ma odpowiedzieć tylko wtedy, gdy czyjś UIN zaczyna się od cyfry 5, oraz gdy ty sam(a) masz status "zaraz wracam" lub "zaraz wracam z opisem". Niech dodatkowo w odpowiedzi zawarte będzie imię rozmówcy - sprawi to wrażenie bardziej ludzkiej sekretarki :)
proc respond {uins text time} {
if {[string index $uins 0] == 5}
if {[status] == "busy" || [status] == "busy+description"} {
msg $uins "Przykro mi [user get $uins -firstname], ale nie ma mnie \
teraz przy komputerze. Zostaw wiadomość a na pewno później odpowiem."
}
}
}
on chat2 respond
Gdybyśmy jeszcze zechcieli zrobić naszą sekretarkę nieco bardziej inteligentną i zmusić ją, aby odpowiadała tylko raz do każdego rozmówcy (a nie przy każdej wiadomości), to należy powyższy skrypt zmodyfikować na następujący:
set respondedList ""
proc respond {uins text time} {
global respondedList
if {[string index $uins 0] == 5 && [lsearch $respondedList $uins] == -1} {
if {[status] == "busy" || [status] == "busy+description")} {
msg $uins "Przykro mi [user get $uins -firstname], ale nie ma mnie \
teraz przy komputerze. Zostaw wiadomość a na pewno później odpowiem."
lappend respondedList $uins
}
}
}
Filtr przeciw botom
Coraz popularniejsze stają się boty spamujące lub zwyczajnie przynudzające biednymi tekstami. Są one prostolinijne i zwykle rzucają schematycznymi tekstami. Możemy sobie kilka popularnych spisać, dodać do poniższego skryptu, a on będzie filtrował wiadomości od nich, automatycznie dodając te boty do listy, do grupy "Boty" oraz ustawiając im flagę "Blokuj".
Działa to tak: sprawdza czy ten ktoś, kto do Ciebie pisze jest na Twojej liście - jeśli jest, to po prostu go blokuje. Jeśli nie ma, to dodaje go do listy jako "Bot_<UIN>" i wtedy blokuje. Dodatkowo dodaje wszystkie te kontakty do grupy "Boty" - możesz sobie to zmienić. W dodatku od razu ignoruje pierwszą wypowiedź tego bota. Tak że żadnej wiadomości nie dostaniesz, tylko nowy kontakt do grupy Boty i od razu zablokowany - oczywiście tylko wtedy, gdy wypowie któreś ze zdefiniowanych zdań.
Jeśli chcesz dodać jakieś zdanie do listy, to edytujesz plik, dodajesz wpisz, a potem musisz przeładować skrypt w oknie ładowania tcl.
lappend lista "Twoje zdanie tutaj."
lappend lista "Inne zdanie..."
lappend lista "Możesz definiować ich dowolną liczbę."
proc filterMsg {uin text time} {
if {[lsearch $::lista $text] > -1} {
if {[user exists $uin]} {
user change $uin -blocking true -group "Boty"
} else {
user add -uin $uin -altname Bot_$uin -group "Boty" -blocking true
}
return 1
}
}
on chat0 filterMsg
Jest to jedynie prosty przykład. Rozbudowana i lepiej działająca wersja została napisana przez Sir_Yaro - AntyBot.
