# Path: dwitter/models.py
# class Dweet(models.Model):
#     code = models.TextField()
#     posted = models.DateTimeField(db_index=True)
#     reply_to = models.ForeignKey("self", on_delete=models.DO_NOTHING,
#                                  related_name="remixes", null=True, blank=True)
# 
#     likes = models.ManyToManyField(User, related_name="liked", blank=True)
#     hotness = models.FloatField(default=1.0, db_index=True)
#     deleted = models.BooleanField(default=False)
# 
#     author = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user),
#                                null=True, blank=True)
# 
#     objects = NotDeletedDweetManager()
#     with_deleted = models.Manager()
# 
#     class Meta:
#         ordering = ('-posted',)
# 
#     def delete(self):
#         self.deleted = True
#         self.save()
# 
#     def save(self, *args, **kwargs):
#         self.calculate_hotness((self.pk is None))
#         super(Dweet, self).save(*args, **kwargs)
# 
#     @cached_property
#     def top_comment(self):
#         """
#         Return the top comment. This is mainly a caching optimization to avoid queries
#         """
#         return self.comments.first()
# 
#     @cached_property
#     def dweet_length(self):
#         return length_of_code(self.code)
# 
#     @cached_property
#     def has_sticky_comment(self):
#         """
#         True when first comment should be stickied (first comment author == dweet author)
#         """
#         if self.top_comment is None:
#             return False
#         return self.top_comment.author == self.author
# 
#     def __str__(self):
#         return 'd/' + str(self.id) + ' (' + self.author.username + ')'
# 
#     def calculate_hotness(self, is_new):
#         """
#         Hotness is inspired by the Hackernews ranking algorithm
#         Read more here:
#         https://medium.com/hacking-and-gonzo/how-hacker-news-ranking-algorithm-works-1d9b0cf2c08d
#         """
#         def epoch_seconds(date):
#             epoch = datetime(2015, 5, 5)  # arbitrary start date before Dwitter existed
#             naive = date.replace(tzinfo=None)
#             td = naive - epoch
#             return td.days * 86400 + td.seconds + (float(td.microseconds) / 1000000)
# 
#         likes = 1
#         if not is_new:
#             likes = max(self.likes.count(), 1)
# 
#         order = log(likes, 2)
#         # 86400 seconds = 24 hours.
#         # So for every log(2) likes on a dweet, its effective
#         # "posted time" moves 24 forward
#         # In other words, it takes log2(likes) * 24hrs before
#         # a dweet with a single like beat yours
#         self.hotness = round(order + epoch_seconds(self.posted)/86400, 7)
# 
# Path: dwitter/webhooks.py
# class Webhooks:
#     @staticmethod
#     def send_discord_message(message):
#         if(not hasattr(settings, 'DISCORD_WEBHOOK')):
#             return  # No discord webhook set up
# 
#         post_data = {'content': message}
# 
#         try:
#             requests.post(settings.DISCORD_WEBHOOK, json=post_data)
#         except Exception:
#             return  # Fail silently, webhooks will stop rather than breaking the site
# 
#     @staticmethod
#     def new_dweet_notifications(dweet):
#         authorname = dweet.author.username
#         msg = ('[u/%s](https://www.dwitter.net/u/%s) posted new dweet ' %
#                (authorname, authorname) +
#                '[d/%d](https://www.dwitter.net/d/%s):\n```js\n%s\n```' %
#                (dweet.id, dweet.id, dweet.code))
# 
#         Webhooks.send_discord_message(msg)
# 
#     @staticmethod
#     def send_mod_chat_message(message):
#         if(not hasattr(settings, 'DISCORD_MOD_CHAT_WEBHOOK')):
#             return False  # No discord webhook set up
# 
#         try:
#             response = requests.post(settings.DISCORD_MOD_CHAT_WEBHOOK, json={
#                 'content': message,
#             })
# 
#             # Discord should return the success code 204
#             return (response.status_code == 204)
#         except Exception:
#             return False


from django.dispatch import receiver
from django.db.models.signals import post_save
from .models import Dweet
from .webhooks import Webhooks


@receiver(post_save, sender=Dweet, dispatch_uid="new_dweet_notifications_signal")
def new_dweet_notifications(sender, instance, created, **kwargs):
    if(created):

