Jump to content
Sign in to follow this  
saivert

IO::Sockets og telnet

Recommended Posts

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

Edited by saivert

Share this post


Link to post

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

Share this post


Link to post

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;

Share this post


Link to post

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?

Share this post


Link to post

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?

Share this post


Link to post

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

Edited by saivert

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...