Пример #1
0
    def voice_connect(self, guild, channel):
        guild_id = get(guild, 'id', guild)
        channel_id = get(channel, 'id', channel)
        path = 'guild/{}/voice_connect/{}'.format(guild_id, channel_id)

        try:
            r = self.http.get(path)
        except RPCException as e:
            if e.status_code == 404:
                return None
            raise e

        return True
Пример #2
0
    def get_guild_member(self, guild, member):
        guild_id = get(guild, 'id', guild)
        member_id = get(member, 'id', member)
        path = 'guild/{}/members/{}'.format(guild_id, member_id)

        try:
            r = self.http.get(path)
        except RPCException as e:
            if e.status_code == 404:
                return None
            raise e

        payload = r.json()
        return Member(**payload)
Пример #3
0
    def __init__(self, in_bot=True):
        self.plugin_db = PrefixedRedis(self.db, 'plugin.' + self.id + '.')

        self.in_bot = in_bot

        methods = inspect.getmembers(self, predicate=inspect.ismethod)
        commands_callbacks = [
            meth for name, meth in methods if get(meth, 'command_info')
        ]
        self.commands = []
        for cb in commands_callbacks:
            info = cb.command_info

            opts = dict()
            opts['expression'] = info['expression']
            opts['description'] = info['description']
            opts['callback'] = cb
            opts['plugin'] = self
            opts['restrict_default'] = info.get('restrict_default', False)

            command = Command(**opts)
            self.commands.append(command)

        # Configs group keys
        self.config_db = GroupKeys(self.id + '.config',
                                   self.plugin_db,
                                   cache=in_bot,
                                   callback=self.handle_config_change)

        # Commands Configs group keys
        self.commands_config_db = GroupKeys(
            self.id + '.cmd-config',
            self.plugin_db,
            cache=in_bot,
            callback=self.handle_commands_config_change)
Пример #4
0
    def check_guild(self, guild):
        guild_id = get(guild, 'id', guild)

        if not self.db.sismember('servers', guild_id):
            return False

        plugins = self.db.smembers('plugins:{}'.format(guild_id))
        return self.name in plugins
Пример #5
0
    def get_dict(self):
        dct = dict()

        for field_name in self.top_level_fields:
            value = get(self, field_name)
            if value:
                dct[field_name] = value

        footer = dict()
        for field_name in self.footer_fields:
            value = get(self, 'footer_' + field_name)
            if value:
                footer[field_name] = randomize(field_name, value, light=True)
        if footer != {}:
            dct['footer'] = footer

        image = dict()
        for field_name in self.image_fields:
            value = get(self, 'image_' + field_name)
            if value:
                image[field_name] = randomize(field_name, value, light=False)
        if image != {}:
            dct['image'] = image

        thumbnail = dict()
        for field_name in self.thumbnail_fields:
            value = get(self, 'thumbnail_' + field_name)
            if value:
                thumbnail[field_name] = randomize(field_name,
                                                  value,
                                                  light=False)
        if thumbnail != {}:
            dct['thumbnail'] = thumbnail

        author = dict()
        for field_name in self.author_fields:
            value = get(self, 'author_' + field_name)
            if value:
                author[field_name] = randomize(field_name, value, light=True)
        if author != {}:
            dct['author'] = author

        dct['fields'] = self.fields

        return dct
Пример #6
0
    def get_config(self, guild):
        guild_id = get(guild, 'id', guild)

        raw_config = self.config_db.get('config.{}'.format(guild_id))
        if raw_config is None:
            return self.default_config(guild)

        config = json.loads(raw_config)
        return CommandConfig(**config)
Пример #7
0
 def patch_config(self, guild, partial_new_config):
     guild_id = get(guild, 'id', guild)
     config = self.get_config(guild)
     for field_name in config.__class__._fields:
         new_value = partial_new_config.get(field_name)
         if new_value is not None:
             setattr(config, field_name, new_value)
     config.sanitize()
     config.validate()
     raw_config = json.dumps(config.serialize())
     self.config_db.set('config.{}'.format(guild_id), raw_config)
     return config
Пример #8
0
    def get_config(self, guild):
        guild_id = get(guild, 'id', guild)

        key = 'config.{}'.format(guild_id)
        raw_config = self.config_db.get(key)

        if raw_config:
            config = self.config_model(**json.loads(raw_config))
        else:
            config = self.get_default_config(guild_id)

        return config
Пример #9
0
    def voice_stop(self, guild):
        guild_id = get(guild, 'id', guild)
        path = 'guild/{}/voice_stop'.format(guild_id)

        try:
            r = self.http.get(path)
        except RPCException as e:
            if e.status_code == 404:
                return None
            raise e

        return True
Пример #10
0
    def get_guild_storage(self, guild):
        guild_id = get(guild, 'id', guild)
        guild_storage = self.guild_storages.get(guild_id)

        if guild_storage:
            return guild_storage

        prefix = 'plugin.{}.guild.{}.storage.'.format(self.id, guild_id)
        guild_storage = PrefixedRedis(self.db, prefix)
        self.guild_storages[guild_id] = guild_storage

        return guild_storage
Пример #11
0
    def voice_play(self, guild, url):
        guild_id = get(guild, 'id', guild)
        path = 'guild/{}/voice_play'.format(guild_id)

        json_body = {'url': url}
        try:
            r = self.http.post(path, json=json_body)
        except RPCException as e:
            if e.status_code == 404:
                return None
            raise e

        return True
