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=73179Danke 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ältund 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 TippP.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