]>
jfr.im git - erebus.git/blob - modules/subtext.py
1 # Erebus IRC bot - Author: Erebus Team
2 # vim: fileencoding=utf-8
3 # module for 's/regex/replacement/' style correction
4 # warning: arbitrary regex's are generally capable of various DoS attacks on CPU/memory usage. use with caution.
5 # This file is released into the public domain; see http://unlicense.org/
9 'author': 'Erebus Team',
10 'license': 'public domain',
11 'compatible': [0], # compatible module API versions
12 'depends': [], # other modules required to work properly?
13 'softdeps': [], # modules which are preferred but not required
18 lib
= modlib
.modlib(__name__
)
19 modstart
= lib
.modstart
24 from collections
import namedtuple
25 re_findsub
= re
.compile(r
"""s([/'";:!@#$%^&-_=`~])(?P<search>.+?)\1(?P<replace>.*?)(?:\1(?P<global>g)?|$)""")
26 Line
= namedtuple('Line', ['sender', 'msg'])
28 @lib.hooknum("PRIVMSG")
29 def privmsg_hook(bot
, line
):
30 pieces
= line
.split(None, 3)
31 fromnick
= pieces
[0][1:].split('!')[0]
33 if chan
[0] != "#": return
36 mo
= re_findsub
.match(msg
)
38 if mo
.group('global') is not None:
41 count
= 1 # only first
43 newline
= re
.sub(mo
.group('search'), mo
.group('replace'), lastline
[chan
].msg
, count
)
44 except Exception as e
: return # ignore it if it doesn't work
45 if newline
!= lastline
[chan
].msg
:
46 if lastline
[chan
].sender
== fromnick
:
47 bot
.msg(chan
, "<%s> %s" % (lastline
[chan
].sender
, newline
))
49 bot
.msg(chan
, "%s: <%s> %s" % (fromnick
, lastline
[chan
].sender
, newline
))
51 lastline
[chan
] = Line(sender
=fromnick
, msg
=msg
)