Jak wyświetlić wynik send

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:

eval (send "WHEREIS nick") && (send "PRIVMSG #kanał efekt_polecenia_whereis")

Nawet nie wiem od której strony się za to zabrać.

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

to daj .to_s i będzie ok

czyli
eval(send “PRIVMG #kanał #{result.to_s}”)

Gdy napiszę tak:

eval result =eval(send "WHEREIS nick"); send "PRIVMSG #kanał :#{result.to_s}"

To wywala mi:
can’t convert Fixnum into String
Gdy nie użyję .to_s, jest tak samo.
Gdy z kolei napiszę:

eval result =(send "WHEREIS nick"); send "PRIVMSG #kanał :#{result}"

To wyświetla cyfrę.
Z .to_s jest to samo.
Cyfrą jest długość ciągu “WHEREIS nick” +1.
Np:

eval result =(send "WHEREIS Risus"); send "PRIVMSG #kanał :#{result}"

zwraca 14.
Dlaczego?

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

Może warto sprawdzić jak zrobił to ktoś inny, np:

to bot irc w Ruby

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?)

"abc" =~ /^a/ #=> 0

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.

Dzięki. A Twój przewodnik mam w zakładkach. : P Nawet go polecałem na jednym forum. ^^
Dzięki za pomoc, już mam pomysł jak rozwiązać ten problem. :wink:

:slight_smile:

zobacz tu:
http://www.agustinvinao.com.ar/2009/10/18/ruby-y-irc/
Hiszpański nie powinien ci być potrzebny, ale w razie potrzeby masz google translator.

pozdrawiam

punkracy dzięki za chęci, ale nie pomogło mi to. Podstawy protokołu irc znam. ^^

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.

masz w rubym jak i w każdym inny języku praktycznie wyrażenia regularne więc to trudne na pewno nie będzie.

Yhm, znam je. Problem na dobrą sprawę można uznać za rozwiązany. :wink:
Chyba, że ktoś chce coś dopisać.