# Path: dwitter/models.py
# class Dweet(models.Model):
#     code = models.TextField()
#     posted = models.DateTimeField(db_index=True)
#     reply_to = models.ForeignKey("self", on_delete=models.DO_NOTHING,
#                                  related_name="remixes", null=True, blank=True)
# 
#     likes = models.ManyToManyField(User, related_name="liked", blank=True)
#     hotness = models.FloatField(default=1.0, db_index=True)
#     deleted = models.BooleanField(default=False)
# 
#     author = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user),
#                                null=True, blank=True)
# 
#     objects = NotDeletedDweetManager()
#     with_deleted = models.Manager()
# 
#     class Meta:
#         ordering = ('-posted',)
# 
#     def delete(self):
#         self.deleted = True
#         self.save()
# 
#     def save(self, *args, **kwargs):
#         self.calculate_hotness((self.pk is None))
#         super(Dweet, self).save(*args, **kwargs)
# 
#     @cached_property
#     def top_comment(self):
#         """
#         Return the top comment. This is mainly a caching optimization to avoid queries
#         """
#         return self.comments.first()
# 
#     @cached_property
#     def dweet_length(self):
#         return length_of_code(self.code)
# 
#     @cached_property
#     def has_sticky_comment(self):
#         """
#         True when first comment should be stickied (first comment author == dweet author)
#         """
#         if self.top_comment is None:
#             return False
#         return self.top_comment.author == self.author
# 
#     def __str__(self):
#         return 'd/' + str(self.id) + ' (' + self.author.username + ')'
# 
#     def calculate_hotness(self, is_new):
#         """
#         Hotness is inspired by the Hackernews ranking algorithm
#         Read more here:
#         https://medium.com/hacking-and-gonzo/how-hacker-news-ranking-algorithm-works-1d9b0cf2c08d
#         """
#         def epoch_seconds(date):
#             epoch = datetime(2015, 5, 5)  # arbitrary start date before Dwitter existed
#             naive = date.replace(tzinfo=None)
#             td = naive - epoch
#             return td.days * 86400 + td.seconds + (float(td.microseconds) / 1000000)
# 
#         likes = 1
#         if not is_new:
#             likes = max(self.likes.count(), 1)
# 
#         order = log(likes, 2)
#         # 86400 seconds = 24 hours.
#         # So for every log(2) likes on a dweet, its effective
#         # "posted time" moves 24 forward
#         # In other words, it takes log2(likes) * 24hrs before
#         # a dweet with a single like beat yours
#         self.hotness = round(order + epoch_seconds(self.posted)/86400, 7)
# 
# Path: dwitter/webhooks.py
# class Webhooks:
#     @staticmethod
#     def send_discord_message(message):
#         if(not hasattr(settings, 'DISCORD_WEBHOOK')):
#             return  # No discord webhook set up
# 
#         post_data = {'content': message}
# 
#         try:
#             requests.post(settings.DISCORD_WEBHOOK, json=post_data)
#         except Exception:
#             return  # Fail silently, webhooks will stop rather than breaking the site
# 
#     @staticmethod
#     def new_dweet_notifications(dweet):
#         authorname = dweet.author.username
#         msg = ('[u/%s](https://www.dwitter.net/u/%s) posted new dweet ' %
#                (authorname, authorname) +
#                '[d/%d](https://www.dwitter.net/d/%s):\n```js\n%s\n```' %
#                (dweet.id, dweet.id, dweet.code))
# 
#         Webhooks.send_discord_message(msg)
# 
#     @staticmethod
#     def send_mod_chat_message(message):
#         if(not hasattr(settings, 'DISCORD_MOD_CHAT_WEBHOOK')):
#             return False  # No discord webhook set up
# 
#         try:
#             response = requests.post(settings.DISCORD_MOD_CHAT_WEBHOOK, json={
#                 'content': message,
#             })
# 
#             # Discord should return the success code 204
#             return (response.status_code == 204)
#         except Exception:
#             return False


# Path: dwitter/signals.py
from django.dispatch import receiver
from django.db.models.signals import post_save
from .models import Dweet
from .webhooks import Webhooks



@receiver(post_save, sender=Dweet, dispatch_uid="new_dweet_notifications_signal")
def new_dweet_notifications(sender, instance, created, **kwargs):
    if(created):

        Webhooks.new_dweet_notifications(instance)