1
0

models.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. from django.db import models
  2. from django.core.validators import validate_unicode_slug, MaxLengthValidator, MaxValueValidator, URLValidator
  3. # Create your models here.
  4. class Network(models.Model):
  5. name = models.CharField(
  6. max_length=40,
  7. unique=True,
  8. validators=[MaxLengthValidator(40)],
  9. )
  10. slug = models.SlugField(
  11. db_index=True,
  12. unique=True,
  13. validators=[validate_unicode_slug],
  14. )
  15. nickname = models.CharField(
  16. max_length=31,
  17. default='RotBot',
  18. validators=[MaxLengthValidator(31)],
  19. )
  20. username = models.CharField(
  21. max_length=31,
  22. default='pyRot',
  23. validators=[MaxLengthValidator(31)],
  24. )
  25. password = models.CharField(
  26. null=True,
  27. blank=True,
  28. max_length=31,
  29. validators=[MaxLengthValidator(31)],
  30. )
  31. mail = models.EmailField()
  32. home_channel = models.CharField(
  33. max_length=64,
  34. default='#RotBot',
  35. validators=[MaxLengthValidator(64)],
  36. )
  37. command_character = models.CharField(
  38. max_length=1,
  39. default='!',
  40. validators=[MaxLengthValidator(1)],
  41. )
  42. help_character = models.CharField(
  43. max_length=1,
  44. default='@',
  45. validators=[MaxLengthValidator(1)],
  46. )
  47. enabled = models.BooleanField(
  48. default=True,
  49. )
  50. class Meta:
  51. ordering = ['name']
  52. def get_absolute_url(self):
  53. from django.urls import reverse
  54. return reverse('rotbot.views.network', args=[str(self.id)])
  55. # Try this in the template: <a href="{{ object.get_absolute_url }}">{{ object.name }}</a>
  56. def __str__(self):
  57. return self.name
  58. class Host(models.Model):
  59. network = models.ForeignKey(
  60. 'Network',
  61. on_delete=models.CASCADE,
  62. related_name="host",
  63. related_query_name="hosts",
  64. )
  65. address = models.CharField(
  66. max_length=200,
  67. unique=True,
  68. validators=[MaxLengthValidator(200)],
  69. )
  70. port = models.PositiveSmallIntegerField(
  71. default = 6697,
  72. validators=[MaxValueValidator(65535)],
  73. )
  74. ssl = models.BooleanField(
  75. default=True,
  76. )
  77. connection_attempts = models.PositiveIntegerField(
  78. default=0,
  79. )
  80. connection_succeeds = models.PositiveIntegerField(
  81. default=0,
  82. )
  83. class Meta:
  84. order_with_respect_to = 'network'
  85. unique_together = ['address', 'port']
  86. @property
  87. def connect_string(self):
  88. return '%s:%s' % (self.address, self.port)
  89. def __str__(self):
  90. return '%s:%s' % (self.address, self.port)
  91. class Channel(models.Model):
  92. network = models.ForeignKey(
  93. 'Network',
  94. on_delete=models.PROTECT,
  95. related_name="channel",
  96. related_query_name="channels",
  97. )
  98. name = models.CharField(
  99. max_length=64,
  100. )
  101. autojoin = models.BooleanField(
  102. default=False,
  103. null=True,
  104. )
  105. key = models.CharField(
  106. max_length=32,
  107. null=True,
  108. )
  109. def __str__(self):
  110. return '%s/$s' % (self.network, self.name)
  111. class User(models.Model):
  112. network = models.ForeignKey(
  113. 'Network',
  114. on_delete=models.PROTECT,
  115. )
  116. name = models.CharField(
  117. max_length=31
  118. )
  119. aliasses = models.ManyToManyField('self')
  120. class Join(models.Model):
  121. network = models.ForeignKey(
  122. 'Network',
  123. on_delete=models.PROTECT,
  124. )
  125. channel = models.ForeignKey(
  126. 'Channel',
  127. on_delete=models.PROTECT,
  128. )
  129. user = models.ForeignKey(
  130. 'User',
  131. on_delete=models.PROTECT,
  132. )
  133. amount = models.PositiveIntegerField(
  134. default=0,
  135. )
  136. class Message(models.Model):
  137. network = models.ForeignKey(
  138. 'Network',
  139. on_delete=models.PROTECT,
  140. )
  141. channel = models.ForeignKey(
  142. 'Channel',
  143. on_delete=models.PROTECT,
  144. )
  145. user = models.ForeignKey(
  146. 'User',
  147. on_delete=models.PROTECT,
  148. )
  149. amount = models.PositiveIntegerField(
  150. default=0,
  151. )
  152. TYPE_CHOICES = [
  153. ('m', 'Message'),
  154. ('a', 'Action'),
  155. ('n', 'Notice'),
  156. ]
  157. type = models.CharField(
  158. max_length=1,
  159. choices=TYPE_CHOICES,
  160. )
  161. class Kick(models.Model):
  162. network = models.ForeignKey(
  163. 'Network',
  164. on_delete=models.PROTECT,
  165. )
  166. channel = models.ForeignKey(
  167. 'Channel',
  168. on_delete=models.PROTECT,
  169. )
  170. kicker = models.ForeignKey(
  171. 'User',
  172. on_delete=models.PROTECT,
  173. related_name='kicker',
  174. )
  175. kicked = models.ForeignKey(
  176. 'User',
  177. on_delete=models.PROTECT,
  178. related_name='kicked',
  179. )
  180. amount = models.PositiveIntegerField(
  181. default=0,
  182. )