onlines.py 1.3 KB

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