1
0

models.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  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_user = models.ForeignKey(
  253. 'User',
  254. on_delete=models.CASCADE,
  255. null=True,
  256. )
  257. last_event_subject = models.ForeignKey(
  258. 'User',
  259. on_delete=models.CASCADE,
  260. null=True,
  261. related_name='user_subject',
  262. )
  263. last_event_content = models.CharField(
  264. null=True,
  265. max_length = 307,
  266. )
  267. xp_spent = models.PositiveIntegerField(
  268. default=0,
  269. )
  270. level = models.PositiveIntegerField(
  271. default=0,
  272. )
  273. coin = models.PositiveIntegerField(
  274. default=0,
  275. )
  276. coin_given = models.PositiveIntegerField(
  277. default=0,
  278. )
  279. coin_spent = models.PositiveIntegerField(
  280. default=0
  281. )
  282. ap_spent = models.PositiveIntegerField(
  283. default=0,
  284. )
  285. karma_correction = models.PositiveIntegerField(
  286. default=0,
  287. )
  288. no_chat = models.BooleanField(
  289. default=False,
  290. )
  291. class Meta:
  292. unique_together = ['network', 'name']
  293. class Join(models.Model):
  294. network = models.ForeignKey(
  295. 'Network',
  296. on_delete=models.PROTECT,
  297. )
  298. channel = models.ForeignKey(
  299. 'Channel',
  300. on_delete=models.PROTECT,
  301. )
  302. user = models.ForeignKey(
  303. 'User',
  304. on_delete=models.PROTECT,
  305. )
  306. amount = models.PositiveIntegerField(
  307. default=0,
  308. )
  309. class Meta:
  310. unique_together = ['network', 'channel', 'user']
  311. class Message(models.Model):
  312. network = models.ForeignKey(
  313. 'Network',
  314. on_delete=models.PROTECT,
  315. )
  316. channel = models.ForeignKey(
  317. 'Channel',
  318. on_delete=models.PROTECT,
  319. )
  320. user = models.ForeignKey(
  321. 'User',
  322. on_delete=models.PROTECT,
  323. )
  324. amount = models.PositiveIntegerField(
  325. default=0,
  326. )
  327. class Meta:
  328. unique_together = ['network', 'channel', 'user']
  329. class Action(models.Model):
  330. network = models.ForeignKey(
  331. 'Network',
  332. on_delete=models.PROTECT,
  333. )
  334. channel = models.ForeignKey(
  335. 'Channel',
  336. on_delete=models.PROTECT,
  337. )
  338. user = models.ForeignKey(
  339. 'User',
  340. on_delete=models.PROTECT,
  341. )
  342. amount = models.PositiveIntegerField(
  343. default=0,
  344. )
  345. class Meta:
  346. unique_together = ['network', 'channel', 'user']
  347. class Notice(models.Model):
  348. network = models.ForeignKey(
  349. 'Network',
  350. on_delete=models.PROTECT,
  351. )
  352. channel = models.ForeignKey(
  353. 'Channel',
  354. on_delete=models.PROTECT,
  355. )
  356. user = models.ForeignKey(
  357. 'User',
  358. on_delete=models.PROTECT,
  359. )
  360. amount = models.PositiveIntegerField(
  361. default=0,
  362. )
  363. class Meta:
  364. unique_together = ['network', 'channel', 'user']
  365. class Kick(models.Model):
  366. network = models.ForeignKey(
  367. 'Network',
  368. on_delete=models.PROTECT,
  369. )
  370. channel = models.ForeignKey(
  371. 'Channel',
  372. on_delete=models.PROTECT,
  373. )
  374. kicker = models.ForeignKey(
  375. 'User',
  376. on_delete=models.PROTECT,
  377. related_name='kicker',
  378. )
  379. kicked = models.ForeignKey(
  380. 'User',
  381. on_delete=models.PROTECT,
  382. related_name='kicked',
  383. )
  384. amount = models.PositiveIntegerField(
  385. default=0,
  386. )
  387. class Meta:
  388. unique_together = ['network', 'channel', 'kicker', 'kicked']
  389. class CurseWord(models.Model):
  390. word = models.CharField(
  391. max_length=15,
  392. unique=True,
  393. )
  394. created = models.DateField(
  395. auto_now_add=True,
  396. )
  397. irc_user = models.ForeignKey(
  398. 'User',
  399. on_delete=models.PROTECT,
  400. null=True,
  401. blank=True,
  402. )
  403. web_user = models.ForeignKey(
  404. WebUser,
  405. on_delete=models.PROTECT,
  406. null=True,
  407. blank=True,
  408. )
  409. banned = models.BooleanField(
  410. default=False,
  411. )
  412. def __str__(self):
  413. return self.word
  414. class CurseAdjective(models.Model):
  415. word = models.CharField(
  416. max_length=15,
  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. def __str__(self):
  438. return self.word