#!/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);