A feature-rich, modular AOL Instant Messenger client written chiefly by Bill Atkins and Dan Chokola in their high school days.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

281 lines
6.3 KiB

#!usr/bin/perl
#########################################################################
# Author Daniel Chokola #
# Title Milkbot #
# Date 4/16/2003 #
# Desc Controls Winamp or XMMS over Milkbone via Milkbot #
#########################################################################
package MilkbotMusic;
use strict;
no strict 'refs';
use warnings;
use Milkbone;
if($^O =~ /linux/) {
eval "use Xmms::Remote";
}
elsif($^O =~ /Win32/) {
eval "use Winamp::Control";
}
my ($amp, $os, %commands);
register_hook("milkbot_get_commands", \&init);
sub init {
my $cmd = '';
if($^O =~ /Win32/i) {
$os = 'win32';
}
elsif($^O =~ /linux/) {
$os = 'linux';
}
if($^O =~ /Win32/) {
$amp = Winamp::Control->new(host => 'localhost', port => 4800, passwd => 'pass');
}
elsif($^O =~ /linux/) {
$amp = new Xmms::Remote ();
}
$commands{'.list'}[0] = "list_$os";
$commands{'.list'}[1] = '.list [num]--makes a list of songs num long based on the song currently playing, 5 by default';
$commands{'.next'}[0] = "next_$os";
$commands{'.next'}[1] = '.next--jumps ahead one track';
$commands{'.paus'}[0] = "paus_$os";
$commands{'.paus'}[1] = '.paus--pauses the current song';
$commands{'.play'}[0] = "play_$os";
$commands{'.play'}[1] = '.play--plays the current song';
$commands{'.prev'}[0] = "prev_$os";
$commands{'.prev'}[1] = '.prev--jumps back one track';
$commands{'.rand'}[0] = "rand_$os";
$commands{'.rand'}[1] = '.rand--randomly selects a song';
$commands{'.rpt'}[0] = "rpt_$os";
$commands{'.rpt'}[1] = '.rpt [on|off]--toggles the repeat status (on or off)';
$commands{'.shuf'}[0] = "shuf_$os";
$commands{'.shuf'}[1] = '.shuf [on|off]--toggles the shuffle status (on or off)';
$commands{'.song'}[0] = "song_$os";
$commands{'.song'}[1] = '.song--displays the current song';
$commands{'.stop'}[0] = "stop_$os";
$commands{'.stop'}[1] = '.stop--stops playback';
$commands{'.vis'}[0] = "vis_$os";
$commands{'.vis'}[1] = '.vis--turns on the visualization';
for(keys(%commands)) {
hook("milkbot_set_command", -name => $_, -desc => $commands{$_}[1]);
}
register_hook("milkbot_command", sub { $cmd = $ARGS{-cmd};
register_hook("milkbot_command_$cmd", sub {
$commands{$cmd}[0]->($ARGS{-user}, $ARGS{-msg});
deregister_hook("milkbot_command_$cmd") if $cmd;
});
});
}
sub send_im {
my ($to, $msg, $away) = @_;
$away = 0;
print $msg, $to;
hook("protocol_send_im", -dest => $to, -msg => $msg, -away => $away);
}
sub list_linux {
my ($from, $msg) = @_;
my @list;
return if($amp->get_playlist_length < 1);
if($msg) {
for(my $i = 0; $i < $msg; $i++) {
$list[$i] = $amp->get_playlist_title($amp->get_playlist_pos + $i - (($msg - 1) / 2));
}
}
if(@list) {
$list[$msg / 2] = '<b>' . $list[$msg / 2] . '</b>';
send_im($_[0], join("\n", @list), 0);
}
else {
for(my $i = 0; $i < 5; $i++) {
$list[$i] = $amp->get_playlist_title($amp->get_playlist_pos + $i - 2);
}
$list[2] = '<b>' . $list[2] . '</b>';
send_im($_[0], join("\n", @list), 0);
}
}
sub next_linux {
$amp->playlist_next;
sleep(1.1);
song_linux(@_);
}
sub paus_linux {
$amp->pause;
send_im($_[0], 'Pause <b>toggled</b>.', 0);
}
sub play_linux {
$amp->play;
sleep(1.1);
song_linux(@_);
}
sub prev_linux {
$amp->playlist_prev;
sleep(1.1);
song_linux(@_);
}
sub rand_linux {
$amp->playlist_next; # a simple, but inelegant solution to the
$amp->toggle_shuffle; # problem of randomizing tracks in xmms:
$amp->playlist_next; # do it twice!
$amp->toggle_shuffle;
sleep(1.1);
song_linux(@_);
}
sub rpt_linux {
$amp->toggle_repeat();
send_im($_[0], 'Repeat <b>toggled</b>.', 0);
}
sub shuf_linux {
$amp->toggle_shuffle();
send_im($_[0], 'Shuffle <b>toggled</b>.', 0);
}
sub stop_linux {
$amp->stop;
send_im($_[0], '<b>Stopped</b>', 0);
}
sub song_linux {
my $song = $amp->get_playlist_title($amp->get_playlist_pos());
if($song) {
send_im($_[0], "Now playing:\n<b>$song</b>", 0);
}
else {
send_im($_[0], '<b>Stopped</b>.', 0);
}
}
sub vis_linux {
send_im($_[0], 'Command <b>failed</b>.', 0);
}
sub list_win32 {
my ($from, $msg) = @_;
my @list;
return if($amp->get_playlist_length < 1);
if($msg) {
for(my $i = 0; $i < $msg; $i++) {
$list[$i] = $amp->getplaylisttitle($amp->getlistpos + $i - (($msg - 1) / 2));
}
}
if(@list) {
$list[$msg / 2] = '<b>' . $list[$msg / 2] . '</b>';
send_im($_[0], join("\n", @list), 0);
}
else {
for(my $i = 0; $i < 5; $i++) {
$list[$i] = $amp->getplaylisttitle($amp->getplaylistpos + $i - 2);
}
$list[2] = '<b>' . $list[2] . '</b>';
send_im($_[0], join("\n", @list), 0);
}
}
sub next_win32 {
$amp->next;
song_win32(@_);
}
sub paus_win32 {
$amp->pause;
song_win32(@_) if $amp->isplaying;
}
sub play_win32 {
$amp->play;
song_win32(@_);
}
sub prev_win32 {
$amp->prev;
sleep(1.1);
song_win32(@_);
}
sub rand_win32 {
my $status;
$status = $amp->shuffle_status;
$amp->shuffle(a => 1);
$amp->next;
$amp->shuffle(a => 0) if(!$status);
sleep(1.1);
song_win32(@_);
}
sub rpt_win32 {
my ($from, $msg) = @_;
$msg =~ tr/A-Z/a-z/ if $msg;
if($msg =~ /on/) {
$amp->repeat(1);
send_im($_[0], 'Repeat <b>on</b>.', 0);
}
elsif($msg =~ /off/) {
$amp->repeat(0);
send_im($_[0], 'Repeat <b>off</b>.', 0);
}
else {
send_im($_[0], $commands{'.rpt'}[1], 0);
}
}
sub shuf_win32 {
my $msg = $_[1];
$msg =~ tr/A-Z/a-z/ if $msg;
if($msg =~ /on/) {
$amp->shuffle(a => 1);
send_im($_[0], 'Shuffle <b>on</b>.', 0);
}
elsif($msg =~ /off/) {
$amp->shuffle(a => 0);
send_im($_[0], 'Shuffle <b>off</b>.', 0);
}
else {
send_im($_[0], $commands{'.shuf'}[1], 0);
}
}
sub stop_win32 {
$amp->fadeoutandstop;
send_im($_[0], '<b>Stopped</b>.', 0);
}
sub song_win32 {
my $song;
if($amp->isplaying) {
$song = $amp->getcurrenttitle;
send_im($_[0], "Now playing:\n<b>$song</b>", 0)
}
else {
send_im($_[0], '<b>Stopped</b>.', 0);
}
}
sub vis_win32 {
$amp->exec_visual();
send_im($_[0], 'Visualization <b>toggled</b>.', 0);
}
1;