93 lines
2.8 KiB
Python

import time
import logging
import datetime
import pwnagotchi.ui.faces as faces
def parse_rfc3339(dt):
if dt == "0001-01-01T00:00:00Z":
return datetime.datetime.now()
return datetime.datetime.strptime(dt.split('.')[0], "%Y-%m-%dT%H:%M:%S")
class Peer(object):
def __init__(self, obj):
now = time.time()
just_met = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")
try:
self.first_met = parse_rfc3339(obj.get('met_at', just_met))
self.first_seen = parse_rfc3339(obj.get('detected_at', just_met))
self.prev_seen = parse_rfc3339(obj.get('prev_seen_at', just_met))
except Exception as e:
logging.warning("error while parsing peer timestamps: %s" % e)
logging.debug(e, exc_info=True)
self.first_met = just_met
self.first_seen = just_met
self.prev_seen = just_met
self.last_seen = now # should be seen_at
self.encounters = obj.get('encounters', 0)
self.session_id = obj.get('session_id', '')
self.last_channel = obj.get('channel', 1)
self.rssi = obj.get('rssi', 0)
self.adv = obj.get('advertisement', {})
def update(self, new):
if self.name() != new.name():
logging.info("peer %s changed name: %s -> %s" % (self.full_name(), self.name(), new.name()))
if self.session_id != new.session_id:
logging.info("peer %s changed session id: %s -> %s" % (self.full_name(), self.session_id, new.session_id))
self.adv = new.adv
self.rssi = new.rssi
self.session_id = new.session_id
self.last_seen = time.time()
self.prev_seen = new.prev_seen
self.first_met = new.first_met
self.encounters = new.encounters
def inactive_for(self):
return time.time() - self.last_seen
def first_encounter(self):
return self.encounters == 1
def is_good_friend(self, config):
return self.encounters >= config['personality']['bond_encounters_factor']
def face(self):
return self.adv.get('face', faces.FRIEND)
def name(self):
return self.adv.get('name', '???')
def identity(self):
return self.adv.get('identity', '???')
def full_name(self):
return "%s@%s" % (self.name(), self.identity())
def version(self):
return self.adv.get('version', '1.0.0a')
def pwnd_run(self):
return int(self.adv.get('pwnd_run', 0))
def pwnd_total(self):
return int(self.adv.get('pwnd_tot', 0))
def uptime(self):
return self.adv.get('uptime', 0)
def epoch(self):
return self.adv.get('epoch', 0)
def full_name(self):
return '%s@%s' % (self.name(), self.identity())
def is_closer(self, other):
return self.rssi > other.rssi