models.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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. SERVICE_CHOICES = [
  51. ('m', 'Modern network services, like Rizon.'),
  52. ('x', 'X bot, like UnderNet.'),
  53. ('n', 'None, bare server.'),
  54. ]
  55. # network_services = models.CharField(
  56. # max_length=1,
  57. # default='m',
  58. # choices=SERVICE_CHOICES,
  59. # )
  60. # mute = models.BooleanField(
  61. # default=False,
  62. # )
  63. class Meta:
  64. ordering = ['name']
  65. def get_absolute_url(self):
  66. from django.urls import reverse
  67. return reverse('rotbot.views.network', args=[str(self.id)])
  68. # Try this in the template: <a href="{{ object.get_absolute_url }}">{{ object.name }}</a>
  69. def __str__(self):
  70. return self.name
  71. class Host(models.Model):
  72. network = models.ForeignKey(
  73. 'Network',
  74. on_delete=models.CASCADE,
  75. related_name="host",
  76. related_query_name="hosts",
  77. )
  78. address = models.CharField(
  79. max_length=200,
  80. unique=True,
  81. validators=[MaxLengthValidator(200)],
  82. )
  83. port = models.PositiveSmallIntegerField(
  84. default = 6697,
  85. validators=[MaxValueValidator(65535)],
  86. )
  87. ssl = models.BooleanField(
  88. default=True,
  89. )
  90. connection_attempts = models.PositiveIntegerField(
  91. default=0,
  92. )
  93. connection_succeeds = models.PositiveIntegerField(
  94. default=0,
  95. )
  96. class Meta:
  97. order_with_respect_to = 'network'
  98. unique_together = ['address', 'port']
  99. @property
  100. def connect_string(self):
  101. return '%s:%s' % (self.address, self.port)
  102. def __str__(self):
  103. return '%s:%s' % (self.address, self.port)
  104. class Channel(models.Model):
  105. network = models.ForeignKey(
  106. 'Network',
  107. on_delete=models.PROTECT,
  108. related_name="channel",
  109. related_query_name="channels",
  110. )
  111. name = models.CharField(
  112. max_length=64,
  113. )
  114. autojoin = models.BooleanField(
  115. default=False,
  116. null=True,
  117. )
  118. key = models.CharField(
  119. max_length=32,
  120. null=True,
  121. )
  122. def __str__(self):
  123. return '%s/$s' % (self.network, self.name)
  124. class User(models.Model):
  125. network = models.ForeignKey(
  126. 'Network',
  127. on_delete=models.PROTECT,
  128. )
  129. name = models.CharField(
  130. max_length=31
  131. )
  132. aliasses = models.ManyToManyField('self')
  133. class Join(models.Model):
  134. network = models.ForeignKey(
  135. 'Network',
  136. on_delete=models.PROTECT,
  137. )
  138. channel = models.ForeignKey(
  139. 'Channel',
  140. on_delete=models.PROTECT,
  141. )
  142. user = models.ForeignKey(
  143. 'User',
  144. on_delete=models.PROTECT,
  145. )
  146. amount = models.PositiveIntegerField(
  147. default=0,
  148. )
  149. class Message(models.Model):
  150. network = models.ForeignKey(
  151. 'Network',
  152. on_delete=models.PROTECT,
  153. )
  154. channel = models.ForeignKey(
  155. 'Channel',
  156. on_delete=models.PROTECT,
  157. )
  158. user = models.ForeignKey(
  159. 'User',
  160. on_delete=models.PROTECT,
  161. )
  162. amount = models.PositiveIntegerField(
  163. default=0,
  164. )
  165. TYPE_CHOICES = [
  166. ('m', 'Message'),
  167. ('a', 'Action'),
  168. ('n', 'Notice'),
  169. ]
  170. type = models.CharField(
  171. max_length=1,
  172. choices=TYPE_CHOICES,
  173. )
  174. class Kick(models.Model):
  175. network = models.ForeignKey(
  176. 'Network',
  177. on_delete=models.PROTECT,
  178. )
  179. channel = models.ForeignKey(
  180. 'Channel',
  181. on_delete=models.PROTECT,
  182. )
  183. kicker = models.ForeignKey(
  184. 'User',
  185. on_delete=models.PROTECT,
  186. related_name='kicker',
  187. )
  188. kicked = models.ForeignKey(
  189. 'User',
  190. on_delete=models.PROTECT,
  191. related_name='kicked',
  192. )
  193. amount = models.PositiveIntegerField(
  194. default=0,
  195. )