Advertisement
Guest User

votex-2.1-JavaFX

a guest
Oct 14th, 2014
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 28.24 KB | None | 0 0
  1. package voteextractor.gui;
  2.  
  3.  
  4. import java.awt.EventQueue;
  5. import java.awt.Toolkit;
  6. import java.awt.datatransfer.Clipboard;
  7. import java.awt.datatransfer.StringSelection;
  8.  
  9. import javafx.application.Application;
  10. import javafx.beans.value.ChangeListener;
  11. import javafx.beans.value.ObservableValue;
  12. import javafx.event.ActionEvent;
  13. import javafx.event.EventHandler;
  14. import javafx.scene.Scene;
  15. import javafx.scene.control.Button;
  16. import javafx.scene.control.CheckBox;
  17. import javafx.scene.control.Label;
  18. import javafx.scene.control.MenuBar;
  19. import javafx.scene.control.TextArea;
  20. import javafx.scene.control.TextField;
  21. import javafx.scene.image.Image;
  22. import javafx.scene.layout.BorderPane;
  23. import javafx.scene.layout.HBox;
  24. import javafx.scene.layout.VBox;
  25. import javafx.scene.text.Font;
  26. import javafx.scene.text.Text;
  27. import javafx.stage.Stage;
  28.  
  29. import javax.swing.JFrame;
  30.  
  31. import java.text.DecimalFormat;
  32. import java.text.NumberFormat;
  33. import java.util.ArrayList;
  34. import java.util.HashMap;
  35. import java.util.Set;
  36. import java.io.BufferedReader;
  37. import java.io.File;
  38. import java.io.FileReader;
  39. import java.io.IOException;
  40. import java.net.MalformedURLException;
  41.  
  42. public class votexJavaFX extends Application{
  43.  
  44.     //private JFrame frmElsahefsIrcstreamvoteextratorV;
  45.    
  46.    
  47.     private ArrayList<String> irclines = new ArrayList<String>();
  48.     private ArrayList<String> irclines_unprocessed = new ArrayList<String>();
  49.     private HashMap<String, Integer> processed_nicknames = new HashMap<String, Integer>();
  50.     private HashMap<String, String> processed_irclines = new HashMap<String, String>();
  51.     private ArrayList<String> blacklisted_nicknames = new ArrayList<String>();
  52.     private ArrayList<String> doublevotes = new ArrayList<String>();
  53.     private ArrayList<String> pattern_only = new ArrayList<String>();
  54.    
  55.     private int votecount = 0;
  56.     private int votesum = 0;
  57.     private String votestring = "";
  58.    
  59.     // Konfigurationsoptionen mit Standardeinstellung//////////
  60.     //
  61.     // zur Laufzeit:  //////////////////////////////////////////
  62.     //
  63.     // Moderatoren highlighten
  64.     private boolean blacky = false;
  65.     private boolean muetsch = false;
  66.     private boolean gebbi = false;
  67.    
  68.     // bei Programmstart über config.ini:  //////////////////////
  69.     //
  70.     // Nicknames der Moderatoren
  71.     private String muetsch_nick = "Muetsch";
  72.     private String blacky_nick = "Blacky107";
  73.     private String gebbi_nick = "Gebbi";
  74.    
  75.     // Zeichenketten im IRC-Client vor und nach den Nicknames
  76.     private String nickstart = "<";
  77.     private String nickstop = ">";
  78.    
  79.     final TextArea textArea = new TextArea();
  80.    
  81.     final TextArea textArea_1 = new TextArea();
  82.    
  83.     Label lb_toplabel = new Label("den IRC-Abschnitt mit den Bewertungen hier reinkopieren:");
  84.    
  85.     final TextField lb_vote = new TextField("X bei Y Bewertern");
  86.    
  87.     final Label lb_votecount = new Label("extrahierte Bewertungen: 0");
  88.    
  89.     final Label lb_sum = new Label("Summe der extrahierten Bewertungen: 0");
  90.    
  91.     Label lb_bottomheader = new Label("Zeilen, aus denen keine Bewertung automatisch extrahiert werden konnte:");
  92.  
  93.    
  94.     final Label lb_vote_exact = new Label("Bewertung: XX");
  95.    
  96.     final TextField voteaddfield = new TextField();
  97.     Button extractbutton = new Button("Extrahieren");
  98.     Button resetbutton = new Button("Zurücksetzen");
  99.    
  100.     CheckBox highlight_muetsch = new CheckBox("Muetsch");
  101.    
  102.     CheckBox highlight_blacky = new CheckBox("Blacky107");
  103.    
  104.     CheckBox highlight_gebbi = new CheckBox("Gebbi");
  105.    
  106.     Button clipboard = new Button("in die Zwischenablage");
  107.    
  108.     Label lbl_manualvotes = new Label("Bewertungen manuell hinzufügen:");
  109.    
  110.     Button manualvote_update = new Button("Aktualisieren");
  111.    
  112.    
  113.     public static void main(String[] args) {
  114.         launch(args);
  115.     }
  116.    
  117.     @Override
  118.     public void start(Stage stage) {
  119.  
  120.         //Stage stage  = stage;
  121.         BorderPane pane = new BorderPane();
  122.         stage.setTitle("el-sahef's IRC-Streamvote-Extractor V2.1 with JavaFX(added from Kullorki)");
  123.  
  124.         double scale = Math.rint(new Text("").getLayoutBounds().getHeight());
  125.         scale = scale / 16;
  126.        
  127.         textArea.setFont(new Font("Arial",11*scale));
  128.         textArea_1.setFont(new Font("Arial",11*scale));
  129.        
  130.         VBox v = new VBox(5*scale);
  131.        
  132.         HBox h1 = new HBox(5*scale);
  133.         h1.getChildren().add(lb_toplabel);
  134.        
  135.         HBox h2 = new HBox(5*scale);
  136.         h2.getChildren().add(textArea);
  137.        
  138.         HBox h3 = new HBox(5*scale);
  139.         h3.getChildren().add(extractbutton);
  140.         h3.getChildren().add(resetbutton);
  141.         h3.getChildren().add(lb_vote);
  142.         h3.getChildren().add(lb_vote_exact);
  143.        
  144.         HBox h4 = new HBox(5*scale);
  145.         h4.getChildren().add(highlight_muetsch);
  146.         h4.getChildren().add(highlight_blacky);
  147.         h4.getChildren().add(highlight_gebbi);
  148.         h4.getChildren().add(clipboard);
  149.        
  150.         HBox h41 = new HBox(5*scale);
  151.         h41.getChildren().add(lb_votecount);
  152.         h41.getChildren().add(lb_sum);
  153.        
  154.         HBox h5 = new HBox(5*scale);
  155.         h5.getChildren().add(lbl_manualvotes);
  156.         h5.getChildren().add(voteaddfield);
  157.         h5.getChildren().add(manualvote_update);
  158.        
  159.         HBox h6 = new HBox(5*scale);
  160.         h6.getChildren().add(lb_bottomheader);
  161.        
  162.         HBox h7 = new HBox(5*scale);
  163.         h7.getChildren().add(textArea_1);
  164.        
  165.         v.getChildren().add(h1);
  166.         v.getChildren().add(h2);
  167.         v.getChildren().add(h3);
  168.         v.getChildren().add(h4);
  169.         v.getChildren().add(h41);
  170.         v.getChildren().add(h5);
  171.         v.getChildren().add(h6);
  172.         v.getChildren().add(h7);
  173.        
  174.         pane.setCenter(v);
  175.         pane.setBottom(new Label(" "));
  176.         pane.setLeft(new Label(" "));
  177.         pane.setRight(new Label(" "));
  178.         pane.setTop(new Label(" "));
  179.        
  180.         stage.setScene(new Scene(pane));
  181.  
  182.         stage.show();
  183.         initialize();
  184.     }
  185.  
  186.  
  187.     /**
  188.      * Create the application.
  189.      */
  190.     public votexJavaFX() {
  191.         initialize();
  192.     }
  193.  
  194.     /**
  195.      * Initialize the contents of the frame.
  196.      */
  197.     private void initialize() {
  198.        
  199.        try {
  200.             BufferedReader input = new BufferedReader(new FileReader("config.ini"));
  201.             String zeile = null;
  202.             while ((zeile = input.readLine()) != null) {   
  203.                
  204.                 // die config-Datei parsen
  205.                 //
  206.                 // Kommentare ignorieren
  207.                 if(zeile.charAt(0) == '#'){
  208.                     continue;
  209.                 }
  210.                
  211.                 // Konfiguration lesen
  212.                 String option = zeile.substring(0, zeile.indexOf("="));
  213.                 String value = zeile.substring(zeile.indexOf("\"") + 1, zeile.lastIndexOf("\""));
  214.                
  215.                 switch (option){
  216.                     case "blacky_nick": blacky_nick = value;
  217.                     break;
  218.                    
  219.                     case "muetsch_nick": muetsch_nick = value;
  220.                     break;
  221.                    
  222.                     case "gebbi_nick": gebbi_nick = value;
  223.                     break;
  224.                    
  225.                     case "nickstart": nickstart = value;
  226.                     break;
  227.                    
  228.                     case "nickstop": nickstop = value;
  229.                     break;
  230.                 }
  231.                
  232.             }
  233.             input.close();
  234.         } catch (IOException e) {
  235.             e.printStackTrace();
  236.         }
  237.        
  238.        
  239.        
  240.        
  241.         extractbutton.setOnAction(new EventHandler<ActionEvent>() {
  242.             @Override
  243.             public void handle(ActionEvent event) {
  244.                 // alles nochmal zurücksetzen
  245.                
  246.                 textArea_1.setText("");
  247.                 voteaddfield.setText(" ");
  248.                
  249.                 votecount = 0;
  250.                 votesum = 0;
  251.                
  252.                 irclines_unprocessed.clear();
  253.                 irclines.clear();
  254.                 processed_irclines.clear();
  255.                 processed_nicknames.clear();
  256.                 doublevotes.clear();
  257.                 blacklisted_nicknames.clear();
  258.                 pattern_only.clear();
  259.                
  260.                
  261.                 // speichere die einzelnen Zeilen ab
  262.                
  263.                 StringBuilder rawdata = new StringBuilder(textArea.getText());
  264.                 fillStringArrayList(rawdata);
  265.                
  266.                 // extrahiere die Votes und berechne Bewertung
  267.                
  268.                 extract();
  269.  
  270.                 double result = ((double) votesum) / ((double) votecount);
  271.                
  272.                 // zeige Bewertung
  273.                
  274.                 lb_vote_exact.setText("genaue Bewertung: " + result);
  275.                
  276.                 // ggf. Mods highlighten
  277.                
  278.                 StringBuilder highlight = new StringBuilder();
  279.                
  280.                 if(muetsch){
  281.                     highlight.append(" " + muetsch_nick);
  282.                 }
  283.                 if(blacky){
  284.                     highlight.append(" " + blacky_nick);
  285.                 }
  286.                 if(gebbi){
  287.                     highlight.append(" " + gebbi_nick);
  288.                 }
  289.                
  290.                 result = Math.round(result * 100.0)/100.0;
  291.                
  292.                 NumberFormat formatter = new DecimalFormat("#0.00");
  293.                
  294.                 votestring = formatter.format(result) + " bei " + votecount + " Bewertungen  " + highlight.toString();
  295.                
  296.                 lb_vote.setText(votestring);
  297.                
  298.                 lb_votecount.setText("extrahierte Bewertungen: " + votecount);
  299.                 lb_sum.setText("Summe der extrahierten Bewertungen: " + votesum);
  300.                
  301.                 // zeige nicht behandelte IRC-Zeilen
  302.                
  303.                 textArea_1.setText(getStringFromArrayList());
  304.  
  305.                
  306.             }
  307.         });
  308.        
  309.  
  310.        
  311.         resetbutton.setOnAction(new EventHandler<ActionEvent>() {
  312.             @Override
  313.             public void handle(ActionEvent event) {
  314.                 // setze alles zurück
  315.                 textArea.setText("");
  316.                 textArea_1.setText("");
  317.                 voteaddfield.setText(" ");
  318.                
  319.                 lb_vote.setText("X bei Y Bewertern");
  320.                 lb_votecount.setText("extrahierte Bewertungen: 0");
  321.                 lb_sum.setText("Summe der extrahierten Bewertungen: 0");
  322.                 lb_vote_exact.setText("genaue Bewertung: XX");
  323.                
  324.                 votecount = 0;
  325.                 votesum = 0;
  326.                
  327.                 votestring = "";
  328.                
  329.                 irclines_unprocessed.clear();
  330.                 irclines.clear();
  331.                 processed_irclines.clear();
  332.                 processed_nicknames.clear();
  333.                 doublevotes.clear();
  334.                 blacklisted_nicknames.clear();
  335.                 pattern_only.clear();
  336.  
  337.             }
  338.         });
  339.        
  340.         highlight_muetsch.selectedProperty().addListener(new ChangeListener<Boolean>() {
  341.                 public void changed(ObservableValue ov,
  342.                     Boolean old_val, Boolean new_val) {
  343.                     muetsch = !muetsch;
  344.                 }
  345.             });
  346.        
  347.         highlight_blacky.selectedProperty().addListener(new ChangeListener<Boolean>() {
  348.                 public void changed(ObservableValue ov,
  349.                     Boolean old_val, Boolean new_val) {
  350.                     blacky = !blacky;
  351.                 }
  352.             });
  353.        
  354.         highlight_gebbi.selectedProperty().addListener(new ChangeListener<Boolean>() {
  355.                 public void changed(ObservableValue ov,
  356.                     Boolean old_val, Boolean new_val) {
  357.                     gebbi = !gebbi;
  358.                 }
  359.             });
  360.        
  361.         clipboard.setOnAction(new EventHandler<ActionEvent>() {
  362.             @Override
  363.             public void handle(ActionEvent event) {
  364.                 StringSelection stringselect = new StringSelection(votestring);
  365.                 Clipboard clpboard = Toolkit.getDefaultToolkit().getSystemClipboard();
  366.                 clpboard.setContents(stringselect, null);
  367.                
  368.             }
  369.         });
  370.        
  371.        
  372.         manualvote_update.setOnAction(new EventHandler<ActionEvent>() {
  373.             @Override
  374.             public void handle(ActionEvent event) {
  375.                
  376.                 int added_votesum = 0;
  377.                 int added_votecount = 0;
  378.                
  379.                 StringBuilder rawaddedvotes = new StringBuilder(voteaddfield.getText());
  380.                 rawaddedvotes.append(" ");
  381.                
  382.                 // Votes aus rawaddedvotes extrahieren, solange Leerzeichen drin sind
  383.                 int newvoteborder;
  384.                
  385.                 if(rawaddedvotes.indexOf(" ") == -1){
  386.                     newvoteborder = rawaddedvotes.length();
  387.                 }
  388.                 else{
  389.                     newvoteborder = rawaddedvotes.indexOf(" ");
  390.                 }
  391.                
  392.                 do{
  393.                     try{
  394.                         int current = Integer.parseInt(rawaddedvotes.substring(0, newvoteborder));
  395.                        
  396.                         // nur wenn Bewertung zwischen 0 und 10, diese werten
  397.                         if ((current >= 0) && current <= 10){
  398.                             added_votesum = added_votesum + Integer.parseInt(rawaddedvotes.substring(0, newvoteborder));
  399.                             added_votecount = added_votecount + 1;
  400.                         }
  401.                     } catch (NumberFormatException e){
  402.                        
  403.                     }
  404.                    
  405.                     // gerade bearebeiteten Bereich löschen
  406.                     rawaddedvotes.delete(0, newvoteborder + 1);
  407.                     newvoteborder = rawaddedvotes.indexOf(" ");
  408.                 }
  409.                 while(rawaddedvotes.indexOf(" ") != -1);
  410.                
  411.                 // neue Gesamtbewertung berechnen
  412.                
  413.                 double result = ((double) votesum + (double) added_votesum) / ((double) votecount + (double) added_votecount);
  414.                
  415.                 // zeige Bewertung
  416.                
  417.                 lb_vote_exact.setText("genaue Bewertung: " + result);
  418.                
  419.                 // ggf. Mods highlighten
  420.                
  421.                 StringBuilder highlight = new StringBuilder();
  422.                
  423.                 if(muetsch){
  424.                     highlight.append(" " + muetsch_nick);
  425.                 }
  426.                 if(blacky){
  427.                     highlight.append(" " + blacky_nick);
  428.                 }
  429.                 if(gebbi){
  430.                     highlight.append(" " + gebbi_nick);
  431.                 }
  432.                
  433.                 result = Math.round(result * 100.0)/100.0;
  434.                
  435.                 NumberFormat formatter = new DecimalFormat("#0.00");
  436.                
  437.                 votestring = formatter.format(result) + " bei " + (votecount + added_votecount) + " Bewertungen  " + highlight.toString();
  438.                
  439.                 lb_vote.setText(votestring);
  440.                
  441.                 lb_votecount.setText("extrahierte Bewertungen: " + (votecount + added_votecount));
  442.                 lb_sum.setText("Summe der extrahierten Bewertungen: " + (votesum + added_votesum));
  443.                
  444.             }
  445.         });
  446.        
  447.     }
  448.     // splittet den großen String aus dem Eingabetextfeld auf die Zeilen auf und trägt diese zur Weiterverarbeiung in eine ArrayList ein
  449.     private void fillStringArrayList(StringBuilder input){
  450.        
  451.        
  452.         int newline;
  453.        
  454.         if(input.indexOf("\n") == -1){
  455.             newline = input.length();
  456.         }
  457.         else{
  458.             newline = input.indexOf("\n");
  459.         }
  460.        
  461.         do{
  462.             irclines.add(input.substring(0, newline));
  463.             input.delete(0, newline + 1);
  464.             newline = input.indexOf("\n");
  465.         }
  466.         while(input.indexOf("\n") != -1);
  467.        
  468.         irclines.add(input.toString());
  469.  
  470.        
  471.        
  472.        
  473.     }
  474.    
  475.     // holt Strings aus der ArrayList und macht daraus einen großen String für das Ausgabetextfeld
  476.     private String getStringFromArrayList(){
  477.        
  478.        
  479.         StringBuilder output = new StringBuilder();
  480.        
  481.         output.append("potentielle Doppelvotes (nicht verarbeitet): \n");
  482.        
  483.         java.util.Iterator<String> it2 = doublevotes.iterator();
  484.         while(it2.hasNext()){
  485.             output.append(it2.next() + "\n");
  486.         }
  487.        
  488.         output.append("\nBewertungsschema, aber keine verarbeitbare Bewertung: \n");
  489.        
  490.         java.util.Iterator<String> it3 = pattern_only.iterator();
  491.         while(it3.hasNext()){
  492.             output.append(it3.next() + "\n");
  493.         }
  494.        
  495.         output.append("\nZeilen ohne Bewertungsschema: \n");
  496.        
  497.         java.util.Iterator<String> it = irclines_unprocessed.iterator();
  498.         while(it.hasNext()){
  499.             output.append(it.next() + "\n");
  500.         }
  501.        
  502.         output.append("\nverarbeitete Zeilen mit Bewertungsschema: \n");
  503.        
  504.         Set<String> keys = processed_irclines.keySet();
  505.         java.util.Iterator<String> it4 = keys.iterator();
  506.         while(it4.hasNext()){
  507.             output.append(processed_irclines.get(it4.next()) + "\n");
  508.         }
  509.        
  510.         return output.toString();
  511.        
  512.     }
  513.    
  514.     // prüft, ob das Bewertungsschema votepattern in String irczeile zwei mal vorkommt (setzt voraus, dass es mind 1x vorkommt)
  515.     private int checkSameDoubleVote(String votepattern, String irczeile){
  516.         // erstes votepattern ersetzen
  517.         String temp = irczeile;
  518.         temp = temp.replaceFirst(votepattern, "");
  519.        
  520.         // wenn jetzt noch eins im String ist, dann doppelvote
  521.         if (temp.contains(votepattern)){
  522.             return 1;
  523.         }
  524.         // sonst nicht
  525.         else{
  526.             return 0;
  527.         }
  528.  
  529.     }
  530.    
  531.     // prüft, ob der Eingabe-Char eine Ziffer, ein Punkt oder ein Minus ist
  532.     private  boolean isNumberOrDotOrMinus(char input){
  533.         String temp = String.valueOf(input);
  534.         if( ( (temp.codePointAt(0) <= 57) & (temp.codePointAt(0) >= 48) ) || (temp.codePointAt(0) == 46) || (temp.codePointAt(0) == 45)){
  535.             return true;
  536.         }
  537.         else{
  538.             return false;
  539.         }
  540.     }
  541.    
  542.     // prüft, ob der Eingabe-Char eine Ziffer oder ein Minus ist
  543.     private  boolean isNumberOrMinus(char input){
  544.         String temp = String.valueOf(input);
  545.         if( ( (temp.codePointAt(0) <= 57) & (temp.codePointAt(0) >= 48) ) || (temp.codePointAt(0) == 45)){
  546.             return true;
  547.         }
  548.         else{
  549.             return false;
  550.         }
  551.     }
  552.    
  553.     // prüft, ob der Eingabe-Char ein Punkt ist
  554.     private  boolean isDot(char input){
  555.         String temp = String.valueOf(input);
  556.         if( temp.codePointAt(0) == 46 ){
  557.             return true;
  558.         }
  559.         else{
  560.             return false;
  561.         }
  562.     }
  563.    
  564.     // beschneidet einen String (beginnend nach dem Nickname, endend vor dem Bewertungsschema) auf die letze Zahl vor dem Bewertungsschema
  565.     // ließt die Zahl aus (oder setzt current_vote = -1 bei Fehlschlag)
  566.     // rundet diese
  567.     // führt Bereichüberprüfung aus und korrigiert ggf. auf Ober-/Untergrenze
  568.     private int parseRow(String row){
  569.        
  570.         // Kommas durch Punkte ersetzen, da ParseFloat nichts mit kommas anfangen kann
  571.         row = row.replace(',' , '.');
  572.        
  573.        
  574.         float bewertung = Float.NaN;
  575.        
  576.         /*
  577.          * Block 1 wertet so aus, dass die erste Zahl vor dem Bewertungsschema genommen wird, wobei zwischen
  578.          * Bewertungsschema und Zahl noch was stehen darf.
  579.          *
  580.          * Beispiel: [Dienstag, 30. September 2014] [23:26:24] <Metalfire>  6,5 kekse /10 --> 7/10
  581.          *
  582.          * Beispiel für Zeilen, die damit falsche Bewertungen produzieren:
  583.          * [Dienstag, 23. September 2014] [22:16:50] <tublat>   2 deep 4 u /10 --> 4/10
  584.          *
  585.          */
  586. //      // try-catch-Block, da es sein kann, dass zwar ein Bewertungsschema gefunden wurde, aber keine Bewertung enthalten ist
  587. //      // dann wird der String auf der Suche nach einer Zahl so lange beschnitten, bis eine StringIndexOutOfBoundsException kommt
  588. //      //
  589. //      // Beispiel: [Dienstag, 14. Oktober 2014] [23:46:52] <TouhouFan>    inaba/10
  590. //      try{
  591. //         
  592. //          // TODO:
  593. //          // Es könnten mehrere Zahlen zwischen Nickstop und Bewertung stehen, dann ist unklar, was Bewertung ist.
  594. //          // Solche Zeilen könnte man auch filtern.
  595. //
  596. //         
  597. //          // prüfen, wo die letzte Zahl vor dem Bewertungsschema ist
  598. //          // dazu von rechts nach links den String durchgehen
  599. //         
  600. //          int i = row.length() - 1;
  601. //          int progress = 0;
  602. //         
  603. //          // zunächst muss mindestens eine Ziffer kommen, das ist das Ende der Zahl
  604. //         
  605. //          while((progress < 1)){
  606. //              if(!isNumberOrMinus(row.charAt(i))){
  607. //                  i = i - 1;
  608. //              }
  609. //              else{
  610. //                  progress = 1;
  611. //              }
  612. //          }
  613. //
  614. //         
  615. //          // das Ende der Zahl wurde gefunden, nun den String beschneiden
  616. //          row = row.substring(0, i+1);
  617. //         
  618. //          boolean dotOccured = false;
  619. //         
  620. //          // jetzt dürfen Ziffern, ein Punkt oder ein Minus kommen
  621. //          //
  622. //          // falls ein Punkt kommt, dürfen davor nur noch Ziffern oder ein Minus kommen
  623. //          while((progress < 2)){
  624. //              // bevor Punkt gekommen ist, Ziffern, Punkte und Minus zulassen
  625. //              if(isNumberOrDotOrMinus(row.charAt(i)) & !dotOccured){
  626. //                  if(isDot(row.charAt(i))){
  627. //                      dotOccured = true;
  628. //                  }
  629. //                  i = i - 1;
  630. //              }
  631. //              // nachdem Punkt gekommen ist (d. h., die Zahl ist eine Kommazahl oder vor der Ganzzahl steht ein Punkt), nur noch Ziffern und Minus zulassen
  632. //              else{
  633. //                  if(isNumberOrMinus(row.charAt(i))){ // nachdem Punkt gekommen ist, nur noch Ziffern zulassen
  634. //                      i = i - 1;
  635. //                  }
  636. //                  else{
  637. //                      // Anfang der Zahl gefunden
  638. //                      progress = 2;                          
  639. //                  }
  640. //              }
  641. //          }
  642. //         
  643. //          // String auf den Bereich mit der Zahl beschneiden
  644. //         
  645. //          row = row.substring(i + 1, row.length() );
  646. //         
  647. //          // die erste Stelle könnte Punkt sein, wenn Berwerung eine Ganzzahl mit Punkt davor ist
  648. //          // dann diesen entfernen
  649. //          if(isDot(row.charAt(0))){
  650. //              row = row.substring(1, row.length());
  651. //          }
  652. //     
  653. //      }
  654. //      // Exception, wenn String out of range --> Bewertungsschema, aber keine Bewertung
  655. //      catch (StringIndexOutOfBoundsException e){
  656. //          row = "nonumber";
  657. //      }
  658.        
  659.         /*
  660.          * Block 2 wertet so aus, dass zwischen Zahl und Bewertungsschema keine weiteren Zeichen (abgesehen von Leerzeichen) stehen dürfen.
  661.          * Beispiel: [Dienstag, 30. September 2014] [23:26:24] <Metalfire>  6,5 /10 --> 7/10
  662.          *
  663.          * Dafür können solche Zeilen:
  664.          * [Dienstag, 30. September 2014] [23:26:24] <Metalfire>    6,5 kekse /10 --> 7/10
  665.          * nicht automatisiert werden.
  666.          *
  667.          * Beide Blöcke werten bei - mit Leerzeichen die Zahl fälschlicherweise positiv
  668.          *
  669.          * Beispiel: [Dienstag, 30. September 2014] [23:26:24] <Metalfire>  - 100/10 --> 10/10
  670.          * [Dienstag, 30. September 2014] [23:26:24] <Metalfire>    -100/10 --> 0/10
  671.          *
  672.          */
  673.        
  674.         boolean done = false;
  675.        
  676.         while(!done){
  677.             try{
  678.                 bewertung = Float.parseFloat(row);
  679.                 done = true;
  680.             }
  681.             catch (NumberFormatException e){
  682.                 if(row.length() > 1){
  683.                     row = row.substring(1);
  684.                 }
  685.                 else{
  686.                     done = true;
  687.                 }
  688.             }
  689.         }
  690.        
  691.         // jetzt sollte der String auf den Bereich mit der Zahl beschnitten sein, so dass
  692.         // diese ausgelesen werden kann
  693.        
  694.        
  695.         /*
  696.          * gehört zu m Code von Block 1
  697.          */
  698. //      try{
  699. //          bewertung = Float.parseFloat(row);
  700. //      }
  701. //      // bei "nonumber" oder unlesbarer Bewertung, diese auf NaN setzen
  702. //      catch (NumberFormatException e){
  703. //          bewertung = Float.NaN;
  704. //      }
  705.        
  706.         // -1 als Bewertung ist Signalwert dafür, dass zwar Bewertungsschema, aber keine gültige Bewertung gefunden wurde
  707.         if(Float.isNaN(bewertung)){
  708.             return -1;
  709.         }
  710.         // falls gültige Bewertung extrahiert werden konnte...
  711.         else{
  712.             // ...diese auf Ganzzahl runden und Bereichsüberprüfung mit Korrektur durchführen
  713.             int current_vote = Math.round(bewertung);
  714.             if(current_vote > 10){
  715.                 current_vote = 10;
  716.             }
  717.             if(current_vote < 0){
  718.                 current_vote = 0;
  719.             }
  720.             return current_vote;
  721.         }
  722.        
  723.     }
  724.    
  725.    
  726.    
  727.     // extrahiert aus einer IRC-Zeile die Bewertung (falls vorhanden) und rechnet diese zum Geamtergebnis hinzu
  728.     // filtert dabei Doppelvotes raus
  729.     private void extract(){
  730.        
  731.        
  732.         int votecount_zeile = 0;
  733.         int current_vote = 0;
  734.         String zeile = null;
  735.         String nickname = null;
  736.        
  737.        
  738.         java.util.Iterator<String> it = irclines.iterator();
  739.         while(it.hasNext()){
  740.            
  741.             votecount_zeile = 0;
  742.             current_vote = 0;
  743.             nickname = null;
  744.             zeile = it.next();
  745.            
  746.             // wenn Zeile nickname enthält, dann diesen extrahieren
  747.             //
  748.             // wenn der IRC-Client die Nicknames nicht mit nickstart und nickstop umrandet, dann funktionert das so nicht
  749.             // wenn jemand den Nickname während des Abschnitts mit den Bewertungen ändert, dann klappt das Aussortieren der Doppelbewertung nicht
  750.             if((zeile.indexOf(nickstart) != -1 ) && (zeile.indexOf(nickstop) != -1 )){
  751.                 nickname = zeile.substring(zeile.indexOf(nickstart) + 1, zeile.indexOf(nickstop));
  752.  
  753.             // Bewertung suchen, falls Zeile Nickname enthält
  754.            
  755.                
  756.                 if (zeile.contains("/10")){
  757.                    
  758.                     // Zeile auf Bereich zwischen dem Bewertungsschema und dem Nickname beschneiden, da nur hier die Zahl von Interesse drin ist (wenn vorhanden)
  759.                     String temp = zeile.substring(zeile.indexOf(nickstop), zeile.indexOf("/10"));
  760.                    
  761.                     votecount_zeile++;
  762.                     votecount_zeile = votecount_zeile + checkSameDoubleVote("/10", zeile);
  763.                    
  764.                     current_vote = parseRow(temp);
  765.                 }
  766.                
  767.                 if (zeile.contains("/ 10")){
  768.                    
  769.                     String temp = zeile.substring(zeile.indexOf(nickstop), zeile.indexOf("/ 10"));
  770.  
  771.                     votecount_zeile++;
  772.                     votecount_zeile = votecount_zeile + checkSameDoubleVote("/ 10", zeile);
  773.                    
  774.                     current_vote = parseRow(temp);
  775.                 }
  776.                
  777.                 if (zeile.contains("\\10")){
  778.                    
  779.                     String temp = zeile.substring(zeile.indexOf(nickstop), zeile.indexOf("\\10"));
  780.  
  781.                     votecount_zeile++;
  782.                     votecount_zeile = votecount_zeile + checkSameDoubleVote("\\10", zeile);
  783.                    
  784.                     current_vote = parseRow(temp);
  785.                 }
  786.                
  787.                 if (zeile.contains("\\ 10")){
  788.                    
  789.                     String temp = zeile.substring(zeile.indexOf(nickstop), zeile.indexOf("\\ 10"));
  790.  
  791.                     votecount_zeile++;
  792.                     votecount_zeile = votecount_zeile + checkSameDoubleVote("\\ 10", zeile);
  793.                    
  794.                     current_vote = parseRow(temp);
  795.                 }
  796.                
  797.                 if (zeile.contains("von10")){
  798.                    
  799.                     String temp = zeile.substring(zeile.indexOf(nickstop), zeile.indexOf("von10"));
  800.  
  801.                     votecount_zeile++;
  802.                     votecount_zeile = votecount_zeile + checkSameDoubleVote("von10", zeile);
  803.                    
  804.                     current_vote = parseRow(temp);
  805.                 }
  806.                
  807.                 if (zeile.contains("von 10")){
  808.                    
  809.                     String temp = zeile.substring(zeile.indexOf(nickstop), zeile.indexOf("von 10"));
  810.  
  811.                     votecount_zeile++;
  812.                     votecount_zeile = votecount_zeile + checkSameDoubleVote("von 10", zeile);
  813.                    
  814.                     current_vote = parseRow(temp);
  815.                 }
  816.                
  817.                 // auf + prüfen, um zeilen wie
  818.                 // [Dienstag, 30. September 2014] [22:47:47] <Links>    6/10 + 2 für den sub
  819.                 // rauszuschmeißen
  820.                 //
  821.                 // kann man auch für - machen, verhindert aber,
  822.                 // dass negative Zahlen automatisch als 0  gewertet werden können
  823.                 // und alle Zeilen mit Bindestrichen fallen auch durchs Raster
  824.                 String temp = zeile.substring(zeile.indexOf(nickstop));
  825.                 if(temp.contains("+")){
  826.                 //if(temp.contains("+") || temp.contains("-")){
  827.                     current_vote = -1;
  828.                 }
  829.                
  830.                
  831.                 // Eintragen der Zeile ///////////////////////////////////////////////////////////////////////////
  832.                
  833.                 // Wahrheitstabelle
  834.                 // votecount = 0 und current_vote = do not care :       keine Bewertung in Zeile
  835.                 // votecount = 1 und current_vote -1 :                  Bewertungsschema vorhanden, aber keine Bewertung
  836.                 // votecount = 1 und current_vote = 0 bis 10:           eine gültige Bewertung vorhanden, Check auf Doppelvote, sonst Eintragung
  837.                 // votecount > 1 und current_vote = do not care:        Doppelvote innerhalb einer Zeile
  838.                
  839.                 // prüfen, ob user schon geblacklistet wurde
  840.                 if(blacklisted_nicknames.contains(nickname) && (votecount_zeile >=1 )){
  841.                    
  842.                     // dann zeile zu den doublevotes und weiter mit der nächsten Zeile
  843.                     doublevotes.add(zeile);
  844.                     continue;
  845.                 }
  846.                
  847.                
  848.                 // wenn nur ein Vote-Schema in der Zeile gefunden wurde und die Zeile einen Nickname hatte
  849.                 //
  850.                 // Beispiel: [Dienstag, 9. September 2014] [23:19:33] <alex_roston> 10/10 so geniaaaaal!
  851.                 // aber auch: [Dienstag, 14. Oktober 2014] [23:46:52] <TouhouFan>   inaba/10
  852.                 if (votecount_zeile == 1) {
  853.                                    
  854.                     // prüfen, ob user schon nen vote abgegeben hat, aber noch nicht geblacklistet wurde
  855.                     if(processed_nicknames.containsKey(nickname)){
  856.                        
  857.                         // dann votecount dekrementieren und den ersten Vote dieses users wieder abziehen
  858.                         votecount--;
  859.                         votesum = votesum - processed_nicknames.get(nickname);
  860.                        
  861.                         // außerdem user blacklisten und jetzige sowie vorherige Zeile dieses users bei den doublevotes eintragen
  862.                         blacklisted_nicknames.add(nickname);
  863.                        
  864.                         temp = processed_irclines.get(nickname);
  865.                         temp = temp.substring(0, temp.lastIndexOf("-->"));
  866.                         doublevotes.add(temp);
  867.                        
  868.                         doublevotes.add(zeile);
  869.                        
  870.                         processed_irclines.remove(nickname);
  871.                        
  872.                        
  873.                        
  874.                     }
  875.                     // Normallfall: user hat noch keinen vote abgegeben und ist nicht wegen doublevote geblacklistet
  876.                     else{
  877.                        
  878.                         // prüfen, ob Bewertungsschema vorhanden war, aber keine Bewertung gefunden werden konnte
  879.                         // dann Zeile unter pattern_only eintragen
  880.                         if (current_vote == -1){
  881.                            
  882.                             pattern_only.add(zeile);
  883.                         }
  884.                
  885.                         // wenn Bewertung gefunden werden konnte
  886.                         else{
  887.                             zeile = zeile + "  -->  " + current_vote;
  888.                             votecount++;
  889.                             votesum = votesum +  current_vote;
  890.                             processed_nicknames.put(nickname, current_vote);
  891.                             processed_irclines.put(nickname, zeile);
  892.                         }
  893.                     }
  894.                 }
  895.                
  896.                 // wenn mehr als ein Vote in der Zeile
  897.                 //
  898.                 // Beispiel: [Mittwoch, 10. September 2014] [00:13:40] <DerDingens> 3/10 für die Folge, 7/10 für blackys geballten HASS = Gesamtwertung 10/10
  899.                 // --> kann man nicht automatisch bearbeiten lassen
  900.                 else if (votecount_zeile > 1){
  901.                    
  902.                     // prüfen, ob user schon nen vote abgegeben hat, aber noch nicht geblacklistet wurde
  903.                     if(processed_nicknames.containsKey(nickname)){
  904.                        
  905.                         // dann votecount dekrementieren und den ersten Vote dieses users wieder abziehen
  906.                         votecount--;
  907.                         votesum = votesum - processed_nicknames.get(nickname);
  908.                        
  909.                         // außerdem user blacklisten und jetzige sowie vorherige Zeile dieses users bei den doublevotes eintragen
  910.                         blacklisted_nicknames.add(nickname);
  911.                         doublevotes.add(processed_irclines.get(nickname));
  912.                         doublevotes.add(zeile);
  913.                        
  914.                     }
  915.                     // sonst user wegen doublevote blacklisten
  916.                     else{
  917.                         // dann zeile zu den doublevotes und weiter mit der nächsten zeile
  918.                         blacklisted_nicknames.add(nickname);
  919.                         doublevotes.add(zeile);
  920.                     }
  921.                    
  922.                 }
  923.                
  924.                 // wenn kein Vote in der Zeile, diese bei unprocessed hinzufügen
  925.                 //
  926.                 // Beispiel: [Dienstag, 14. Oktober 2014] [23:52:43] <Hans_Yolo>    ok animestream vorbei für heute
  927.                 else{
  928.                     irclines_unprocessed.add(zeile);
  929.                 }
  930.             }
  931.            
  932.             // wenn kein Nickname nach Schema <nickname>
  933.             // mit < gleich nickstart und > gleich nickstop in der Zeile, diese bei unprocessed hinzufügen
  934.             //
  935.             // Beispiel: [Mittwoch, 15. Oktober 2014] [00:37:03] Beenden    brainless (~chatzilla@euirc-e21b6c8b.dynamic.kabel-deutschland.de) hat diesen Server verlassen (Client exited).
  936.             else{
  937.                 irclines_unprocessed.add(zeile);
  938.             }
  939.  
  940.            
  941.         } //while-Klammer
  942.    
  943.     } // extract-Klammer
  944.    
  945. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement