InternetWatcher.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. # by Greg Hazel
  2. import random
  3. from twisted.internet import task
  4. from BTL.obsoletepythonsupport import set
  5. class InternetSubscriber(object):
  6. def internet_active(self):
  7. pass
  8. def try_one_connection(self):
  9. pass
  10. class InternetWatcher(object):
  11. def __init__(self, rawserver):
  12. self.rawserver = rawserver
  13. old_connectionMade = rawserver.connectionMade
  14. def connectionMade(s):
  15. if rawserver.connections == 0:
  16. self._first_connection()
  17. old_connectionMade(s)
  18. rawserver.connectionMade = connectionMade
  19. rawserver.internet_watcher = self
  20. self.subscribers = set()
  21. self.internet_watcher = task.LoopingCall(self._internet_watch)
  22. self.internet_watcher.start(5)
  23. def add_subscriber(self, s):
  24. self.subscribers.add(s)
  25. def remove_subscriber(self, s):
  26. self.subscribers.remove(s)
  27. def _internet_watch(self):
  28. if self.rawserver.connections != 0 or not self.subscribers:
  29. return
  30. l = list(self.subscribers)
  31. random.shuffle(l)
  32. for s in l:
  33. if s.try_one_connection():
  34. break
  35. def _first_connection(self):
  36. for s in self.subscribers:
  37. s.internet_active()
  38. def get_internet_watcher(rawserver):
  39. if not hasattr(rawserver, "internet_watcher"):
  40. InternetWatcher(rawserver)
  41. return rawserver.internet_watcher