tMerge pull request #1242 from kyuupichan/pick_random_server - electrum - Electrum Bitcoin wallet (HTM) git clone https://git.parazyd.org/electrum (DIR) Log (DIR) Files (DIR) Refs (DIR) Submodules --- (DIR) commit 71046371ecb293a016f5777c3070fbdc933638ff (DIR) parent 117b809bab531ec5d8eb2aa0f20a00c8f922a6a2 (HTM) Author: ThomasV <electrumdev@gmail.com> Date: Sun, 24 May 2015 16:43:17 +0200 Merge pull request #1242 from kyuupichan/pick_random_server Clean up pick_random_server() and filter_protocol() and their Diffstat: M electrum | 6 +----- M gui/gtk.py | 1 - M gui/qt/network_dialog.py | 2 +- M lib/network.py | 46 +++++++++++-------------------- M scripts/servers | 4 ++-- 5 files changed, 20 insertions(+), 39 deletions(-) --- (DIR) diff --git a/electrum b/electrum t@@ -309,11 +309,7 @@ if __name__ == '__main__': else: password = prompt_password("Password (hit return if you do not wish to encrypt your wallet):") - # if config.server is set, the user either passed the server on command line - # or chose it previously already. if he didn't pass a server on the command line, - # we just pick up a random one. - if not config.get('server'): - config.set_key('server', pick_random_server()) + # If config doesn't have a server, network.py will pick a random one #fee = options.tx_fee if options.tx_fee else raw_input("fee (default:%s):" % (str(Decimal(wallet.fee)/100000000))) #gap = options.gap_limit if options.gap_limit else raw_input("gap limit (default 5):") (DIR) diff --git a/gui/gtk.py b/gui/gtk.py t@@ -34,7 +34,6 @@ import platform MONOSPACE_FONT = 'Lucida Console' if platform.system() == 'Windows' else 'monospace' from electrum.util import format_satoshis, parse_URI -from electrum.network import DEFAULT_SERVERS from electrum.bitcoin import MIN_RELAY_TX_FEE def numbify(entry, is_int = False): (DIR) diff --git a/gui/qt/network_dialog.py b/gui/qt/network_dialog.py t@@ -23,7 +23,7 @@ import os.path, json, ast, traceback from PyQt4.QtGui import * from PyQt4.QtCore import * -from electrum import DEFAULT_SERVERS, DEFAULT_PORTS +from electrum import DEFAULT_PORTS from util import * (DIR) diff --git a/lib/network.py b/lib/network.py t@@ -68,19 +68,19 @@ def parse_servers(result): return servers - - -def filter_protocol(servers, p): - l = [] - for k, protocols in servers.items(): - if p in protocols: - s = serialize_server(k, protocols[p], p) - l.append(s) - return l - - -def pick_random_server(p='s'): - return random.choice( filter_protocol(DEFAULT_SERVERS,p) ) +def filter_protocol(hostmap = DEFAULT_SERVERS, protocol = 's'): + '''Filters the hostmap for those implementing protocol. + The result is a list in serialized form.''' + eligible = [] + for host, portmap in hostmap.items(): + port = portmap.get(protocol) + if port: + eligible.append(serialize_server(host, port, protocol)) + return eligible + +def pick_random_server(hostmap = DEFAULT_SERVERS, protocol = 's', exclude_set = set()): + eligible = list(set(filter_protocol(hostmap, protocol)) - exclude_set) + return random.choice(eligible) if eligible else None from simple_config import SimpleConfig t@@ -149,7 +149,7 @@ class Network(util.DaemonThread): except: self.default_server = None if not self.default_server: - self.default_server = pick_random_server('s') + self.default_server = pick_random_server() self.irc_servers = {} # returned by interface (list from irc) self.recent_servers = self.read_recent_servers() t@@ -247,21 +247,6 @@ class Network(util.DaemonThread): value = self.get_status_value(key) self.response_queue.put({'method':'network.status', 'params':[key, value]}) - def random_server(self): - choice_list = [] - l = filter_protocol(self.get_servers(), self.protocol) - for s in l: - if s in self.pending_servers or s in self.disconnected_servers or s in self.interfaces.keys(): - continue - else: - choice_list.append(s) - - if not choice_list: - return - - server = random.choice( choice_list ) - return server - def get_parameters(self): host, port, protocol = deserialize_server(self.default_server) auto_connect = self.config.get('auto_cycle', True) t@@ -293,7 +278,8 @@ class Network(util.DaemonThread): i.start() def start_random_interface(self): - server = self.random_server() + exclude_set = self.disconnected_servers.union(self.pending_servers).union(set(self.interfaces)) + server = pick_random_server(self.get_servers(), self.protocol, exclude_set) if server: self.start_interface(server) (DIR) diff --git a/scripts/servers b/scripts/servers t@@ -1,7 +1,7 @@ #!/usr/bin/env python from electrum import SimpleConfig, set_verbosity -from electrum.network import DEFAULT_SERVERS, filter_protocol +from electrum.network import filter_protocol import time, Queue from collections import defaultdict t@@ -9,7 +9,7 @@ import util, json set_verbosity(False) config = SimpleConfig() -servers = filter_protocol(DEFAULT_SERVERS,'t') +servers = filter_protocol(protocol = 't') results = util.send_request(servers, {'method':'blockchain.headers.subscribe', 'params':[]}) d = defaultdict(int)