completed cmd_adduser and added CMDFLAG_REGISTERED_CHAN flag
authorpk910 <philipp@zoelle1.de>
Wed, 17 Aug 2011 15:27:20 +0000 (17:27 +0200)
committerpk910 <philipp@zoelle1.de>
Wed, 17 Aug 2011 15:27:20 +0000 (17:27 +0200)
ChanNode.c
ChanNode.h
bot_NeonServ.c
cmd_neonserv_adduser.c
modcmd.c
modcmd.h

index 47e06635179c723ebd9a4f137f1e7924b0061f67..482c54ce112ea463a6bf49da2cf879e285efe022 100644 (file)
@@ -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;
+    }
+}
index b62beff35fc8e1fa165bd05b4d6dbb5f4b59eee6..88cf2ac00a86be41606cd22596110f472fa1cdf5 100644 (file)
@@ -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
index 207450148cb7773dffeeceb8b0c0914909b496a1..8621d92bd0a868dc6c6094d495d07c21606c765d 100644 (file)
 #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
index efeb99472dda92079defe701aff14fbf7c686a58..e5d2bd2e1e4e66dbbe6e11b6d5dd3e866ee56f1e 100644 (file)
@@ -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]));
 }
index bde88d19991210699d67513d9aadb46d038afb3f..9273f0265b999b010435b3bc64da26c8824266dd 100644 (file)
--- 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));
index aac4119e42b735c1411f8900c2ff372e17ecd059..932fc1062873cf772334ce115d29b31b3f9e3d44 100644 (file)
--- 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;