models.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. from django.db import models
  2. from django.core.validators import validate_unicode_slug, MaxLengthValidator, MaxValueValidator, URLValidator
  3. class Network(models.Model):
  4. name = models.CharField(
  5. max_length=40,
  6. unique=True,
  7. validators=[MaxLengthValidator(40)],
  8. )
  9. slug = models.SlugField(
  10. db_index=True,
  11. unique=True,
  12. validators=[validate_unicode_slug],
  13. )
  14. nickname = models.CharField(
  15. max_length=31,
  16. default='RotBot',
  17. validators=[MaxLengthValidator(31)],
  18. )
  19. username = models.CharField(
  20. max_length=31,
  21. default='pyRot',
  22. validators=[MaxLengthValidator(31)],
  23. )
  24. password = models.CharField(
  25. null=True,
  26. blank=True,
  27. max_length=31,
  28. validators=[MaxLengthValidator(31)],
  29. )
  30. mail = models.EmailField()
  31. home_channel = models.CharField(
  32. max_length=64,
  33. default='#RotBot',
  34. validators=[MaxLengthValidator(64)],
  35. )
  36. command_character = models.CharField(
  37. max_length=1,
  38. default='!',
  39. validators=[MaxLengthValidator(1)],
  40. )
  41. help_character = models.CharField(
  42. max_length=1,
  43. default='@',
  44. validators=[MaxLengthValidator(1)],
  45. )
  46. enabled = models.BooleanField(
  47. default=True,
  48. )
  49. SERVICE_CHOICES = [
  50. ('m', 'Modern network services, like Rizon.'),
  51. ('x', 'X bot, like UnderNet.'),
  52. ('n', 'None, bare server.'),
  53. ]
  54. # network_services = models.CharField(
  55. # max_length=1,
  56. # default='m',
  57. # choices=SERVICE_CHOICES,
  58. # )
  59. # mute = models.BooleanField(
  60. # default=False,
  61. # )
  62. class Meta:
  63. ordering = ['name']
  64. def get_absolute_url(self):
  65. from django.urls import reverse
  66. return reverse('rotbot.views.network', args=[str(self.id)])
  67. # Try this in the template: <a href="{{ object.get_absolute_url }}">{{ object.name }}</a>
  68. def __str__(self):
  69. return self.name
  70. class Host(models.Model):
  71. network = models.ForeignKey(
  72. 'Network',
  73. on_delete=models.CASCADE,
  74. related_name="host",
  75. related_query_name="hosts",
  76. )
  77. address = models.CharField(
  78. max_length=200,
  79. unique=True,
  80. validators=[MaxLengthValidator(200)],
  81. )
  82. port = models.PositiveSmallIntegerField(
  83. default = 6697,
  84. validators=[MaxValueValidator(65535)],
  85. )
  86. ssl = models.BooleanField(
  87. default=True,
  88. )
  89. connection_attempts = models.PositiveIntegerField(
  90. default=0,
  91. )
  92. connection_succeeds = models.PositiveIntegerField(
  93. default=0,
  94. )
  95. class Meta:
  96. order_with_respect_to = 'network'
  97. unique_together = ['address', 'port']
  98. @property
  99. def connect_string(self):
  100. return '%s:%s' % (self.address, self.port)
  101. def __str__(self):
  102. return '%s:%s' % (self.address, self.port)
  103. class Channel(models.Model):
  104. slug = models.SlugField(
  105. unique=True,
  106. validators=[validate_unicode_slug],
  107. )
  108. network = models.ForeignKey(
  109. 'Network',
  110. on_delete=models.PROTECT,
  111. related_name="channel",
  112. related_query_name="channels",
  113. )
  114. name = models.CharField(
  115. max_length=64,
  116. )
  117. autojoin = models.BooleanField(
  118. default=False,
  119. #null=True,
  120. #blank=False
  121. )
  122. key = models.CharField(
  123. max_length=32,
  124. )
  125. games = models.BooleanField(
  126. default=False,
  127. )
  128. statistic_commands = models.BooleanField(
  129. default=False,
  130. )
  131. EVENT_TYPE_CHOICES = [
  132. #('pm', 'private message'),
  133. #('pa', 'private action'),
  134. #('pn', 'private notice'),
  135. ('cm', 'channel message'),
  136. ('ca', 'channel action'),
  137. ('cn', 'channel notice'),
  138. ('ct', 'channel topic'),
  139. ('ck', 'channel password'),
  140. ('ci', 'channel invite'),
  141. ('cj', 'channel join'),
  142. ('cp', 'channel part'),
  143. ('ck', 'channel kick'),
  144. ('kd', 'channel kicked'),
  145. ( 'mc', 'mode change'),
  146. #('nc', 'nick change'),
  147. #('sq', 'quit'),
  148. ]
  149. last_event_type = models.CharField(
  150. max_length=2,
  151. choices=EVENT_TYPE_CHOICES,
  152. )
  153. last_event_datetime = models.DateTimeField(
  154. auto_now=True,
  155. )
  156. last_event_channel = models.ForeignKey(
  157. 'Channel',
  158. on_delete=models.CASCADE,
  159. null=True,
  160. )
  161. last_event_user = models.ForeignKey(
  162. 'User',
  163. on_delete=models.CASCADE,
  164. null=True,
  165. )
  166. last_event_subject = models.ForeignKey(
  167. 'User',
  168. on_delete=models.CASCADE,
  169. null=True,
  170. related_name='channel_subject',
  171. )
  172. last_event_content = models.CharField(
  173. null=True,
  174. max_length = 307,
  175. )
  176. class Meta:
  177. unique_together = ['network', 'name']
  178. def __str__(self):
  179. return '%s/$s' % (self.network, self.name)
  180. class TempChannelKey(models.Model):
  181. key = models.CharField(
  182. max_length=40,
  183. unique=True,
  184. )
  185. network = models.ForeignKey(
  186. 'Network',
  187. on_delete=models.CASCADE,
  188. )
  189. channel = models.ForeignKey(
  190. 'Channel',
  191. on_delete=models.CASCADE,
  192. )
  193. created = models.DateTimeField(
  194. auto_now_add=True,
  195. )
  196. class User(models.Model):
  197. slug = models.SlugField(
  198. unique=True,
  199. validators=[validate_unicode_slug],
  200. )
  201. network = models.ForeignKey(
  202. 'Network',
  203. on_delete=models.PROTECT,
  204. )
  205. name = models.CharField(
  206. max_length=31
  207. )
  208. aliasses = models.ManyToManyField('self')
  209. EVENT_TYPE_CHOICES = [
  210. ('pm', 'private message'),
  211. ('pa', 'private action'),
  212. ('pn', 'private notice'),
  213. ('cm', 'channel message'),
  214. ('ca', 'channel action'),
  215. ('cn', 'channel notice'),
  216. ('ct', 'channel topic'),
  217. ('ck', 'channel password'),
  218. ('ci', 'channel invite'),
  219. ('cj', 'channel join'),
  220. ('cp', 'channel part'),
  221. ('ck', 'channel kick'),
  222. ('kd', 'channel kicked'),
  223. ('mc', 'mode change'),
  224. ('nc', 'nick change'),
  225. ('sq', 'quit'),
  226. ]
  227. last_event_type = models.CharField(
  228. max_length=2,
  229. choices=EVENT_TYPE_CHOICES,
  230. )
  231. last_event_datetime = models.DateTimeField(
  232. auto_now=True,
  233. )
  234. last_event_channel = models.ForeignKey(
  235. 'Channel',
  236. on_delete=models.CASCADE,
  237. null=True,
  238. )
  239. last_event_user = models.ForeignKey(
  240. 'User',
  241. on_delete=models.CASCADE,
  242. null=True,
  243. )
  244. last_event_subject = models.ForeignKey(
  245. 'User',
  246. on_delete=models.CASCADE,
  247. null=True,
  248. related_name='user_subject',
  249. )
  250. last_event_content = models.CharField(
  251. null=True,
  252. max_length = 307,
  253. )
  254. class Meta:
  255. unique_together = ['network', 'name']
  256. class Join(models.Model):
  257. network = models.ForeignKey(
  258. 'Network',
  259. on_delete=models.PROTECT,
  260. )
  261. channel = models.ForeignKey(
  262. 'Channel',
  263. on_delete=models.PROTECT,
  264. )
  265. user = models.ForeignKey(
  266. 'User',
  267. on_delete=models.PROTECT,
  268. )
  269. amount = models.PositiveIntegerField(
  270. default=0,
  271. )
  272. class Meta:
  273. unique_together = ['network', 'channel', 'user']
  274. class Message(models.Model):
  275. network = models.ForeignKey(
  276. 'Network',
  277. on_delete=models.PROTECT,
  278. )
  279. channel = models.ForeignKey(
  280. 'Channel',
  281. on_delete=models.PROTECT,
  282. )
  283. user = models.ForeignKey(
  284. 'User',
  285. on_delete=models.PROTECT,
  286. )
  287. amount = models.PositiveIntegerField(
  288. default=0,
  289. )
  290. class Meta:
  291. unique_together = ['network', 'channel', 'user']
  292. class Action(models.Model):
  293. network = models.ForeignKey(
  294. 'Network',
  295. on_delete=models.PROTECT,
  296. )
  297. channel = models.ForeignKey(
  298. 'Channel',
  299. on_delete=models.PROTECT,
  300. )
  301. user = models.ForeignKey(
  302. 'User',
  303. on_delete=models.PROTECT,
  304. )
  305. amount = models.PositiveIntegerField(
  306. default=0,
  307. )
  308. class Meta:
  309. unique_together = ['network', 'channel', 'user']
  310. class Notice(models.Model):
  311. network = models.ForeignKey(
  312. 'Network',
  313. on_delete=models.PROTECT,
  314. )
  315. channel = models.ForeignKey(
  316. 'Channel',
  317. on_delete=models.PROTECT,
  318. )
  319. user = models.ForeignKey(
  320. 'User',
  321. on_delete=models.PROTECT,
  322. )
  323. amount = models.PositiveIntegerField(
  324. default=0,
  325. )
  326. class Meta:
  327. unique_together = ['network', 'channel', 'user']
  328. class Kick(models.Model):
  329. network = models.ForeignKey(
  330. 'Network',
  331. on_delete=models.PROTECT,
  332. )
  333. channel = models.ForeignKey(
  334. 'Channel',
  335. on_delete=models.PROTECT,
  336. )
  337. kicker = models.ForeignKey(
  338. 'User',
  339. on_delete=models.PROTECT,
  340. related_name='kicker',
  341. )
  342. kicked = models.ForeignKey(
  343. 'User',
  344. on_delete=models.PROTECT,
  345. related_name='kicked',
  346. )
  347. amount = models.PositiveIntegerField(
  348. default=0,
  349. )
  350. class Meta:
  351. unique_together = ['network', 'channel', 'kicker', 'kicked']