Esempio n. 1
0
 async def filter_view(self, ctx, args):
     if len(args) == 0:
         await ctx.send('You must supply a filter name.')
     elif not filters.exists(ctx.author.id, args[0]):
         await ctx.send(f'The filter "{args[0]}" does not exist.')
     else:
         await ctx.send(
             f'`{filters.get(ctx.author.id, args[0])}`\n```\n ```\n{parse(filters.get(ctx.author.id,args[0]), ctx.author.id)["message"]}'
         )
Esempio n. 2
0
 async def filter_delete(self, ctx, args):
     if len(args) == 0:
         await ctx.send('You must supply a filter name.')
     if args[0] in filters.reserved:
         await ctx.send(f'You cannot delete a reserved filter.')
     elif not filters.exists(ctx.author.id, args[0]):
         await ctx.send(f'The filter "{args[0]}" does not exist.')
     else:
         filters.delete(ctx.author.id, args[0])
         await ctx.send(f'Successfully deleted filter "{args[0]}".')
Esempio n. 3
0
 async def filter_edit(self, ctx, args):
     if len(args) == 0:
         await ctx.send('You must supply a filter name.')
     elif not filters.exists(ctx.author.id, args[0]):
         await ctx.send(f'The filter "{args[0]}" does not exist.')
     elif len(args) == 1:
         await ctx.send('You must supply a filter string.')
     else:
         filters.set(ctx.author.id, args[0], ' '.join(args[1:]))
         await ctx.send(f'Successfully edited filter "{args[0]}".')
Esempio n. 4
0
 async def filter_create(self, ctx, args):
     if len(args) == 0:
         await ctx.send('You must supply a filter name.')
     if args[0] in filters.reserved:
         await ctx.send(f'You cannot name a filter "{args[0]}".')
     elif filters.exists(ctx.author.id, args[0]):
         await ctx.send(f'The filter "{args[0]}" already exists.')
     elif len(args) == 1:
         await ctx.send('You must supply a filter string.')
     else:
         filters.set(ctx.author.id, args[0], ' '.join(args[1:]))
         await ctx.send(f'Successfully created filter "{args[0]}".')
Esempio n. 5
0
    def start(self, user):
        if self.stage != Stage.JOIN:
            return {'ok': False, 'message': 'This game has already started!'}
        if user != self.author:
            return {
                'ok':
                False,
                'message':
                f'Only the creator, **@{self.author.name}#{self.author.discriminator}**, can start this game.'
            }
        if len(self.players) < 2:
            return {
                'ok': False,
                'message': 'There must be at least 2 players!'
            }

        errors = []

        if self.settings['rfilter'].value in filters.reserved:
            self.rfilter = filparse(
                filters.get(self.author.id, self.settings['rfilter'].value),
                self.author.id)['data']
        else:
            if filters.exists(self.author.id, self.settings['rfilter'].value):
                fil = filparse(
                    filters.get(self.author.id,
                                self.settings['rfilter'].value),
                    self.author.id, 'rfilter')
                if fil['ok']:
                    self.rfilter = fil['data']
                else:
                    errors += fil['message'].split('\n')
            else:
                rf = self.settings['rfilter'].value
                errors.append(
                    f'Error setting rfilter: No filter named "{rf}" exists.')

        if self.settings['pfilter'].value in filters.reserved:
            self.pfilter = filparse(
                filters.get(self.author.id, self.settings['pfilter'].value),
                self.author.id)['data']
        else:
            if filters.exists(self.author.id, self.settings['pfilter'].value):
                fil = filparse(
                    filters.get(self.author.id,
                                self.settings['pfilter'].value),
                    self.author.id, 'pfilter')
                if fil['ok']:
                    self.pfilter = fil['data']
                else:
                    errors += fil['message'].split('\n')
            else:
                pf = self.settings['pfilter'].value
                errors.append(
                    f'Error setting pfilter: No filter named "{pf}" exists.')

        if not errors:
            self.cards = Cards(self.rfilter, self.pfilter)
            try:
                self.cards = Cards(self.rfilter, self.pfilter)
            except Exception as e:
                errors += str(e).split('\n')

        if errors:
            nl = '\n- '
            return {
                'ok':
                False,
                'message':
                f'```diff\n- {nl.join(errors)}\n```\nGame failed to start.'
            }

        self.stage = Stage.DRAW
        self.round = 1
        self.deal()
        return {
            'ok': True,
            'message': 'Game successfully started.',
            'files': []
        }