Пример #12
0
    def get_guild_members(self, guild):
        guild_id = get(guild, 'id', guild)
        path = 'guild/{}/members'.format(guild_id)

        try:
            r = self.http.get(path)
        except RPCException as e:
            if e.status_code == 404:
                return None
            raise e

        payload = r.json()
        return [Member(**m) for m in payload.values()]
Пример #13
0
    def get_guild(self, guild):
        guild_id = get(guild, 'id', guild)
        path = 'guild/{}'.format(guild_id)

        try:
            r = self.http.get(path)
        except RPCException as e:
            if e.status_code == 404:
                return None
            raise e

        payload = r.json()
        return Guild(**payload)
Пример #14
0
 def patch_config(self, guild, raw_config):
     guild_id = get(guild, 'id', guild)
     config = self.get_config(guild_id)
     new_config = self.config_model(**raw_config)
     new_config.sanitize()
     new_config.validate()
     # pre-hook
     self.before_config_patch(guild_id, config, new_config)
     self.config_db.set('config.{}'.format(guild_id),
                        json.dumps(new_config.serialize()))
     # post-hook
     self.after_config_patch(guild_id, new_config)
     return new_config
Пример #15
0
    def default_config(self, guild):
        guild_id = get(guild, 'id', guild)

        default_config = {
            'allowed_roles': [],
            'enabled': True,
            'global_cooldown': -1,
            'personal_cooldown': -1
        }

        if not self.restrict_default:
            default_config['allowed_roles'] = [guild_id]

        return CommandConfig(**default_config)
Пример #16
0
    def run(self):
        loops = []
        for name, method in self.__class__.__dict__.items():
            if hasattr(method, 'is_loop'):
                loops.append(name)

        loops = [get(self, loop) for loop in loops]

        active_loops = []

        import copy
        for loop in loops:
            active_loops.append(gevent.spawn(self.get_loop_container(loop)))

        gevent.joinall(active_loops)
Пример #17
0
    def handle_event(self, payload):
        event_type = payload['t']
        guild_id = payload['g']
        data = payload.get('d')

        if data:
            data_type_name = event_type.split('_')[0].lower()
            data_type_module = get(mee6.types, data_type_name)
            if data_type_module:
                data_type = get(data_type_module, data_type_name.capitalize())
            else:
                data_type = None

            if data_type:
                decoded_data = data_type(**data)
            else:
                decoded_data = data

        listener = get(self, 'on_' + event_type.lower())
        if listener:
            if data:
                gevent.spawn(listener, guild_id, decoded_data)
            else:
                gevent.spawn(listener, guild_id)
Пример #18
0
    def check_permission(self, ctx):
        member_permissions = ctx.author.guild_permissions

        if (member_permissions >> 5 & 1) or (member_permissions >> 3 & 1):
            return True

        if int(ctx.author.id) == int(ctx.guild.owner_id):
            return True

        config = self.get_config(ctx.guild)
        allowed_roles = config.allowed_roles
        for role in ctx.author.roles:
            role_id = get(role, 'id', role)
            if role_id in allowed_roles:
                return True

        return False
Пример #19
0
 def patch_config_old(self, guild, partial_new_config):
     guild_id = get(guild, 'id', guild)
     config = self.get_config(guild_id)
     new_config = deepcopy(config)
     for field_name, field in config.__class__._fields.items():
         new_value = partial_new_config.get(field_name)
         if new_value is not None:
             setattr(new_config, field_name, field.deserialize(new_value))
     new_config.sanitize()
     new_config.validate()
     # pre-hook
     self.before_config_patch(guild_id, config, new_config)
     self.config_db.set('config.{}'.format(guild_id),
                        json.dumps(new_config.serialize()))
     # post-hook
     self.after_config_patch(guild_id, new_config)
     return new_config
Пример #20
0
    def patch_config(self, guild, new_config):
        guild_id = get(guild, 'id', guild)

        old_config = self.get_config(guild_id)

        # pre-hook
        self.before_config_patch(guild_id, old_config, new_config)

        config = {
            k: new_config.get(k, old_config[k])
            for k in old_config.keys()
        }

        # validation
        config = self.validate_config(guild_id, config)

        self.config_db.set('config.{}'.format(guild_id), json.dumps(config))

        # post-hook
        self.after_config_patch(guild_id, config)

        return config
Пример #21
0
 def send(self, guild, channel):
     guild_id = get(guild, 'id', guild)
     channel_id = get(channel, 'id', channel)
     return send_message(channel_id, self.message, embed=self.embed)
Пример #22
0
 def disable(self, guild):
     guild_id = get(guild, 'id', guild)
     self.db.srem('plugins:{}'.format(guild_id), self.name)
     self.db.srem('plugin.{}.guilds'.format(self.name), guild_id)
Пример #23
0
def worker(plugins):
    plugins = [get(mee6.plugins, plugin_name) for plugin_name in plugins]

    mee6_worker.run(*plugins)
Пример #24
0
def plugin(plugin_name):
    plugins_name = plugin_name.capitalize()
    plugin = get(mee6.plugins, plugin_name)()

    plugin.run()
Пример #25
0
 def delete_config(self, guild):
     guild_id = get(guild, 'id', guild)
     self.config_db.delete('config.{}'.format(guild_id))