1
0

models.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  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. EVENT_TYPE_CHOICES = [
  154. ('pm', 'private message'),
  155. ('pa', 'private action'),
  156. ('pn', 'private notice'),
  157. ('cm', 'channel message'),
  158. ('ca', 'channel action'),
  159. ('cn', 'channel notice'),
  160. ('ct', 'channel topic'),
  161. ('ck', 'channel password'),
  162. ('ci', 'channel invite'),
  163. ('cj', 'channel join'),
  164. ('cp', 'channel part'),
  165. ('ck', 'channel kick'),
  166. ('kd', 'channel kicked'),
  167. ('mc', 'mode change'),
  168. ('nc', 'nick change'),
  169. ('sq', 'quit'),
  170. ]
  171. last_event_type = models.CharField(
  172. max_length=2,
  173. choices=EVENT_TYPE_CHOICES,
  174. )
  175. last_event_datetime = models.DateTimeField(
  176. auto_now=True,
  177. )
  178. last_event_channel = models.ForeignKey(
  179. 'Channel',
  180. on_delete=models.CASCADE,
  181. null=True,
  182. )
  183. last_event_user = models.ForeignKey(
  184. 'User',
  185. on_delete=models.CASCADE,
  186. null=True,
  187. )
  188. last_event_subject = models.ForeignKey(
  189. 'User',
  190. on_delete=models.CASCADE,
  191. null=True,
  192. related_name='channel_subject',
  193. )
  194. last_event_content = models.CharField(
  195. null=True,
  196. max_length = 307,
  197. )
  198. class Meta:
  199. unique_together = ['network', 'name']
  200. def __str__(self):
  201. return '%s/$s' % (self.network, self.name)
  202. class TempChannelKey(models.Model):
  203. key = models.CharField(
  204. max_length=40,
  205. unique=True,
  206. )
  207. network = models.ForeignKey(
  208. 'Network',
  209. on_delete=models.CASCADE,
  210. )
  211. channel = models.ForeignKey(
  212. 'Channel',
  213. on_delete=models.CASCADE,
  214. )
  215. created = models.DateTimeField(
  216. auto_now_add=True,
  217. )
  218. class User(models.Model):
  219. slug = models.SlugField(
  220. unique=True,
  221. validators=[validate_unicode_slug],
  222. )
  223. network = models.ForeignKey(
  224. 'Network',
  225. on_delete=models.PROTECT,
  226. )
  227. name = models.CharField(
  228. max_length=31
  229. )
  230. aliasses = models.ManyToManyField('self')
  231. EVENT_TYPE_CHOICES = [
  232. ('pm', 'private message'),
  233. ('pa', 'private action'),
  234. ('pn', 'private notice'),
  235. ('cm', 'channel message'),
  236. ('ca', 'channel action'),
  237. ('cn', 'channel notice'),
  238. ('ct', 'channel topic'),
  239. ('ck', 'channel password'),
  240. ('ci', 'channel invite'),
  241. ('cj', 'channel join'),
  242. ('cp', 'channel part'),
  243. ('ck', 'channel kick'),
  244. ('kd', 'channel kicked'),
  245. ('mc', 'mode change'),
  246. ('nc', 'nick change'),
  247. ('sq', 'quit'),
  248. ]
  249. last_event_type = models.CharField(
  250. max_length=2,
  251. choices=EVENT_TYPE_CHOICES,
  252. )
  253. last_event_datetime = models.DateTimeField(
  254. auto_now=True,
  255. )
  256. last_event_channel = models.ForeignKey(
  257. 'Channel',
  258. on_delete=models.CASCADE,
  259. null=True,
  260. )
  261. last_event_user = models.ForeignKey(
  262. 'User',
  263. on_delete=models.CASCADE,
  264. null=True,
  265. )
  266. last_event_subject = models.ForeignKey(
  267. 'User',
  268. on_delete=models.CASCADE,
  269. null=True,
  270. related_name='user_subject',
  271. )
  272. last_event_content = models.CharField(
  273. null=True,
  274. max_length = 307,
  275. )
  276. class Meta:
  277. unique_together = ['network', 'name']
  278. class Join(models.Model):
  279. network = models.ForeignKey(
  280. 'Network',
  281. on_delete=models.PROTECT,
  282. )
  283. channel = models.ForeignKey(
  284. 'Channel',
  285. on_delete=models.PROTECT,
  286. )
  287. user = models.ForeignKey(
  288. 'User',
  289. on_delete=models.PROTECT,
  290. )
  291. amount = models.PositiveIntegerField(
  292. default=0,
  293. )
  294. class Meta:
  295. unique_together = ['network', 'channel', 'user']
  296. class Message(models.Model):
  297. network = models.ForeignKey(
  298. 'Network',
  299. on_delete=models.PROTECT,
  300. )
  301. channel = models.ForeignKey(
  302. 'Channel',
  303. on_delete=models.PROTECT,
  304. )
  305. user = models.ForeignKey(
  306. 'User',
  307. on_delete=models.PROTECT,
  308. )
  309. amount = models.PositiveIntegerField(
  310. default=0,
  311. )
  312. class Meta:
  313. unique_together = ['network', 'channel', 'user']
  314. class Action(models.Model):
  315. network = models.ForeignKey(
  316. 'Network',
  317. on_delete=models.PROTECT,
  318. )
  319. channel = models.ForeignKey(
  320. 'Channel',
  321. on_delete=models.PROTECT,
  322. )
  323. user = models.ForeignKey(
  324. 'User',
  325. on_delete=models.PROTECT,
  326. )
  327. amount = models.PositiveIntegerField(
  328. default=0,
  329. )
  330. class Meta:
  331. unique_together = ['network', 'channel', 'user']
  332. class Notice(models.Model):
  333. network = models.ForeignKey(
  334. 'Network',
  335. on_delete=models.PROTECT,
  336. )
  337. channel = models.ForeignKey(
  338. 'Channel',
  339. on_delete=models.PROTECT,
  340. )
  341. user = models.ForeignKey(
  342. 'User',
  343. on_delete=models.PROTECT,
  344. )
  345. amount = models.PositiveIntegerField(
  346. default=0,
  347. )
  348. class Meta:
  349. unique_together = ['network', 'channel', 'user']
  350. class Kick(models.Model):
  351. network = models.ForeignKey(
  352. 'Network',
  353. on_delete=models.PROTECT,
  354. )
  355. channel = models.ForeignKey(
  356. 'Channel',
  357. on_delete=models.PROTECT,
  358. )
  359. kicker = models.ForeignKey(
  360. 'User',
  361. on_delete=models.PROTECT,
  362. related_name='kicker',
  363. )
  364. kicked = models.ForeignKey(
  365. 'User',
  366. on_delete=models.PROTECT,
  367. related_name='kicked',
  368. )
  369. amount = models.PositiveIntegerField(
  370. default=0,
  371. )
  372. class Meta:
  373. unique_together = ['network', 'channel', 'kicker', 'kicked']