summaryrefslogtreecommitdiffstats
path: root/scripts/l33tmusic.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/l33tmusic.pl')
-rw-r--r--scripts/l33tmusic.pl283
1 files changed, 283 insertions, 0 deletions
diff --git a/scripts/l33tmusic.pl b/scripts/l33tmusic.pl
new file mode 100644
index 0000000..0595782
--- /dev/null
+++ b/scripts/l33tmusic.pl
@@ -0,0 +1,283 @@
+use strict;
+use Irssi;
+use Irssi::TextUI;
+use vars qw($VERSION %IRSSI);
+use Xmms;
+use Xmms::Remote ();
+
+#changed to recommended version system with onedigit.twodigits, sorry :)
+$VERSION = '2.01';
+%IRSSI = (
+ authors => 'Mikachu',
+ contact => 'Mikachu @ quakenet|freenode|arcnet|oftc',
+ description => 'A script to show playing xmms song in channel or in a statusbar, and also control xmms. Be sure to read through the script to see all features.',
+ name => 'l33t xmms music showing script',
+ license => 'GPL',
+ modules => 'Bundle::Xmms',
+ sbitems => 'l33tmusic'
+);
+
+#Stuff i've added recently that i can remember:
+#
+#fixed the -c parameter, now you can do stuff like
+#/l33tmusic -c / jump_to_timestr 1:24 to jump around
+#and /l33tmusic -c / pause to pause, and /l33tmusic
+#-c /echo get_playlist_pos to echo the position :)
+#
+#only answers to /ctcp music if xmms is actually on
+#(if someone /ctcp music nick 2 it will show your current+2
+#song in playlist as currently playing instead of saying
+#that it is the second next song, oh well :)
+#
+#some stuff now take a numerical argument as an offset
+#to the current position in the playlist
+#
+#Stuff i've added that i can't remember:
+#
+#if you expected to find something here you weren't thinking
+#look below for stuff
+
+#this function from nickcolor.pl
+my @colors = qw/2 3 4 5 6 7 9 10 11 12 13/;
+sub simple_hash {
+ my ($string) = @_;
+ chomp $string;
+ my @chars = split //, $string;
+ my $counter;
+
+ foreach my $char (@chars) {
+ $counter += ord $char;
+ }
+
+ $counter = $colors[$counter % 11];
+
+ return $counter;
+}
+
+sub getvars {
+ if ($_[0] =~ "songinfo") {
+ my ($position, $title, $time, $status, $filename);
+ my $xmmscontrol = Xmms::Remote->new;
+ my $wantedpos = $_[0];
+ $wantedpos =~ s/songinfo //;
+ unless ($wantedpos =~ /^-?\d+$/ && (( $wantedpos + $xmmscontrol->get_playlist_pos <= $xmmscontrol->get_playlist_length-1 && $wantedpos >= 0) || 0-$wantedpos <= $xmmscontrol->get_playlist_pos && $wantedpos <= 0) ) {
+ $wantedpos = 0;
+ }
+ my $wantedpos = $xmmscontrol->get_playlist_pos + $wantedpos;
+ $title = $xmmscontrol->get_playlist_title($wantedpos);
+ my $seconds = ($xmmscontrol->get_output_time/1000)%60;
+ my $tmp = length($seconds);
+ if($tmp == "1") {
+ $seconds = "0" . $seconds;
+ }
+ $position = int($xmmscontrol->get_output_time/60000) . ":" . $seconds;
+ $time = $xmmscontrol->get_playlist_timestr($wantedpos);
+ if ($xmmscontrol->is_playing) {
+ if ($xmmscontrol->is_paused) {
+ $status = "Paused";
+ } else {
+ $status = "Playing";
+ }
+ } else {
+ $status = "Stopped";
+ }
+ $filename = $xmmscontrol->get_playlist_file($wantedpos);
+
+ $title =~ s/[\r\n]/ /g;
+ $filename =~ s/[\r\n]/ /g;
+
+ return($position, $title, $time, $status, $filename);
+ } elsif ($_[0] =~ "filename") {
+ my $xmmscontrol = Xmms::Remote->new;
+ my $wantedpos = $_[0];
+ $wantedpos =~ s/filename //;
+ unless ($wantedpos =~ /^-?\d+$/ && (( $wantedpos + $xmmscontrol->get_playlist_pos <= $xmmscontrol->get_playlist_length-1 && $wantedpos >= 0) || 0-$wantedpos <= $xmmscontrol->get_playlist_pos && $wantedpos <= 0) ) {
+ $wantedpos = 0;
+ }
+ $wantedpos = $xmmscontrol->get_playlist_pos + $wantedpos;
+ $filename = $xmmscontrol->get_playlist_file($wantedpos);
+ $filename =~ s/[\r\n]/ /g;
+ return($filename);
+ }
+}
+
+sub ctcp_info {
+ if (Irssi::settings_get_bool('l33tctcp_enabled') && Xmms::Remote->new->is_running) {
+ my ($server, $msg, $nick, $address, $channel) = @_;
+ my ($p, $n, $t, $s) = getvars("songinfo $msg");
+ my $reply = Irssi::settings_get_str('l33tctcpreply');
+ $reply =~ s/(\$\w+)/$1/eeg;
+ $server->command("^notice $nick $reply");
+ Irssi::statusbar_items_redraw('l33tmusic');
+ }
+}
+
+sub triggersend {
+ my $trigger = Irssi::settings_get_str('l33ttrigger');
+ if ($_[1] =~ /^$trigger/) {
+ if (Irssi::settings_get_bool('l33ttrigger_enabled')) {
+ $_[1] =~ s/$trigger //g;
+ $_[1] = getvars("filename $_[1]");
+ $_[0]->command("DCC SEND $_[2] \"$filename\"");
+ } else {
+ $_[0]->command("^notice $_[2] Trigger currently disabled");
+ }
+ }
+}
+
+sub themainthingie {
+ if (Xmms::Remote->new->is_running) {
+ my ($msg, $server, $nick, $address, $channel) = @_;
+ my $command;
+ my ($p, $n, $t, $s, $f) = getvars("songinfo 0");
+ #The -m switch will echo the info in the status window,
+ #I have this bound to meta-q :), takes a numerical argument
+ #same as the -s switch
+ if ($msg =~ "^-m") {
+ $msg =~ s/^-m //;
+ my ($p, $n, $t, $s, $f) = getvars("songinfo " . $msg);
+ print CLIENTCRAP "" . simple_hash("$n") . "$n ($p / $t)";
+ $command = "";
+ #This allows a fully customized message, to be used in
+ #aliases, since it's not fun to write the full thing every
+ #time
+ } elsif ($msg =~ "^-e") {
+ $msg =~ s/^\-e //;
+ $command = "$msg";
+ #The -c switch is now fixed mostly, it seems that you
+ #can do whatever you want, and if it happens to match
+ #a proper command such as jump_to_timestr and you pass
+ #the right parameter, it works, otherwise i made it not
+ #crash anymore, weee :)
+ } elsif ($msg =~ "^-c") {
+ $msg =~ s/^\-c //;
+ my $thingie;
+ my ($msg, $reply, $param) = split(/ /, "$msg", 3);
+ if ($param) {
+ return unless eval {
+ $thingie = Xmms::Remote->new->$reply($param);
+ }
+ } else {
+ return unless eval {
+ $thingie = Xmms::Remote->new->$reply;
+ }
+ }
+ if ($thingie) {
+ $command = "$msg $thingie";
+ }
+ #The -f switch has been removed, please use
+ #/l33tmusic -e /colme or /colsay from the
+ #ascii.pl script to get better functionality
+
+ #This switch will send the currently playing song to
+ #the nick on the command line, takes a numerical
+ #argument like the -m switch
+ } elsif ($msg =~ "^-s") {
+ $msg =~ s/^-s //;
+ (my $friend, $msg) = split " ", $msg;
+ $friend =~ s/ //;
+ my ($p, $n, $t, $s, $f) = getvars("songinfo " . $msg);
+ $server->command("dcc send $friend \"$f\"");
+ #If a string was given, put it in front of the info, and
+ #anything after a # after the info. If nothing is in front
+ #of the #, throw in the string from the settings.
+ } elsif ($msg) {
+ my $msg2;
+ $msg =~ s/(\$\w+)/$1/eeg;
+ ($msg, $msg2) = split "#", $msg;
+ if ($msg =~ /^$/) {
+ $msg = Irssi::settings_get_str('l33tstringplaying');
+ }
+ $command = "me $msg $n ($p / $t) $msg2";
+ #Just go with the defaults
+ } else {
+ if ( $s eq "Playing" ) {
+ $command = Irssi::settings_get_str('l33tstringplaying');
+ $command = Irssi::settings_get_str('l33tstringaction') . " $command " . Irssi::settings_get_str('l33tstringsongformat');
+ } else {
+ $command = "echo Xmms is $s";
+ }
+ }
+ $command =~ s/(\$\w+)/$1/eeg;
+ $command =~ s/\s+/ /g;
+ if ($command) {
+ Irssi::active_win()->command("$command");
+ }
+ }else {
+ Irssi::active_win()->command("echo Xmms isn't currently running");
+ }
+}
+
+sub checkformpg123 {
+ my ($msg, $server, $witem) = @_;
+ if ($msg =~ /^Playing( MPEG stream from )?/) {
+ $msg =~ s/Playing MPEG stream from //;
+ $msg =~ s/Playing //;
+ $msg =~ s/%20/ /g;
+ $msg =~ s/\.(mp3|ogg)( \.\.\.)?//i;
+ $msg =~ s/_/ /g;
+ $msg =~ s/oc remix//i;
+ $msg = Irssi::settings_get_str('l33tstringaction') . " " . Irssi::settings_get_str('l33tstringplayingmpg123') . " $msg";
+ Irssi::signal_stop();
+ Irssi::signal_remove('send text', 'checkformpg123');
+ Irssi::signal_emit('send command', $msg, $server, $witem);
+ Irssi::signal_add('send text', 'checkformpg123');
+ }
+
+}
+
+my $statusbar_item;
+my $refresh_tag;
+my $scrollpos=0;
+sub refresh_statusbar {
+ my ($p, $no, $t, $s, $f) = getvars("songinfo 0");
+ my $width=Irssi::active_win()->{width};
+ my $n;
+ my $others = Irssi::settings_get_str('l33tstatusbar');
+ $others =~ s/\%.//g;
+ $others =~ s/\$n//g;
+ $others =~ s/(\$\w+)/$1/eeg;
+ my $maxlength=$width - length($others);
+ if (length($no) > $maxlength) {
+ my $middlethingie = Irssi::settings_get_str('l33tmiddlethingie');
+ $no = "$no $middlethingie";
+ $n=substr(substr($no, $scrollpos, length($no)) . substr($no, 0, $scrollpos), 0, $maxlength);
+ $scrollpos++;
+ $scrollpos=0 if ($scrollpos + 1 > length($no));
+ } else {
+ $n = $no;
+ }
+ $n =~ s/\%/\%\%/g;
+ $statusbar_item = Irssi::settings_get_str('l33tstatusbar');
+ $statusbar_item =~ s/(\$\w+)/$1/eeg;
+ Irssi::statusbar_items_redraw('l33tmusic');
+}
+
+sub l33tmusic_statusbar {
+ my ($item, $get_size_only) = @_;
+ $item->default_handler($get_size_only, "$statusbar_item", undef, 1);
+}
+
+
+Irssi::signal_add('send text', 'checkformpg123');
+Irssi::command_bind('l33tmusic', 'themainthingie');
+Irssi::settings_add_str('infopipe', 'l33tstringaction', '/me');
+Irssi::settings_add_str('infopipe', 'l33tstringplayingmpg123', 'is listening to');
+Irssi::settings_add_str('infopipe', 'l33tstringplaying', 'is listening to');
+Irssi::settings_add_str('infopipe', 'l33tstatusbar', '$n ($p / $t)');
+Irssi::settings_add_str('infopipe', 'l33tstatusbarrefresh', '500');
+Irssi::settings_add_str('infopipe', 'l33tmiddlethingie', '*** ');
+Irssi::settings_add_str('infopipe', 'l33tstringsongformat', '$n ($p / $t)');
+Irssi::settings_add_str('infopipe', 'l33tctcpreply', 'I\'m listening to $n ($p / $t) Status: $s');
+Irssi::settings_add_str('infopipe', 'l33ttrigger', 'ˇyourtriggerhere');
+Irssi::settings_add_bool('infopipe', 'l33ttrigger_enabled', 0);
+Irssi::settings_add_bool('infopipe', 'l33tctcp_enabled', 0);
+Irssi::settings_add_bool('infopipe', 'l33twarning_read', 0);
+Irssi::signal_add("ctcp msg music", "ctcp_info");
+Irssi::signal_add_last("message public", "triggersend");
+Irssi::statusbar_item_register('l33tmusic', undef, 'l33tmusic_statusbar');
+$refresh_tag=Irssi::timeout_add(Irssi::settings_get_str('l33tstatusbarrefresh'), 'refresh_statusbar', undef);
+unless (Irssi::settings_get_bool('l33twarning_read')) {
+ print CLIENTCRAP "Type /set l33t to see all available settings. To remove this message, please type /set l33twarning_read on. Type /set l33t to list all options.";
+ print CLIENTCRAP "If you want statusbar, add \'l33tmusic = { placement = \"top\"; items = { l33tmusic = { }; }; };\' to your config file, above \'topic = {\', and do a /reload.";
+}