import Queue
import threading
import time

from bmconfigparser import BMConfigParser
from debug import logger
from helper_threading import StoppableThread
from network.bmproto import BMProto
from network.connectionpool import BMConnectionPool
from network.udp import UDPSocket
import protocol
import state

class AnnounceThread(threading.Thread, StoppableThread):
    def __init__(self):
        threading.Thread.__init__(self, name="AnnounceThread")
        self.initStop()
        self.name = "AnnounceThread"
        BMConnectionPool()
        logger.info("init announce thread")

    def run(self):
        lastSelfAnnounced = 0
        while not self._stopped and state.shutdown == 0:
            processed = 0
            if lastSelfAnnounced < time.time() - UDPSocket.announceInterval:
                self.announceSelf()
                lastSelfAnnounced = time.time()
            if processed == 0:
                self.stop.wait(10)

    def announceSelf(self):
        for connection in BMConnectionPool().udpSockets.values():
            for stream in state.streamsInWhichIAmParticipating:
                addr = (stream, state.Peer('127.0.0.1', BMConfigParser().safeGetInt("bitmessagesettings", "port")), time.time())
                connection.writeQueue.put(BMProto.assembleAddr([addr]))

    def stopThread(self):
        super(AnnounceThread, self).stopThread()
