kosmeticke upravy
[krypto.git] / robot.py
index 596f386..21d297a 100755 (executable)
--- a/robot.py
+++ b/robot.py
@@ -9,8 +9,10 @@ from ocesavac import ocesat
 import jakobsen
 from jakobsen import reference
 import koincidence
+import posuny
 import pickle
 import os
+import re
 
 ABECEDA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
 
@@ -20,12 +22,16 @@ class settings:
 settings = pickle.load(open('./robot_settings'))
 os.chdir(settings.path)
 
-def posli_mail(komu, co, text):
+def posli_mail(komu, co, text, loguj=None):
     msg = MIMEText(text)
     msg['Subject'] = co
     msg['From'] = settings.name + " <" + settings.mail  + ">"
     msg['To'] = komu
     smtplib.SMTP('localhost').sendmail(settings.mail, komu, msg.as_string())
+    if loguj:
+        f = open(loguj, 'w')
+        f.write(msg.as_string())
+        f.close()
 
 # Cteni mailu
 mail = email.message_from_file(sys.stdin)
@@ -55,12 +61,24 @@ if opsny == 'H':
     sys.exit()
 if 'L' in opsny:
     mail = pickle.load(open('./msg_last.tmp'))
-    if (mail['From'] != odesilatel):
+    m1 = re.match(r".*\<(.*)\>.*", mail['From'])
+    m2 = re.match(r".*\<(.*)\>.*", odesilatel)
+    if m1:
+        f1 = m1.group(1)
+    else:
+        f1 = mail['From']
+    if m2:
+        f2 = m2.group(1)
+    else:
+        f2 = odesilatel
+    if (f1 != f2):
         posli_mail(odesilatel, "Omluva", "Omlouvam se,"
                    " ale Vase zprava uz bohuzel neni na serveru ulozena.\n")
         sys.exit()
 telo = mail.get_payload().strip()
-if len(telo) < 2:
+if len(ocesat(telo, False)) < 2:
+    posli_mail(odesilatel, "Omluva", "Omlouvam se,"
+                   " ale Vase zprava je prilis kratka.\n")
     sys.exit()
 zprava = telo.upper()
 analyza = []
@@ -80,7 +98,7 @@ if 'A' in opsny:
     mod_x = True
     mod_m = True
 if not mod_m and not mod_x:
-    if ' ' in ocesat(zprava, True):
+    if ' ' in ocesat(zprava, True)[1:-1]:
         mod_m = True
         analyza.append("\nAutomaticky zvolena analyza s mezerami.")
     else:
@@ -113,32 +131,29 @@ for char in sorted(freq, key=freq.get, reverse=True):
                    float(freq[char])/celkem))
 
 # Index koincidence
-# TODO verze s mezerami
-analyza.append("\nIndexy koincidence (vzdy bez mezer):")
-analyza.append(koincidence.tabulka_indexu(zprava))
+if mod_m:
+    analyza.append("\nIndex koincidence (s mezerami):")
+    analyza.append('{0:.2%}'.format(koincidence.index_koincidence(zprava, True)))
+if mod_x:
+    analyza.append("\nIndexy koincidence (bez mezer):")
+    analyza.append(koincidence.tabulka_indexu(zprava))
 
 # Jakobsen
-# TODO verze bez mezer
 if mod_m:
     analyza.append("\nJakobsen (s mezerami):")
-    analyza.append(jakobsen.desifruj(zprava, './ref'))
+    analyza.append(jakobsen.desifruj(zprava))
+if mod_x:
+    analyza.append("\nJakobsen (bez mezer):")
+    analyza.append(jakobsen.desifruj(zprava, False))
 
 # Posuny v abecede
-# TODO najit nejvhodnejsi posuny a vypsat jenom ty
-def posun(char):
-    if 65 <= ord(char) < 90:
-        return chr(ord(char) + 1)
-    if ord(char) == 90:
-        return 'A'
-    else:
-        return char
-
+(posun, posunuty_text) = posuny.nejlepsi(zprava)
 if 'P' in opsny or 'A' in opsny:
-    analyza.append("\nPosuny v abecede:")
-    posunuty = zprava
-    for i in range(26):
-        posunuty = map(posun, posunuty)
-        analyza.append(''.join(posunuty))
+    analyza.append("\nPosuny v abecede (nejlepsi posun {0}):".format(posun))
+    analyza.append("\n".join("{0:>2} {1}".format(i + 1, posuny.vsechny(zprava)[i]) for i in range(26)))
+else:
+    analyza.append("\nNejlepsi posun ({0}):".format(posun))
+    analyza.append(posunuty_text)
 
 # Bigramy
 if ('B' in opsny or 'A' in opsny):
@@ -162,26 +177,18 @@ analyza.append(''.join(["\nS pozdravem\nVas Robot\n"
                         "\n--\nPro napovedu zaslete mail s predmetem \"",
                         settings.subject," H\".\n"]))
 
-# Kompozice odpovedi
-msg = MIMEText("\n".join(analyza))
-msg['Subject'] = "Analyza Vasi zpravy"
-msg['From'] = settings.name + " <" + settings.mail  + ">"
-msg['To'] = odesilatel
-
 # Odeslani odpovedi
-s = smtplib.SMTP('localhost')
-s.sendmail(settings.mail, odesilatel, msg.as_string())
-s.quit()
-
-# Zalogovani posledni zpravy
-f = open('./robot_last.tmp', 'w')
-f.write(msg.as_string())
-f.close()
+posli_mail(odesilatel, "Analyza Vasi zpravy", "\n".join(analyza), './robot_last.tmp')
 
 f = open('./msg_last.tmp', 'w')
 pickle.dump(mail, f)
 f.close()
 
 f = open('./robot.log', 'a')
-f.write(asctime() + " " +  odesilatel + "\n")
+m = re.match(r".*\<(.*)\>.*", odesilatel)
+if m:
+    odesilatel2 = m.group(1)
+else:
+    odesilatel2 = odesilatel
+f.write(asctime() + " " +  odesilatel2 + " " + opsny + "\n")
 f.close()