*/
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;
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
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
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 {
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) {
cache->event = event;
cache->nick = strdup(argv[1]);
cache->channel = strdup(channel);
+ cache->multibot = multibot;
get_userauth(cuser, neonserv_cmd_register_nick_lookup, cache);
}
}
//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);
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();
} 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);
}