From: pk910 Date: Wed, 17 Aug 2011 15:27:20 +0000 (+0200) Subject: completed cmd_adduser and added CMDFLAG_REGISTERED_CHAN flag X-Git-Tag: v5.3~520 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=db818bf4952ccd5eda06f7ccbbe2283db1414065 completed cmd_adduser and added CMDFLAG_REGISTERED_CHAN flag --- diff --git a/ChanNode.c b/ChanNode.c index 47e0663..482c54c 100644 --- a/ChanNode.c +++ b/ChanNode.c @@ -2,6 +2,7 @@ #include "ChanUser.h" #include "UserNode.h" #include "modcmd.h" +#include "mysqlConn.h" static struct ChanNode **chanList; static int modes_with_strarg, modes_with_intarg; @@ -375,3 +376,18 @@ void getModeString(struct ChanNode* chan, char *modesStr) { #undef MODE_VALUE_INDEX } + +void load_channel_settings(struct ChanNode *chan) { + if(!(chan->flags & CHANFLAG_REQUESTED_CHANINFO)) { + check_mysql(); + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `channel_id` FROM `channels` WHERE `channel_name` = '%s'", escape_string(chan->name)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + chan->flags |= CHANFLAG_CHAN_REGISTERED; + chan->channel_id = atoi(row[0]); + } + chan->flags |= CHANFLAG_REQUESTED_CHANINFO; + } +} diff --git a/ChanNode.h b/ChanNode.h index b62beff..88cf2ac 100644 --- a/ChanNode.h +++ b/ChanNode.h @@ -6,6 +6,8 @@ struct ChanUser; struct trigger_cache; #define CHANFLAG_RECEIVED_USERLIST 0x01 +#define CHANFLAG_REQUESTED_CHANINFO 0x02 +#define CHANFLAG_CHAN_REGISTERED 0x04 struct ChanNode { char name[CHANNELLEN+1]; @@ -18,6 +20,7 @@ struct ChanNode { struct UserNode *chanbot; struct trigger_cache *trigger; + int channel_id; struct ChanNode *next; }; @@ -35,4 +38,6 @@ void* getModeValue(struct ChanNode* chan, char modeChar); void parseModes(struct ChanNode* chan, char *modeStr, char **argv, int argc); void getModeString(struct ChanNode* chan, char *modesStr); +void load_channel_settings(struct ChanNode *chan); + #endif \ No newline at end of file diff --git a/bot_NeonServ.c b/bot_NeonServ.c index 2074501..8621d92 100644 --- a/bot_NeonServ.c +++ b/bot_NeonServ.c @@ -13,13 +13,14 @@ #include "WHOHandler.h" #define BOTID 1 -#define CLASSNAME "NeonServ" static const struct default_language_entry msgtab[] = { {"NS_USER_UNKNOWN", "User with nick \002%s\002 does not exist."}, {"NS_AUTH_UNKNOWN", "Account \002%s\002 has not been registered."}, {"NS_USER_NEED_AUTH", "%s must first authenticate with \002AuthServ\002."}, {"NS_INVALID_ACCESS", "\002%d\002 is an invalid access level."}, + {"NS_ADDUSER_ALREADY_ADDED", "%s is already on the \002%s\002 user list (with access %d)."}, + {"NS_ADDUSER_DONE", "Added %s to the %s user list with access %d."}, {NULL, NULL} }; @@ -60,7 +61,7 @@ static void start_bots() { MYSQL_RES *res, *res2; MYSQL_ROW row; - printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `whoisbot`, `id` FROM `bots` WHERE `botclass` = '%s' AND `active` = '1'", escape_string(CLASSNAME)); + printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `whoisbot`, `id` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); res = mysql_use(); while ((row = mysql_fetch_row(res)) != NULL) { @@ -95,7 +96,7 @@ void init_NeonServ() { register_command(BOTID, "users", neonserv_cmd_users, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REQUIRE_AUTH); register_command(BOTID, "modes", neonserv_cmd_modes, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - register_command(BOTID, "adduser", neonserv_cmd_adduser, 2, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + register_command(BOTID, "adduser", neonserv_cmd_adduser, 2, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); start_bots(); bind_bot_ready(neonserv_bot_ready); @@ -109,4 +110,3 @@ void free_NeonServ() { } #undef BOTID -#undef CLASSNAME diff --git a/cmd_neonserv_adduser.c b/cmd_neonserv_adduser.c index efeb994..e5d2bd2 100644 --- a/cmd_neonserv_adduser.c +++ b/cmd_neonserv_adduser.c @@ -111,9 +111,17 @@ static void neonserv_cmd_adduser_async1(struct ClientSocket *client, struct Clie res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { userid = atoi(row[0]); + //check if the user is already added + printf_mysql_query("SELECT `chanuser_access` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + reply(textclient, user, "NS_ADDUSER_ALREADY_ADDED", nick, chan->name, atoi(row[0])); + return; + } } else { printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(auth)); userid = (int) mysql_insert_id(mysql_conn); } - putsock(client, "PRIVMSG %s :%s: [%d] %s %d", chan->name, nick, userid, auth, caccess); + printf_mysql_query("INSERT INTO `chanusers` (`chanuser_cid`, `chanuser_uid`, `chanuser_access`) VALUES ('%d', '%d', '%d')", chan->channel_id, userid, access); + reply(textclient, user, "NS_ADDUSER_DONE", nick, chan->name, atoi(row[0])); } diff --git a/modcmd.c b/modcmd.c index bde88d1..9273f02 100644 --- a/modcmd.c +++ b/modcmd.c @@ -198,6 +198,22 @@ static void handle_command(struct ClientSocket *client, struct UserNode *user, s reply(tmp_text_client, user, "MODCMD_CHAN_REQUIRED"); break; } + if((cbind->func->flags & CMDFLAG_REGISTERED_CHAN)) { + load_channel_settings(chan); + if(!(chan->flags & CHANFLAG_CHAN_REGISTERED)) { + reply(tmp_text_client, user, "MODCMD_CHAN_REQUIRED"); + break; + } + check_mysql(); + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `botid` FROM `bot_channels` LEFT JOIN `bots` ON `bot_channels`.`botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botclass` = '%d'", chan->channel_id, client->botid); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) == NULL) { + reply(tmp_text_client, user, "MODCMD_CHAN_REQUIRED"); + break; + } + } if((cbind->func->flags & CMDFLAG_CHECK_AUTH) && !(user->flags & USERFLAG_ISAUTHED)) { //check auth... struct command_check_user_cache *data = malloc(sizeof(*data)); diff --git a/modcmd.h b/modcmd.h index aac4119..932fc10 100644 --- a/modcmd.h +++ b/modcmd.h @@ -7,6 +7,7 @@ #define CMDFLAG_REQUIRE_GOD 0x04 #define CMDFLAG_CHECK_AUTH 0x08 #define CMDFLAG_OVERRIDE_ACCESS 0x10 +#define CMDFLAG_REGISTERED_CHAN 0x20 struct ClientSocket; struct UserNode;