Dateninkonsistenzproblem ... brauche Hilfe...



  • Hi nochmal.
    Ich beschreibe hier mal ein altes Problem neu.

    Ich habe das Problem, dass in meiner Klasse an
    irgendeinem Zeitpunkt (also folglich dynamisch) eine Methode aufgerufen wird.
    Und diese muss auf Informationen von einem Objekt zugreifen.

    Jedoch ist dieses leider statisch und folglich greift die
    Methode immer auf leere "Standardwerte" zurück.
    Wie kann ich dafür sorgen, dass das Objekt welches
    ich am Anfang erzeugt habe, auch dann noch die Daten enthält,
    wenn der Zugriff erfolgt.
    Zum Beipsiel durch die Eingabe eines Users.

    Hat irgendjemand eine Idee?
    Ich bin echt am verzweifeln. 😞

    Wer noch weitere Informationen zu dem Problem haben möchte muss einfach hier gucken:
    http://www.c-plusplus.net/forum/viewtopic.php?t=73179

    Danke für eure Hilfe.



  • ufz... so ganz hab ich das auch noch nicht geblickt.
    Wenn ich das richtig verstehe, dann hast du 2 Objekte.

    1. die Botklasse
    2. eine Klasse die die Userdaten enthält

    und irgendwo steht halt noch die main drin.

    die Botklasse überschreibt die onMessage methode von dem komischen bot...
    und nun weisst du nicht, wie du in der onMessage methode auf das Objekt mit den Userdaten zugreifen kannst?

    wenn das so ist, dann ist das relativ einfach und auf verschiedenen Wegen zu lösen.
    Einer wäre:

    Klasse User:

    import java.io.*;
    
    public class UserDB{
       public UserDB(File userDB) { /* Userdaten einlesen */ }
       public boolean login(String user) { /* Prüfen, ob User berechtig ist */ }
    }
    

    Klasse MyBot:

    import org.jibble.pircbot.*; 
    
    public MyBot extends PircBot{
       private UserDB userdb;
    
       public MyBot(UserDB userdb){
          this.userdb = userdb;
       }
    
       public void onMessage(String channel, String sender, String login, String hostname, String message) {
          if( /* Message beginnt mit !login */ ){
    
              String passwort = /* Passwort aus der Message lesen */;
    
              if(userdb.login(sender, passwort) == true){
                 sendMessage(channel, sender + " konnte angemeldet werden.");
              }
              else{
                 sendMessage(channel, sender + " hat keine Berechtigung.");
              }
          }
       }
    }
    

    Klasse Start:

    import java.io.*;
    
    public class Start{
       public static void main( ... ){
          UserDB userdb = new UserDB(new File(/* Pfad zur Userdatei */));
          MyBot bot = new MyBot(userdb);
          ...
       }
    }
    

    Hoffe gehelft zu haben... ansonsten versuch dein problem mal einfach und in einer art ablaufplan darzustellen... mit möglichst wenig worten 😉
    Achja... dann gibts ja noch die 11880 ... da werden sie geholfen 😉 🤡 😃



  • Ha,
    es kann sein dass Du mir meinen Fehler aufgezeigt hast.
    Weil:
    Ich starte meinen Bot immer so:
    java StartBot <configdatei>

    Kann also den Bot gar nicht mit der UserDB im Konstruktor starten.
    Ich check das mal gerade.

    Das ganze läuft dann so ab.

    java StartBot
    -> Objekt Action (main) [extends PircBot]
    -> Obj.ReadConfig (parsen von Config)
    -> Obj.Bot (Instanz des PircBot)

    Und dann muss ich halt noch die onMessage überladen.
    Hrm...ich gucke mal weiter.
    Aber erstmal Danke für den Tipp 👍

    P.S.: Das mit der Telefonnummer war eine Lüge! 😉



  • Mir langts!!!!
    Ich paste jetzt den wichtigsten Teil meines Codes hier rein,
    vielleicht sieht dann ja jeder das Prob:

    import org.jibble.pircbot.*;
    public class Action extends PircBot{
    
            private Hashtable manno = new Hashtable();	
    
    	//argumentless constructor
    	public Action(){
    	}
    
    	//constructor to create and initialize the bot and call action functions.
    	public Action(String[] args){
    	if(args.length ==0){
    					System.out.println("To start the bot directly use the following Syntax: \n");
    					System.out.println("java StartBot <path and config file>.\n\n");
    					System.out.println("Example:\n");
    					System.out.println("java StartBot file:/home/foo/config-for-foo");
    					System.exit(1);
    					}
    					else{
    						System.out.println("***************************************");
    						System.out.println("\nWelcome to the IRC Bot Project.");
    
    					//Find the config file (first argument after bot)
    					ReadConfig thisconfig = new ReadConfig(args[0]);
    					//Parsing the Config File
    					ConfigParser config = new ConfigParser(thisconfig.getLocation());
    
    					Vector channels = config.getChannels();
    					Hashtable servers = config.getServers();
    					Vector server = new Vector();
    					for (Enumeration e = servers.keys() ; e.hasMoreElements() ;) {
    							 server.add(e.nextElement()); }
    
    					System.out.println("The bots name: " + config.getName());			
    					System.out.println("It try to join the server(s): "+ server.get(0) );
    					for(Enumeration e = channels.elements() ; e.hasMoreElements() ; ){
    					System.out.println("It joins the following channel(s): " + e.nextElement());
    				}
    
    				//start the bot		
    				Action thebot = new Action();
    				//give em its name
    				thebot.setName(config.getName());
    
    				thebot.setVerbose(true);
    				try {thebot.connect((String)server.get(0)); }
    				catch(Exception e){ System.out.println("Problems: " + e); }
    
    				//join all channels
    				for(Enumeration e = channels.elements() ; e.hasMoreElements() ; ){
    				thebot.joinChannel((String)e.nextElement());
    				}
    
    				//creates the UserManagementSystem			
    				UserManagement usermanagement = new UserManagement(config.getUserfile());
                                    manno = usermanagement.getUserStatus();
    
    		public void onMessage(String channel, String sender, String login, String hostname, String message) {
    												if (message.startsWith("!login")){ login(channel,sender,hostname,message); } 
    					}
    
    				//All get-Methods
    				public void login(String channel,String sender,String hostname,String message){
    							System.out.println( "\n****SYSTEM MESSAGE****LOG-IN****" );
    							System.out.println( sender + " Tries to log in. It comes from: " + channel + " and got the hostname: " + hostname);
    							for (Enumeration e = manno.keys() ; e.hasMoreElements() ;) {
    										System.out.println("Ist das Drecksdingen schon wieder leer? " + e.nextElement()); }
    							System.out.println(manno.size());
    						}
    
    }
    

    Arghs, also das Problem ist der Hashtable namens "manno" 😡 .
    Weil dieser immer von login drauf zugreift leer ist.
    Also meine Frage, ist es ein "Designproblem" von meinen Klassen, oder
    muss ich anfangen mit Threads oder wie die Dinger heissen zu arbeiten.

    Aber nochmals vielen Dank für die bisherige Hilfe 👍

    [edit]Ok ich gehe mal davon aus dass das ein Problem ist, welches in meiner Klassenstruktur liegt, ich redesigne mal mein gesamtes Projekt.



  • 😃 😃 😃
    Du bist mein RETTER.
    Dankeschhön....!!!!

    Es klappt fast alles (ich wäre niemals auf diese Idee gekommen meine Klassen so umzuschreiben wie Du es in Deinem Beispiel getan hast, ich hoffe sowas kommt mit ein bisschen Erfahrung).

    Ich wollte mich einfach nochmal recht herzlich für Deine Mühe bedanken!! 👍 👍

    thx 🙂



  • Na prima 🙂

    Hmm.. lass mich mal kurz überlegen,
    1Std Arbeit bei 40€/Stunde, macht das dann genau 40€,
    meine Kontonummer ist .... 😃

    Hehe, ne gerne geschehen.

    MfG Ingo


Anmelden zum Antworten