1
0
Fork 0

[grep] Introducing new module that perform grep like action on subcommand

This commit is contained in:
nemunaire 2015-11-13 01:39:30 +01:00
parent 38412c1c16
commit f27347f028
1 changed files with 64 additions and 0 deletions

64
modules/grep.py Normal file
View File

@ -0,0 +1,64 @@
"""Filter messages, displaying lines matching a pattern"""
# PYTHON STUFFS #######################################################
import re
from nemubot import context
from nemubot.exception import IMException
from nemubot.hooks import hook
from nemubot.message import Command, Text
from more import Response
# MODULE CORE #########################################################
def grep(fltr, cmd, args, msg):
"""Perform a grep like on known nemubot structures
Arguments:
fltr -- The filter regexp
cmd -- The subcommand to execute
args -- subcommand arguments
msg -- The original message
"""
for r in context.subtreat(Command(cmd,
args,
to_response=msg.to_response,
frm=msg.frm,
server=msg.server)):
if isinstance(r, Response):
for i in range(len(r.messages) - 1, -1, -1):
if isinstance(r.messages[i], list):
for j in range(len(r.messages[i]) - 1, -1, -1):
if not re.match(fltr, r.messages[i][j]):
r.messages[i].pop(j)
if len(r.messages[i]) <= 0:
r.messages.pop(i)
elif isinstance(r.messages[i], str) and not re.match(fltr, r.messages[i]):
r.messages.pop(i)
yield r
elif isinstance(r, Text):
if re.match(fltr, r.message):
yield r
else:
yield r
# MODULE INTERFACE ####################################################
@hook.command("grep",
help="Display only lines from a subcommand matching the given pattern",
help_usage={"PTRN !SUBCMD": "Filter SUBCMD command using the pattern PTRN"})
def cmd_grep(msg):
if len(msg.args) < 2:
raise IMException("Please provide a filter and a command")
return [m for m in grep(msg.args[0] if msg.args[0][0] == "^" else ".*" + msg.args[0] + ".*",
msg.args[1][1:] if msg.args[1][0] == "!" else msg.args[1],
msg.args[2:],
msg)]