From 141636b58bbe071ac218f214aa26613ab6f2aff0 Mon Sep 17 00:00:00 2001 From: pk910 Date: Sun, 18 Dec 2011 16:16:42 +0100 Subject: [PATCH] added basic halfop support --- database.sql | 4 ++- src/ChanUser.h | 3 ++- src/ModeNode.c | 49 ++++++++++++++++++++----------------- src/WHOHandler.c | 3 +++ src/cmd_neonserv_nicklist.c | 5 ++++ 5 files changed, 40 insertions(+), 24 deletions(-) diff --git a/database.sql b/database.sql index 4b1bb19..01abde3 100644 --- a/database.sql +++ b/database.sql @@ -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; -- -------------------------------------------------------- diff --git a/src/ChanUser.h b/src/ChanUser.h index 98b9e59..f3ca484 100644 --- a/src/ChanUser.h +++ b/src/ChanUser.h @@ -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; diff --git a/src/ModeNode.c b/src/ModeNode.c index 6ed9b53..4a0b76e 100644 --- a/src/ModeNode.c +++ b/src/ModeNode.c @@ -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; diff --git a/src/WHOHandler.c b/src/WHOHandler.c index ab1b0c0..a21f560 100644 --- a/src/WHOHandler.c +++ b/src/WHOHandler.c @@ -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; diff --git a/src/cmd_neonserv_nicklist.c b/src/cmd_neonserv_nicklist.c index 70cd24d..268621d 100644 --- a/src/cmd_neonserv_nicklist.c +++ b/src/cmd_neonserv_nicklist.c @@ -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'; } -- 2.20.1