Convert Yahoo Messenger Logs to Adium Logs

697 views Asked by At

Is there a way to convert logs from YM for mac to Adium ?

Thanks Cezar

1

There are 1 answers

1
openid On
#!/usr/bin/perl
use warnings;
use strict;
use File::Find;
use File::Copy;
use Getopt::Long;

my $inDir = undef;
my $outDir = undef ;
my $adiumUser = undef;
my $force = 0;
my $foundLogs = 0;
my $help = 0;

my %Protocols = (               #Map gaim protocol IDs to Adium ones
                                "aim"   =>      "AIM",
                                "yahoo" =>      "Yahoo!",
                                "msn"   =>      "MSN"
                                #Add the rest here, or tell me what they are, someone who uses other protocols
                                );

sub usage
{
        my $msg = shift;
        print   "Error: $msg\n" if $msg;
        print   "Usage: gaim2adium.pl [--adiumUser <user> | --outDir <output dir>] [--inDir <input dir>] [--yes]\n";
        print   "Options: (defaults)\n\n";
        print   "\tinDir:\t\t\tDirectory to import logs from (~/.gaim/logs)\n";
        print   "\toutDir:\t\t\tDirectory to import logs to (./Logs)\n";
        print   "\tadiumUser:\t\tAttempt to automatically import logs to the specified Adium user\n";
        print   "\tyes:\t\t\tDon't prompt before overwriting existing logs\n";
        print   "\thelp:\t\t\tDisplay this help.\n";
        print   "\nOnce the logs have been imported, the contents of outDir can be dragged to your Adium log folder\n\n";
        exit(1);
}

sub process_log
{
        -f or return;
        #gaim logs are LOG_BASE/Protocol/Account/Contact/YYYY-MM-DD-TIME.(html|txt)
        if($File::Find::name =~ m!^$inDir(?:/)?(.*?)/(.*?)/(.*?)/(\d{4})-(\d{2})-(\d{2})\.(\d{4})(\d{2}).(html|txt)!)
        {
                my ($proto,$acct,$contact,$year,$month,$day,$hour,$seconds,$ext) = ($1,$2,$3,$4,$5,$6,$7,$8,$9);
                return unless defined ($proto = $Protocols{lc $proto});
                $foundLogs = 1;         #Set the logs found flag
                my $outFN = "$contact ($year|$month|$day).";
                $outFN .= ((lc $ext) eq "html") ? "html" : "adiumLog";
                mkdir("$outDir/$proto.$acct");
                mkdir("$outDir/$proto.$acct/$contact");
                my $file = "$outDir/$proto.$acct/$contact/$outFN";
                if(-e $file && !$force)
                {
#                       print(($adiumUser?"$adiumUser already has":"There already exists"),
#                        " a log from $proto.$acct to $contact on $day/$month/$year.\n");
                        `cat '$File::Find::name' >> '$file'`;
                } else {
                        copy($File::Find::name,$file);
                }
                `touch -t $year$month$day$hour.$seconds '$file'`;
        }
}

#Sort a list of log files by time
sub sort_logs
{
        my @files = @_;
        return sort logcmp @files;
}

sub logcmp
{
        my ($t1,$t2);
        $t1 = $& if $a =~ /\d{6}/;
        $t2 = $& if $b =~ /\d{6}/;
        return 0 unless defined($t1) && defined($t2);
        return $t1 <=> $t2;
}


GetOptions(     "adiumUser=s"   =>      \$adiumUser,
                        "inDir=s"               =>      \$inDir,
                        "outDir=s"              =>      \$outDir,
                        "yes"                   =>      \$force,
                        "help"                  =>      \$help)
        or usage();
usage() if $help;
usage("You must supply at most one of adiumUser and outDir") if defined($outDir) && defined($adiumUser);

$outDir ||= "$ENV{HOME}/Library/Application Support/Adium 2.0/Users/$adiumUser/Logs" if defined $adiumUser;
$outDir ||= "$ENV{PWD}/Logs";

$inDir ||= shift;
$inDir ||= "$ENV{HOME}/.gaim/logs";

print "NOTE: Output directory exists, existing logs will be appended to.\n" if(-d $outDir);

mkdir($outDir) unless -e $outDir;
usage("Output dir must be a directory") unless -d $outDir;
usage("Output dir must be writeable") unless -w $outDir;

usage("Input directory '$inDir' does not exist") unless -d $inDir;
usage("Input directory '$inDir' is not readable") unless -r $inDir;

#Spider the logs dir
find({wanted => \&process_log,
                preprocess => \&sort_logs}, $inDir);

#Warn if we didn't find any logs
unless($foundLogs)
{
        print "Warning: No recognized logs found.\n";
        print "Note:\tThis script only supports logs generated by gaim 0.73 and above.\n";
        print "\tYou may be able to update older gaim logs to the new format using the script from\n";
        print "\thttp://sourceforge.net/forum/message.php?msg_id=2392758\n";
        exit(1);
}

exit(0);