--- /dev/null
+#!/usr/bin/python
+# -*- coding:utf8 -*-
+
+# codé par 20-100 à partir du 02/04/12, sur une idée de NeK
+
+import socket
+import time
+import pickle
+import re
+
+def start():
+ # ouvre une connexion avec le serveur de news et renvoie la socket
+ s=socket.socket()
+ s.connect(("news.crans.org",119))
+ s.recv(4096)
+ return s
+
+def ask(s,something):
+ # effectue une requête et renvoie (execution_code,result)
+ s.send(something+"\n")
+ time.sleep(0.05)
+ t=s.recv(8192)
+ try:
+ firstline,rest=t.split(' ',1)
+ except:
+ print t
+ raise
+ return int(firstline.split()[0]),rest
+
+def get_groups(s):
+ # donne la liste des groupes existants
+ cod,t=ask(s,"list")
+ if cod in range(200,300):
+ l=t.split("\n")[2:-2]
+ return [i.split()[0] for i in l]
+ else:
+ raise KeyboardInterrup("communication error : %s"%(cod))
+
+def load_read():
+ # charge le dico des derniers messages lus
+ return pickle.load(open("dicoread.txt"))
+
+def save_read(dicoread):
+ # sauvegarde le dio des derniers messages lus
+ pickle.dump(dicoread,open("dicoread.txt","w"))
+
+def get_last_message(s,group):
+ # renvoie le dernier message existant dans un groupe
+ cod,t=ask(s,"group %s"%(group))
+ if cod in range(200,300):
+ return int(t.split()[2])
+ else:
+ raise KeyboardInterrup("communication error : %s"%(cod))
+
+def get_all_last(s,groups):
+ # récupère les derniers messages de tous les groupes
+ dicolast={}
+ for g in groups:
+ dicolast[g]=get_last_message(s,g)
+ return dicolast
+
+def get_nouveaux_messages(s,groups,dicoread,dicounread):
+ # crée un itérateurs sur les nouveaux messages
+ # un "nouveau" message c'est un message dont le numéro
+ # est supérieur strict à celui dans dicoread
+ # mais inférieur à celui dans dicounread
+ for g in groups:
+ if not(dicoread.has_key(g)):
+ dicoread[g]=0
+ # il faut lui redire dans quel groupe on est
+ ask(s,"group %s"%(g))
+ for ident in range(dicoread[g]+1,dicounread[g]+1):
+ # on demande les headers du message
+ cod,rest=ask(s,"head %s"%(ident))
+ if cod in range(200,300):
+ mid=re.findall('Message-ID:(.*)',t)[0].strip()
+ ref=False
+ try:
+ ref=re.findall('References:(.*)',t)[0].strip()
+ _,message
+ yield rest
+ else:
+ # bon bah ce massage existe pas, tant pis
+ pass