#!/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