# HG changeset patch # User Goffi # Date 1295219510 -3600 # Node ID ad3b820651fafb859d147b4d98c568770600df3e # Parent 0ed5553b5313de89fe7013df7eefbc012f62720d Tools: new misc library, Trigger management implementation diff -r 0ed5553b5313 -r ad3b820651fa src/tools/misc.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/tools/misc.py Mon Jan 17 00:11:50 2011 +0100 @@ -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 +