From 9b2a1231294413f079b2d5620ce7066687ae1d03 Mon Sep 17 00:00:00 2001 From: pk910 Date: Tue, 18 Oct 2011 22:51:03 +0200 Subject: [PATCH] made cmd_register more multibot compatible --- src/bot_NeonServ.c | 3 +- src/bot_NeonSpam.c | 2 +- src/cmd_neonserv_register.c | 66 ++++++++++++++++++++++++++----------- 3 files changed, 49 insertions(+), 22 deletions(-) diff --git a/src/bot_NeonServ.c b/src/bot_NeonServ.c index 2f449e7..ea5b662 100644 --- a/src/bot_NeonServ.c +++ b/src/bot_NeonServ.c @@ -223,6 +223,7 @@ static const struct default_language_entry msgtab[] = { {"NS_REGISTER_FULL", "the bot can not join more channels."}, {"NS_REGISTER_DISCONNECTED", "%s has been registered with a Bot, that is currently NOT connected. The Bot should join the channel, when it reconnects to the IRC-Network."}, /* {ARGS: "#TestChan"} */ {"NS_REGISTER_DONE", "$b%s$b is now registered to $b%s$b."}, /* {ARGS: "#TestChan", "TestUser"} */ + {"NS_REGISTER_DONE_NOAUTH", "$b%s$b is now registered."}, /* {ARGS: "#TestChan"} */ {"NS_UNREGISTER_NOT_REGISTERED", "$b%s$b is not registered with %s."}, /* {ARGS: "#TestChan", "NeonServ"} */ {"NS_UNREGISTER_DONE", "$b%s$b unregistered."}, /* {ARGS: "#TestChan"} */ {"NS_RECOVER_DONE", "$b%s$b has been recovered."}, /* {ARGS: "#TestChan"} */ @@ -471,7 +472,7 @@ void init_NeonServ() { #define OPER_COMMAND(NAME,FUNCTION,PARAMCOUNT,GACCESS,FLAGS) register_command(BOTID, NAME, FUNCTION, PARAMCOUNT, NULL, GACCESS, FLAGS) // NAME FUNCTION PARAMS ACCS FLAGS OPER_COMMAND("trace", neonserv_cmd_trace, 1, 400, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - OPER_COMMAND("register", neonserv_cmd_register, 2, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); + OPER_COMMAND("register", neonserv_cmd_register, 1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); OPER_COMMAND("unregister", neonserv_cmd_unregister,1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); OPER_COMMAND("recover", neonserv_cmd_recover, 1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); OPER_COMMAND("say", neonserv_cmd_say, 2, 600, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); diff --git a/src/bot_NeonSpam.c b/src/bot_NeonSpam.c index 4695748..56258e0 100644 --- a/src/bot_NeonSpam.c +++ b/src/bot_NeonSpam.c @@ -98,7 +98,7 @@ void init_NeonSpam() { #define OPER_COMMAND(NAME,FUNCTION,PARAMCOUNT,GACCESS,FLAGS) register_command(BOTID, NAME, FUNCTION, PARAMCOUNT, NULL, GACCESS, FLAGS) // NAME FUNCTION PARAMS ACCS FLAGS - OPER_COMMAND("register", neonserv_cmd_register, 2, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); + OPER_COMMAND("register", neonserv_cmd_register, 1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); OPER_COMMAND("unregister", neonserv_cmd_unregister,1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); OPER_COMMAND("bind", neonserv_cmd_bind, 2, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); OPER_COMMAND("unbind", neonserv_cmd_unbind, 1, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); diff --git a/src/cmd_neonserv_register.c b/src/cmd_neonserv_register.c index 47658c5..77cfd51 100644 --- a/src/cmd_neonserv_register.c +++ b/src/cmd_neonserv_register.c @@ -23,7 +23,7 @@ */ static AUTHLOOKUP_CALLBACK(neonserv_cmd_register_auth_lookup); static USERAUTH_CALLBACK(neonserv_cmd_register_nick_lookup); -static void neonserv_cmd_register_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *channel, char *auth); +static void neonserv_cmd_register_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *channel, char *auth, int multibot); struct neonserv_cmd_register_cache { struct ClientSocket *client, *textclient; @@ -32,20 +32,35 @@ struct neonserv_cmd_register_cache { struct Event *event; char *nick; char *channel; + int multibot; }; CMD_BIND(neonserv_cmd_register) { MYSQL_RES *res; MYSQL_ROW row; char *channel = argv[0]; + int multibot = 0; if(!is_valid_chan(channel)) { reply(getTextBot(), user, "NS_INVALID_CHANNEL_NAME", argv[0]); return; } - printf_mysql_query("SELECT `botid` FROM `bot_channels` LEFT JOIN `bots` ON `bot_channels`.`botid` = `bots`.`id` LEFT JOIN `channels` ON `bot_channels`.`chanid` = `channels`.`channel_id` WHERE `channel_name` = '%s' AND `botclass` = '%d'", escape_string(channel), client->botid); + printf_mysql_query("SELECT `botid`, `botclass` FROM `bot_channels` LEFT JOIN `bots` ON `bot_channels`.`botid` = `bots`.`id` LEFT JOIN `channels` ON `bot_channels`.`chanid` = `channels`.`channel_id` WHERE `channel_name` = '%s'", escape_string(channel)); res = mysql_use(); - if ((row = mysql_fetch_row(res)) != NULL) { - reply(getTextBot(), user, "NS_REGISTER_ALREADY", argv[0], client->user->nick); + while ((row = mysql_fetch_row(res)) != NULL) { + if(atoi(row[1]) == client->botid) { + reply(getTextBot(), user, "NS_REGISTER_ALREADY", argv[0], client->user->nick); + return; + } else + multibot = 1; + } + //if theres already another bot in the channel we don't need a owner parameter... + if(multibot && argc < 2) { + //skip all these owner check lines + multibot = 2; + + return; + } else if(argc < 2) { + reply(getTextBot(), user, "MODCMD_LESS_PARAM_COUNT"); return; } //check own access @@ -55,7 +70,7 @@ CMD_BIND(neonserv_cmd_register) { printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[1])); res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { - neonserv_cmd_register_async1(client, getTextBot(), user, chan, event, channel, row[0]); + neonserv_cmd_register_async1(client, getTextBot(), user, chan, event, channel, row[0], multibot); } else { //we need to create a new user... //but first lookup the auth to check if it really exists @@ -71,6 +86,7 @@ CMD_BIND(neonserv_cmd_register) { cache->event = event; cache->nick = strdup(argv[1]); cache->channel = strdup(channel); + cache->multibot = multibot; lookup_authname(argv[1], neonserv_cmd_register_auth_lookup, cache); } } else { @@ -80,7 +96,7 @@ CMD_BIND(neonserv_cmd_register) { cuser->flags |= USERFLAG_ISTMPUSER; } if(cuser->flags & USERFLAG_ISAUTHED) { - neonserv_cmd_register_async1(client, getTextBot(), user, chan, event, channel, cuser->auth); + neonserv_cmd_register_async1(client, getTextBot(), user, chan, event, channel, cuser->auth, multibot); } else { struct neonserv_cmd_register_cache *cache = malloc(sizeof(*cache)); if (!cache) { @@ -94,6 +110,7 @@ CMD_BIND(neonserv_cmd_register) { cache->event = event; cache->nick = strdup(argv[1]); cache->channel = strdup(channel); + cache->multibot = multibot; get_userauth(cuser, neonserv_cmd_register_nick_lookup, cache); } } @@ -105,7 +122,7 @@ static AUTHLOOKUP_CALLBACK(neonserv_cmd_register_auth_lookup) { //AUTH_DOES_NOT_EXIST reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->nick); } else - neonserv_cmd_register_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, cache->channel, auth); + neonserv_cmd_register_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, cache->channel, auth, cache->multibot); free(cache->channel); free(cache->nick); free(cache); @@ -122,30 +139,32 @@ static USERAUTH_CALLBACK(neonserv_cmd_register_nick_lookup) { reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick); } else - neonserv_cmd_register_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, cache->channel, user->auth); + neonserv_cmd_register_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, cache->channel, user->auth, cache->multibot); free(cache->channel); free(cache->nick); free(cache); } -static void neonserv_cmd_register_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *channel, char *auth) { +static void neonserv_cmd_register_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *channel, char *auth, int multibot) { //we've got a valid auth now... MYSQL_RES *res; MYSQL_ROW row, row2; - int userid, adminid; + int userid = 0, adminid; printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) adminid = atoi(row[0]); else adminid = 0; - printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) != NULL) { - userid = atoi(row[0]); - } else { - printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(auth)); - userid = (int) mysql_insert_id(mysql_conn); + if(multibot != 2) { + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + userid = atoi(row[0]); + } else { + printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(auth)); + userid = (int) mysql_insert_id(mysql_conn); + } } printf_mysql_query("SELECT `id`, `max_channels`, `defaulttrigger` FROM `bots` WHERE `botclass` = '%d' ORDER BY `register_priority` DESC", client->botid); res = mysql_use(); @@ -185,8 +204,15 @@ static void neonserv_cmd_register_async1(struct ClientSocket *client, struct Cli } else reply(textclient, user, "NS_REGISTER_DISCONNECTED"); printf_mysql_query("INSERT INTO `bot_channels` (`botid`, `chanid`, `trigger`) VALUES ('%d', '%d', '%s')", botid, chanid, bottrigger); - printf_mysql_query("DELETE FROM `chanusers` WHERE `chanuser_cid` = '%d'", chanid); - printf_mysql_query("INSERT INTO `chanusers` (`chanuser_cid`, `chanuser_uid`, `chanuser_access`) VALUES ('%d', '%d', '%d')", chanid, userid, 500); - reply(textclient, user, "NS_REGISTER_DONE", channel, auth); + if(multibot != 2) { + if(multibot) { + printf_mysql_query("UPDATE `chanusers` SET `chanuser_access` = 499 WHERE `chanuser_cid` = '%d' AND `chanuser_access` = '500'", chanid); + printf_mysql_query("DELETE FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chanid, userid); + } else + printf_mysql_query("DELETE FROM `chanusers` WHERE `chanuser_cid` = '%d'", chanid); + printf_mysql_query("INSERT INTO `chanusers` (`chanuser_cid`, `chanuser_uid`, `chanuser_access`) VALUES ('%d', '%d', '%d')", chanid, userid, 500); + reply(textclient, user, "NS_REGISTER_DONE", channel, auth); + } else + reply(textclient, user, "NS_REGISTER_DONE_NOAUTH", channel); logEvent(event); } -- 2.20.1