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"]}' )
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]}".')
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]}".')
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]}".')
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': [] }
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}