/***********************************************************************
X3 ChangeLog
+2009-01-31 Alex Schumann <rubin@afternet.org>
+
+ * src/chanserv.c: change server link handlers to return an int
+
+ * src/hash.h: change server link handlers to return an int
+
+ * src/plugins/annoy/plugin.py: add some debug code for testing new
+ hooks
+
+ * src/modpython.py: support for new hooks server_link, nick_change,
+ and new_user
+
+ * src/mod-python.c: support for new hooks server_link, nick_change,
+ and new_user
+
2009-01-30 Neil Spierling <sirvulcan@sirvulcan.co.nz>
* src/opserv.c: Warning fix.
}
}
-static void
+static int
handle_server_link(UNUSED_ARG(struct server *server))
{
struct chanData *cData;
timeq_add(now + chanserv_conf.adjust_delay, chanserv_adjust_limit, cData);
}
}
+ return 0;
}
static void
struct modeNode* GetUserMode(struct chanNode* channel, struct userNode* user);
unsigned int IsUserP(struct userNode *user);
-typedef void (*server_link_func_t) (struct server *server);
+typedef int (*server_link_func_t) (struct server *server);
void reg_server_link_func(server_link_func_t handler);
typedef int (*new_user_func_t) (struct userNode *user);
}
}
+static int
+python_handle_server_link(struct server *server)
+{
+ log_module(PY_LOG, LOG_INFO, "python module handle_server_link");
+ if(!server) {
+ log_module(PY_LOG, LOG_WARNING, "Python code got server link without server!");
+ return 0;
+ }
+ else {
+ char *args[] = {server->name, server->description};
+ return python_call_handler("server_link", args, 2, "", "", "");
+ }
+}
+
+static int
+python_handle_new_user(struct userNode *user)
+{
+ log_module(PY_LOG, LOG_INFO, "Python module handle_new_user");
+ if(!user) {
+ log_module(PY_LOG, LOG_WARNING, "Python code got new_user without the user");
+ return 0;
+ }
+ else {
+ char *args[] = {user->nick, user->ident, user->hostname, user->info};
+ return python_call_handler("new_user", args, 4, "", "", "");
+ }
+}
+
+static void
+python_handle_nick_change(struct userNode *user, const char *old_nick)
+{
+ log_module(PY_LOG, LOG_INFO, "Python module handle_nick_change");
+ if(!user) {
+ log_module(PY_LOG, LOG_WARNING, "Python code got nick_change without the user!");
+ }
+ else {
+ char *args[] = {user->nick, (char *)old_nick};
+ python_call_handler("nick_change", args, 2, "", "", "");
+ }
+}
+
/* ----------------------------------------------------------------------------- */
// Please help us by implimenting any of the callbacks listed as TODO below. They already exist
// in x3, they just need handle_ bridges implimented. (see python_handle_join for an example)
-//TODO: reg_server_link_func(python_handle_server_link);
-//TODO: reg_new_user_func(python_handle_new_user);
-//TODO: reg_nick_change_func(python_handle_nick_change);
+ reg_server_link_func(python_handle_server_link);
+ reg_new_user_func(python_handle_new_user);
+ reg_nick_change_func(python_handle_nick_change);
//TODO: reg_del_user_func(python_handle_del_user);
//TODO: reg_account_func(python_handle_account); /* stamping of account name to the ircd */
//TODO: reg_handle_rename_func(python_handle_handle_rename); /* handle used to ALSO mean account name */
return 0
def join(self, irc, channel, nick):
- user = svc.get_user(nick)
+ #user = svc.get_user(nick)
#print "DEBUG: handler.join()"
- self.plugins.callhandler("join", irc, [channel, nick], [channel, nick])
- return 0
+ return self.plugins.callhandler("join", irc, [channel, nick], [channel, nick])
+
+ def server_link(self, irc, name, desc):
+ return self.plugins.callhandler("server_link", irc, [name, desc], [name, desc])
+
+ def new_user(self, irc, nick, ident, hostname, info):
+ # we may filter on all the user fields, but we only pass the nick because
+ # the plugin can get the rest itself
+ return self.plugins.callhandler("new_user", irc, [nick, ident, hostname, info], [nick])
+
+ def nick_change(self, irc, nick, old_nick):
+ return self.plugins.callhandler("nick_change", irc, [nick, old_nick], [nick, old_nick])
def cmd_run(self, irc, cmd):
#print "DEBUG: handler.cmd_run: %s"%cmd
def cmd_command(self, irc, plugin, cmd, args):
#print "DEBUG: handel.cmd_command; %s %s; args= %s"%(plugin, cmd, args)
- self.plugins.callhandler("command", irc, [plugin, cmd], [args])
- return 0
+ return self.plugins.callhandler("command", irc, [plugin, cmd], [args])
def load(self, irc, plugin):
return self.plugins.load(plugin)
def callhandler(self, event, irc, filter, args):
for hook in self.findhooksforevent(event, filter):
- hook.trigger(irc, args)
+ if(hook.trigger(irc, args)):
+ return 1
+ return 0
def load(self, name):
""" Loads a plugin by name """
self.handler = handler
self.name = "annoy"
-# irc.send_target_privmsg("O3", "#TheOPS", "%s is loaded"%self.name)
-# handler.addhook("join", self.on_join, "foobar")
+# These hooks are for testing, and are commented out by default so as not to annoy
+# us unless we want to test them
+ #handler.addhook("join", self.on_join, "foobar")
+ #handler.addhook("nick_change", self.nick_change, ["Rubin", None], "testing")
+
handler.addcommand(self.name, "dance", self.dance)
handler.addcommand(self.name, "nickof", self.nickof)
self.test = "footest"
# def on_join(self, irc, channel, nick):
# irc.send_target_privmsg("x3", channel, "%s joined %s:%s "%(nick, channel, self.test))
+ def nick_change(self, irc, nick, old_nick):
+ svcinfo = svc.get_info()
+ # opserv pm #theops that someones nick changed
+ irc.send_target_privmsg(svcinfo["opserv"], "#theops", "%s changed nick to %s"%(old_nick, nick) )
+
def dance(self, irc, args):
nick = irc.caller
user = svc.get_user(nick)