added basic halfop support
authorpk910 <philipp@zoelle1.de>
Sun, 18 Dec 2011 15:16:42 +0000 (16:16 +0100)
committerpk910 <philipp@zoelle1.de>
Sun, 18 Dec 2011 15:16:42 +0000 (16:16 +0100)
database.sql
src/ChanUser.h
src/ModeNode.c
src/WHOHandler.c
src/cmd_neonserv_nicklist.c

index 4b1bb19685bb1d82b11b8899b7a226ca72360290..01abde3eba806b9cc613daf5bfe3afe0a6386ec5 100644 (file)
@@ -52,13 +52,15 @@ CREATE TABLE IF NOT EXISTS `bots` (
 CREATE TABLE IF NOT EXISTS `bot_binds` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `botclass` int(11) NOT NULL,
+  `botid` int(11) NOT NULL,
   `command` varchar(60) NOT NULL,
   `function` varchar(60) NOT NULL,
   `parameters` varchar(100) NOT NULL,
   `chan_access` varchar(256) DEFAULT NULL,
   `global_access` int(3) DEFAULT NULL,
   `flags` tinyint(4) NOT NULL,
-  PRIMARY KEY (`id`)
+  PRIMARY KEY (`id`),
+  KEY `botid` (`botid`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
 
 -- --------------------------------------------------------
index 98b9e599fdfd280231911200c5c704bc69356f1d..f3ca4848d78da6efdcf4870a0db107d9f5413663 100644 (file)
@@ -21,8 +21,9 @@
 #define CHANUSERFLAG_OPPED  0x01
 #define CHANUSERFLAG_VOICED 0x02
 #define CHANUSERFLAG_INVISIBLE 0x04
+#define CHANUSERFLAG_HALFOPPED 0x08
 
-#define CHANUSERFLAG_OPPED_OR_VOICED (CHANUSERFLAG_OPPED | CHANUSERFLAG_VOICED)
+#define CHANUSERFLAG_OPPED_OR_VOICED (CHANUSERFLAG_OPPED | CHANUSERFLAG_HALFOPPED | CHANUSERFLAG_VOICED)
 
 struct ChanNode;
 struct UserNode;
index 6ed9b530b89e7b5d42ae3c7e844925bd5bf398ca..4a0b76e1d13d42a4616572e7c7e98a16ffc2c5eb 100644 (file)
@@ -25,28 +25,30 @@ static int modes_with_strarg, modes_with_intarg, modes_count;
 unsigned int valid_modes[] = { /* Thats our mode list :P */
     1,  'b', CHANNEL_MODE_TYPE_A,
     2,  'o', CHANNEL_MODE_TYPE_A,
-    3,  'v', CHANNEL_MODE_TYPE_A,
-    4,  'k', CHANNEL_MODE_TYPE_B | CHANNEL_MODE_VALUE_STRING | CHANNEL_MODE_KEY,
-    5,  'a', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_INTEGER,
-    6,  'l', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_INTEGER,
-    7,  'f', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_STRING,
-    8,  'F', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_STRING,
-    9,  'c', CHANNEL_MODE_TYPE_D,
-    10, 'C', CHANNEL_MODE_TYPE_D,
-    11, 'i', CHANNEL_MODE_TYPE_D,
-    12, 'm', CHANNEL_MODE_TYPE_D,
-    13, 'M', CHANNEL_MODE_TYPE_D,
-    14, 'n', CHANNEL_MODE_TYPE_D,
-    15, 'N', CHANNEL_MODE_TYPE_D,
-    16, 'p', CHANNEL_MODE_TYPE_D,
-    17, 'r', CHANNEL_MODE_TYPE_D,
-    18, 's', CHANNEL_MODE_TYPE_D,
-    19, 't', CHANNEL_MODE_TYPE_D,
-    20, 'u', CHANNEL_MODE_TYPE_D,
-    21, 'D', CHANNEL_MODE_TYPE_D,
-    22, 'd', CHANNEL_MODE_TYPE_D,
-    23, 'R', CHANNEL_MODE_TYPE_D,
-    24, 'z', CHANNEL_MODE_TYPE_D,
+    3,  'h', CHANNEL_MODE_TYPE_A,
+    4,  'v', CHANNEL_MODE_TYPE_A,
+    5,  'k', CHANNEL_MODE_TYPE_B | CHANNEL_MODE_VALUE_STRING | CHANNEL_MODE_KEY,
+    6,  'a', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_INTEGER,
+    7,  'l', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_INTEGER,
+    8,  'f', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_STRING,
+    9,  'F', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_STRING,
+    10, 'c', CHANNEL_MODE_TYPE_D,
+    11, 'C', CHANNEL_MODE_TYPE_D,
+    12, 'i', CHANNEL_MODE_TYPE_D,
+    13, 'm', CHANNEL_MODE_TYPE_D,
+    14, 'M', CHANNEL_MODE_TYPE_D,
+    15, 'n', CHANNEL_MODE_TYPE_D,
+    16, 'N', CHANNEL_MODE_TYPE_D,
+    17, 'p', CHANNEL_MODE_TYPE_D,
+    18, 'r', CHANNEL_MODE_TYPE_D,
+    19, 's', CHANNEL_MODE_TYPE_D,
+    20, 'S', CHANNEL_MODE_TYPE_D,
+    21, 't', CHANNEL_MODE_TYPE_D,
+    22, 'u', CHANNEL_MODE_TYPE_D,
+    23, 'D', CHANNEL_MODE_TYPE_D,
+    24, 'd', CHANNEL_MODE_TYPE_D,
+    25, 'R', CHANNEL_MODE_TYPE_D,
+    26, 'z', CHANNEL_MODE_TYPE_D,
 //  ^ maximum is 32!!!
     0x00, 0x00, 0x00
 };
@@ -181,6 +183,9 @@ void parseModes(struct ModeNode* modes, char *modeStr, char **argv, int argc) {
                 case 'o':
                     parseModesUserPriv(modes, CHANUSERFLAG_OPPED, add, argv[argpos]);
                     break;
+                case 'h':
+                    parseModesUserPriv(modes, CHANUSERFLAG_HALFOPPED, add, argv[argpos]);
+                    break;
                 case 'v':
                     parseModesUserPriv(modes, CHANUSERFLAG_VOICED, add, argv[argpos]);
                     break;
index ab1b0c0251d862d9b3c3cb8b0eb951952b4d1d6d..a21f560414ec7ad962a2fb75e76ff43f01ee95cb 100644 (file)
@@ -208,6 +208,9 @@ void recv_whohandler_354(struct ClientSocket *client, char **argv, unsigned int
                 case '@':
                     chanuserflags |= CHANUSERFLAG_OPPED;
                     break;
+                case '%':
+                    chanuserflags |= CHANUSERFLAG_HALFOPPED;
+                    break;
                 case '+':
                     chanuserflags |= CHANUSERFLAG_VOICED;
                     break;
index 70cd24d2999e1c263867032e23df8e149beb633c..268621dfcc613442628e0741cd630ec2fa1096d4 100644 (file)
@@ -105,8 +105,12 @@ static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct Cli
     int synced_user = 0;
     struct ChanUser *chanuser;
     int sort_nicklist[] = { 
+            CHANUSERFLAG_OPPED | CHANUSERFLAG_HALFOPPED | CHANUSERFLAG_VOICED,
+            CHANUSERFLAG_OPPED | CHANUSERFLAG_HALFOPPED,
             CHANUSERFLAG_OPPED | CHANUSERFLAG_VOICED,
             CHANUSERFLAG_OPPED,
+            CHANUSERFLAG_HALFOPPED | CHANUSERFLAG_VOICED,
+            CHANUSERFLAG_HALFOPPED,
             CHANUSERFLAG_VOICED,
             CHANUSERFLAG_INVISIBLE,
             0
@@ -125,6 +129,7 @@ static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct Cli
             if(!stateset) {
                 if((chanuser->flags & CHANUSERFLAG_INVISIBLE)) statebuf[stateset++] = '<';
                 if((chanuser->flags & CHANUSERFLAG_OPPED)) statebuf[stateset++] = '@';
+                if((chanuser->flags & CHANUSERFLAG_HALFOPPED)) statebuf[stateset++] = '%';
                 if((chanuser->flags & CHANUSERFLAG_VOICED)) statebuf[stateset++] = '+';
                 statebuf[stateset++] = '\0';
             }