+#!/usr/bin/env python
+
+import sys
+import smtplib
+import email
+from email.mime.text import MIMEText
+from time import asctime
+from ocesavac import ocesat
+import jakobsen
+from jakobsen import reference
+import koincidence
+import pickle
+import os
+
+ABECEDA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+
+class settings:
+ pass
+
+settings = pickle.load(open('./robot_settings'))
+os.chdir(settings.path)
+
+# Cteni mailu
+mail = email.message_from_file(sys.stdin)
+predmet, _, opsny = mail['Subject'].strip().upper().partition(' ')
+if predmet != settings.subject:
+ sys.exit()
+if (opsny == 'L'):
+ mail = pickle.load(open('./msg_last.tmp'))
+odesilatel = mail['From']
+telo = mail.get_payload().strip()
+if len(telo) < 2:
+ sys.exit()
+zprava = telo.upper()
+analyza = []
+
+# Zakladni udaje
+analyza.append("Delka zpravy (bez mezer a zvlastnich znaku):")
+analyza.append(str(len(ocesat(zprava, False))))
+
+# Index koincidence
+analyza.append("\nIndexy koincidence:")
+analyza.append(koincidence.tabulka_indexu(zprava))
+
+# Jakobsen
+analyza.append("\nJakobsen:")
+analyza.append(jakobsen.desifruj(zprava, './ref'))
+
+# Posuny v abecede
+analyza.append("\nPosuny v abecede:")
+
+def posun(char):
+ if 65 <= ord(char) < 90:
+ return chr(ord(char) + 1)
+ if ord(char) == 90:
+ return 'A'
+ else:
+ return char
+
+posunuty = zprava
+for i in range(26):
+ posunuty = map(posun, posunuty)
+ analyza.append(''.join(posunuty))
+
+# Frekvence znaku
+analyza.append("\nFrekvencni analyza:")
+freq = dict()
+for char in ABECEDA:
+ freq[char] = 0
+for char in zprava:
+ if char in freq:
+ freq[char] += 1
+celkem = sum(freq.values())
+for char in sorted(freq, key=freq.get, reverse=True):
+ analyza.append('{0} {1:>3} {2:>6.2%}'.format(char, freq[char],
+ float(freq[char])/celkem))
+
+# Bigramy
+analyza.append("\nBigramy podle cetnosti:")
+bigramy = dict()
+for i in ABECEDA:
+ for j in ABECEDA:
+ bigramy[i+j] = 0
+for i in range(0, len(zprava)-1):
+ if zprava[i:i+2] in bigramy:
+ bigramy[zprava[i:i+2]] += 1
+celkem = sum(bigramy.values())
+for char in sorted(bigramy, key=bigramy.get, reverse=True):
+ if bigramy[char] == 0:
+ break
+ analyza.append('{0} {1:>3} {2:>6.2%}'.format(char, bigramy[char],
+ float(bigramy[char])/celkem))
+
+# Kompozice odpovedi
+msg = MIMEText("Puvodni zprava:\n" +
+ telo + "\n\n" + "\n".join(analyza) +
+ "\n\nS pozdravem\nVas Robot\n")
+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()
+
+f = open('./msg_last.tmp', 'w')
+pickle.dump(mail, f)
+f.close()
+
+f = open('./robot.log', 'a')
+f.write(asctime() + " " + odesilatel + "\n")
+f.close()