EKG i Bash - Bot GG

  1. Wstęp
  2. Co nam bedzie potrzebne?
  3. Piszemy naszego bota!
    1. Ogólny zarys
    2. Użytkownik: czytanie newsów z pliku
    3. Mały panel admina: dodawanie newsów
    4. Mały panel admina: testowanie wyglądu newsów
    5. Mały panel admina: czyszczenie pliku z newsami
  4. 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

Bot GG w czasie pracy 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
Kod naszego bota GG 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.