]> gitweb.pimeys.fr Git - today.git/blob - today-server.py
sync côté serveur
[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 time, datetime
14 import re
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 #: Fichier où sont stockés les derniers IDs des trucs
24 store_published_file = "lasts_published"
25
26 #: Fichier où est stockée une copie de la liste des derniers IDs *lus*
27 store_seen_file = "lasts_sync"
28
29 def get_now():
30 """Obtenir la date actuelle sous le bon format"""
31 timestamp = time.time()
32 now = datetime.datetime(*time.localtime(timestamp)[:7])
33 return now
34
35 def last_dtc():
36 """Vérifie si il y a des quotes DTC non lues"""
37 return dtc.last_inserted()
38
39 def last_xkcd():
40 try:
41 p = urllib.urlopen("http://xkcd.com")
42 except IOError:
43 return "Impossible de se connecter à xkcd"
44 t = p.read()
45 current_id = int(re.findall("Permanent link to this comic: http://xkcd.com/(.*?)/", t)[0])
46 return current_id
47
48 def get_file():
49 """Récupère la liste des derniers ids de chaque truc, stockée dans le fichiers."""
50 f = open(store_published_file)
51 news = json.load(f)
52 f.close()
53 return news
54
55 def update_file(news):
56 """Met à jour la liste des derniers ids dans le fichier."""
57 f = open(store_published_file, 'w')
58 json.dump(news, f)
59 f.close()
60
61 def fetch_all():
62 """Va chercher sur les différents sites les nouveaux trucs."""
63 news = {}
64 news["xkcd"] = last_xkcd()
65 news["dtc"] = last_dtc()
66 return news
67
68 def sync():
69 """Reçoit une requête de synchronisation."""
70 # On récupère où en est le client sur stdin
71 t = sys.stdin.read()
72 on_client = json.loads(t)
73 # On récupère où en est le serveur dans le fichier idoine
74 if os.path.isfile(store_seen_file):
75 on_server = json.load(open(store_seen_file))
76 else:
77 on_server = {}
78 # On garde le maximum
79 for k in set(on_client.keys() + on_server.keys()):
80 on_server[k] = max(on_client.get(k, 0), on_server.get(k, 0))
81 # On enregistre ce nouveau dico
82 json.dump(on_server, open(store_seen_file, "w"))
83 # On envoie au client ce nouveau dico
84 print json.dumps(on_server)
85
86 if __name__ == "__main__":
87 if sys.argv[1] == "check":
88 news = fetch_all()
89 update_file(news)
90 elif sys.argv[1] == "whatsup":
91 news = get_file()
92 print json.dumps(news)
93 elif sys.argv[1] == "sync":
94 sync()