diff src/tools/misc.py @ 250:ad3b820651fa

Tools: new misc library, Trigger management implementation
author Goffi <goffi@goffi.org>
date Mon, 17 Jan 2011 00:11:50 +0100
parents
children cf005701624b
line wrap: on
line diff
--- /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 <http://www.gnu.org/licenses/>.
+"""
+
+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
+