IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Parser Log pour mmorpg


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Parser Log pour mmorpg
    Bonjour à tous,

    Voilà je souhaiterai savoir comment surveiller un fichier log d'un jeu qui peut être modifié plusieurs fois par seconde pour y récupérer les informations écrites en fin de fichier. En gros je souhaite écrire un dps meter comme "advanced combat tracker" , "riftjunkies" , "EQcompanion" etc ...

    Pour schematiser je souhaite :

    1) Programme surveille le fichier EQ_NomDuJoueur.log
    2) Une entrée est effectuée dans le fichier par le jeu (sous forme d'une ligne ascii dont voici un exemple)

    [Tue Jun 12 13:12:00 2012] Jenekab kicks an emerald scale drake for 74 points of damage.
    [Tue Jun 12 13:12:00 2012] Shaix scores a critical hit! (996)
    [Tue Jun 12 13:12:00 2012] Jenekab bites an emerald scale drake for 120 points of damage.
    [Tue Jun 12 13:12:01 2012] Shaix`s warder scores a critical hit! (990)
    [Tue Jun 12 13:12:01 2012] Shaix`s warder scores a critical hit! (990)
    [Tue Jun 12 13:12:01 2012] Your Elegant Defiant Chain Leggings shimmers briefly.
    [Tue Jun 12 13:12:01 2012] You begin casting Malosinatia.
    [Tue Jun 12 13:12:02 2012] Jenekab bites an emerald scale drake for 35 points of damage.
    [Tue Jun 12 13:12:02 2012] Jenekab tries to bite an emerald scale drake, but an emerald scale drake dodges!
    [Tue Jun 12 13:12:02 2012] Jenekab tries to bite an emerald scale drake, but an emerald scale drake dodges!
    [Tue Jun 12 13:12:02 2012] Jenekab tries to bite an emerald scale drake, but misses!
    [Tue Jun 12 13:12:02 2012] Shaix scores a critical hit! (606)

    3) Le programme détecte que des données viennent d'être ajoutées au fichier log (c'est ce que je cherche ! comment être prévenu ?)
    4) Le programme traite les données ( début du combat, dommages par secondes, statistiques...)
    5) Le programme déclenche une alarme par affichage en overlay dans la fenêtre du jeu (un sort vient d'expirer, un buff vient d'être lancé ...)
    6) Goto 1

    J'ai exploré le web et j'y ai trouvé certaines pistes comme :
    - le source de Nono40 : http://nono40.developpez.com/sources/source0045/ mais il ne semble pas fonctionner sous Windows7
    - La JVCL avec TJvChangeNotify mais aucun exemple de trouvé

    Si vous aviez un exemple de source qui puisse remplir la fonction que je recherche cela m'arrangerait énormément.

    Avec mes remerciements !

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    Je ne connais pas le TJvChangeNotify mais je suppose qu'il encapsule le FindFirstChangeNotification
    Il y a surement un OnChange ou équivalent, cela ne doit pas être un objet compliqué !

    J'avais fait un programme pour afficher des logs en temps réel !
    TFileSizeList et TNotifyShaiFileChangeThread qui te permettra d'avoir le contenu du fichier entre deux modifications

  3. #3
    Fxg
    Fxg est déconnecté
    Membre éclairé
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 510
    Points : 837
    Points
    837
    Par défaut
    Bonjour,

    Il y a bien une démo de l'utilisation du composant TJvChangeNotify classée comme d'habitude dans le sous-répertoire examples du répertoire jvcl

    Bon test

  4. #4
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Oui en effet il existe un projet delphi en exemple pour le JvChangeNotify mais le problème est qu'il signale une modification faite dans le répertoire sans indiquer le fichier concerné.
    Hors c'est justement ce qui m'intéresse, savoir de quel fichier log vient la modification et pour cela je n'ai pas trouvé d'exemple où la solution.

    Cordialement.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    C'est le comportement normal de FindFirstChangeNotification !

    Un peu d'imagination !

    Il te suffit de mémoriser la taille de chaque fichier du dossier avant de lancer le Notify, puis lors du Notify, tu refais un FindFirst..., tu compares la taille N et N-1, cela te donnera les nouvelles données, c'est que mon code fait en tout cas !

    As-tu étudié le code en lien que j'avais fourni ?
    Tu aurais eu la réponse à ta question !

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 755
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 755
    Points : 13 349
    Points
    13 349
    Par défaut
    Ce composant te fournira toutes les informations souhaitées

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    SHChangeNotifyRegister est un plus lourde que FindFirstChangeNotification !

    Là il faudrait faire l'inverse, il faudra filtrer les résultats car cela fourni TOUS les fichiers et pas juste ceux d'un dossier précis !

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 755
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 755
    Points : 13 349
    Points
    13 349
    Par défaut
    C'est une limitation de ce composant en effet, mais SHChangeNotifyRegister demande une liste de PIDLs. Donc logiquement pas de problème pour cibler un répertoire

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    Entre Fournir une liste de PIDLs et faire FindFirst lors d'un changement notifié par TJvChangeNotify, lequel était le plus simple


    Je pensais que PIDL c'était uniquement les dossier système, je savais pas que SHParseDisplayName supportait un dossier quelconque !
    Cela rend finalement SHChangeNotifyRegister plus pratique que je ne le pensais et surtout plus besoin de thread pour FindFirstChangeNotification\WaitForObject

    Mais, comme le sujet est , c'est que filtrer à postériori ne doit pas géner Delphinautes

  10. #10
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci pour votre participation, j'ai trouvé mon bonheur sur la page de Nono40 : http://nono40.developpez.com/sources/source0017/ .

    Merci pour le source Shai mais je suis débutant, bon depuis hier j'ai digéré la création d'une Classe ce qui me permet déjà de mieux comprendre (il y a 24h ca me faisait le même effet que du mandarin )

    Donc post résolu définitivement.

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    Le Code Nono40 fait presque ce que j'ai décrit, au lieu comparer Taille N et N-1 pour chaque fichier, il conserve une Date de Notification qu'il compare à la Date de Modification
    L'approche est similaire, le résultat aussi

    J'avais bien suivi que tu étais débutant, même si ton pseudo 'Delphinautes' pouvait faire espérer que tu étais un débutant avancé

    C'est d'ailleurs pour cela que j'indiquais à AndNotOr que définir une liste de PIDLs n'était pas le plus simple

    mon code était presque complet mais surement trop spécifique à mon besoin !

    il n'y avait pas grand chose à faire pour l'utiliser, juste créer l'objet TNotifyShaiFileChangeThread en lui passant les gestionnaires d'évènement !

    Manquait une déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TFileMessageEvent = procedure(Sender: TObject; const Messages: string) of object;
    Juste le Create comme dans le Code Nono40

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThreadSurveillance:= TNotifyShaiFileChangeThread.Create(Dossier, nil, TraiteFichier, nil);
    plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.TraiteFichier(Sender: TObject; const Messages: string);
    begin
      ShowMessage(Messages);
    end;
    Messages contenant UNIQUEMENT les données ajoutées !
    Cela peut avoir pour toi un sens, tu ne récupères QUE les dernières lignes non traitées !

    Sinon cette variante, fourni le Nom du fichier à la place des données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    procedure TNotifyShaiFileChangeThread.ReadLastMessages();
     
      procedure FillSizes();
      var
        SearchRec: TSearchRec;
        SearcMask: string;
      begin
        FFileSize.BeginUpdate();
        try
          SearcMask := '*.log';
          if FindFirst(FDirName+SearcMask, faAnyFile, SearchRec)= 0 then
          begin
            repeat
              if FExcludeFile.IndexOf(SearchRec.Name) < 0 then
                 FFileSize.Size[SearchRec.Name] := TWin32FindData(SearchRec.FindData).nFileSizeLow; // Peu probable que cela dépasse 2Go, je ne gère pas High
            until FindNext(SearchRec) <> 0;
          end;
        finally
          FFileSize.EndUpdate();
        end;
      end;
     
      procedure CheckSizes();
      var
        ifs: Integer;
        Item: TFileSizeListItem;
      begin
        for ifs := 0 to FFileSize.Count - 1 do
        begin
          Item := FFileSize.Sizes[ifs];
          if Item.Size > Item.OldSize then
            FFileSize.LastMessage[ifs] := FFileSize[ifs];
        end;
      end;
     
    begin
      try
        FillSizes();
        CheckSizes();
      except
        on E: Exception do Exit;
      end;
    end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parser logs apache pour extraire dans un CSV
    Par GTJuanpablo dans le forum Linux
    Réponses: 13
    Dernier message: 22/04/2009, 15h43
  2. Réponses: 1
    Dernier message: 29/11/2005, 14h01
  3. [Système] Existe-t-il un bon parser HTML pour PHP ?
    Par MiJack dans le forum Langage
    Réponses: 8
    Dernier message: 25/10/2005, 11h18
  4. [Oracle 8i/Fichier de log] - fichier log pour analyse erreur
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 4
    Dernier message: 25/01/2005, 19h06
  5. [Parser HTML] quel parser utiliser pour du HTML 4.0 ?
    Par Cyber@l dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 19/07/2004, 19h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo