`ident` varchar(12) NOT NULL,
`realname` varchar(255) NOT NULL,
`automodes` varchar(20) NOT NULL,
+ `oper_user` varchar(50) DEFAULT NULL,
+ `oper_pass` varchar(50) DEFAULT NULL,
`botclass` int(10) NOT NULL,
`textbot` tinyint(1) NOT NULL,
`queue` tinyint(1) NOT NULL,
`channel_badword_reaction_duration` = '60',
`channel_badword_except` = '400' WHERE `channel_name` = 'defaults';
---version: 17
+-- version: 17
+
+ALTER TABLE `bots` ADD `oper_user` VARCHAR( 50 ) NULL AFTER `automodes` ,
+ADD `oper_pass` VARCHAR( 50 ) NULL AFTER `oper_user`;
+
+-- version: 18
event_mode(user, chan, argv[1], argv+2, argc-2);
} else {
//UserMode
+ if(stricmp(client->user->nick, argv[0])) {
+ DESYNCHRONIZE(cache_sync);
+ return 0;
+ }
+ parseUserModes(client->user, argv[1]);
}
DESYNCHRONIZE(cache_sync);
return 1;
static struct UserNode **userList;
+unsigned int valid_user_modes[] = {
+ 1, 'o',
+ 2, 'O',
+ 3, 'i',
+ 4, 'w',
+ 5, 's',
+ 6, 'd',
+ 7, 'k',
+ 8, 'g',
+ 9, 'n',
+ 10, 'I',
+ 11, 'X',
+ 12, 'S',
+ 13, 'H',
+ 14, 'c',
+ 15, 'W',
+ 16, 't',
+ 17, 'D',
+ 18, 'x',
+// ^ maximum is 32!!!
+ 0x00, 0x00
+};
+
void init_UserNode() {
+ unsigned int *mode, flag = 1;
userList = calloc(VALID_NICK_CHARS_FIRST_LEN+1, sizeof(*userList));
+ for (mode = valid_user_modes; mode[1]; mode += 2) {
+ mode[0] = flag;
+ flag = flag << 1;
+ }
}
void free_UserNode() {
return -1; //ERROR!
}
+static unsigned int* getUserModeOptions(char mode) {
+ unsigned int *cmode;
+ for (cmode = valid_user_modes; cmode[1]; cmode += 2) {
+ if(cmode[1] == mode)
+ return cmode;
+ }
+ return NULL;
+}
+
+int isUserModeSet(struct UserNode *user, char modeChar) {
+ unsigned int *modeOpt = getUserModeOptions(modeChar);
+ return (user->usermode & modeOpt[0]);
+}
+
+void parseUserModes(struct UserNode* user, char *modeStr) {
+ int i, add = 1;
+ unsigned int *modeOpt;
+ for(i = 0; i < strlen(modeStr); i++) {
+ if(modeStr[i] == '+') {
+ add = 1;
+ continue;
+ }
+ if(modeStr[i] == '-') {
+ add = 0;
+ continue;
+ }
+ modeOpt = getUserModeOptions(modeStr[i]);
+ if(!modeOpt) continue; // unknown mode?
+ if(add) {
+ user->usermode |= modeOpt[0];
+ } else {
+ user->usermode &= ~modeOpt[0];
+ }
+ }
+}
+
+
struct UserNode* getUserByNick(const char *nick) { //case sensitive
int userListIndex = get_nicklist_entry(*nick);
if(userListIndex == -1 || userList[userListIndex] == NULL)
user->flags = 0;
user->channel = NULL;
user->last_who = 0;
+ user->usermode = 0;
SYNCHRONIZE(cache_sync);
user->next = userList[userListIndex];
userList[userListIndex] = user;
user->realname[0] = 0;
user->flags = 0;
user->channel = NULL;
+ user->usermode = 0;
user->last_who = 0;
} else
user->flags &= ~USERFLAG_FREETMPUSER;
user->realname[0] = 0;
user->flags = 0;
user->channel = NULL;
+ user->usermode = 0;
user->last_who = 0;
} else
user->flags &= ~USERFLAG_FREETMPUSER;
user->realname[0] = 0;
user->flags = USERFLAG_ISSERVER;
user->channel = NULL;
+ user->usermode = 0;
user->last_who = 0;
break;
} else if(cmask[i] == '@') {
user->realname[0] = 0;
user->flags = 0;
user->channel = NULL;
+ user->usermode = 0;
user->last_who = 0;
break;
}
char realname[REALLEN+1];
char auth[AUTHLEN+1];
struct IPNode *ip;
- unsigned int flags;
+ unsigned int flags, usermode;
time_t created, last_who;
struct ChanUser *channel;
struct language *language;
#ifndef DND_FUNCTIONS
void init_UserNode();
void free_UserNode();
+/* MODULAR ACCESSIBLE */ int isUserModeSet(struct UserNode *user, char modeChar);
+void parseUserModes(struct UserNode* user, char *modeStr);
/* MODULAR ACCESSIBLE */ int is_valid_nick(const char *nick);
/* MODULAR ACCESSIBLE */ struct UserNode* getUserByNick(const char *nick);
/* MODULAR ACCESSIBLE */ struct UserNode* getUserByMask(const char *mask);
}
void requestOp(struct UserNode *user, struct ChanNode *chan) {
- struct ClientSocket *bot;
+ struct ClientSocket *bot, *userbot = NULL;
struct ChanUser *chanuser = getChanUser(user, chan);
char opped = 0;
if(!chanuser) return;
if((chanuser->flags & CHANUSERFLAG_OPPED)) return;
for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) {
- if((chanuser = getChanUser(bot->user, chan)) != NULL && (chanuser->flags & CHANUSERFLAG_OPPED)) {
+ if(!opped && (chanuser = getChanUser(bot->user, chan)) != NULL && (chanuser->flags & CHANUSERFLAG_OPPED)) {
opped = 1;
putsock(bot, "MODE %s +o %s", chan->name, user->nick);
- break;
+ }
+ if(bot->user == user) {
+ userbot = bot;
}
}
if(!opped) {
- //self op?
+ if(userbot && (isUserModeSet(user, 'o') || isUserModeSet(user, 'O') || isUserModeSet(user, 'k') || isUserModeSet(user, 'X'))) {
+ putsock(userbot, "MODE %s +o %s", chan->name, user->nick);
+ putsock(userbot, "OPMODE %s +o %s", chan->name, user->nick);
+ }
}
}
/* 181-183 */ #include "WHOHandler.h"
/* 184-188 */ #include "version.h"
/* 189 */ /* modules.h */
+/* 190 */ /* UserNode.h */
#define Function void *
/* 186 */ (Function) get_revision,
/* 187 */ (Function) get_codelines,
/* 188 */ (Function) get_patchlevel,
-/* 189 */ (Function) get_module_name
+/* 189 */ (Function) get_module_name,
+/* 190 */ (Function) isUserModeSet
};
static int module_id_counter = 1;
MYSQL_RES *res;
MYSQL_ROW row;
- printf_mysql_query("SELECT `automodes` FROM `bots` WHERE `id` = '%d'", client->clientid);
+ printf_mysql_query("SELECT `automodes`, `oper_user`, `oper_pass` FROM `bots` WHERE `id` = '%d'", client->clientid);
res = mysql_use();
if ((row = mysql_fetch_row(res)) != NULL) {
+ if(row[1] && row[2]) {
+ putsock(client, "OPER %s %s", row[1], row[2]);
+ }
putsock(client, "MODE %s +%s", client->user->nick, row[0]);
}
MYSQL_RES *res;
MYSQL_ROW row;
- printf_mysql_query("SELECT `automodes` FROM `bots` WHERE `id` = '%d'", client->clientid);
+ printf_mysql_query("SELECT `automodes`, `oper_user`, `oper_pass` FROM `bots` WHERE `id` = '%d'", client->clientid);
res = mysql_use();
if ((row = mysql_fetch_row(res)) != NULL) {
+ if(row[1] && row[2]) {
+ putsock(client, "OPER %s %s", row[1], row[2]);
+ }
putsock(client, "MODE %s +%s", client->user->nick, row[0]);
}
MYSQL_RES *res;
MYSQL_ROW row;
- printf_mysql_query("SELECT `automodes` FROM `bots` WHERE `id` = '%d'", client->clientid);
+ printf_mysql_query("SELECT `automodes`, `oper_user`, `oper_pass` FROM `bots` WHERE `id` = '%d'", client->clientid);
res = mysql_use();
if ((row = mysql_fetch_row(res)) != NULL) {
+ if(row[1] && row[2]) {
+ putsock(client, "OPER %s %s", row[1], row[2]);
+ }
putsock(client, "MODE %s +%s", client->user->nick, row[0]);
}
MYSQL_RES *res;
MYSQL_ROW row;
- printf_mysql_query("SELECT `automodes` FROM `bots` WHERE `id` = '%d'", client->clientid);
+ printf_mysql_query("SELECT `automodes`, `oper_user`, `oper_pass` FROM `bots` WHERE `id` = '%d'", client->clientid);
res = mysql_use();
if ((row = mysql_fetch_row(res)) != NULL) {
+ if(row[1] && row[2]) {
+ putsock(client, "OPER %s %s", row[1], row[2]);
+ }
putsock(client, "MODE %s +%s", client->user->nick, row[0]);
}
MYSQL_RES *res;
MYSQL_ROW row;
- printf_mysql_query("SELECT `automodes` FROM `bots` WHERE `id` = '%d'", client->clientid);
+ printf_mysql_query("SELECT `automodes`, `oper_user`, `oper_pass` FROM `bots` WHERE `id` = '%d'", client->clientid);
res = mysql_use();
if ((row = mysql_fetch_row(res)) != NULL) {
+ if(row[1] && row[2]) {
+ putsock(client, "OPER %s %s", row[1], row[2]);
+ }
putsock(client, "MODE %s +%s", client->user->nick, row[0]);
}
/* 187 */ #define get_codelines ((const char * (*)(void))global[187])
/* 188 */ #define get_patchlevel ((const int (*)(void))global[188])
/* 189 */ #define get_module_name ((char * (*)(int))global[189])
+/* 190 */ #define isUserModeSet ((int (*)(struct UserNode *, char))global[190])
#define MODULE_HEADER(initfunc,startfunc,loopfunc,stopfunc) \
void **global = NULL; \
*/
#include "mysqlConn.h"
-#define DATABASE_VERSION "17"
+#define DATABASE_VERSION "18"
static void show_mysql_error();
#include "main.h"
-#define MODULE_VERSION 2
+#define MODULE_VERSION 3
#ifndef DND_FUNCTIONS
extern const char *compilation;