onlines.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from datetime import timedelta
  2. from django.core.cache import cache
  3. from django.utils import timezone
  4. from misago.models import Session
  5. class MembersOnline(object):
  6. def __init__(self, monitor, frequency=180):
  7. self.recounted = False
  8. self.monitor = monitor
  9. self.frequency = frequency
  10. self._members = int(monitor['online_members'])
  11. self._all = int(monitor['online_all'])
  12. self._om = self._members
  13. self._oa = self._all
  14. if (monitor.expired('online_all', frequency) or
  15. monitor.expired('online_members', frequency)):
  16. self.count_sessions()
  17. self.recounted = False
  18. def count_sessions(self):
  19. if not self.recounted:
  20. self.recounted = True
  21. queryset = Session.objects.filter(matched=True).filter(crawler__isnull=True).filter(last__gte=timezone.now() - timedelta(seconds=self.frequency))
  22. self._all = queryset.count()
  23. self._members = queryset.filter(user__isnull=False).count()
  24. cache.delete_many(['team_users_online', 'ranks_online'])
  25. def new_session(self):
  26. self._all += 1
  27. def sign_in(self):
  28. self._members += 1
  29. def sign_out(self):
  30. if self._members:
  31. self._members -= 1
  32. def all(self):
  33. return self._all
  34. def members(self):
  35. return self._members
  36. def sync(self):
  37. if self._members != self._om:
  38. self.monitor['online_members'] = self._members
  39. if self._all != self._oa:
  40. self.monitor['online_all'] = self._all
  41. def stats(self):
  42. return {
  43. 'members': self.members(),
  44. 'all': self.all(),
  45. }