implement priority in calling do().
store module.do instead of module, making this an awful lot like an internal command bus. steal a trick from irclib and sort based on priority, while we're at it. we added priority a while ago, and this means that low prio (high value) items are called later, meaning we can do things like !join #botname and have the IrcAdmin handler handle it before MegaHAL gets to it
This commit is contained in:
parent
07be2f3a85
commit
015fe87e1a
@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License
|
|||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import bisect
|
||||||
from ConfigParser import NoOptionError, NoSectionError
|
from ConfigParser import NoOptionError, NoSectionError
|
||||||
import re
|
import re
|
||||||
import signal
|
import signal
|
||||||
@ -81,6 +82,7 @@ class DrBotIRC(irclib.IRC):
|
|||||||
"""Implement a customized irclib IRC."""
|
"""Implement a customized irclib IRC."""
|
||||||
|
|
||||||
modlist = []
|
modlist = []
|
||||||
|
internal_bus = []
|
||||||
config = None
|
config = None
|
||||||
server = None
|
server = None
|
||||||
|
|
||||||
@ -228,8 +230,8 @@ class DrBotIRC(irclib.IRC):
|
|||||||
"""Walk the loaded modules, see if any reply to input text."""
|
"""Walk the loaded modules, see if any reply to input text."""
|
||||||
|
|
||||||
# aliases resolved. run result against each module
|
# aliases resolved. run result against each module
|
||||||
for module in self.modlist:
|
for (priority, handler) in self.internal_bus:
|
||||||
ret = module.do(connection, event, nick, userhost, attempt, admin_unlocked)
|
ret = handler(connection, event, nick, userhost, attempt, admin_unlocked)
|
||||||
if ret is not None:
|
if ret is not None:
|
||||||
# a module had a result for us, post-alias, so return it
|
# a module had a result for us, post-alias, so return it
|
||||||
# TODO: scan all modules with compounding results
|
# TODO: scan all modules with compounding results
|
||||||
@ -268,6 +270,7 @@ class DrBotIRC(irclib.IRC):
|
|||||||
module = sys.modules[modstr]
|
module = sys.modules[modstr]
|
||||||
botmod = eval('module.' + modname + '(self, self.config, self.server)')
|
botmod = eval('module.' + modname + '(self, self.config, self.server)')
|
||||||
self.modlist.append(botmod)
|
self.modlist.append(botmod)
|
||||||
|
bisect.insort(self.internal_bus, (botmod.priority(), botmod.do))
|
||||||
botmod.register_handlers(self.server)
|
botmod.register_handlers(self.server)
|
||||||
|
|
||||||
# might as well add it to the list
|
# might as well add it to the list
|
||||||
@ -290,6 +293,7 @@ class DrBotIRC(irclib.IRC):
|
|||||||
|
|
||||||
# remove module references
|
# remove module references
|
||||||
self.modlist.remove(module)
|
self.modlist.remove(module)
|
||||||
|
self.internal_bus.remove((module.priority(), module.do))
|
||||||
module.unregister_handlers()
|
module.unregister_handlers()
|
||||||
|
|
||||||
# del it
|
# del it
|
||||||
|
Loading…
x
Reference in New Issue
Block a user