class CustomFormat(SlottedModel): emoji = Field(str, default=None) format = Field(str, default=None)
class CheckConfig(SlottedModel): count = Field(int) interval = Field(int) meta = Field(dict, default=None) punishment = Field(PunishmentType, default=None) punishment_duration = Field(int, default=None)
class SubConfig(SlottedModel): max_messages = Field(CheckConfig, default=None) max_mentions = Field(CheckConfig, default=None) max_links = Field(CheckConfig, default=None) max_emojis = Field(CheckConfig, default=None) max_newlines = Field(CheckConfig, default=None) max_attachments = Field(CheckConfig, default=None) max_duplicates = Field(CheckConfig, default=None) punishment = Field(PunishmentType, default=PunishmentType.NONE) punishment_duration = Field(int, default=300) clean = Field(bool, default=False) clean_count = Field(int, default=100) clean_duration = Field(int, default=900) _cached_max_messages_bucket = Field(str, private=True) _cached_max_mentions_bucket = Field(str, private=True) _cached_max_links_bucket = Field(str, private=True) _cached_max_emojis_bucket = Field(str, private=True) _cached_max_newlines_bucket = Field(str, private=True) _cached_max_attachments_bucket = Field(str, private=True) def validate(self): if self.clean_duration < 0 or self.clean_duration > 86400: raise Exception( 'Invalid value for `clean_duration` must be between 0 and 86400' ) if self.clean_count < 0 or self.clean_count > 1000: raise Exception( 'Invaliud value for `clean_count` must be between 0 and 1000') def get_bucket(self, attr, guild_id): obj = getattr(self, attr) if not obj or not obj.count or not obj.interval: return (None, None) bucket = getattr(self, '_cached_{}_bucket'.format(attr), None) if not bucket: bucket = LeakyBucket(rdb, 'spam:{}:{}:{}'.format(attr, guild_id, '{}'), obj.count, obj.interval * 1000) setattr(self, '_cached_{}_bucket'.format(attr), bucket) return obj, bucket
class GuildConfig(SlottedModel): nickname = Field(text) commands = Field(CommandsConfig, default=None, create=False) levels = DictField(int, int) plugins = Field(PluginsConfig.parse)
class SubRedditConfig(SlottedModel): channel = Field(ChannelField) mode = Field(FormatMode, default=FormatMode.PRETTY) nsfw = Field(bool, default=False) text_length = Field(int, default=256) include_stats = Field(bool, default=False)
class MusicConfig(PluginConfig): max_song_length = Field(int, default=7200)
class JoinPluginConfig(PluginConfig): join_role = Field(snowflake, default=None) security = Field(bool, default=False) advanced = Field(JoinPluginConfigAdvanced) pass
class NotifyConfig(SlottedModel): mutes = Field(bool, default=False) warns = Field(bool, default=False) kicks = Field(bool, default=False) bans = Field(bool, default=False)
class LimitTempConfig(SlottedModel): duration_limit_level = Field(int, default=0) maximum_limited_duration = Field(str, default='1d')
class MemesConfig(PluginConfig): #auto-reply to meesux hate_meesux = Field(bool, default=False)
class StreamConfig(SlottedModel): channel = Field(ChannelField) notification_type = Field(NotificationType) notification_target = Field(snowflake)
class CheckConfig(SlottedModel): count = Field(int) interval = Field(int) meta = Field(dict, default=None)
class LevelPluginConfig(PluginConfig): actions = Field(LevelUpActionConfig) rewards = DictField(int, snowflake) pass
class LevelUpActionConfig(SlottedModel): message = Field(bool, default=False) chat = Field(bool, default=True)
def deco(plugin_cls): name = plugin_cls.__name__.replace('Plugin', '').lower() PluginsConfig._fields[name] = Field(config_cls, default=Unset) PluginsConfig._fields[name].name = name # PluginsConfig._fields[name].default = None return plugin_cls
class SubConfig(SlottedModel): max_messages = Field(CheckConfig, default=None) max_mentions = Field(CheckConfig, default=None) max_links = Field(CheckConfig, default=None) max_emojis = Field(CheckConfig, default=None) max_newlines = Field(CheckConfig, default=None) max_attachments = Field(CheckConfig, default=None) max_duplicates = Field(CheckConfig, default=None) punishment = Field(PunishmentType, default=PunishmentType.NONE) punishment_duration = Field(int, default=300) clean = Field(bool, default=False) clean_count = Field(int, default=100) _cached_max_messages_bucket = Field(str, private=True) _cached_max_mentions_bucket = Field(str, private=True) _cached_max_links_bucket = Field(str, private=True) _cached_max_emojis_bucket = Field(str, private=True) _cached_max_newlines_bucket = Field(str, private=True) _cached_max_attachments_bucket = Field(str, private=True) def get_bucket(self, attr, guild_id): obj = getattr(self, attr) if not obj or not obj.count or not obj.interval: return (None, None) bucket = getattr(self, '_cached_{}_bucket'.format(attr), None) if not bucket: bucket = LeakyBucket(rdb, 'spam:{}:{}:{}'.format(attr, guild_id, '{}'), obj.count, obj.interval * 1000) setattr(self, '_cached_{}_bucket'.format(attr), bucket) return obj, bucket
class TagsConfig(PluginConfig): max_tag_length = Field(int) min_level_remove_others = Field(int, default=int(CommandLevels.MOD))
class CommandOverrideConfig(SlottedModel): disabled = Field(bool, default=False) level = Field(int)
class PersistConfig(SlottedModel): roles = Field(bool, default=False) nickname = Field(bool, default=False) voice = Field(bool, default=False) role_ids = ListField(snowflake, default=[])
class JoinPluginConfigAdvanced(SlottedModel): low = Field(int, default=0) medium = Field(int, default=5) high = Field(int, default=10) highest = Field(int, default=30, alias='extreme' ) # Disco calls it extreme, the client calls it Highest.