# -*- coding: utf-8 -*- ## This file is part of Gajim. ## ## Gajim is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published ## by the Free Software Foundation; version 3 only. ## ## Gajim is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with Gajim. If not, see . ## ''' Regex Filter plugin. :author: Yann Leboulanger :since: 23th September 2011 :copyright: Copyright (2011) Yann Leboulanger :license: GPLv3 ''' import re from plugins import GajimPlugin from plugins.helpers import log, log_calls from common import gajim from common import ged from command_system.framework import CommandContainer, command, doc from command_system.implementation.hosts import * class RegexFilterPlugin(GajimPlugin): @log_calls('RegexFilterPlugin') def init(self): self.description = _('Regex Filter Plugin.') self.config_dialog = None self.events_handlers = { 'decrypted-message-received': (ged.PREGUI1, self._nec_decrypted_message_received), 'gc-message-received': (ged.PREGUI1, self._nec_gc_message_received), } self.create_rules() @log_calls('RegexFilterPlugin') def activate(self): FilterCommands.enable() @log_calls('RegexFilterPlugin') def deactivate(self): FilterCommands.disable() @log_calls('RegexFilterPlugin') def create_rules(self): self.rules = {} for num, c in self.config.items(): self.rules[int(num)] = [re.compile(c[0], re.MULTILINE), c[1]] @log_calls('RegexFilterPlugin') def add_rule(self, search, replace): if self.rules: num = max(self.rules.keys()) + 1 else: num = 0 self.config[str(num)] = [search, replace] self.create_rules() @log_calls('RegexFilterPlugin') def remove_rule(self, num): if num in self.config: del self.config[num] self.create_rules() return True return False @log_calls('RegexFilterPlugin') def get_rules(self): return self.config @log_calls('RegexFilterPlugin') def _nec_all(self, obj): if not obj.msgtxt: return rules_num = sorted(self.rules.keys()) for num in rules_num: rule = self.rules[num] obj.msgtxt = rule[0].sub(rule[1], obj.msgtxt) @log_calls('RegexFilterPlugin') def _nec_decrypted_message_received(self, obj): self._nec_all(obj) @log_calls('RegexFilterPlugin') def _nec_gc_message_received(self, obj): self._nec_all(obj) class FilterCommands(CommandContainer): AUTOMATIC = False HOSTS = ChatCommands, PrivateChatCommands, GroupChatCommands @command("add_filter", raw=True) @doc(_("Add an incoming filter. First argument is the search regex, " "second argument is the replace regex.")) def add_filter(self, search, replace): plugin = gajim.plugin_manager.get_active_plugin('regex_filter') plugin.add_rule(search, replace) return _('Added rule to replace %s by %s' % (search, replace)) @command("remove_filter", raw=True) @doc(_("Remove an incoming filter. Argument is the rule number. " "See /list_rules command.")) def remove_filter(self, num): plugin = gajim.plugin_manager.get_active_plugin('regex_filter') if plugin.remove_rule(num): return _('Rule number %s removed' % num) return _('Rule number %s does not exist' % num) @command("list_filters") @doc(_("List incoming filters.")) def list_filters(self): plugin = gajim.plugin_manager.get_active_plugin('regex_filter') rules = plugin.get_rules() st = '' for num, rule in rules.items(): st += _('%(num)s: %(search)s -> %(replace)s') % {'num': num, 'search': rule[0], 'replace': rule[1]} + '\n' if st: return st[:-1] else: return _('No rule defined')