Bladeren bron

ffpb: benutze ALFRED-Daten nur wenn sie jünger sind als 5 Minuten

Helge Jung 9 jaren geleden
bovenliggende
commit
2b7e31636d
1 gewijzigde bestanden met toevoegingen van 42 en 8 verwijderingen
  1. 42 8
      modules/ffpb.py

+ 42 - 8
modules/ffpb.py

@@ -2,6 +2,8 @@
 from __future__ import print_function
 import willie
 
+import datetime
+from email.utils import mktime_tz
 import git
 import netaddr
 import json
@@ -21,6 +23,7 @@ stats = None
 
 alfred_method = None
 alfred_data = None
+alfred_update = datetime.datetime(1970,1,1,23,42)
 
 ffpb_resolver = dns.resolver.Resolver ()
 ffpb_resolver.nameservers = ['10.132.254.53']
@@ -160,25 +163,48 @@ def mac2ipv6(mac, prefix=None):
 @willie.module.interval(30)
 def ffpb_updatealfred(bot):
 	"""Aktualisiere ALFRED-Daten"""
-	global alfred_data
+	global alfred_data, alfred_update
 
 	if alfred_method is None or alfred_method == "None":
 		return
 
+	updated = None
 	if alfred_method == "exec":
 		rawdata = subprocess.check_output(['alfred-json', '-z', '-r', '158'])
-		alfred_data = json.load(rawdata)
-		#print("Fetched new ALFRED data:", len(alfred_data), "entries")
+		updated = datetime.datetime.now()
+	elif alfred_method.startswith("http"):
+		try:
+			rawdata = urllib2.urlopen(alfred_method)
+		except:
+			print("Failed to download ALFRED data.")
+			return
+		updated = datetime.datetime.fromtimestamp(mktime_tz(rawdata.info().getdate_tz("Last-Modified")))
+	else:
+		print("Unknown ALFRED data method '", alfred_method, "', cannot load new data.", sep="")
+		alfred_data = None
 		return
 
-	if alfred_method.startswith("http"):
-		rawdata = urllib2.urlopen(alfred_method)
+	try:
 		alfred_data = json.load(rawdata)
-		#print("Downloaded new ALFRED data:", len(alfred_data), "entries")
+		#print("Fetched new ALFRED data:", len(alfred_data), "entries")
+		alfred_update = updated
+
+	except ValueError as e:
+		print("Failed to parse ALFRED data ({0}): {1}".format(e.errno, e.strerror))
 		return
 
-	print("Unknown ALFRED data method '", alfred_method, "', cannot load new data.", sep="")
-	alfred_data = None
+def ffpb_alfred_data_outdated():
+	timeout = datetime.datetime.now() - datetime.timedelta(minutes=5)
+	is_outdated = timeout > alfred_update
+	#print("ALFRED outdated? {0} (timeout={1} vs. lastupdate={2})".format(is_outdated, timeout, alfred_update))
+	return is_outdated
+
+@willie.module.commands('debug-alfred')
+def ffpb_debug_alfred(bot, trigger):
+	if alfred_data is None:
+		bot.say("Keine ALFRED-Daten vorhanden.")
+	else:
+		bot.say("ALFRED Daten: count={0} lastupdate={1}".format(len(alfred_data), alfred_update))
 
 @willie.module.commands('info')
 def ffpb_peerinfo(bot, trigger):
@@ -191,6 +217,10 @@ def ffpb_peerinfo(bot, trigger):
 		bot.say("Informationen sind ausverkauft, kommen erst morgen wieder rein.")
 		return
 
+	if ffpb_alfred_data_outdated():
+		bot.say("Ich habe gerade keine aktuellen Informationen, daher sage ich mal lieber nichts zu '" + target_name + "'.")
+		return
+
 	node = ffpb_findnode(target_name)
 	if node is None:
 		bot.say("Kein Plan wer oder was mit '" + target_name + "' gemeint ist :(")
@@ -243,6 +273,10 @@ def ffpb_peerlink(bot, trigger):
 		bot.say("Informationen sind ausverkauft, kommen erst morgen wieder rein.")
 		return
 
+	if ffpb_alfred_data_outdated():
+		bot.say("Ich habe gerade keine aktuellen Informationen, daher sage ich mal lieber nichts zu '" + target_name + "'.")
+		return
+
 	node = ffpb_findnode(target_name)
 	if node is None:
 		bot.say("Kein Plan wer oder was mit '" + target_name + "' gemeint ist :(")