rewrote irc announcer so that shares locally received after announced on irc are...
authorForrest Voight <forrest@forre.st>
Tue, 20 Mar 2012 02:10:29 +0000 (22:10 -0400)
committerForrest Voight <forrest@forre.st>
Tue, 20 Mar 2012 05:07:41 +0000 (01:07 -0400)
p2pool/main.py
p2pool/networks.py

index 10a2c68..6989ef6 100644 (file)
@@ -696,7 +696,7 @@ def main(args, net, datadir_path, merged_urls, worker_endpoint):
             from twisted.words.protocols import irc
             class IRCClient(irc.IRCClient):
                 nickname = 'p2pool%02i' % (random.randrange(100),)
-                channel = '#p2pool' if net.NAME == 'bitcoin' else '#p2pool-alt'
+                channel = net.ANNOUNCE_CHANNEL
                 def lineReceived(self, line):
                     print repr(line)
                     irc.IRCClient.lineReceived(self, line)
@@ -704,17 +704,23 @@ def main(args, net, datadir_path, merged_urls, worker_endpoint):
                     irc.IRCClient.signedOn(self)
                     self.factory.resetDelay()
                     self.join(self.channel)
-                    self.watch_id = tracker.verified.added.watch(self._new_share)
-                    self.announced_hashes = set()
-                    self.delayed_messages = {}
+                    @defer.inlineCallbacks
+                    def new_share(share):
+                        if share.pow_hash <= share.header['bits'].target and abs(share.timestamp - time.time()) < 10*60:
+                            yield deferral.sleep(random.expovariate(1/60))
+                            message = '\x02%s BLOCK FOUND by %s! %s%064x' % (net.NAME.upper(), bitcoin_data.script2_to_address(share.new_script, net.PARENT), net.PARENT.BLOCK_EXPLORER_URL_PREFIX, share.header_hash)
+                            if message not in self.recent_messages:
+                                self.say(self.channel, message)
+                                self._remember_message(message)
+                    self.watch_id = tracker.verified.added.watch(new_share)
+                    self.recent_messages = []
+                def _remember_message(self, message):
+                    self.recent_messages.append(message)
+                    while len(self.recent_message) > 100:
+                        self.recent_messages.pop(0)
                 def privmsg(self, user, channel, message):
-                    if channel == self.channel and message in self.delayed_messages:
-                        self.delayed_messages.pop(message).cancel()
-                def _new_share(self, share):
-                    if share.pow_hash <= share.header['bits'].target and share.header_hash not in self.announced_hashes and abs(share.timestamp - time.time()) < 10*60:
-                        self.announced_hashes.add(share.header_hash)
-                        message = '\x02%s BLOCK FOUND by %s! %s%064x' % (net.NAME.upper(), bitcoin_data.script2_to_address(share.new_script, net.PARENT), net.PARENT.BLOCK_EXPLORER_URL_PREFIX, share.header_hash)
-                        self.delayed_messages[message] = reactor.callLater(random.expovariate(1/60), lambda: (self.say(self.channel, message), self.delayed_messages.pop(message)))
+                    if channel == self.channel:
+                        self._remember_message(message)
                 def connectionLost(self, reason):
                     tracker.verified.added.unwatch(self.watch_id)
                     print 'IRC connection lost:', reason.getErrorMessage()
index ca27b8c..936a08f 100644 (file)
@@ -22,6 +22,7 @@ nets = dict(
         PERSIST=True,
         WORKER_PORT=9332,
         BOOTSTRAP_ADDRS='74.220.242.6:9334 93.97.192.93 66.90.73.83 67.83.108.0 219.84.64.174 24.167.17.248 109.74.195.142 83.211.86.49 89.78.212.44 94.23.34.145 168.7.116.243 72.14.191.28 94.174.40.189:9344'.split(' '),
+        ANNOUNCE_CHANNEL='#p2pool',
     ),
     bitcoin_testnet=math.Object(
         PARENT=networks.nets['bitcoin_testnet'],
@@ -37,6 +38,7 @@ nets = dict(
         PERSIST=False,
         WORKER_PORT=19332,
         BOOTSTRAP_ADDRS='72.14.191.28'.split(' '),
+        ANNOUNCE_CHANNEL='#p2pool-alt',
     ),
     
     litecoin=math.Object(
@@ -53,6 +55,7 @@ nets = dict(
         PERSIST=True,
         WORKER_PORT=9327,
         BOOTSTRAP_ADDRS='76.26.53.101 124.205.120.178 190.195.79.161 173.167.113.73 82.161.65.210 67.83.108.0 78.101.67.239 78.100.161.252 87.58.117.233 78.100.162.223 216.239.45.4 78.101.131.221 72.14.191.28 97.81.163.217 69.126.183.240 219.84.64.174 78.101.119.27 89.211.228.244 178.152.122.30 172.16.0.3 76.26.53.101:51319'.split(' '),
+        ANNOUNCE_CHANNEL='#p2pool-alt',
     ),
     litecoin_testnet=math.Object(
         PARENT=networks.nets['litecoin_testnet'],
@@ -68,6 +71,7 @@ nets = dict(
         PERSIST=False,
         WORKER_PORT=19327,
         BOOTSTRAP_ADDRS='72.14.191.28'.split(' '),
+        ANNOUNCE_CHANNEL='#p2pool-alt',
     ),
 )
 for net_name, net in nets.iteritems():