#!/usr/bin/perl -w

# ----------------------------------------------------------------------------
# LE-logs-split (v1.1) :
#  Découpage de fichiers de logs du jeu Landes-Eternelles
#  en plusieurs fichiers de logs mensuels ou journaliers.
#
# Copyright (C) 2009, by Mayhem [GT] <mayhem@rhcp.net>
#
#  This program is free software;  you can redistribute it and/or modify
#  it under  the terms  of the  GNU General Public License  as published
#  by the  Free  Software  Foundation;  either version 2 of the License,
#  or (at your option) any later version.
#
#  This  program  is distributed  in the  hope that  it will  be useful,
#  but  WITHOUT  ANY  WARRANTY;  without even  the implied  warranty  of
#  MERCHANTABILITY  or  FITNESS  FOR  A  PARTICULAR  PURPOSE.
#  See the GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License along
#  with this program; if not, write to the Free Software Foundation, Inc.,
#  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# ----------------------------------------------------------------------------

use strict;
use utf8;

binmode(STDIN,  ":utf8");
binmode(STDOUT, ":utf8");

my $day = 0;
my $path = "./logsplit";
my @lfiles = ();


# Analyse des paramètres de la ligne de commande

while ($_ = shift @ARGV) {
  if    (/^(-h|--help)$/)    { &usage(); }
  elsif (/^(-v|--version)$/) { &version(); }
  elsif (/^(-d|--day)$/)     { $day = 1; }
  elsif (/^(-p|--path)$/)    { $path = ($ARGV[0]!~/^-/)?shift @ARGV:""; }
  elsif (/^(-f|--file)$/)    { while (@ARGV && $ARGV[0]!~/^-/) { push(@lfiles, shift @ARGV); } }
  else { &erreur("Option non reconnue : `$_'"); }
}

if (! -e $path) { print "Création du dossier : $path\n"; mkdir("$path"); }
if ((! -d $path) || (! -w $path)) { &erreur("Dossier de destination non accessible : $path"); }
foreach my $file (@lfiles) { if (! -f $file) { &erreur("Impossible de trouver le fichier $file"); } }
if (! @lfiles) { &erreur("Vous devez spécifier au moins un fichier de log à analyser (-f file)"); }


# Lecture et découpage du fichier de logs

foreach my $file (@lfiles) {
  print "Traitement du fichier $file pour en extraire les logs ".(($day>0)?"journaliers":"mensuels")." dans le dossier $path\n";
  open(IN, "< $file") or &erreur("Impossible d'ouvrir le fichier de logs : $!");

    my $base = ($file =~ m/chat_log_([^\/]+)\.txt(\..+)?$/)?$1:"split"; $base =~ s/_200\d{3}$//;
    my $date = "nodate";
    my $line = "";
    my $nbl  = 0;

    while (! eof(IN)) {
      if ($line =~ m/^\s*$/) { $line = <IN>; $nbl++; next; }
#     if ($line =~ m/^(D.but du journal|Début du journal|Log started at|Hourly time\-stamp: log continued at) (\d\d\d\d)\-(\d\d)\-(\d\d)\s+(\d\d):(\d\d):(\d\d)\s+/i) {
      if ($line =~ m/^(D..?but du journal|Log started at|Hourly time\-stamp: log continued at) (\d\d\d\d)\-(\d\d)\-(\d\d)\s+(\d\d):(\d\d):(\d\d)\s+/i) {
        $date = ($day) ? sprintf("%04d%02d_%02d", $2, $3, $4) : sprintf("%04d%02d", $2, $3);
      }
      my $newfile = sprintf("%s/chat_log_%s_%s.txt", $path, $base, $date);

      print "[$nbl]\tEcriture dans le fichier $newfile ...\n";
      open(OUT, ">> $newfile") or &erreur("Impossible d'écrire dans le fichier : $newfile");
        print OUT $line;
        while (defined($line = <IN>)) {
          $nbl++;
          last if ($line =~ m/^(Log started|Hourly time\-stamp: log continued) at/i);
          print OUT $line;
        }
      close(OUT);
    }

  close(IN);
}


# Fin !

print "Opération terminée.\n";
exit 0;


# Fonctions utilitaires diverses

sub erreur {
  my ($msg) = @_;
  print "$0: $msg !\n";
  print "Pour en savoir davantage, faites `$0 --help'.\n";
  exit 2;
}

sub version {
  print "Version: LE-logs-split v1.1 - (c)2009 Mayhem [GT]\n";
  exit 1;
}

sub usage {
  print "Usage: $0 [-d] [-p path] -f file[ file2 file3...] [-p path]\n";
  print "  -f , --file      liste des fichiers de logs à découper selon l'horodatage\n";
  print "  -p , --path      dossier de destination pour les fichiers de logs créés (par défaut $path)\n";
  print "  -d , --day       découpage en logs journaliers (par défaut découpage mensuel)\n";
  print "  -v , --version   affiche le numéro de version\n";
  print "  -h , --help      affiche cet écran d'aide\n";
  exit 1;
}
