2 from blockchain import Blockchain
3 import threading, time, Queue, os, sys, shutil
4 from util import user_dir, appdata_dir, print_error
8 class Network(threading.Thread):
10 def __init__(self, config):
11 threading.Thread.__init__(self)
14 self.lock = threading.Lock()
15 self.blockchain = Blockchain(config)
17 self.queue = Queue.Queue()
18 self.default_server = self.config.get('server')
19 self.servers_list = interface.filter_protocol(interface.DEFAULT_SERVERS,'s')
23 def register_callback(self, event, callback):
25 if not self.callbacks.get(event):
26 self.callbacks[event] = []
27 self.callbacks[event].append(callback)
30 def trigger_callback(self, event):
32 callbacks = self.callbacks.get(event,[])[:]
34 [callback() for callback in callbacks]
37 def start_interfaces(self):
39 for server in self.servers_list:
40 self.interfaces[server] = interface.Interface({'server':server})
42 for i in self.interfaces.values():
43 i.network = self # fixme
46 if self.default_server:
47 self.interface = interface.Interface({'server':self.default_server})
48 self.interface.network = self # fixme
49 self.interface.start(self.queue)
51 self.interface = self.interfaces[0]
54 def start(self, wait=False):
56 self.start_interfaces()
57 threading.Thread.__init__(self)
59 self.interface.connect_event.wait()
60 return self.interface.is_connected
65 self.blockchain.start()
70 while self.is_running():
74 i.register_channel('verifier', self.blockchain.queue)
75 i.register_channel('get_header')
76 i.send([ ('blockchain.headers.subscribe',[])], 'verifier')
77 if i == self.interface:
78 i.send([('server.banner',[])])
79 i.send([('server.peers.subscribe',[])])
81 self.interfaces.pop(i.server)
82 if i == self.interface:
83 if self.default_server is None:
84 print_msg("Using random server...")
85 server = random.choice( self.servers_list )
86 self.interface = interface.Interface({'server':self.default_server})
88 #i.trigger_callback('disconnected')
91 def on_peers(self, resut):
94 def on_banner(self, result):
98 with self.lock: self.running = False
100 def is_running(self):
101 with self.lock: return self.running
104 def resend_subscriptions(self):
105 for channel, messages in self.subscriptions.items():
107 self.send(messages, channel)
110 def auto_cycle(self):
111 if not self.is_connected and self.config.get('auto_cycle'):
112 print_msg("Using random server...")
113 servers = filter_protocol(DEFAULT_SERVERS, 's')
115 server = random.choice( servers )
116 servers.remove(server)
118 self.config.set_key('server', server, False)
119 self.init_with_server(self.config)
120 if self.is_connected: break
122 if not self.is_connected:
123 print 'no server available'
124 self.connect_event.set() # to finish start
125 self.server = 'ecdsa.org:50001:t'
132 if __name__ == "__main__":
134 config = simple_config.SimpleConfig({'verbose':True})
135 network = Network(config)