// // See fail sisaldab endast iseõppiva vestluskaaslase sortsu // // - kojott- // // Copyright (C) 2003 Siim Kobin & Ronald Rosenberg // // Ülevaade: // Programmi töökeskonnaks on irc server. Ta ühendab end ette nähtud serveriga, ronib kindlasse tuppa // ja hakkab meelde jätma vajalikke lauseid, mida nopib välja teiste jututoa kasutajate jutu seest. // // Õppimine: // Hetkel suudab ta meelde jätta ainult faktidel põhinevaid lauseid. Õppimise võtmeks on kindel sõna/väljend // mille esinemisel hakatakas lauset edasi uurima. Faktid ta tunneb ära laustes, mis sisaldavad endas sõnu "on" // või "ei ole". Õppimine läheb lahti siis, kui üks nedest kahest võtmest asub rea esimese kolme sõna hulgas. // Valisin sellise kolme sõna reegli seepärast, et selline lause ehitus viitab eelkõige mingile definitsioonile. // // Vastamine: // Kui kasutaja sisestab mingi lause, siis kojott jookseb andmebaasi ja käiab selle läbi, ning kui leiab andmebaasist // sõna, mis esineb ka kasutaja lauses, siis randomiga valib võimalike vastuste hulgast vastuse ning kirjutab selle // ette nähtud kanalile. // // Programm valmis java grupitöö tulemusena. // // Koodi probleemide lahendamisel aitasid kaasa Jaagup & Veiks // // Kogu töö pikkuseks on 239 rida st. 7654 sümbolit // import java.sql.*; import java.lang.*; import java.net.*; import java.io.*; import java.util.StringTokenizer; public class vestlus{ public static void main(String argumendid[]) throws Exception{ //mysql draiveri setingud String driver = "com.mysql.jdbc.Driver"; String database = "jdbc:mysql://193.40.81.97/kojott"; String user = "monty"; String passwd = "K6jmclF"; //käivitab mysql draiveri try { Class.forName(driver).newInstance(); }catch(Exception e){ System.err.println(e.getMessage()); } Socket sc=new Socket("irc.ircnet.ee", 6667); //erinevad Writerid ja Readerid failidega ümber käimiseks BufferedReader sisse=new BufferedReader( new InputStreamReader(sc.getInputStream()) ); PrintWriter valja=new PrintWriter(sc.getOutputStream(), true); //globaalsed muutujad String[] triger={" on ", " ei ole "}; String kontroll="vrdjas"; int tyhiloendur=0; int olemas; //saadab serverile infi sisse saamiseks valja.println("PASS rd003a"); valja.println("NICK kojott"); valja.println("USER kojott ws27.hk.tpu.ee irc.ircnet.ee :java vestluskaaslane"); valja.println("JOIN #linux.ee"); System.out.println("Yhendus serveriga loodud"); //alustab serveri poot saadetud teadete vastu võtmist String rida=sisse.readLine(); while(rida!=null){ //väldib pingi välja viskamist if (rida.indexOf("PING :")>-1){ valja.println("PONG ws27.hk.tpu.ee "+rida.substring(rida.indexOf("PING :")+6)); System.out.println("Saatsin PONG: "+rida.substring(rida.indexOf("PING :")+6)); } //teeb read loetavaks. Esiteks lähevad lugemisele ainult need read, mis algavad koolonikga. need read pannakse muutujasse rida //seejärel praagitakse välja kõik read, mis ei sisalda hüüumärki, sest selle puudumisel ei ole tegemist kasutaja või mingi teenuse sisestatud reaga. //nimi saab endale väärtuseks alamstringi muutujast rida algusest kuni esimese hüüumärgini, sest see osa reast sisaldab teksti sisestanud kasutaja nime. //järgnevalt võetakse ette ainult need read mis sisaldavad PRIVMSG, sest kõik kasutajate poolt sisestatud read sisaldavad seda //lõppuks võetakse muutujast rida ära kõik, mis asub eespool esimest koolonit. tulemuseks jääb muutujasse rida ainult kasutaja poolt sisestatud tekst, mille alusel kogu süsteem edasi toimib. if (rida.substring(0, 1).equals(":")){ rida=rida.substring(1); if (rida.indexOf("!")>0){ String nimi=rida.substring(0, rida.indexOf("!")); if (rida.indexOf("PRIVMSG")>0){ rida=rida.substring(rida.indexOf(":")+1); System.out.println(nimi+" => "+rida); //Alustame vastamist. Loome ühenduse mysqliga kasutades eelpool defineeritud draiverit Connection con = DriverManager.getConnection(database, user, passwd); Statement stmt = con.createStatement(); //saadame päringu mysqlile ResultSet rs1 = stmt.executeQuery("SELECT * FROM on_;"); int on_olemas=0; //kontrollime, kas muutujas rida on mõni selline sõna, mis meil andmebaasis võtmesõnade hulgas asub. kui on olemas, siis katkestame tsükli. //tsykli katkestuse tulemusena jääb meil ette andmebaasist just see rida, kus asub võtmesõna, mis on esindatud ka muutujas rida. while (rs1.next() && on_olemas==0){ String votmesona=rs1.getString("SONA"); if (rida.indexOf(votmesona)>=0){ on_olemas=2; break; } } //kontrollime, et mitu vastust on andmebaasis sellel võtmesõnal if (on_olemas == 2){ int rnd=1; if (rs1.getString("V2")!=null){ rnd=2; } if (rs1.getString("V3")!=null){ rnd=3; } //vastavalt vastuste kogusele genereerime juhuarvu. int valik=(int)Math.floor(Math.random() * rnd)+1; //trykime jutukasse randomiga valitud vastuse. //valja.println("PRIVMSG #hk.tpu.ee :"+rs1.getString("V"+valik)); } con.close(); } } } //sulgeb ennast ilusti, kui keegi ütleb ole vait natuke if (rida.equals("ole vait natuke")){ valja.println("QUIT :Davai.. lõunale nüüd"); System.out.println("Yhendus serveriga suletud"); } //alustame õppimist for (int i=0; i<2; i++){ //kui triger asub rea peal (st. index on suurem, kui -1), siis alustab õppimist if (rida.indexOf(triger[i])>=0){ StringTokenizer st = new StringTokenizer(rida); kontroll=st.nextToken(); tyhiloendur=0; //juhul kui trigeriks on on if (triger[i].equals(" on ")){ //niikaua, kui pole on tulnud, jätkab sõnade lugemist. Sellega tehakse kindlaks, mitmendal kohal lauses on sõna "on". while (!kontroll.equals("on")) { kontroll=st.nextToken(); tyhiloendur++; } //kui on asub esimese 3 sõna hulgas, siis tegutseb edasi if (tyhiloendur<3){ String voti=rida.substring(0, rida.indexOf(" on ")); try { Connection con = DriverManager.getConnection(database, user, passwd); Statement stmt = con.createStatement(); ResultSet rs1 = stmt.executeQuery("SELECT * FROM on_;"); olemas=0; //kontrollib võtmesõna olemasolu andmebaasis while (rs1.next() && olemas==0){ String votmesona=rs1.getString("SONA"); if (votmesona.equals(voti)){ olemas=2; break; } } //kui võtmesõna andmebaasis ei ole, siis ta sisestab selle. if (olemas != 2){ stmt.executeUpdate("INSERT INTO `on_` VALUES ('', '"+rida.substring(0, rida.indexOf(" on ")+1)+"', '"+rida+"', NULL, NULL) "); }else{ //kui võtmesõna esineb andmebaasis, siis ta vaatab, kuhu ta selle lause kirjutada saab. kui kõik kolm välja on täidetud, siis tõstab ta teise välja kolmanda asemele, esimese teise asemele ja uue rea sisestab esimeseks. sellega kindlustatakse, et uuem lause jääb vanemale peale. String kala=rida.substring(0, rida.indexOf(" on ")+1); if (rs1.getString("V2")==null){ stmt.executeUpdate("UPDATE on_ SET V2='"+rida+"' where SONA='"+kala+"'; "); } if (rs1.getString("V3")==null){ stmt.executeUpdate("UPDATE on_ SET V3='"+rida+"' where SONA='"+kala+"'; "); }else{ stmt.executeUpdate("UPDATE on_ SET V3='"+rs1.getString("V2")+"' where SONA='"+kala+"'; "); stmt.executeUpdate("UPDATE on_ SET V2='"+rs1.getString("V1")+"' where SONA='"+kala+"'; "); stmt.executeUpdate("UPDATE on_ SET V1='"+rida+"' where SONA='"+kala+"'; "); } } con.close(); }catch(Exception e){ //kui on probleeme andmebaasiga, siis väljastab veateate. System.err.println(e.getMessage()); } } } //juhul kui trigeriks on ei ole. koodi poolest on ta täpselt sama eelmise juhuga. if (triger[i].equals(" ei ole ")){ while (!kontroll.equals("ei")) { kontroll=st.nextToken(); tyhiloendur++; } if (tyhiloendur<3){ String voti=rida.substring(0, rida.indexOf(" ei ole ")); try { Connection con = DriverManager.getConnection(database, user, passwd); Statement stmt = con.createStatement(); ResultSet rs1 = stmt.executeQuery("SELECT * FROM on_;"); olemas=0; while (rs1.next() && olemas==0){ String votmesona=rs1.getString("SONA"); if (votmesona.equals(voti)){ olemas=2; break; } } if (olemas != 2){ stmt.executeUpdate("INSERT INTO `on_` VALUES ('', '"+rida.substring(0, rida.indexOf(" ei ole ")+1)+"', '"+rida+"', NULL, NULL) "); }else{ String kala=rida.substring(0, rida.indexOf(" ei ole ")+1); if (rs1.getString("V2")==null){ stmt.executeUpdate("UPDATE on_ SET V2='"+rida+"' where SONA='"+kala+"'; "); } if (rs1.getString("V3")==null){ stmt.executeUpdate("UPDATE on_ SET V3='"+rida+"' where SONA='"+kala+"'; "); }else{ stmt.executeUpdate("UPDATE on_ SET V3='"+rs1.getString("V2")+"' where SONA='"+kala+"'; "); stmt.executeUpdate("UPDATE on_ SET V2='"+rs1.getString("V1")+"' where SONA='"+kala+"'; "); stmt.executeUpdate("UPDATE on_ SET V1='"+rida+"' where SONA='"+kala+"'; "); } } con.close(); }catch(Exception e){ System.err.println(e.getMessage()); } } } } } //loeb sisse serveri poolt saadetud uue rea, et seda töötlema hakata. rida=sisse.readLine(); } sisse.close(); valja.close(); System.out.println("Nüüd on vestluskaaslane kinni ja sa võid endal lahti imada ;)"); } }