From 5eede1ca24fa61c8c48e4b5c4eee468c7c2873ac Mon Sep 17 00:00:00 2001 From: Goffi Date: Mon, 17 Jan 2011 00:11:50 +0100 Subject: [PATCH] Tools: new misc library, Trigger management implementation --- src/tools/misc.py | 66 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/tools/misc.py diff --git a/src/tools/misc.py b/src/tools/misc.py new file mode 100644 index 00000000..f37a735d --- /dev/null +++ b/src/tools/misc.py @@ -0,0 +1,66 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +""" +SAT: a jabber client +Copyright (C) 2009, 2010, 2011 Jérôme Poisson (goffi@goffi.org) + +This program 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, either version 3 of the License, or +(at your option) any later version. + +This program 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 this program. If not, see . +""" + +from logging import debug, info, error + +"""Misc usefull classes""" + +class TriggerException(Exception): + pass + +class TriggerManager: + """This class manage triggers: code which interact to change de behaviour of SàT""" + + def __init__(self): + self.__triggers={} + + def add(self, point_name, callback): + """Add a trigger to a point + @param point_name: name of the point when the trigger should be run + @param callback: method to call at the trigger point + """ + if not self.__triggers.has_key(point_name): + self.__triggers[point_name]=[] + self.__triggers[point_name].append(callback) + + def remove(self, point_name, callback): + """Remove a trigger from a point + @param point_name: name of the point when the trigger should be run + @param callback: method to remove, must exists in the trigger point""" + try: + self.__triggers[point_name].remove(callback) + except (KeyError,ValueError): + raise TriggerException("Trying to remove an unexisting trigger") + + + def point(self, point_name, *args, **kwargs): + """This put a trigger point + All the trigger for that point will be run + @param point_name: name of the trigger point + @return: True if the action must be continue, False else""" + if not self.__triggers.has_key(point_name): + return True + + for trigger in self.__triggers[point_name]: + if not trigger(*args, **kwargs): + return False + return True +