#!/usr/bin/perl use strict; use warnings; use locale; # Configuration section my $ournick = 'fenster'; # it will be displayed in the output my $centericqdir = "$ENV{HOME}/.centericq"; # End of configuration section my %NAMES = (); my %NICKS = (); my $hisnick; sub displayname($) { my $uin = shift; return $NAMES{$uin} if (defined $NAMES{$uin}); open(F,"$centericqdir/$uin/info") or return $uin; my @lines = ; close F; chomp $lines[0]; chomp $lines[1]; chomp $lines[2]; chomp $lines[45]; $NICKS{$uin} = $lines[0]; my $return = $lines[45]; $return = $lines[0] unless $return; $return = ($lines[1] || '') . ' ' . ($lines[2] || '') unless $return; $return = $uin unless ($return && $return ne ' '); chomp $return; $NAMES{$uin} = $return; return $return; } sub nick($) { my $uin = shift; return $NICKS{$uin} if (defined $NICKS{$uin}); my $return = `head -n 1 "$centericqdir/$uin/info"`; chomp $return; $NAMES{$uin} = $return; return $return; } my $request = $ARGV[0]; my $additional = $ARGV[1]; unless ($request) { print "centericq history converter\n"; print "Usage: $0 [--latest]\n"; print " $0 --stdin [hisnick]\n"; print "Author: Alexander Fenster (2003-2008)\n\n"; print <. GPL exit 1; } my $file; if ($request eq '--stdin') { local undef $/; $file = ; $hisnick = $additional || ''; } else { my %candidates = (); my $latest; my $maxdate = 0; if ($request =~ /^(\d+):?$/ && -e "$centericqdir/$1/history") { $candidates{$request} = displayname($request); } else { # need to check 1st, 2nd, 3rd and 46th lines of info files opendir(DIR, $centericqdir); foreach my $dir (readdir DIR) { next if ($dir =~ /^\.\.?$/); chomp $dir; if (($dir =~ /^\d+$/ || $dir =~ /^j.*$/) && -e "$centericqdir/$dir/info") { if ((displayname($dir) =~ /$request/i || nick($dir) =~ /$request/i || $dir =~ /$request:?/i) && !exists $candidates{$dir}) { $candidates{$dir} = displayname($dir); my @stat = stat "$centericqdir/$dir/history"; my $date = $stat[9]; if (defined $date && $date > $maxdate) { $latest = $dir; $maxdate = $date; } } } } closedir DIR; } my @candidates = (defined $additional && $additional eq '--latest' && defined $latest) ? ($latest) : keys %candidates; if (@candidates > 1) { my ($uin, $nick, $name); print "Multiple match:\n"; format FORM = @<<<<<<<<< @<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $uin, $nick, $name . $~ = 'FORM'; foreach $uin (sort { $a cmp $b } @candidates) { $nick = nick($uin); $name = displayname($uin); write; } print "Please try more detailed query.\n"; exit 1; } if (@candidates == 0) { print "No UINs matching query found.\n"; exit 1; } my $uin = $candidates[0]; # print "Working with UIN: $uin == ".nick($uin)." == ".displayname($uin)."\n"; unless (-e "$centericqdir/$uin/history") { print "Cannot find history file $centericqdir/$uin/history for uin $uin.\n"; exit 1; } $hisnick = $uin; if (-e "$centericqdir/$uin/info") { $hisnick = displayname($uin); } my $filename = "$centericqdir/$uin/history"; open(F, $filename); local undef $/; $file = ; close F; } foreach (split chr(12), $file) { my ($skip, $direction, $type, $time1, $time2, $text) = split /\n/, $_, 6; if (defined $direction) { print "[" . scalar(localtime($time1)) . "] " . (($direction eq 'IN') ? $hisnick : $ournick). ":\n"; $text =~ s/\n+/\n/gs; $text =~ s/\n\Z//s; print $text,"\n\n"; } }