Witam.
Mam kolejny problem z irc botem.
Poprzez eval wysyłam komendę np: whereis.
eval send "WHEREIS nick"
No i w oknie bota na shellu wyświetla mi wynik.
Jest to zasługa kawałka kodu, odpowiedzialnego za wyświetlanie wiadomości z socketa.
To wiem.
Tylko jak zrobić, żeby wynik polecenia whereis z eval został wyświetlony w oknie kanału?
Chodzi mi o coś w stylu:
Wszystko to dla mnie nieco dziwne (eval + send w Rubim to nie są metody, którymi powinno się operować, przy każdej możliwości, ale to temat na innego posta). Ale zasadniczo to chyba chodzi Ci o coś takiego:
result = evel(send "WHEREIS nick")
eval(send "PRIVMG #kanał #{result}")
Tylko napisz proszę więcej - dlaczego używasz eval? Dlaczego używasz send (to jest z biblioteki Telnet?)? Może lepiej byłoby to zrobić z wykorzystaniem method_missing.
apohllo, to jest prosty irc bot na którym się uczę. : P
A eval używam tylko jako ciekawego dodatku.
Żeby np bezpośrednio z kanału wykonać jakiś kod, taka zabawka. ^^
send używam dlatego, bo tak się nauczyłem wysyłać polecenia do serwera. Nie wiem czy to część biblioteki telnet.
A co do tego co napisałeś, gdy tak zrobię, wyskakuje mi błąd:
can’t convert Fixnum into String
zwraca to co dostaje, więc tu trzeba wejść głębiej i sprawdzić np co zwraca samo
send “WHEREIS Risus”
i tak dalej kierować się w górę.
Polecenie które używasz nie są dość standardowe, więc ciężko powiedzieć. To że od początku zwraca ci liczbę, to widać już po pierwszym błędzie, bo to on właśnie mówi. “Nie mogę skonwertować liczby na napis”
Prawdopodobnie problem jest w send. Czytałeś man jakiś do niego?
Bo jak dla mnie to on zwraca jako odpowiedź int (flaga do odebranej wiadomości) sprawdź to, poszukaj w send. No i może jakiegoś innego bardziej ruby/ror sposób na IRC
gotar po wysłaniu do serwera:
eval send “WHEREIS nick”
w odpowiedz dostaję pewne dane.
Na dobrą sprawę powinienem je wyciągnąć z socketa.
Wygląda to w oknie bota tak:
311 Construct ~Hmm anonymous 2294E8.231A4D.9F2B27.496AC5 * :~Hmm
319 Construct ~Hmm :#test
312 Construct ~Hmm *.server
318 Construct ~Hmm :End of /WHOIS list.
W oknie konsoli ładnie to pokazuje, bo tam jest skierowany cały strumień danych z socketa. : P
Tak jak napisałem w pierwszym poście.
Więc samo eval send “WHEREIS nick” działa prawidłowo.
Problem pojawia się przy wypisaniu powyższego wyniku na kanał.
Np:
eval result=eval(send "WHEREIS nick")
To już wywala błąd.
Pozostaje mi szukanie innego rozwiązania.
(A tak na marginesie… Jest jakiś odpowiednik w ruby preg match z php?)
Znaczy, że dopasował w. regularne począwszy od zerowej literki. W Ruby w przeciwieństwie do PHP 0 nie jest fałszem.
Poczytaj sobie o wyrażeniach w moim przewodniku.
Pytanie czemu nie pomogło? Musi być koniecznie ten eval? Tak na szybko jak napisałem ten przykład plus:
while line = @socket.gets
puts line.chop
end
to wyrzuciło mi tekst z serwera, co prawda z błędem, ale nie chciało mi się szukać jak muszę się przedstawić:
[code]>> while line = @socket.gets
puts line.chop
end
NOTICE AUTH :*** Looking up your hostname…
NOTICE AUTH :*** Checking ident
NOTICE AUTH :*** Couldn’t look up your hostname
NOTICE AUTH :*** No identd (auth) response
ERROR :Closing Link: 127.0.0.1 (Connection Timed Out)[/code]
pozdrawiam
punkracy nie pomogło, bo to, co tam jest napisane umiem. : P
Właśnie zależało mi, żeby zrobić to za pomocą eval. Ale wydaje mi się, że i tak będę musiał
normalnie to napisać. Wiem jak odbierać dane z socketa i je wyświetlić.
Ale będę musiał zrobić swojego rodzaju filtr. Będzie on wypisywał dane na kanał od momentu polecenia whois,
aż do napotkania fragmentu: :End of /WHOIS list.