Mercurial > hg
view mcabber/contrib/cicq2mcabber.pl @ 1961:39021fd6b0e1
Try to improve readmarks in some cases
This patch removes the readmark when entering chatmode if the mark is on the
last line. This should hopefully fix weird behavior seen under some
circumstances.
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Tue, 15 Mar 2011 00:39:17 +0100 |
parents | cb2f18e20e6a |
children |
line wrap: on
line source
#!/usr/bin/perl -w # # usage: cicq2mcabber.pl cicqhistoryfile > mcabberhistoryfile # Convert a centericq history file to mcabber format # # See histolog.c for the mcabber format. # # MiKael, 2005/05/05 use strict; my $line; my $inblock = 0; my %bdata = (); sub print_entry() { my ($type, $info, $date, $len, $data); return unless(defined $bdata{"msg"}); if ($bdata{"type"} eq "MSG") { $type = "M"; if ($bdata{"inout"} eq "OUT") { $info = "S"; } elsif ($bdata{"inout"} eq "IN") { $info = "R"; } else { print STDERR "Neither IN nor OUT!?\n"; return; } } else { print STDERR "Data type not handled.\n"; return; } $date = $bdata{"timestamp"}; $len = $bdata{"nb"}; $data = $bdata{"msg"}; # Date conversion to iso8601 my ($ss,$mm,$hh,$DD,$MM,$YYYY) = gmtime($date); $date = sprintf "%04d%02d%02dT%02d:%02d:%02dZ", $YYYY+1900, $MM+1,$DD,$hh,$mm,$ss; printf("%s%s %18.18s %03d %s", $type, $info, $date, $len, $data); } while ($line = <>) { chomp $line; # The separator is ^L ; I use substr to exclude the EOL if ($line eq "") { print_entry() if ($inblock); # reset data for new block %bdata = (); $inblock = 1; next; } # Skip garbage or unrecognized stuff... if (!$inblock) { print STDERR "Skipping line\n"; next; } # 1 IN/OUT line unless (exists $bdata{"inout"}) { if (($line eq "IN") || ($line eq "OUT")) { $bdata{"inout"} = $line; } else { print STDERR "No IN/OUT information ($line)!\n"; $inblock = 0; } next; } # 1 type line (MSG...) unless (exists $bdata{"type"}) { # We don't handle NOTE and AUTH yet. if ($line eq "MSG") { $bdata{"type"} = $line; } else { print STDERR "Not a MSG type ($line)\n"; $inblock = 0; } next; } # 2 date lines unless (exists $bdata{"timestamp"}) { $bdata{"timestamp"} = $line; last unless defined ($line = <>); chomp $line; $bdata{"timestamp2"} = $line; if (! $bdata{"timestamp2"} eq $bdata{"timestamp2"}) { print STDERR "Timestamps differ...\n"; } next; } # ... The message itself $line =~ s/ $//; if (exists $bdata{"msg"}) { $bdata{"msg"} .= $line."\n"; $bdata{"nb"}++; } else { $bdata{"msg"} = $line."\n"; $bdata{"nb"} = 0; } } print_entry() if ($inblock); # vim:set sw=2 sts=2 et si cinoptions="":