Bot 0.2.0, dostępny w najbliższej knajpie. A raczej niedostępny, bo na razie tylko sobie biernie patrzy, nie zdradzając swojej obecności. Przepisałem go od zera. Patrzcie, jaki jest mały! Osiągnąłem to dzięki temu, że całe przetwarzanie listy wiadomości zostało oddelegowane do models.py. A zerknijcie na to, w jaki elegancki sposób funkcja Message.process() wyciąga wszystkie dane z shouta! Porównajcie sobie z którąś z
poprzednich inkarnacji, polegających głównie na wyrażeniach regularnych. Tym razem zwerbowałem do pomocy czyjś analizator HTML, BeautifulSoup.
Dużym przełomem jest sprawdzenie w Firebugu żądań wysyłanych przez shoutbox do serwera i odkrycie, że wyrzucenie ";restart" z "
http://forum.rpg-center.pl/index.php?action=shoutbox;sa=get;xml;row=dowolnaliczba" sprawia, że przesyłane są jedynie nowe shouty w danej sesji, a więc wszystkie ostatnie 100 za pierwszym razem (bo wszystkie są nowe), a potem tylko te, które nie zostały jeszcze wysłane.
To oznacza parę rzeczy: po pierwsze, sprawdzanie nowych wiadomości jest mocno ułatwione, bo większość roboty jest wykonywana przez serwer. Po drugie, nie muszę już za każdym razem pobierać stu kilobajtów wiadomości. Większość odpowiedzi z serwera, biorąc pod uwagę fatalny poziom aktywności w Knajpie, będzie zajmowała 0 kilobajtów. Złożoność czasowa w najlepszym wypadku (ale najgorszym dla bywalców, tj. brak nowych wiadomości) jest teraz bardzo dobra: bot otrzyma pustą odpowiedź, Message.getMessageList() wyciągnie atrybut text odpowiedzi, wykona jedno sprawdzenie, zwróci pustą listę i to wszystko. O(5).
Jeśli chodzi o funkcję wait(), to pomyślałem, by zaimplementować system z 8chana/Vichuja, tzn. odświeżać co 5 sekund i stopniowo podwajać ten czas aż do 300 sekund w przypadku braku postów, ale biorąc pod uwagę bardzo wydajny sposób pobierania nowych shoutów (odkryty przeze mnie dopiero wczoraj), mogę wyrzucić ten zbajerowany system, zmienną self.time, i dać botowi sprawdzać nowe wiadomości co 3 sekundy, jak zwykły klient shoutboksa. Czuję dobrze optymalizacja.
Innych funkcji bot nadal nie posiada, albowiem im też chciałbym się przyjrzeć i w miarę możliwości usprawnić.
Może niedługo wsadzę kod na GitHuba. Tylko trochę się cykam, bo nigdy tego wcześniej nie robiłem.