Brian Stephan
333424025b
markov targets are queried and autogenerated based on chatter, but had a legacy name which is no longer in use for this, preferring the foreign keys to channel and consequently server. the name is really just informative these days, but was still being used to find targets, and thus was breaking when two servers had the same channel name in them. this fixes that
141 lines
4.5 KiB
Python
141 lines
4.5 KiB
Python
"""Track basic IRC settings and similar."""
|
|
import logging
|
|
import re
|
|
|
|
from django.conf import settings
|
|
from django.db import models
|
|
from django.utils import timezone
|
|
|
|
log = logging.getLogger('ircbot.models')
|
|
|
|
|
|
class LowerCaseCharField(models.CharField):
|
|
"""Provide a case-insensitive, forced-lower CharField."""
|
|
|
|
def get_prep_value(self, value):
|
|
"""Manipulate the field value to make it lowercase."""
|
|
value = super(LowerCaseCharField, self).get_prep_value(value)
|
|
if value is not None:
|
|
value = value.lower()
|
|
return value
|
|
|
|
|
|
class Alias(models.Model):
|
|
"""Allow for aliasing of arbitrary regexes to normal supported commands."""
|
|
|
|
pattern = models.CharField(max_length=200, unique=True)
|
|
replacement = models.CharField(max_length=200)
|
|
|
|
class Meta:
|
|
"""Settings for the model."""
|
|
|
|
verbose_name_plural = "aliases"
|
|
|
|
def __str__(self):
|
|
"""Provide string representation."""
|
|
return "{0:s} -> {1:s}".format(self.pattern, self.replacement)
|
|
|
|
def replace(self, what):
|
|
"""Match the regex and replace with the command."""
|
|
command = None
|
|
if re.search(self.pattern, what, flags=re.IGNORECASE):
|
|
command = re.sub(self.pattern, self.replacement, what, flags=re.IGNORECASE)
|
|
|
|
return command
|
|
|
|
|
|
class BotUser(models.Model):
|
|
"""Configure bot users, which can do things through the bot and standard Django auth."""
|
|
|
|
nickmask = models.CharField(max_length=200, unique=True)
|
|
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
|
|
|
|
class Meta:
|
|
"""Settings for the model."""
|
|
|
|
permissions = (
|
|
('quit_bot', "Can tell the bot to quit via IRC"),
|
|
)
|
|
|
|
def __str__(self):
|
|
"""Provide string representation."""
|
|
return "{0:s} (Django user {1:s})".format(self.nickmask, self.user.username)
|
|
|
|
|
|
class IrcServer(models.Model):
|
|
"""Contain server information in an object, and help contextualize channels."""
|
|
|
|
name = models.CharField(max_length=200, unique=True)
|
|
hostname = models.CharField(max_length=200)
|
|
port = models.PositiveSmallIntegerField(default=6667)
|
|
password = models.CharField(max_length=200, default=None, null=True, blank=True)
|
|
|
|
nickname = models.CharField(max_length=32)
|
|
realname = models.CharField(max_length=32, default='', blank=True)
|
|
additional_addressed_nicks = models.TextField(default='', blank=True,
|
|
help_text="For e.g. BitlBee alternative nicks")
|
|
|
|
use_ssl = models.BooleanField(default=False)
|
|
use_ipv6 = models.BooleanField(default=False)
|
|
|
|
post_connect = models.TextField(default='', blank=True)
|
|
delay_before_joins = models.PositiveSmallIntegerField(default=0)
|
|
|
|
xmlrpc_host = models.CharField(max_length=200, default='localhost')
|
|
xmlrpc_port = models.PositiveSmallIntegerField(default=13132)
|
|
|
|
replace_irc_control_with_markdown = models.BooleanField(default=False)
|
|
|
|
def __str__(self):
|
|
"""Provide string summary of the server."""
|
|
return f"{self.name} ({self.hostname}/{self.port})"
|
|
|
|
|
|
class IrcChannel(models.Model):
|
|
"""Track channel settings."""
|
|
|
|
name = LowerCaseCharField(max_length=200)
|
|
server = models.ForeignKey('IrcServer', on_delete=models.CASCADE)
|
|
autojoin = models.BooleanField(default=False)
|
|
|
|
topic_msg = models.TextField(default='', blank=True)
|
|
topic_time = models.DateTimeField(default=timezone.now)
|
|
topic_by = models.CharField(max_length=200, default='', blank=True)
|
|
|
|
markov_learn_from_channel = models.BooleanField(default=True)
|
|
|
|
discord_bridge = models.CharField(default='', max_length=32, blank=True)
|
|
|
|
class Meta:
|
|
"""Settings for the model."""
|
|
|
|
constraints = (
|
|
models.UniqueConstraint(fields=['name', 'server'], name='unique_server_channel'),
|
|
)
|
|
permissions = (
|
|
('manage_current_channels', "Can join/part channels via IRC"),
|
|
)
|
|
|
|
def __str__(self):
|
|
"""Provide string representation."""
|
|
return "{0:s} on {1:s}".format(self.name, self.server.name)
|
|
|
|
|
|
class IrcPlugin(models.Model):
|
|
"""Represent an IRC plugin and its loading settings."""
|
|
|
|
path = models.CharField(max_length=200, unique=True)
|
|
autoload = models.BooleanField(default=False)
|
|
|
|
class Meta:
|
|
"""Settings for the model."""
|
|
|
|
ordering = ['path']
|
|
permissions = (
|
|
('manage_loaded_plugins', "Can load/unload plugins via IRC"),
|
|
)
|
|
|
|
def __str__(self):
|
|
"""Provide string representation."""
|
|
return "{0:s}".format(self.path)
|