models.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. from django.db import models
  2. from django.contrib.auth.models import User as WebUser
  3. from django.core.validators import validate_unicode_slug, MaxLengthValidator, MaxValueValidator, URLValidator
  4. class Owner(models.Model):
  5. network = models.ForeignKey(
  6. 'Network',
  7. on_delete=models.CASCADE,
  8. )
  9. hostmask = models.CharField(
  10. max_length=50,
  11. unique=True,
  12. )
  13. class Network(models.Model):
  14. name = models.CharField(
  15. max_length=40,
  16. unique=True,
  17. validators=[MaxLengthValidator(40)],
  18. )
  19. slug = models.SlugField(
  20. db_index=True,
  21. unique=True,
  22. validators=[validate_unicode_slug],
  23. )
  24. nickname = models.CharField(
  25. max_length=31,
  26. default='RotBot',
  27. validators=[MaxLengthValidator(31)],
  28. )
  29. username = models.CharField(
  30. max_length=31,
  31. default='pyRot',
  32. validators=[MaxLengthValidator(31)],
  33. )
  34. password = models.CharField(
  35. null=True,
  36. blank=True,
  37. max_length=31,
  38. validators=[MaxLengthValidator(31)],
  39. )
  40. mail = models.EmailField()
  41. home_channel = models.CharField(
  42. max_length=64,
  43. default='#RotBot',
  44. validators=[MaxLengthValidator(64)],
  45. )
  46. command_character = models.CharField(
  47. max_length=1,
  48. default='!',
  49. validators=[MaxLengthValidator(1)],
  50. )
  51. help_character = models.CharField(
  52. max_length=1,
  53. default='@',
  54. validators=[MaxLengthValidator(1)],
  55. )
  56. enabled = models.BooleanField(
  57. default=True,
  58. )
  59. SERVICE_CHOICES = [
  60. ('m', 'NickServ, ChanServ & MemoServ'),
  61. ('x', 'X bot'),
  62. ('n', 'None.'),
  63. ]
  64. services = models.CharField(
  65. max_length=1,
  66. default='m',
  67. choices=SERVICE_CHOICES,
  68. )
  69. # mute = models.BooleanField(
  70. # default=False,
  71. # )
  72. class Meta:
  73. ordering = ['name']
  74. def get_absolute_url(self):
  75. from django.urls import reverse
  76. return reverse('rotbot.views.network', args=[str(self.id)])
  77. # Try this in the template: <a href="{{ object.get_absolute_url }}">{{ object.name }}</a>
  78. def __str__(self):
  79. return self.name
  80. class Host(models.Model):
  81. network = models.ForeignKey(
  82. 'Network',
  83. on_delete=models.CASCADE,
  84. related_name="host",
  85. related_query_name="hosts",
  86. )
  87. address = models.CharField(
  88. max_length=200,
  89. unique=True,
  90. validators=[MaxLengthValidator(200)],
  91. )
  92. port = models.PositiveSmallIntegerField(
  93. default = 6697,
  94. validators=[MaxValueValidator(65535)],
  95. )
  96. ssl = models.BooleanField(
  97. default=True,
  98. )
  99. connection_attempts = models.PositiveIntegerField(
  100. default=0,
  101. )
  102. connection_succeeds = models.PositiveIntegerField(
  103. default=0,
  104. )
  105. class Meta:
  106. order_with_respect_to = 'network'
  107. unique_together = ['address', 'port']
  108. @property
  109. def connect_string(self):
  110. return '%s:%s' % (self.address, self.port)
  111. def __str__(self):
  112. return '%s:%s' % (self.address, self.port)
  113. class Channel(models.Model):
  114. slug = models.SlugField(
  115. unique=True,
  116. validators=[validate_unicode_slug],
  117. )
  118. network = models.ForeignKey(
  119. 'Network',
  120. on_delete=models.PROTECT,
  121. related_name="channel",
  122. related_query_name="channels",
  123. )
  124. name = models.CharField(
  125. max_length=64,
  126. )
  127. autojoin = models.BooleanField(
  128. default=True,
  129. #null=True,
  130. #blank=False
  131. )
  132. key = models.CharField(
  133. max_length=32,
  134. )
  135. games = models.BooleanField(
  136. default=False,
  137. )
  138. chat = models.BooleanField(
  139. default=False,
  140. )
  141. statistic_commands = models.BooleanField(
  142. default=False,
  143. )
  144. CHANNEL_EVENT_TYPE_CHOICES = [
  145. #('pm', 'private message'),
  146. #('pa', 'private action'),
  147. #('pn', 'private notice'),
  148. ('cm', 'channel message'),
  149. ('ca', 'channel action'),
  150. ('cn', 'channel notice'),
  151. ('ct', 'channel topic'),
  152. ('ck', 'channel password'),
  153. ('ci', 'channel invite'),
  154. ('cj', 'channel join'),
  155. ('cp', 'channel part'),
  156. ('ck', 'channel kick'),
  157. ('kd', 'channel kicked'),
  158. ( 'mc', 'mode change'),
  159. #('nc', 'nick change'),
  160. #('sq', 'quit'),
  161. ]
  162. last_event_type = models.CharField(
  163. max_length=2,
  164. choices=CHANNEL_EVENT_TYPE_CHOICES,
  165. )
  166. last_event_datetime = models.DateTimeField(
  167. auto_now=True,
  168. )
  169. last_event_channel = models.ForeignKey(
  170. 'Channel',
  171. on_delete=models.CASCADE,
  172. null=True,
  173. )
  174. last_event_user = models.ForeignKey(
  175. 'User',
  176. on_delete=models.CASCADE,
  177. null=True,
  178. )
  179. last_event_subject = models.ForeignKey(
  180. 'User',
  181. on_delete=models.CASCADE,
  182. null=True,
  183. related_name='channel_subject',
  184. )
  185. last_event_content = models.CharField(
  186. null=True,
  187. max_length = 307,
  188. )
  189. last_changesetting_datetime = models.DateTimeField(
  190. null=True,
  191. blank=True,
  192. )
  193. last_changesetting_ircuser = models.DateTimeField(
  194. null=True,
  195. blank=True,
  196. )
  197. last_changesetting_webuser = models.DateTimeField(
  198. null=True,
  199. blank=True,
  200. )
  201. last_greet = models.DateTimeField(
  202. null=True,
  203. blank=True,
  204. )
  205. last_lame = models.DateTimeField(
  206. null=True,
  207. blank=True,
  208. )
  209. class Meta:
  210. unique_together = ['network', 'name']
  211. def __str__(self):
  212. return '%s/%s' % (self.network, self.name)
  213. class TempChannelKey(models.Model):
  214. key = models.CharField(
  215. max_length=40,
  216. unique=True,
  217. )
  218. network = models.ForeignKey(
  219. 'Network',
  220. on_delete=models.CASCADE,
  221. )
  222. channel = models.ForeignKey(
  223. 'Channel',
  224. on_delete=models.CASCADE,
  225. )
  226. created = models.DateTimeField(
  227. auto_now_add=True,
  228. )
  229. class User(models.Model):
  230. slug = models.SlugField(
  231. unique=True,
  232. validators=[validate_unicode_slug],
  233. )
  234. network = models.ForeignKey(
  235. 'Network',
  236. on_delete=models.PROTECT,
  237. )
  238. name = models.CharField(
  239. max_length=31
  240. )
  241. aliasses = models.ManyToManyField('self')
  242. USER_EVENT_TYPE_CHOICES = [
  243. ('pm', 'private message'),
  244. ('pa', 'private action'),
  245. ('pn', 'private notice'),
  246. ('cm', 'channel message'),
  247. ('ca', 'channel action'),
  248. ('cn', 'channel notice'),
  249. ('ct', 'channel topic'),
  250. ('ck', 'channel password'),
  251. ('ci', 'channel invite'),
  252. ('cj', 'channel join'),
  253. ('cp', 'channel part'),
  254. ('ck', 'channel kick'),
  255. ('kd', 'channel kicked'),
  256. ('mc', 'mode change'),
  257. ('nc', 'nick change'),
  258. ('sq', 'quit'),
  259. ]
  260. last_event_type = models.CharField(
  261. max_length=2,
  262. choices=USER_EVENT_TYPE_CHOICES,
  263. )
  264. last_event_datetime = models.DateTimeField(
  265. auto_now=True,
  266. )
  267. last_event_channel = models.ForeignKey(
  268. 'Channel',
  269. on_delete=models.CASCADE,
  270. null=True,
  271. )
  272. last_event_subject = models.ForeignKey(
  273. 'User',
  274. on_delete=models.CASCADE,
  275. null=True,
  276. )
  277. last_event_content = models.CharField(
  278. null=True,
  279. max_length = 307,
  280. )
  281. xp_spent = models.PositiveIntegerField(
  282. default=0,
  283. )
  284. level = models.PositiveIntegerField(
  285. default=0,
  286. )
  287. coin = models.PositiveIntegerField(
  288. default=0,
  289. )
  290. coin_given = models.PositiveIntegerField(
  291. default=0,
  292. )
  293. coin_spent = models.PositiveIntegerField(
  294. default=0
  295. )
  296. ap_spent = models.PositiveIntegerField(
  297. default=0,
  298. )
  299. karma_correction = models.PositiveIntegerField(
  300. default=0,
  301. )
  302. xp_correction = models.PositiveIntegerField(
  303. default=0,
  304. )
  305. no_chat = models.BooleanField(
  306. default=False,
  307. )
  308. last_greet = models.DateTimeField(
  309. null=True,
  310. blank=True,
  311. )
  312. last_lame = models.DateTimeField(
  313. null=True,
  314. blank=True,
  315. )
  316. class Meta:
  317. unique_together = ['network', 'name']
  318. class Join(models.Model):
  319. network = models.ForeignKey(
  320. 'Network',
  321. on_delete=models.PROTECT,
  322. )
  323. channel = models.ForeignKey(
  324. 'Channel',
  325. on_delete=models.PROTECT,
  326. )
  327. user = models.ForeignKey(
  328. 'User',
  329. on_delete=models.PROTECT,
  330. )
  331. amount = models.PositiveIntegerField(
  332. default=0,
  333. )
  334. class Meta:
  335. unique_together = ['network', 'channel', 'user']
  336. class Message(models.Model):
  337. network = models.ForeignKey(
  338. 'Network',
  339. on_delete=models.PROTECT,
  340. )
  341. channel = models.ForeignKey(
  342. 'Channel',
  343. on_delete=models.PROTECT,
  344. )
  345. user = models.ForeignKey(
  346. 'User',
  347. on_delete=models.PROTECT,
  348. )
  349. amount = models.PositiveIntegerField(
  350. default=0,
  351. )
  352. class Meta:
  353. unique_together = ['network', 'channel', 'user']
  354. class Action(models.Model):
  355. network = models.ForeignKey(
  356. 'Network',
  357. on_delete=models.PROTECT,
  358. )
  359. channel = models.ForeignKey(
  360. 'Channel',
  361. on_delete=models.PROTECT,
  362. )
  363. user = models.ForeignKey(
  364. 'User',
  365. on_delete=models.PROTECT,
  366. )
  367. amount = models.PositiveIntegerField(
  368. default=0,
  369. )
  370. class Meta:
  371. unique_together = ['network', 'channel', 'user']
  372. class Notice(models.Model):
  373. network = models.ForeignKey(
  374. 'Network',
  375. on_delete=models.PROTECT,
  376. )
  377. channel = models.ForeignKey(
  378. 'Channel',
  379. on_delete=models.PROTECT,
  380. )
  381. user = models.ForeignKey(
  382. 'User',
  383. on_delete=models.PROTECT,
  384. )
  385. amount = models.PositiveIntegerField(
  386. default=0,
  387. )
  388. class Meta:
  389. unique_together = ['network', 'channel', 'user']
  390. class Kick(models.Model):
  391. network = models.ForeignKey(
  392. 'Network',
  393. on_delete=models.PROTECT,
  394. )
  395. channel = models.ForeignKey(
  396. 'Channel',
  397. on_delete=models.PROTECT,
  398. )
  399. kicker = models.ForeignKey(
  400. 'User',
  401. on_delete=models.PROTECT,
  402. related_name='kicker',
  403. )
  404. kicked = models.ForeignKey(
  405. 'User',
  406. on_delete=models.PROTECT,
  407. related_name='kicked',
  408. )
  409. amount = models.PositiveIntegerField(
  410. default=0,
  411. )
  412. class Meta:
  413. unique_together = ['network', 'channel', 'kicker', 'kicked']
  414. class CurseWord(models.Model):
  415. content = models.CharField(
  416. max_length=16,
  417. unique=True,
  418. )
  419. created = models.DateField(
  420. auto_now_add=True,
  421. )
  422. irc_user = models.ForeignKey(
  423. 'User',
  424. on_delete=models.PROTECT,
  425. null=True,
  426. blank=True,
  427. )
  428. web_user = models.ForeignKey(
  429. WebUser,
  430. on_delete=models.PROTECT,
  431. null=True,
  432. blank=True,
  433. )
  434. banned = models.BooleanField(
  435. default=False,
  436. )
  437. ban_created = models.DateField(
  438. null=True,
  439. blank=True,
  440. )
  441. banned_by_irc_user = models.ForeignKey(
  442. 'User',
  443. on_delete=models.PROTECT,
  444. null=True,
  445. blank=True,
  446. related_name='curseword_banned_by_irc_user',
  447. )
  448. banned_by_web_user = models.ForeignKey(
  449. WebUser,
  450. on_delete=models.PROTECT,
  451. null=True,
  452. blank=True,
  453. related_name='curseword_banned_by_web_user',
  454. )
  455. def __str__(self):
  456. return self.word
  457. class Adjective(models.Model):
  458. content = models.CharField(
  459. max_length=16,
  460. unique=True,
  461. )
  462. created = models.DateField(
  463. auto_now_add=True,
  464. )
  465. irc_user = models.ForeignKey(
  466. 'User',
  467. on_delete=models.PROTECT,
  468. null=True,
  469. blank=True,
  470. )
  471. web_user = models.ForeignKey(
  472. WebUser,
  473. on_delete=models.PROTECT,
  474. null=True,
  475. blank=True,
  476. )
  477. banned = models.BooleanField(
  478. default=False,
  479. )
  480. ban_created = models.DateField(
  481. null=True,
  482. blank=True,
  483. )
  484. banned_by_irc_user = models.ForeignKey(
  485. 'User',
  486. on_delete=models.PROTECT,
  487. null=True,
  488. blank=True,
  489. related_name='adjective_banned_by_irc_user',
  490. )
  491. banned_by_web_user = models.ForeignKey(
  492. WebUser,
  493. on_delete=models.PROTECT,
  494. null=True,
  495. blank=True,
  496. related_name='adjective_banned_by_web_user',
  497. )
  498. def __str__(self):
  499. return self.word
  500. class NickReplyMessage(models.Model):
  501. content = models.CharField(
  502. max_length=200,
  503. unique=True,
  504. )
  505. created = models.DateField(
  506. auto_now_add=True,
  507. )
  508. irc_user = models.ForeignKey(
  509. 'User',
  510. on_delete=models.PROTECT,
  511. null=True,
  512. blank=True,
  513. )
  514. web_user = models.ForeignKey(
  515. WebUser,
  516. on_delete=models.PROTECT,
  517. null=True,
  518. blank=True,
  519. )
  520. banned = models.BooleanField(
  521. default=False,
  522. )
  523. ban_created = models.DateField(
  524. null=True,
  525. blank=True,
  526. )
  527. banned_by_irc_user = models.ForeignKey(
  528. 'User',
  529. on_delete=models.PROTECT,
  530. null=True,
  531. blank=True,
  532. related_name='nickreplymessage_banned_by_irc_user',
  533. )
  534. banned_by_web_user = models.ForeignKey(
  535. WebUser,
  536. on_delete=models.PROTECT,
  537. null=True,
  538. blank=True,
  539. related_name='nickreplymessage_banned_by_web_user',
  540. )
  541. class NickReplyAction(models.Model):
  542. content = models.CharField(
  543. max_length=200,
  544. unique=True,
  545. )
  546. created = models.DateField(
  547. auto_now_add=True,
  548. )
  549. irc_user = models.ForeignKey(
  550. 'User',
  551. on_delete=models.PROTECT,
  552. null=True,
  553. blank=True,
  554. )
  555. web_user = models.ForeignKey(
  556. WebUser,
  557. on_delete=models.PROTECT,
  558. null=True,
  559. blank=True,
  560. )
  561. banned = models.BooleanField(
  562. default=False,
  563. )
  564. ban_created = models.DateField(
  565. null=True,
  566. blank=True,
  567. )
  568. banned_by_irc_user = models.ForeignKey(
  569. 'User',
  570. on_delete=models.PROTECT,
  571. null=True,
  572. blank=True,
  573. related_name='nickreplyaction_banned_by_irc_user',
  574. )
  575. banned_by_web_user = models.ForeignKey(
  576. WebUser,
  577. on_delete=models.PROTECT,
  578. null=True,
  579. blank=True,
  580. related_name='nickreplyaction_banned_by_web_user',
  581. )