mirror of
https://github.com/markqvist/NomadNet.git
synced 2025-05-10 10:04:56 -04:00
Basic Network Text UI implemented. Announce stream and peer settings implemented.
This commit is contained in:
parent
420cfcbbe3
commit
a53bd70dc9
8 changed files with 668 additions and 25 deletions
|
@ -1,11 +1,15 @@
|
|||
import os
|
||||
import RNS
|
||||
import LXMF
|
||||
import time
|
||||
import RNS.vendor.umsgpack as msgpack
|
||||
|
||||
class Directory:
|
||||
ANNOUNCE_STREAM_MAXLENGTH = 256
|
||||
|
||||
def __init__(self, app):
|
||||
self.directory_entries = {}
|
||||
self.announce_stream = []
|
||||
self.app = app
|
||||
self.load_from_disk()
|
||||
|
||||
|
@ -14,10 +18,15 @@ class Directory:
|
|||
packed_list = []
|
||||
for source_hash in self.directory_entries:
|
||||
e = self.directory_entries[source_hash]
|
||||
packed_list.append((e.source_hash, e.display_name, e.trust_level))
|
||||
packed_list.append((e.source_hash, e.display_name, e.trust_level, e.hosts_node))
|
||||
|
||||
directory = {
|
||||
"entry_list": packed_list,
|
||||
"announce_stream": self.announce_stream
|
||||
}
|
||||
|
||||
file = open(self.app.directorypath, "wb")
|
||||
file.write(msgpack.packb(packed_list))
|
||||
file.write(msgpack.packb(directory))
|
||||
file.close()
|
||||
except Exception as e:
|
||||
RNS.log("Could not write directory to disk. Then contained exception was: "+str(e), RNS.LOG_ERROR)
|
||||
|
@ -26,18 +35,31 @@ class Directory:
|
|||
if os.path.isfile(self.app.directorypath):
|
||||
try:
|
||||
file = open(self.app.directorypath, "rb")
|
||||
unpacked_list = msgpack.unpackb(file.read())
|
||||
unpacked_directory = msgpack.unpackb(file.read())
|
||||
unpacked_list = unpacked_directory["entry_list"]
|
||||
file.close()
|
||||
|
||||
entries = {}
|
||||
for e in unpacked_list:
|
||||
entries[e[0]] = DirectoryEntry(e[0], e[1], e[2])
|
||||
if len(e) > 3:
|
||||
hosts_node = e[3]
|
||||
else:
|
||||
hosts_node = False
|
||||
|
||||
entries[e[0]] = DirectoryEntry(e[0], e[1], e[2], hosts_node)
|
||||
|
||||
self.directory_entries = entries
|
||||
self.announce_stream = unpacked_directory["announce_stream"]
|
||||
|
||||
except Exception as e:
|
||||
RNS.log("Could not load directory from disk. The contained exception was: "+str(e), RNS.LOG_ERROR)
|
||||
|
||||
def announce_received(self, source_hash, app_data):
|
||||
timestamp = time.time()
|
||||
self.announce_stream.insert(0, (timestamp, source_hash, app_data))
|
||||
while len(self.announce_stream) > Directory.ANNOUNCE_STREAM_MAXLENGTH:
|
||||
self.announce_stream.pop()
|
||||
|
||||
def display_name(self, source_hash):
|
||||
if source_hash in self.directory_entries:
|
||||
return self.directory_entries[source_hash].display_name
|
||||
|
@ -94,6 +116,27 @@ class Directory:
|
|||
except Exception as e:
|
||||
return False
|
||||
|
||||
def known_nodes(self):
|
||||
node_list = []
|
||||
for eh in self.directory_entries:
|
||||
e = self.directory_entries[eh]
|
||||
if e.hosts_node:
|
||||
node_list.append(e)
|
||||
|
||||
return node_list
|
||||
|
||||
def number_of_known_nodes(self):
|
||||
return len(self.known_nodes())
|
||||
|
||||
def number_of_known_peers(self, lookback_seconds=None):
|
||||
unique_hashes = []
|
||||
cutoff_time = time.time()-lookback_seconds
|
||||
for entry in self.announce_stream:
|
||||
if not entry[1] in unique_hashes:
|
||||
if lookback_seconds == None or entry[0] > cutoff_time:
|
||||
unique_hashes.append(entry[1])
|
||||
|
||||
return len(unique_hashes)
|
||||
|
||||
class DirectoryEntry:
|
||||
WARNING = 0x00
|
||||
|
@ -101,7 +144,7 @@ class DirectoryEntry:
|
|||
UNKNOWN = 0x02
|
||||
TRUSTED = 0xFF
|
||||
|
||||
def __init__(self, source_hash, display_name=None, trust_level=UNKNOWN):
|
||||
def __init__(self, source_hash, display_name=None, trust_level=UNKNOWN, hosts_node=False):
|
||||
if len(source_hash) == RNS.Identity.TRUNCATED_HASHLENGTH//8:
|
||||
self.source_hash = source_hash
|
||||
self.display_name = display_name
|
||||
|
@ -109,5 +152,6 @@ class DirectoryEntry:
|
|||
display_name = source_hash
|
||||
|
||||
self.trust_level = trust_level
|
||||
self.hosts_node = hosts_node
|
||||
else:
|
||||
raise TypeError("Attempt to add invalid source hash to directory")
|
Loading…
Add table
Add a link
Reference in a new issue