]> gitweb.pimeys.fr Git - today.git/blob - today_server.py
[gather] Soyons un peu plus clairs sur le cahier des charges
[today.git] / today_server.py
1 #!/usr/bin/python
2 # -*- encoding: utf-8 -*-
3
4 """ Codé par 20-100
5 script qui affiche des trucs à penser, des J-n des conneries
6 or that kind of stuff.
7
8 Partie serveur, prévue pour chercher périodiquement les trucs non lus
9 et répondre à un check.
10
11 """
12
13 import re
14 from lxml import etree
15 import os
16 import sys
17 import urllib
18 import json
19 os.chdir('/home/vincent/scripts/today/')
20 sys.path.append("/home/vincent/scripts/dtc/")
21 import dtc
22
23 #: Config serveur
24 import serverconfig
25
26 #: Récupération de toutes les nouveautés
27 import gather
28
29 def last_dtc():
30 """Vérifie si il y a des quotes DTC non lues"""
31 return dtc.last_inserted()
32
33 def last_xkcd():
34 p = urllib.urlopen("http://xkcd.com")
35 t = p.read()
36 current_id = int(re.findall("Permanent link to this comic: http://xkcd.com/(.*?)/", t)[0])
37 return current_id
38
39 def last_xantah():
40 p = urllib.urlopen("http://www.adoprixtoxis.com/lite/download/xantah_downloads.php")
41 t = p.read()
42 ids = re.findall("""<div class="top">Xantah (.*?)</div>""", t)
43 ids = [int(i) for i in ids]
44 return max(ids)
45
46 def last_jl8():
47 rss = urllib.urlopen("http://limbero.org/jl8/rss/")
48 t = rss.read()
49 x = etree.fromstring(t)
50 links = x.xpath("//link")
51 maxnum = links[1].text.split("/")[-1]
52 maxnum = int(maxnum)
53 return maxnum
54
55 def get_file():
56 """Récupère la liste des derniers ids de chaque truc, stockée dans le fichier."""
57 f = open(serverconfig.store_published_file)
58 news = json.load(f)
59 f.close()
60 return news
61
62 def update_file(news):
63 """Met à jour la liste des derniers ids dans le fichier."""
64 f = open(serverconfig.store_published_file, 'w')
65 json.dump(news, f)
66 f.close()
67
68 FETCHS = {
69 "xkcd" : last_xkcd,
70 "dtc" : last_dtc,
71 "xantah" : last_xantah,
72 "dc" : last_jl8,
73 }
74
75 def fetch_all():
76 """Va chercher sur les différents sites les nouveaux trucs."""
77 news = {}
78 for (k, f) in FETCHS.iteritems():
79 try:
80 news[k] = f()
81 except Exception as e:
82 raise
83 news.update(gather.gather())
84 return news
85
86 def sync():
87 """Reçoit une requête de synchronisation."""
88 # On récupère où en est le client sur stdin
89 t = sys.stdin.read()
90 on_client = json.loads(t)
91 # On récupère où en est le serveur dans le fichier idoine
92 if os.path.isfile(serverconfig.store_seen_file):
93 on_server = json.load(open(serverconfig.store_seen_file))
94 else:
95 on_server = {}
96 # On garde le maximum
97 for k in set(on_client.keys() + on_server.keys()):
98 on_server[k] = max(on_client.get(k, 0), on_server.get(k, 0))
99 # On enregistre ce nouveau dico
100 json.dump(on_server, open(serverconfig.store_seen_file, "w"))
101 # On envoie au client ce nouveau dico
102 print json.dumps(on_server)
103
104 if __name__ == "__main__":
105 DEBUG = ("--debug" in sys.argv) or ("--verbose" in sys.argv) or serverconfig.DEBUG
106 if sys.argv[1] == "check":
107 news = fetch_all()
108 if "--init" in sys.argv:
109 olds = news
110 else:
111 olds = get_file()
112 olds.update(news)
113 update_file(olds)
114 elif sys.argv[1] == "whatsup":
115 news = get_file()
116 print json.dumps(news)
117 elif sys.argv[1] == "sync":
118 sync()