EKG i Bash - Bot GG
- Wstęp
- Co nam bedzie potrzebne?
- Piszemy naszego bota!
- Ogólny zarys
- Użytkownik: czytanie newsów z pliku
- Mały panel admina: dodawanie newsów
- Mały panel admina: testowanie wyglądu newsów
- Mały panel admina: czyszczenie pliku z newsami
- Autor
1. Wstęp
Witam w kolejnym artykule z serii EKG i Bash. :) Dzisiaj stworzymy prostego
bota newsowego, którego będziemy obsługiwać przez GG.
Zapraszam do czytania! :)
2. Co będzie nam potrzebne?
Potrzebujemy shella lub stacji Linuksowej z dowolną dystrybucją,zainstalowaną powłoką bash (domyślna powłoka w większości dystrybucji) i zainstalowanym Eksperymentalnym Klientem Gadu-Gadu (strona domowa: http://ekg.chmurka.net/).
3. Piszemy naszego bota!
Nie będę opisywał konfiguracji EKG, jeśli nadal potrzebujesz opisu to
zapraszam do poprzedniego artykułu EKG i Bash - Automatyczna sekretarka.
Pragnę nadmienić, że dołączenie skryptu do zdarzenia wykonujemy jak w
poprzednim artykule o EKG i Bashu:
/on --add msg,chat * /exec --bmsg %1 ~/gg_bot/obsluga %1 "%4"
I. Ogólny zarys
Naszego bota podzielimy sobie na dwie części: część użytkownika i
administratora. Oczywiście zwykły użytkownik nie może mieć dostępu do części
administratora.
W części użytkownika będziemy mieli 3 funkcje:
- czytanie newsów, przy wysłaniu do bota tekstu "czytaj"
- wyświetlanie daty i godziny z serwera, przy wysłaniu tekstu "data"
- wyświetlenie informacji (autor, etc.), przy wysłaniu tekstu "info"
Oczywiście jeśli wyślemy inną wiadomość otrzymamy informację
zwrotną, że bot nie zna takiej komendy.
W części administratora będziemy mieli:
- dodawanie newsów, przy wysłaniu dowolnej wiadomości (np. po wysłaniu
wiadomości "22/11/2007 Test" ta wiadomość będzie zapisana do bazy)
- usunięcie bazy newsów, przy wysłaniu wiadomości "clear"
- przetestowanie wyglądu bazy, przy wysłaniu wiadomości "test"
Za bazę newsów będzie nam służył zwykły plik o rozszerzeniu txt, w tym
przypadku będzie to "wypis.txt".
Całą obsługę ujmiemy w pliku "obsluga".
Wszystkie pliki będą w katalogu "gg_bot" w katalogu home użytkownika
(~/gg_bot/).
II. Użytkownik: czytanie newsów z pliku
Zaczynamy pisanie naszego prostego bota od czytania newsów z
pliku "wypis.txt". Tworzymy pliki "obsluga" i "wypis.txt":
touch ~/gg_bot/obsluga
touch ~/gg_bot/wypis.txt
Nadajemy także plikowi "obsługa" prawa wykonywalności - "chmod +x
~/gg_bot/obsluga".
Teraz gdy stworzyliśmy te pliki, otwórzmy pierwszy z nich za pomocą dowolnego
edytora (ja korzystam z Nano) - "nano ~/gg_bot/obsluga". Na samym początku
wpisujemy:
#!/bin/bash
Ta linijka służy do tego aby nasz PeCet wiedział czym wykonać nasz skrypt.
Dwie linijki niżej napiszemy:
echo "Najnowsze newsy: "
eval 'cat ~/gg_bot/wypis.txt'
Przypominam, że "echo" wyświetla dowolny napis, a "eval" stara się wykonać
podany tekst jako polecenie powłoki.
Tak więc wyświetlamy napis "Najnowsze newsy:" i wyświetlamy plik
"~/gg_bot/wypis.txt" przy dostaniu dowolnej wiadomości. Niezbyt nas to
satysfakcjonuje prawda? Dodajmy jeszcze instrukcje warunkową "if":
if [ "$2" = "czytaj" ]; then
echo "Najnowsze newsy: "
eval 'cat ~/gg_bot/wypis.txt'
fi
W tym miejscu chciałbym jeszcze nadmienić, że parametry przekazywane do
skryptu są takie:
$1 - numer Gadu-Gadu
$2 - treść wiadomości
Należy zauważyć, że napisałem "$2" w cudzysłowie tak jak "czytaj". Odpowiadam
dlaczego - przy wysłaniu samego wyrazu "czytaj" wszystko jest ok, ale gdy
napiszemy chociażby "czytaj a" czy "s as" dostaniemy wiadomość błędu, że
podaliśmy za dużo argumentów. Po podaniu "$2" w cudzysłowie takiego problemu
nie będziemy mieli.
To już nam bardziej odpowiada - jak bot dostanie wiadomość o treści "czytaj"
,wtedy wyświetli newsy. Na tym zakończymy tą funkcję ;)
III. Użytkownik: dodatkowe komendy - data i info
Teraz dopiszemy dwie nowe funkcje do naszego bota: przy wysłaniu "data" do
bota dostaniemy wiadomość z dniem tygodnia, godziną i datą, a przy wysłaniu
"info" dostaniemy spreparowaną przez nas wiadomość.
Napiszmy tak:
if [ "$2" = "czytaj" ]; then
echo "Najnowsze newsy: "
eval 'cat ~/gg_bot/wypis.txt'
elif [ "$2" = "data" ]; then
echo "Data systemowa: "
eval "date"
elif [ "$2" = "info" ]; then
echo "Witaj w prostym bocie informacyjnym!"
echo "Powered by GNU/Linux!"
fi
Jak widać doszły nam dwie nowe opcje: data i info. Widzisz to "elif"? Dzięki
temu sprawdzi jeszcze jeden warunek (i następny, i następny). Wszystko działa
na takiej samej zasadzie. Proste, a więc możemy przejść dalej.
Przed "fi" dopiszmy jeszcze kilka linijek skryptu:
else
echo "Nie wiem co znaczy '$2'"
echo "Obsługuje komendy: czytaj, info, data."
I takim oto sposobem, bot przy otrzymaniu wiadomości nie pasującej do żadnej z
funkcji wypisze komunikat, że nie wie co znaczy "$2" i wyświetli obsługiwane
komendy.
IV. Mały panel admina: dodawanie newsów
Oczywiście czym byłby taki bot gdybyśmy musieli ręcznie wpisywać do pliku
newsy? Zapewne niczym ciekawym. Tak więc stworzymy możliwość dodawania newsów
z określonego numeru GG.
case $1 in
TwójNumerGG)
eval "echo '$2' >> ~/gg_bot/wypis.txt"
echo "News o treści '$2' dodany"
fi
;;
*)
>>>Tutaj wstaw skrypt z punktu III!<<<
;;
esac
Jak widać nasz skrypt wygląda bardzo podobnie do skrypyu automatycznej
sekretarki.
Instrukcja warunkowa "case" sprawdza czy "$1" (numer GG) to TwójNumerGG,
jeśli tak to zapisuje wiadomość ("$2") do pliku "~/gg_bot/wypis.txt" po czym
wysyła wiadomość "News o treści '$2' dodany" ("$2" zostanie zamieniony na
treść naszej wiadomości). Takie dodawanie wiadomości jak najbardziej nam
odpowiada.
V. Mały panel admina: testowanie wyglądu newsów
Przydałoby się sprawdzić jak nasze newsy będą wyglądać w akcji. Napiszemy to
podobnie jak dodatkowe funkcje z poziomu użytkownika:
case $1 in
TwójNumerGG)
if [ "$2" = "test" ]; then
echo "To jest test newsów: "
eval 'cat ~/gg_bot/wypis.txt'
else
eval "echo '$2' >> ~/gg_bot/wypis.txt"
echo "News o treści '$2' dodany"
fi
;;
*)
>>>Tutaj wstaw skrypt z punktu III!<<<
;;
esac
Podobnie jak w punkcie III mamy tutaj warunek (jeśli "$2" = "test" to wypisz
newsy) i "else", dzięki któremu, w momencie gdy "$2" nie będzie pasować do
żadnego z warunków, wykonane zostaną instrukcje zawarte po else (w tym
przypadku "eval" i "echo").
VI. Mały panel admina: czyszczenie pliku z newsami
Została nam ostatnia funkcja - czyszczenie pliku "wypis.txt" z newsów.
Wiadomo przecież, że wiadomości na GG mają określoną długość (powyżej tej
długości wiadomości są ucinane), więc musimy co jakiś czas czyścić plik.
Zastosujemy tutaj echo, bo jak powinniście pamiętać:
"echo coś >> plik" <- wpisze "coś" do nowej linii, nie kasując niczego
"echo coś > plik" <- kasuje wszystko w pliku i wpisuje "coś" do pierwszej
linii
Tak więc napiszmy:
case $1 in
TwójNumerGG)
if [ "$2" = "test" ]; then
echo "To jest test newsów: "
eval 'cat ~/gg_bot/wypis.txt'
elif [ "$2" = "clear" ]; then
eval 'echo > ~/gg_bot/wypis.txt'
echo "Baza została wyczyszczona"
else
eval "echo '$2' >> ~/gg_bot/wypis.txt"
echo "News o treści '$2' dodany"
fi
;;
*)
>>>Tutaj wstaw skrypt z punktu III!<<<
;;
esac
Jak widać mamy tutaj znów "elif", co jest bardzo przydatne. Przy pomocy
"echo" kasujemy obecną zawartość pliku z newsami, po czym wysyłamy
informacje, że baza została usunięta.
Tak więc, nasz końcowy kod będzie wyglądał tak:
case $1 in
TwójNumerGG)
if [ "$2" = "test" ]; then
echo "To jest test newsów: "
eval 'cat ~/gg_bot/wypis.txt'
elif [ "$2" = "clear" ]; then
eval 'echo > ~/gg_bot/wypis.txt'
echo "Baza została wyczyszczona"
else
eval "echo '$2' >> ~/gg_bot/wypis.txt"
echo "News o treści '$2' dodany"
fi
;;
*)
if [ "$2" = "czytaj" ]; then
echo "Najnowsze newsy: "
eval 'cat ~/gg_bot/wypis.txt'
elif [ "$2" = "data" ]; then
echo "Data systemowa: "
eval "date"
elif [ "$2" = "info" ]; then
echo "Witaj w prostym bocie informacyjnym!"
echo "Powered by GNU/Linux!"
else
echo "Nie wiem co znaczy '$2'"
echo "Obsługuje komendy: czytaj, info, data."
fi
;;
esac
4. Autor
Autorem powyższego artykułu jest Kamil "elwin013" Banach.
Strona autora: http://elwin.ovh.org/ | Kontakt:
elwin93(malpiszon)gmail(kropa)com
Zabrania sie kopiowanie powyższego artykułu bez wiedzy autora.
Autor nie odpowiada za żadne szkody wynikające z korzystania z treści tego artykułu.
Wszelkie prawa zastrzeżone.