Esempio n. 6
0
def parse(string, id, origin=''):
    errmsg = 'Parsing error' + (f' (${origin})' if origin else '') + ': '

    if len(regex.findall(r'(?<!\\)(?:\\{2})*\(', string)) != len(
            regex.findall(r'(?<!\\)(?:\\{2})*\)', string)):
        return {
            'ok': False,
            'message': errmsg + 'mismatched parentheses.',
            'data': None
        }

    groups = [
        i[0] for i in regex.findall(
            r'((?:\\[)(\\]|[^)(\s])+|((?:(?<!\\)|(?<=\\{2}))(?:\\{2})*\((?:(?:\\[)(\\]|[^)(])+|(?1))*+(?:\\{2})*\)))',
            string)
    ]
    stripped = search(r'(?:\\[()\\]|[^()]|(?<=.)\(|\)(?=.))+', string).strip()
    while len(groups) == 1 and len(stripped) == len(string) - 2:
        string = stripped
        groups = [
            i[0] for i in regex.findall(
                r'((?:\\[)(\\]|[^)(\s])+|((?:(?<!\\)|(?<=\\{2}))(?:\\{2})*\((?:(?:\\[)(\\]|[^)(])+|(?1))*+(?:\\{2})*\)))',
                string)
        ]
        stripped = search(r'(?:\\[()\\]|[^()]|(?<=.)\(|\)(?=.))+',
                          string).strip()

    if len(groups) == 0:
        return {'ok': True, 'message': '', 'data': None}
    if len(groups) == 1:
        if string == 'NOT':
            return {
                'ok': False,
                'message': errmsg + 'NOT gate missing right operand.',
                'data': None
            }
        if string in Filter.gates:
            return {
                'ok': False,
                'message':
                errmsg + string + ' gate missing left and right operands.',
                'data': None
            }
        if string.startswith('$'):
            if filters.exists(id, string[1:]):
                return parse(filters.get(id, string[1:]), id, string[1:])
            else:
                return {
                    'ok': False,
                    'message':
                    errmsg + f'No filter named "{string[1:]}" exists.',
                    'data': None
                }
        else:
            try:
                out = Filter(string)
            except Exception as e:
                return {'ok': False, 'message': errmsg + str(e), 'data': None}
        return {'ok': True, 'message': str(out), 'data': out}

    groups = [
        parse(i, id, origin) if i not in Filter.gates else i for i in groups
    ]
    errors = {
        i['message']
        for i in groups if i not in Filter.gates and not i['ok']
    }
    if errors:
        return {'ok': False, 'message': '\n'.join(errors), 'data': None}

    groups = [
        i['data'] if i not in Filter.gates else i for i in groups
        if i in Filter.gates or i['data']
    ]
    i = 0
    while i < len(groups):
        if groups[i] == 'NOT':
            if i == len(groups) - 1:
                return {
                    'ok': False,
                    'message': errmsg + 'NOT gate missing right operand.',
                    'data': None
                }
            if groups[i + 1] == 'NOT':
                groups.pop(i)
                groups.pop(i)
                i -= 1
            elif groups[i + 1] in Filter.gates:
                groups.pop(i)
                groups[i] = Filter.gates[len(Filter.gates) - 1 -
                                         Filter.gates.index(groups[i])]
            else:
                groups[i] = Filter('NOT', combine=True, right=groups[i + 1])
                groups.pop(i + 1)
        i += 1

    i = 0
    while i < len(groups):
        if groups[i] in Filter.gates:
            if i == 0:
                return {
                    'ok': False,
                    'message':
                    errmsg + groups[i] + ' gate missing left operand.',
                    'data': None
                }
                if i == len(groups) - 1 or groups[i + 1] in Filter.gates:
                    return {
                        'ok': False,
                        'message': errmsg + groups[i] +
                        ' gate missing left and right operands.',
                        'data': None
                    }
            elif i == len(groups) - 1 or groups[i + 1] in Filter.gates:
                return {
                    'ok': False,
                    'message':
                    errmsg + groups[i] + ' gate missing right operand.',
                    'data': None
                }
            else:
                groups[i] = Filter(groups[i],
                                   combine=True,
                                   left=groups[i - 1],
                                   right=groups[i + 1])
                groups.pop(i + 1)
                groups.pop(i - 1)
                i -= 1
        i += 1

    if len(groups) == 0:
        return {'ok': True, 'message': '', 'data': None}

    out = groups[0]
    for i in groups[1:]:
        out = Filter('AND', combine=True, left=out, right=i)
    return {'ok': True, 'message': str(out), 'data': out}