[srvx-commits] CVS: services/src main.c,1.152,1.153 mod-snoop.c,1.16,1.17 modcmd.c,1.64,1.65 modules
Brought to you by:
entrope
From: Entrope <en...@us...> - 2003-08-18 19:35:17
|
Update of /cvsroot/srvx/services/src In directory sc8-pr-cvs1:/tmp/cvs-serv32569/src Modified Files: main.c mod-snoop.c modcmd.c modules.c modules.h Log Message: allow dynamic addition and removal of "secondary" bots Index: main.c =================================================================== RCS file: /cvsroot/srvx/services/src/main.c,v retrieving revision 1.152 retrieving revision 1.153 diff -C2 -r1.152 -r1.153 *** main.c 31 Jul 2003 02:08:40 -0000 1.152 --- main.c 18 Aug 2003 19:35:12 -0000 1.153 *************** *** 25,29 **** #include "ioset.h" #include "modcmd.h" - #include "policer.h" #include "saxdb.h" #include "sendmail.h" --- 25,28 ---- *************** *** 779,782 **** --- 778,782 ---- modcmd_finalize(); saxdb_finalize(); + modules_finalize(); /* The first exit func to be called *should* be saxdb_write_all(). */ Index: mod-snoop.c =================================================================== RCS file: /cvsroot/srvx/services/src/mod-snoop.c,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -r1.16 -r1.17 *** mod-snoop.c 3 Aug 2003 18:44:12 -0000 1.16 --- mod-snoop.c 18 Aug 2003 19:35:13 -0000 1.17 *************** *** 131,144 **** node = conf_get_data("modules/snoop", RECDB_OBJECT); if (!node) return; - str = database_get_data(node, "bot", RECDB_QSTRING); - if (!str) return; - snoop_cfg.bot = GetUserH(str); - if (!snoop_cfg.bot) return; str = database_get_data(node, "channel", RECDB_QSTRING); if (!str) return; snoop_cfg.channel = AddChannel(str, now, "+sntim", NULL); if (!snoop_cfg.channel) return; - AddChannelUser(snoop_cfg.bot, snoop_cfg.channel); - AddChannelOp(1, &snoop_cfg.bot, snoop_cfg.channel, snoop_cfg.bot, 1); str = database_get_data(node, "show_bursts", RECDB_QSTRING); snoop_cfg.show_bursts = str ? enabled_string(str) : 0; --- 131,138 ---- *************** *** 166,169 **** --- 160,179 ---- * usermode (no hook) */ + return 1; + } + + int + snoop_finalize(void) { + dict_t node; + char *str; + + node = conf_get_data("modules/snoop", RECDB_OBJECT); + if (!node) return; + str = database_get_data(node, "bot", RECDB_QSTRING); + if (!str) return; + snoop_cfg.bot = GetUserH(str); + if (!snoop_cfg.bot) return; + AddChannelUser(snoop_cfg.bot, snoop_cfg.channel); + AddChannelOp(1, &snoop_cfg.bot, snoop_cfg.channel, snoop_cfg.bot, 1); return 1; } Index: modcmd.c =================================================================== RCS file: /cvsroot/srvx/services/src/modcmd.c,v retrieving revision 1.64 retrieving revision 1.65 diff -C2 -r1.64 -r1.65 *** modcmd.c 5 Aug 2003 18:16:10 -0000 1.64 --- modcmd.c 18 Aug 2003 19:35:13 -0000 1.65 *************** *** 92,95 **** --- 92,101 ---- #define MCMSG_HELPFILE_SEQUENCE "Help priority %d: %s" #define MCMSG_HELPFILE_SEQUENCE_SET "Set helpfile priority sequence for %s." + #define MCMSG_ALREADY_SERVICE "$b%s$b is already a service." + #define MCMSG_NEW_SERVICE "Added new service bot $b%s$b." + #define MCMSG_SERVICE_RENAMED "Service renamed to $b%s$b." + #define MCMSG_REMOVED_TRIGGER "Removed trigger from $b%s$b." + #define MCMSG_NEW_TRIGGER "Changed trigger for $b%s$b to $b%c$b." + #define MCMSG_SERVICE_REMOVED "Service $b%s$b has been deleted." struct pending_template { *************** *** 873,877 **** unsigned int count; - if (!module) return 0; count = 0; for (it = dict_first(module->commands); it; it = iter_next(it)) { --- 879,882 ---- *************** *** 1606,1609 **** --- 1611,1681 ---- } + static MODCMD_FUNC(cmd_service_add) { + const unsigned char *nick, *desc; + struct userNode *bot; + + nick = argv[1]; + desc = unsplit_string(argv+2, argc-2, NULL); + bot = GetUserH(nick); + if (bot && IsService(bot)) { + reply(MCMSG_ALREADY_SERVICE, bot->nick); + return 0; + } + bot = AddService(nick, desc); + service_register(bot, '\0'); + reply(MCMSG_NEW_SERVICE, bot->nick); + return 1; + } + + static MODCMD_FUNC(cmd_service_rename) { + struct service *service; + + if (!(service = service_find(argv[1]))) { + reply(MCMSG_UNKNOWN_SERVICE, argv[1]); + return 0; + } + NickChange(service->bot, argv[2], 0); + reply(MCMSG_SERVICE_RENAMED, service->bot->nick); + return 1; + } + + static MODCMD_FUNC(cmd_service_trigger) { + struct service *service; + + if (!(service = service_find(argv[1]))) { + reply(MCMSG_UNKNOWN_SERVICE, argv[1]); + return 0; + } + if (service->trigger) reg_chanmsg_func(service->trigger, NULL, NULL); + if (argc < 3) { + reply(MCMSG_REMOVED_TRIGGER, service->bot->nick); + return 1; + } + service->trigger = argv[2][0]; + reg_chanmsg_func(service->trigger, service->bot, modcmd_chanmsg); + reply(MCMSG_NEW_TRIGGER, service->bot->nick, service->trigger); + return 1; + } + + static MODCMD_FUNC(cmd_service_remove) { + char *name, *reason; + struct service *service; + + name = argv[1]; + if (argc > 2) { + reason = unsplit_string(argv+2, argc-2, NULL); + } else { + reason = "Removing bot"; + } + if (!(service = service_find(name))) { + reply(MCMSG_UNKNOWN_SERVICE, name); + return 0; + } + DelUser(service->bot, NULL, 1, reason); + dict_remove(services, name); + reply(MCMSG_SERVICE_REMOVED, name); + return 1; + } + void modcmd_nick_change(struct userNode *user, const char *old_nick) { *************** *** 1682,1685 **** --- 1754,1772 ---- unsigned int ii; + saxdb_start_record(ctx, "bots", 1); + for (it = dict_first(services); it; it = iter_next(it)) { + char buff[16]; + service = iter_data(it); + saxdb_start_record(ctx, service->bot->nick, 1); + if (service->trigger) { + buff[0] = service->trigger; + buff[1] = '\0'; + saxdb_write_string(ctx, "trigger", buff); + } + saxdb_write_string(ctx, "description", service->bot->info); + saxdb_end_record(ctx); + } + saxdb_end_record(ctx); + saxdb_start_record(ctx, "services", 1); for (it = dict_first(services); it; it = iter_next(it)) { *************** *** 1692,1695 **** --- 1779,1783 ---- } saxdb_end_record(ctx); + saxdb_start_record(ctx, "helpfiles", 1); slist.size = 0; *************** *** 1704,1707 **** --- 1792,1796 ---- if (slist.list) free(slist.list); saxdb_end_record(ctx); + return 0; } *************** *** 1731,1734 **** --- 1820,1827 ---- modcmd_register(modcmd_module, "showcommands", cmd_showcommands, 1, 0, "flags", "+acceptchan", NULL); modcmd_register(modcmd_module, "helpfiles", cmd_helpfiles, 2, 0, "template", "bind", NULL); + modcmd_register(modcmd_module, "service add", cmd_service_add, 3, 0, NULL); + modcmd_register(modcmd_module, "service rename", cmd_service_rename, 3, 0, NULL); + modcmd_register(modcmd_module, "service trigger", cmd_service_trigger, 2, 0, NULL); + modcmd_register(modcmd_module, "service remove", cmd_service_remove, 2, 0, NULL); } *************** *** 1840,1846 **** db2 = database_get_data(db, "bots", RECDB_OBJECT); for (it = dict_first(db2); it; it = iter_next(it)) { ! if (service_find(iter_key(it))) { ! continue; ! } rd = iter_data(it); if (rd->type != RECDB_OBJECT) { --- 1933,1941 ---- db2 = database_get_data(db, "bots", RECDB_OBJECT); for (it = dict_first(db2); it; it = iter_next(it)) { ! struct userNode *bot; ! const char *str; ! unsigned char trigger; ! ! if (service_find(iter_key(it))) continue; rd = iter_data(it); if (rd->type != RECDB_OBJECT) { *************** *** 1848,1852 **** continue; } ! /* TODO: create userNode and service for this bot */ } db2 = database_get_data(db, "services", RECDB_OBJECT); --- 1943,1951 ---- continue; } ! str = database_get_data(rd->d.object, "trigger", RECDB_QSTRING); ! trigger = str ? str[0] : '\0'; ! str = database_get_data(rd->d.object, "description", RECDB_QSTRING); ! bot = AddService(iter_key(it), str); ! service_register(bot, trigger); } db2 = database_get_data(db, "services", RECDB_OBJECT); *************** *** 1955,1958 **** --- 2054,2059 ---- svccmd = service_make_alias(service, "stats", "*modcmd.joiner", NULL); svccmd->min_opserv_level = 101; + svccmd = service_make_alias(service, "service", "*modcmd.joiner", NULL); + svccmd->min_opserv_level = 900; service_make_alias(service, "helpserv", "*helpserv.helpserv", NULL); } Index: modules.c =================================================================== RCS file: /cvsroot/srvx/services/src/modules.c,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -r1.27 -r1.28 *** modules.c 29 Jul 2003 01:51:24 -0000 1.27 --- modules.c 18 Aug 2003 19:35:13 -0000 1.28 *************** *** 26,29 **** --- 26,30 ---- WORKING, BROKEN, + INITED, DONE }; *************** *** 32,49 **** const char *name; int (*init_func)(void); const char **deps; enum init_state state; }; ! #define WITH_MODULE(x) extern int x##_init(void); extern const char *x##_module_deps[]; #include "modules-list.h" #undef WITH_MODULE static struct cmodule cmodules[] = { ! #define WITH_MODULE(x) { #x, x##_init, x##_module_deps, UNINIT }, #include "modules-list.h" #undef WITH_MODULE /* Placeholder at end of array */ ! { NULL, NULL, NULL, UNINIT } }; --- 33,51 ---- const char *name; int (*init_func)(void); + int (*finalize_func)(void); const char **deps; enum init_state state; }; ! #define WITH_MODULE(x) extern int x##_init(void); extern int x##_finalize(void); extern const char *x##_module_deps[]; #include "modules-list.h" #undef WITH_MODULE static struct cmodule cmodules[] = { ! #define WITH_MODULE(x) { #x, x##_init, x##_finalize, x##_module_deps, UNINIT }, #include "modules-list.h" #undef WITH_MODULE /* Placeholder at end of array */ ! { NULL, NULL, NULL, NULL, UNINIT } }; *************** *** 62,66 **** static int ! module_init(struct cmodule *cmod) { unsigned int ii; struct cmodule *dep; --- 64,68 ---- static int ! module_init(struct cmodule *cmod, int final) { unsigned int ii; struct cmodule *dep; *************** *** 68,72 **** switch (cmod->state) { case UNINIT: break; ! case DONE: return 1; case BROKEN: return 0; case WORKING: --- 70,75 ---- switch (cmod->state) { case UNINIT: break; ! case INITED: return !final; ! case DONE: return 1; case BROKEN: return 0; case WORKING: *************** *** 74,78 **** return 0; } ! log_module(MAIN_LOG, LOG_INFO, "Starting initialization of code module %s.", cmod->name); cmod->state = WORKING; for (ii=0; cmod->deps[ii]; ++ii) { --- 77,85 ---- return 0; } ! if (final) { ! log_module(MAIN_LOG, LOG_INFO, "Starting late initialization of code module %s.", cmod->name); ! } else { ! log_module(MAIN_LOG, LOG_INFO, "Starting early initialization of code module %s.", cmod->name); ! } cmod->state = WORKING; for (ii=0; cmod->deps[ii]; ++ii) { *************** *** 83,87 **** return 0; } ! if (!module_init(dep)) { log_module(MAIN_LOG, LOG_ERROR, "Failed to initialize dependency %s of code module %s.", dep->name, cmod->name); cmod->state = BROKEN; --- 90,94 ---- return 0; } ! if (!module_init(dep, final)) { log_module(MAIN_LOG, LOG_ERROR, "Failed to initialize dependency %s of code module %s.", dep->name, cmod->name); cmod->state = BROKEN; *************** *** 89,99 **** } } ! if (!cmod->init_func()) { ! log_module(MAIN_LOG, LOG_ERROR, "Failed to initialize code module %s.", cmod->name); ! cmod->state = BROKEN; ! return 0; } - cmod->state = DONE; - return 1; } --- 96,116 ---- } } ! if (final) { ! if (!cmod->finalize_func()) { ! log_module(MAIN_LOG, LOG_ERROR, "Failed to initialize code module %s.", cmod->name); ! cmod->state = BROKEN; ! return 0; ! } ! cmod->state = DONE; ! return 1; ! } else { ! if (!cmod->init_func()) { ! log_module(MAIN_LOG, LOG_ERROR, "Failed to initialize code module %s.", cmod->name); ! cmod->state = BROKEN; ! return 0; ! } ! cmod->state = INITED; ! return 1; } } *************** *** 105,110 **** for (ii=0; cmodules[ii].name; ++ii) { if (cmodules[ii].state == UNINIT) { ! module_init(cmodules + ii); } if (cmodules[ii].state != DONE) { log_module(MAIN_LOG, LOG_WARNING, "Code module %s not properly initialized.", cmodules[ii].name); --- 122,140 ---- for (ii=0; cmodules[ii].name; ++ii) { if (cmodules[ii].state == UNINIT) { ! module_init(cmodules + ii, 0); } + if (cmodules[ii].state != INITED) { + log_module(MAIN_LOG, LOG_WARNING, "Code module %s not properly initialized.", cmodules[ii].name); + } + } + } + + void + modules_finalize(void) { + unsigned int ii; + + for (ii=0; cmodules[ii].name; ++ii) { + if (cmodules[ii].state != INITED) continue; + module_init(cmodules + ii, 1); if (cmodules[ii].state != DONE) { log_module(MAIN_LOG, LOG_WARNING, "Code module %s not properly initialized.", cmodules[ii].name); Index: modules.h =================================================================== RCS file: /cvsroot/srvx/services/src/modules.h,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -r1.14 -r1.15 *** modules.h 7 Jul 2003 16:29:33 -0000 1.14 --- modules.h 18 Aug 2003 19:35:13 -0000 1.15 *************** *** 23,26 **** --- 23,27 ---- void modules_init(void); + void modules_finalize(void); #endif |