port re from walrinator

This commit is contained in:
EyeZiS 2018-04-10 21:18:10 +02:00
parent 54468c493f
commit 193c90336f
Signed by untrusted user: kate
GPG Key ID: F17AECB58C3A3096
1 changed files with 85 additions and 0 deletions

85
stdplugins/re.py Normal file
View File

@ -0,0 +1,85 @@
from collections import defaultdict, deque
import re
import regex
from telethon import events, utils
# Heavily based on
# https://github.com/SijmenSchoon/regexbot/blob/master/regexbot.py
last_msgs = defaultdict(lambda: deque(maxlen=10))
def doit(chat_id, match, original):
fr = match.group(1)
to = match.group(2)
to = to.replace('\\/', '/')
try:
fl = match.group(3)
if fl is None:
fl = ''
fl = fl[1:]
except IndexError:
fl = ''
# Build Python regex flags
count = 1
flags = 0
for f in fl:
if f == 'i':
flags |= regex.IGNORECASE
elif f == 'g':
count = 0
else:
return None, f"Unknown flag: {f}"
def actually_doit(original):
try:
s, i = regex.subn(fr, to, original.message,
count=count, flags=flags)
if i > 0:
return original, s
except Exception as e:
return None, f"u dun goofed m8: {str(e)}"
return None, None
if original is not None:
return actually_doit(original)
# Try matching the last few messages
for original in reversed(last_msgs[chat_id]):
m, s = actually_doit(original)
if s is not None:
return m, s
return None, None
async def group_has_regex(group):
return any(getattr(x, 'username', None) == 'regexbot'
async for x in borg.get_participants(group, search='@regexbot'))
@borg.on(events.NewMessage)
async def on_message(event):
chat_id = utils.get_peer_id(await event.input_chat)
last_msgs[chat_id].append(event.message)
@borg.on(events.NewMessage(
pattern=re.compile(r"^s/((?:\\/|[^/])+)/((?:\\/|[^/])*)(/.*)?")))
async def on_regex(event):
if event.forward:
return
if not event.is_private and await group_has_regex(await event.input_chat):
return
chat_id = utils.get_peer_id(await event.input_chat)
m, s = doit(chat_id, event.pattern_match, await event.reply_message)
if m is not None:
out = await borg.send_message(await event.input_chat, s, reply_to=m.id)
last_msgs[chat_id].append(out)
elif s is not None:
await event.reply(s)
raise events.StopPropagation