1
0

models.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  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. source = 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', 'Modern network services, like Rizon.'),
  61. ('x', 'X bot, like UnderNet.'),
  62. ('n', 'None, bare server.'),
  63. ]
  64. # network_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=False,
  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. class Meta:
  190. unique_together = ['network', 'name']
  191. def __str__(self):
  192. return '%s/$s' % (self.network, self.name)
  193. class TempChannelKey(models.Model):
  194. key = models.CharField(
  195. max_length=40,
  196. unique=True,
  197. )
  198. network = models.ForeignKey(
  199. 'Network',
  200. on_delete=models.CASCADE,
  201. )
  202. channel = models.ForeignKey(
  203. 'Channel',
  204. on_delete=models.CASCADE,
  205. )
  206. created = models.DateTimeField(
  207. auto_now_add=True,
  208. )
  209. class User(models.Model):
  210. slug = models.SlugField(
  211. unique=True,
  212. validators=[validate_unicode_slug],
  213. )
  214. network = models.ForeignKey(
  215. 'Network',
  216. on_delete=models.PROTECT,
  217. )
  218. name = models.CharField(
  219. max_length=31
  220. )
  221. aliasses = models.ManyToManyField('self')
  222. USER_EVENT_TYPE_CHOICES = [
  223. ('pm', 'private message'),
  224. ('pa', 'private action'),
  225. ('pn', 'private notice'),
  226. ('cm', 'channel message'),
  227. ('ca', 'channel action'),
  228. ('cn', 'channel notice'),
  229. ('ct', 'channel topic'),
  230. ('ck', 'channel password'),
  231. ('ci', 'channel invite'),
  232. ('cj', 'channel join'),
  233. ('cp', 'channel part'),
  234. ('ck', 'channel kick'),
  235. ('kd', 'channel kicked'),
  236. ('mc', 'mode change'),
  237. ('nc', 'nick change'),
  238. ('sq', 'quit'),
  239. ]
  240. last_event_type = models.CharField(
  241. max_length=2,
  242. choices=USER_EVENT_TYPE_CHOICES,
  243. )
  244. last_event_datetime = models.DateTimeField(
  245. auto_now=True,
  246. )
  247. last_event_channel = models.ForeignKey(
  248. 'Channel',
  249. on_delete=models.CASCADE,
  250. null=True,
  251. )
  252. last_event_subject = models.ForeignKey(
  253. 'User',
  254. on_delete=models.CASCADE,
  255. null=True,
  256. )
  257. last_event_content = models.CharField(
  258. null=True,
  259. max_length = 307,
  260. )
  261. xp_spent = models.PositiveIntegerField(
  262. default=0,
  263. )
  264. level = models.PositiveIntegerField(
  265. default=0,
  266. )
  267. coin = models.PositiveIntegerField(
  268. default=0,
  269. )
  270. coin_given = models.PositiveIntegerField(
  271. default=0,
  272. )
  273. coin_spent = models.PositiveIntegerField(
  274. default=0
  275. )
  276. ap_spent = models.PositiveIntegerField(
  277. default=0,
  278. )
  279. karma_correction = models.PositiveIntegerField(
  280. default=0,
  281. )
  282. xp_corrention = models.PositiveIntegerField(
  283. default=0,
  284. )
  285. no_chat = models.BooleanField(
  286. default=False,
  287. )
  288. class Meta:
  289. unique_together = ['network', 'name']
  290. class Join(models.Model):
  291. network = models.ForeignKey(
  292. 'Network',
  293. on_delete=models.PROTECT,
  294. )
  295. channel = models.ForeignKey(
  296. 'Channel',
  297. on_delete=models.PROTECT,
  298. )
  299. user = models.ForeignKey(
  300. 'User',
  301. on_delete=models.PROTECT,
  302. )
  303. amount = models.PositiveIntegerField(
  304. default=0,
  305. )
  306. class Meta:
  307. unique_together = ['network', 'channel', 'user']
  308. class Message(models.Model):
  309. network = models.ForeignKey(
  310. 'Network',
  311. on_delete=models.PROTECT,
  312. )
  313. channel = models.ForeignKey(
  314. 'Channel',
  315. on_delete=models.PROTECT,
  316. )
  317. user = models.ForeignKey(
  318. 'User',
  319. on_delete=models.PROTECT,
  320. )
  321. amount = models.PositiveIntegerField(
  322. default=0,
  323. )
  324. class Meta:
  325. unique_together = ['network', 'channel', 'user']
  326. class Action(models.Model):
  327. network = models.ForeignKey(
  328. 'Network',
  329. on_delete=models.PROTECT,
  330. )
  331. channel = models.ForeignKey(
  332. 'Channel',
  333. on_delete=models.PROTECT,
  334. )
  335. user = models.ForeignKey(
  336. 'User',
  337. on_delete=models.PROTECT,
  338. )
  339. amount = models.PositiveIntegerField(
  340. default=0,
  341. )
  342. class Meta:
  343. unique_together = ['network', 'channel', 'user']
  344. class Notice(models.Model):
  345. network = models.ForeignKey(
  346. 'Network',
  347. on_delete=models.PROTECT,
  348. )
  349. channel = models.ForeignKey(
  350. 'Channel',
  351. on_delete=models.PROTECT,
  352. )
  353. user = models.ForeignKey(
  354. 'User',
  355. on_delete=models.PROTECT,
  356. )
  357. amount = models.PositiveIntegerField(
  358. default=0,
  359. )
  360. class Meta:
  361. unique_together = ['network', 'channel', 'user']
  362. class Kick(models.Model):
  363. network = models.ForeignKey(
  364. 'Network',
  365. on_delete=models.PROTECT,
  366. )
  367. channel = models.ForeignKey(
  368. 'Channel',
  369. on_delete=models.PROTECT,
  370. )
  371. kicker = models.ForeignKey(
  372. 'User',
  373. on_delete=models.PROTECT,
  374. related_name='kicker',
  375. )
  376. kicked = models.ForeignKey(
  377. 'User',
  378. on_delete=models.PROTECT,
  379. related_name='kicked',
  380. )
  381. amount = models.PositiveIntegerField(
  382. default=0,
  383. )
  384. class Meta:
  385. unique_together = ['network', 'channel', 'kicker', 'kicked']
  386. class CurseWord(models.Model):
  387. word = models.CharField(
  388. max_length=15,
  389. unique=True,
  390. )
  391. created = models.DateField(
  392. auto_now_add=True,
  393. )
  394. irc_user = models.ForeignKey(
  395. 'User',
  396. on_delete=models.PROTECT,
  397. null=True,
  398. blank=True,
  399. )
  400. web_user = models.ForeignKey(
  401. WebUser,
  402. on_delete=models.PROTECT,
  403. null=True,
  404. blank=True,
  405. )
  406. banned = models.BooleanField(
  407. default=False,
  408. )
  409. def __str__(self):
  410. return self.word
  411. class CurseAdjective(models.Model):
  412. word = models.CharField(
  413. max_length=15,
  414. unique=True,
  415. )
  416. created = models.DateField(
  417. auto_now_add=True,
  418. )
  419. irc_user = models.ForeignKey(
  420. 'User',
  421. on_delete=models.PROTECT,
  422. null=True,
  423. blank=True,
  424. )
  425. web_user = models.ForeignKey(
  426. WebUser,
  427. on_delete=models.PROTECT,
  428. null=True,
  429. blank=True,
  430. )
  431. banned = models.BooleanField(
  432. default=False,
  433. )
  434. def __str__(self):
  435. return self.word