saivert Skrevet 31. juli 2006 Del Skrevet 31. juli 2006 (endret) Jeg trenger et irssi skript som kommuniserer med en telnet server. Her er skjellettkode som dere kan bruke. #!/usr/bin/perl use strict; use warnings; use lib '/usr/local/lib/perl5/site_perl/5.6.2/'; use Irssi; use IO::Socket; use Data::Dumper; sub fb2k { # Kode for å kommunisere med server skal være her # # Bruk følgende for å sende en beskjed til kanalen # Irssi::server_find_tag('nettverk')->command("/msg #kanal np: $song"); # $song må fylles med sangtittel. } fb2k; Det skal styre en serverplugin til FooBar2000 som lar deg hente ut hvilken sang som spilles og styre avspillingen med play, pause, stop, next, prev kommandoer. Et eksempel på ting som vises når du bruker telnet kommandoen mot serveren er: 999|Connected to foobar2000 Control Server v0.8.5 beta 9| 999|Accepted client from 127.0.0.1| 999|There are currently 1/4 clients connected| 999|Type '?' or 'help' for command information| 111|0|128|38.22|MP3|192|226.63||Andrea T Mendoza & Tibet||2005|Dance||Could It Be Magic| Du ser at du får en statuskode først, så data etter. Alt er adskilt med | tegnet (pipe) og det er linjeskift mellom hver linje (\n). Jeg har fått til velfungerende kode i PHP som ser slik ut: $fs = fsockopen($host, $port, $errno, $errstr, 10); if (!$fs) die('Error #'.$errno.': '.$errstr); while (!feof($fs)) { // Les alt til vi treffer en \n fscanf($fs, '%[ -~]\n', $line); // Del opp i array. | er skilletegn $data = preg_split('/\|/', $line); // Sjekk om vi har statuskode 111, 112 eller 113 som tilsier // playing, paused eller stopped respektivt. // Statuskoden er i $data[0] (første element i array) if ( preg_match('/^111|112|113$/', $data[0]) ) { // Ta vare på denne statuslinja siden den inneholder info om sangen som spilles $songinfo = $data; break; } } fclose($fs); Så hele greia går ut på å skrive om det til Perl. Videre for å diskutere protokollen så kan så skrive "help" til serveren når du er tilkoblet og trykke ENTER. Da får du: http://pastebin.ca/107667 (Link til tekst, blir for mye å legge her på forumet) Ganske kjekt ikke sant? FooBar2000 komponenten heter forresten foo_controlserver Link til den her: http://www.hydrogenaudio.org/forums/index....showtopic=38114 Endret 31. juli 2006 av saivert Lenke til kommentar
Torbjørn Skrevet 31. juli 2006 Del Skrevet 31. juli 2006 jeg pleier å gjøre dette med HTTP_writer eller noe slikt, http lar seg kanskje lettere implementere enn telnet? du trenger bare kjøre enkle GET requests mot maskinen med foobar Lenke til kommentar
trtrtr Skrevet 2. august 2006 Del Skrevet 2. august 2006 Vet ikke hva "irssi skript" er for noe Saivert, men her har du litt socket kode i perl som du kan tilpasse. PS! Til Saivert og Torbjørn : Hvorfor gidder dere å bruke PHP, egentlig? use IO::Socket; use Carp; my $RemoteAdr = q(www.vg.no); my $RemotePort = q(80); my $Client = IO::Socket::INET->new (PeerAddr => $RemoteAdr, PeerPort => $RemotePort, Proto => 'tcp', Type => SOCK_STREAM ) or croak "Problems creating client.."; #Send forespørsel print $Client "GET /index.html HTTP/1.1\n\n"; #Dump ut svar my @g = <$Client>; print "\nGot:", @g; Lenke til kommentar
Torbjørn Skrevet 2. august 2006 Del Skrevet 2. august 2006 PS! Til Saivert og Torbjørn : Hvorfor gidder dere å bruke PHP, egentlig? 6604483[/snapback] jeg bruker ikke php Lenke til kommentar
saivert Skrevet 4. august 2006 Forfatter Del Skrevet 4. august 2006 PHP er noe jeg bruker for en webside som styrer foobar2000. Der har jeg fått til koden som kommuniserer med serveren. Jeg har også tatt en titt på foo_http_writer som fungerer greit. Har allerede Perl skript som jeg kan kjøre i irssi (som er en konsollbasert IRC klient, trodde dere Perl-freks kjente til denne IRC klienten da). Men foo_controlserver er mer avansert og støtter flere kommandoer, samt at man har en persistent tilkobling mot server og kan motta events (ny trackinfo linje hver gang det skifter sang i FooBar2000). Jeg prøvde meg med IO::Sockets, men fikk det ikke helt til med å lese fra socket direkte. Men skal prøve igjen med den koden som jeg fikk her nå. Jeg vil såklart poste ferdig skript når jeg får det til så dere ser resultatet til slutt. Det er jo litt av poenget her ikke sant? Lenke til kommentar
trtrtr Skrevet 5. august 2006 Del Skrevet 5. august 2006 Hei Saivert, sett litt på koden din for winamp plugin'en din (skrevet i visual c++, sant?). Har du laget denne fra scratch selv, eller har du modifisert ekisterende kode? Uansett imponerende greier. Tror tilsvarende greier skulle være mulig å lage kjapt i perl ved hjelp av "httpQ winamp-plugin" samt perltray (for generering av "popup" på enklest mulig måte). Er ikke personlig så fascinert av slike plugins, egentlig, men er klart man lærer masse av slike prosjekt som man kan ta med seg videre. Og ha litt c i baklomma er jo kjekt om man en vakker dag skulle ha bruk for å lage noe i XS, samt du får vel mye gratis i perl dersom du er stabil i c, vil jeg tro? Lenke til kommentar
saivert Skrevet 12. august 2006 Forfatter Del Skrevet 12. august 2006 (endret) Jeg bestemte meg for å fortsette å bruke foo_write_http komponenten til FooBar2000. Har skrevet ferdig koden som ser slik ut: #!/usr/bin/perl # # FooBar2000 Now playing script # Requires foo_write_http component installed in FooBar2000 # use strict; use warnings; use lib '/usr/local/lib/perl5/site_perl/5.6.2/'; use Irssi; use Irssi::Irc; use LWP::UserAgent; #use Data::Dumper; sub fb2k_cursong{ my ($data, $server, $witem) = @_; my $ua = new LWP::UserAgent; $ua->timeout(10); $ua->agent("Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.5) Irssi/0.8.10 Saivert-parser/1.0"); my $res = $ua->get("http://home.saivert.com:4800/?cmd=" . $data); if ($res->is_success) { my $content = $res->content; if (!($data eq "")) { Irssi::print($content); } else { if ($witem && ($witem->{type} eq "CHANNEL" || $witem->{type} eq "QUERY")) { $witem->command("SAY $content"); } } } else { Irssi::print("fb2k.pl: Could not get songinfo"); } } Irssi::command_bind('np', 'fb2k_cursong'); /np dumper bare ut gjeldende sang i den kanalen du befinner deg i. /np <kommando> utfører kommandoen. kommandoer er start, stop, next, previous Endret 13. august 2006 av saivert Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå