maduck/GoWDiscordTeamBot

View on GitHub
models/pet_rescue_config.py

Summary

Maintainability
A
0 mins
Test Coverage
import asyncio

import discord

from models import DB


class PetRescueConfig:
    DEFAULT_CONFIG = {
        'mention': '@everyone',
        'delete_mention': True,
        'delete_message': True,
        'delete_pet': True,
    }

    def __init__(self):
        self.__data = {}

    async def load(self):
        lock = asyncio.Lock()
        async with lock:
            db = DB()
            query = 'SELECT * FROM PetRescueConfig;'
            db.cursor.execute(query)
            self.__data = {
                entry['channel_id']: {
                    'mention': entry['mention'],
                    'delete_mention': bool(entry['delete_mention']),
                    'delete_message': bool(entry['delete_message']),
                    'delete_pet': bool(entry['delete_pet']),
                }
                for entry in db.cursor.fetchall()
            }

    def get(self, channel):
        return self.__data.get(channel.id, self.DEFAULT_CONFIG.copy())

    @staticmethod
    def atobool(input_value, translated_trues):
        true_values = ['on', '1', 'true', 'yes']
        true_values.extend(translated_trues)
        return any(item in input_value.lower() for item in true_values)

    async def update(self, guild, channel, key, value, translated_trues):
        translations = {
            'delete_message': self.atobool,
            'delete_mention': self.atobool,
            'delete_pet': self.atobool,
        }

        def noop(x, _):
            return x

        config = self.get(channel)
        config[key] = translations.get(key, noop)(value, translated_trues)
        await self.set(guild, channel, config)
        return config

    async def set(self, guild, channel, config):
        lock = asyncio.Lock()
        async with lock:
            self.__data[channel.id] = config
            db = DB()
            query = """
            INSERT INTO PetRescueConfig (guild_name, guild_id, channel_name, channel_id, mention, delete_mention,
             delete_message, delete_pet)
              VALUES (?, ?, ?, ?, ?, ?, ?, ?)
              ON CONFLICT (guild_id, channel_id)
              DO UPDATE SET guild_name=?, guild_id=?, channel_name=?, channel_id=?, mention=?, delete_mention=?,
               delete_message=?, delete_pet=?;"""
            channel_type = channel.type
            if channel_type == discord.ChannelType.private:
                guild_name = 'Private Message'
                guild_id = 0
                channel_name = channel.recipient.name
            else:
                guild_id = guild.id
                guild_name = guild.name
                channel_name = channel.name
            params = [
                guild_name,
                guild_id,
                channel_name,
                channel.id,
                config['mention'],
                config['delete_mention'],
                config['delete_message'],
                config['delete_pet'],
            ]
            db.cursor.execute(query, (*params, *params))
            db.commit()
            db.close()