-for (;;) {
- open my $log, "-|", "disorder", "log";
- my $startp = 1;
- my $stateinfo = undef;
- LINE: while (<$log>) {
- chomp;
- my @f = ();
- my $q = my $t = undef;
- my $e = 0;
- my $j = -1;
- for (my $i = 0; $i < length $_; $i++) {
- my $ch = substr($_, $i, 1);
- if ($e) {
- if ($ch eq "n") { $ch = "\n"; }
- $t .= $ch; $e = 0;
- } elsif ($ch eq $q) {
- push @f, $t; $q = $t = undef;
- } elsif (defined $q) {
- if ($ch eq "\\") { $e = 1; }
- else { $t .= $ch; }
- } elsif ($ch eq " ") {
- push @f, $t if defined $t; $t = undef;
- } elsif (!defined $t && ($ch eq '"' || $ch eq "'")) {
- $t //= ""; $q = $ch; $j = $i;
- } else {
- $t //= ""; $t .= $ch;
- }
- }
- defined $q and die "unmatched $q (pos $j) in: $_";
- push @f, $t if defined $t;
-
- my $what = $f[1];
- if ($what eq "volume" && $startp) {
- $startp = 0;
- notify "DisOrder state", "Connected: $startinfo";
- now_playing;
- } elsif ($what eq "state") {
- my $st = $f[2];
- my $msg;
- my $np = 0;
- if ($st eq "disable_random") { $msg = "random play disabled"; }
- elsif ($st eq "enable_random") { $msg = "random play enabled"; }
- elsif ($st eq "disable_play") { $msg = "playing disabled"; }
- elsif ($st eq "enable_play") { $msg = "playing enabled"; }
- elsif ($st eq "pause") { $msg = "paused"; }
- elsif ($st eq "resume") { $msg = "playing"; $np = 1; }
- else { next LINE; }
- if (!$startp) {
- notify "DisOrder state", ucfirst $msg;
- now_playing if $np;
- } else {
- if (defined $startinfo) { $startinfo .= "; " . $msg; }
- else { $startinfo = $msg; }
- }
- } elsif ($what eq "scratched") {
- notify "DisOrder state", "Scratched playing track";
- } elsif ($what eq "playing") {
- now_playing $f[2];
+sub get_state () {
+ my $sk = connect_to_server $C{config};
+ send_command0 $sk, "log";
+ my $st = get_state0 $sk;
+ close $sk;
+ return $st;
+}
+
+sub decode_track_name ($\%) {
+ my ($sk, $info) = @_;
+ return unless exists $info->{track};
+ my $track = $info->{track};
+ for my $i ("artist", "album", "title") {
+ my @f = split_fields send_command $sk, "part", $track, "display", "$i";
+ $info->{$i} = $f[0];
+ }
+}
+
+sub format_now_playing (\%) {
+ my ($info) = @_;
+ exists $info->{track} or return "Nothing.";
+ my $r = "$info->{artist}: ‘$info->{title}’";
+ $r .= ", from ‘$info->{album}’" if $info->{album};
+ $r .= "\n(chosen by $info->{submitter})" if exists $info->{submitter};
+ return $r;
+}
+
+sub get_now_playing ($) {
+ my ($sk) = @_;
+ my $r = send_command $sk, "playing";
+ defined $r or return {};
+ my %info = split_fields $r;
+ decode_track_name $sk, %info;
+ return \%info;
+}
+
+sub watch_and_notify0 ($) {
+ my ($now_playing) = @_;
+
+ my $sk = connect_to_server $C{config}, 1;
+ my $sk_log = connect_to_server $C{config}, 1;
+
+ send_command0 $sk_log, "log";
+ my $st = get_state0 $sk_log;
+ my $msg = "playing " . ($st->{play} ? "enabled" : "disabled");
+ $msg .= "; random play " . ($st->{random} ? "enabled" : "disabled");
+ $msg .= "; " . ($st->{pause} ? "paused" : "playing");
+ notify "$TITLE state", "Connected: $msg";
+ if ($st->{play} && $now_playing) {
+ my $info = get_now_playing $sk;
+ notify "$TITLE: Now playing", format_now_playing %$info;
+ }
+
+ while (my $line = readline $sk_log) {
+ my @f = split_fields $line;
+
+ if ($f[1] eq "state") {
+ my $msg = undef;
+ if ($f[2] eq "disable_random") { $msg = "Random play disabled"; }
+ elsif ($f[2] eq "enable_random") { $msg = "Random play enabled"; }
+ elsif ($f[2] eq "disable_play") { $msg = "Playing disabled"; }
+ elsif ($f[2] eq "enable_play") { $msg = "Playing enabled"; }
+ elsif ($f[2] eq "pause") { $msg = "Paused"; }
+ elsif ($f[2] eq "resume") { $msg = "Playing"; }
+ notify "$TITLE state", $msg if defined $msg;
+ } elsif ($f[1] eq "playing") {
+ my %info;
+ $info{track} = $f[2];
+ $info{submitter} = $f[3] if @f > 3;
+ decode_track_name $sk, %info;
+ notify "$TITLE: Now playing", format_now_playing %info;
+ } elsif ($f[1] eq "scratched") {
+ my %info;
+ $info{track} = $f[2];
+ decode_track_name $sk, %info;
+ notify "$TITLE: Scratched by $f[3]", format_now_playing %info;