1
0

models.py 11 KB

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