X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fcmd_neonserv_register.c;h=c806ca48680197281d8bb5c41145240d060c822e;hb=c575e458c6257e75b97884847143b20965a5dfda;hp=d336d7fc15a42f9e769c8ffe34f1d9b942e58e4b;hpb=0f1dc61921eef1db8e404a5a82372e2d1cd55daa;p=NeonServV5.git diff --git a/src/cmd_neonserv_register.c b/src/cmd_neonserv_register.c index d336d7f..c806ca4 100644 --- a/src/cmd_neonserv_register.c +++ b/src/cmd_neonserv_register.c @@ -1,3 +1,19 @@ +/* cmd_neonserv_register.c - NeonServ v5.2 + * Copyright (C) 2011 Philipp Kreil (pk910) + * + * 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 . + */ #include "cmd_neonserv.h" @@ -7,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; @@ -16,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; + neonserv_cmd_register_async1(client, getTextBot(), user, chan, event, channel, NULL, multibot); + return; + } else if(argc < 2) { + reply(getTextBot(), user, "MODCMD_LESS_PARAM_COUNT"); return; } //check own access @@ -39,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 @@ -55,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 { @@ -64,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) { @@ -78,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); } } @@ -89,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); @@ -106,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(); @@ -169,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); }