def do_sed(message):
if message.channel not in channels:
return
try:
regex, replacement, flags, target = parse_sed(message.content[1:])
except ValueError:
return
try:
c = re.compile(regex, flags & 127)
except re.error as e:
return
g = gevent.getcurrent()
def raiseKeyboardInterrupt(s, i):
print("timing out!", g)
gevent.spawn(message.reply, 'fk off with ur evil regex bro')
g.throw(gevent.GreenletExit)
# ## We install a signal handler, to timeout the regular expression match if it's taking too long, i.e. evil regexp
# ## s/^(a+)+$/rip/
old_sighandler = signal.signal(signal.SIGALRM, raiseKeyboardInterrupt)
signal.setitimer(signal.ITIMER_REAL, 0.05)
try:
m = c.search
q = channels[message.channel]
for i in range(-1, -len(q) - 1, -1):
nick, line = q[i]
if m(line) and (not target or nick.lower() == target):
q[i] = nick, doTranslation(c.sub(replacement, line, 0 if flags & 0x100 else 1)[:400], flags)
gevent.spawn_later(0, message.reply, '*%s*: %s' % (nick, q[i][1]))
break
except re.error as e:
return
finally:
### Restore original handlers.
signal.setitimer(signal.ITIMER_REAL, 0)
signal.signal(signal.SIGALRM, old_sighandler)
评论列表
文章目录