diff options
Diffstat (limited to 'pydis_site/apps/api/models/bot')
| -rw-r--r-- | pydis_site/apps/api/models/bot/infraction.py | 6 | ||||
| -rw-r--r-- | pydis_site/apps/api/models/bot/message.py | 16 | ||||
| -rw-r--r-- | pydis_site/apps/api/models/bot/metricity.py | 28 | 
3 files changed, 40 insertions, 10 deletions
diff --git a/pydis_site/apps/api/models/bot/infraction.py b/pydis_site/apps/api/models/bot/infraction.py index c9303024..218ee5ec 100644 --- a/pydis_site/apps/api/models/bot/infraction.py +++ b/pydis_site/apps/api/models/bot/infraction.py @@ -23,6 +23,12 @@ class Infraction(ModelReprMixin, models.Model):          default=timezone.now,          help_text="The date and time of the creation of this infraction."      ) +    last_applied = models.DateTimeField( +        # This default is for backwards compatibility with bot versions +        # that don't explicitly give a value. +        default=timezone.now, +        help_text="The date and time of when this infraction was last applied." +    )      expires_at = models.DateTimeField(          null=True,          help_text=( diff --git a/pydis_site/apps/api/models/bot/message.py b/pydis_site/apps/api/models/bot/message.py index bab3368d..89ae27e4 100644 --- a/pydis_site/apps/api/models/bot/message.py +++ b/pydis_site/apps/api/models/bot/message.py @@ -1,13 +1,11 @@ -from datetime import datetime +import datetime  from django.contrib.postgres import fields as pgfields  from django.core.validators import MinValueValidator  from django.db import models -from django.utils import timezone  from pydis_site.apps.api.models.bot.user import User  from pydis_site.apps.api.models.mixins import ModelReprMixin -from pydis_site.apps.api.models.utils import validate_embed  class Message(ModelReprMixin, models.Model): @@ -48,9 +46,7 @@ class Message(ModelReprMixin, models.Model):          blank=True      )      embeds = pgfields.ArrayField( -        models.JSONField( -            validators=(validate_embed,) -        ), +        models.JSONField(),          blank=True,          help_text="Embeds attached to this message."      ) @@ -63,11 +59,11 @@ class Message(ModelReprMixin, models.Model):      )      @property -    def timestamp(self) -> datetime: +    def timestamp(self) -> datetime.datetime:          """Attribute that represents the message timestamp as derived from the snowflake id.""" -        tz_naive_datetime = datetime.utcfromtimestamp(((self.id >> 22) + 1420070400000) / 1000) -        tz_aware_datetime = timezone.make_aware(tz_naive_datetime, timezone=timezone.utc) -        return tz_aware_datetime +        return datetime.datetime.utcfromtimestamp( +            ((self.id >> 22) + 1420070400000) / 1000 +        ).replace(tzinfo=datetime.timezone.utc)      class Meta:          """Metadata provided for Django's ORM.""" diff --git a/pydis_site/apps/api/models/bot/metricity.py b/pydis_site/apps/api/models/bot/metricity.py index abd25ef0..f53dd33c 100644 --- a/pydis_site/apps/api/models/bot/metricity.py +++ b/pydis_site/apps/api/models/bot/metricity.py @@ -130,3 +130,31 @@ class Metricity:              raise NotFoundError()          return values + +    def total_messages_in_past_n_days( +        self, +        user_ids: list[str], +        days: int +    ) -> list[tuple[str, int]]: +        """ +        Query activity by a list of users in the past `days` days. + +        Returns a list of (user_id, message_count) tuples. +        """ +        self.cursor.execute( +            """ +            SELECT +                author_id, COUNT(*) +            FROM messages +            WHERE +                author_id IN %s +                AND NOT is_deleted +                AND channel_id NOT IN %s +                AND created_at > now() - interval '%s days' +            GROUP BY author_id +            """, +            [tuple(user_ids), EXCLUDE_CHANNELS, days] +        ) +        values = self.cursor.fetchall() + +        return values  |