ALTER TABLE `channels` ADD `channel_exttopic` TINYINT( 1 ) NOT NULL AFTER `channel_topicmask` ,
ADD `channel_exttopic_topic` VARCHAR( 512 ) NOT NULL AFTER `channel_exttopic`;
-ALTER TABLE `bots` ADD `max_channels` INT( 5 ) NOT NULL ;
\ No newline at end of file
+ALTER TABLE `bots` ADD `max_channels` INT( 5 ) NOT NULL ;
+
+ALTER TABLE `bot_binds` CHANGE `botid` `botclass` INT( 11 ) NOT NULL;
+ALTER TABLE `bots` DROP `whoisbot` ;
+ALTER TABLE `bots` DROP `bindFrom` ;
+
--- /dev/null
+
+#include "EventLogger.h"
+
+static struct Event *first_event = NULL, *last_event = NULL;
+
+struct Event *createEvent(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *command, char **args, int argc, int flags) {
+ struct Event *event = malloc(sizeof(*event));
+ if (!event)
+ {
+ perror("malloc() failed");
+ return NULL;
+ }
+ event->client = client;
+ event->user = user;
+ event->chan = chan;
+ event->event_time = time(0);
+ event->command = strdup(command);
+ char arguments[MAXLEN];
+ int argpos = 0;
+ int i;
+ for(i = 0; i < argc; i++)
+ argpos += sprintf(arguments + argpos, "%s ", args[i]);
+ arguments[(argpos ? argpos-1 : 0)] = '\0';
+ event->arguments = strdup(arguments);
+ event->flags = flags;
+ event->next = NULL;
+ if(last_event) {
+ last_event->next = event;
+ last_event = event;
+ } else {
+ last_event = event;
+ first_event = event;
+ }
+ return event;
+}
+
+void logEvent(struct Event *event) {
+ //log!
+}
+
+static void destroyEvent(struct Event *event) {
+ if(event == first_event)
+ first_event = event->next;
+ if(event == last_event) {
+ struct Event *last;
+ for(last = first_event; last; last = last->next)
+ if(last->next == NULL) break;
+ last_event = last;
+ }
+ free(event->command);
+ free(event->arguments);
+ free(event);
+}
+
+void destroyEvents() {
+ time_t now = time(0);
+ while(first_event && now - first_event->event_time >= 60) {
+ destroyEvent(first_event);
+ }
+}
--- /dev/null
+#ifndef _EventLogger_h
+#define _EventLogger_h
+
+#include "main.h"
+struct ClientSocket;
+struct UserNode;
+struct ChanNode;
+
+struct Event {
+ struct ClientSocket *client;
+ struct UserNode *user;
+ struct ChanNode *chan;
+ time_t event_time;
+ char *command;
+ char *arguments;
+ unsigned int flags; /* defined in modcmd.h */
+
+ struct Event *next;
+};
+
+struct Event *createEvent(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *command, char **args, int argc, int flags);
+void logEvent(struct Event *event);
+void destroyEvents();
+
+#endif
\ No newline at end of file
gcc -g -O2 ${LIBS} -c tools.c -o tools.o ${CFLAGS}
gcc -g -O2 ${LIBS} -c timeq.c -o timeq.o ${CFLAGS}
gcc -g -O2 ${LIBS} -c DBHelper.c -o DBHelper.o ${CFLAGS}
+ gcc -g -O2 ${LIBS} -c EventLogger.c -o EventLogger.o ${CFLAGS}
gcc -g -O2 ${LIBS} -c bots.c -o bots.o ${CFLAGS}
gcc -g -O2 ${LIBS} -c bot_NeonServ.c -o bot_NeonServ.o ${CFLAGS}
#include "tools.h"
#include "timeq.h"
#include "version.h"
+#include "EventLogger.h"
#define BOTID 1
{"NS_USERS_COUNT_MATCH", "There are \002%d\002 users in %s. (\002%d\002 matching your request)"},
{"NS_USERS_COUNT_MATCH_1", "There is \002%d\002 user in %s. (\002%d\002 matching your request)"},
{"NS_USERS_SEEN_HERE", "Here"},
+ {"NS_USERS_SEEN_INVISIBLE", "Here (invisible)"},
{"NS_USERS_SEEN_NEVER", "Never"},
{"NS_USERS_STATE_SUSPENDED", "Suspended"},
{"NS_USERS_STATE_NORMAL", "Normal"},
client->botid = BOTID;
client->clientid = atoi(row[7]);
connect_socket(client);
- printf_mysql_query("SELECT `command`, `function`, `parameters`, `global_access`, `chan_access` FROM `bot_binds` WHERE `botid` = '%d'", client->clientid);
+ printf_mysql_query("SELECT `command`, `function`, `parameters`, `global_access`, `chan_access` FROM `bot_binds` WHERE `botclass` = '%d'", client->botid);
res2 = mysql_use();
while ((row = mysql_fetch_row(res2)) != NULL) {
if(bind_cmd_to_command(BOTID, row[0], row[1])) {
* argv[1-*] reason
*/
static USERLIST_CALLBACK(neonserv_cmd_addban_userlist_lookup);
-static void neonserv_cmd_addban_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *mas, char *reason);
+static void neonserv_cmd_addban_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *mas, char *reason);
struct neonserv_cmd_addban_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
+ struct Event *event;
char *mask;
char *reason;
};
cache->client = client;
cache->textclient = getTextBot();
cache->user = user;
+ cache->event = event;
cache->mask = strdup(argv[0]);
if(argc > 1) {
cache->reason = strdup(merge_argv(argv, 1, argc));
static USERLIST_CALLBACK(neonserv_cmd_addban_userlist_lookup) {
struct neonserv_cmd_addban_cache *cache = data;
- neonserv_cmd_addban_async1(cache->client, cache->textclient, cache->user, chan, cache->mask, (cache->reason ? cache->reason : "Bye."));
+ neonserv_cmd_addban_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->mask, (cache->reason ? cache->reason : "Bye."));
free(cache->mask);
if(cache->reason)
free(cache->reason);
free(cache);
}
-static void neonserv_cmd_addban_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *mask, char *reason) {
+static void neonserv_cmd_addban_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *mask, char *reason) {
int match_count = 0;
char hostmask_buffer[NICKLEN+USERLEN+HOSTLEN+3];
char usermask[NICKLEN+USERLEN+HOSTLEN+3];
}
}
reply(textclient, user, "NS_ADDBAN_DONE", mask, chan->name, match_count);
+ logEvent(event);
}
*/
static AUTHLOOKUP_CALLBACK(neonserv_cmd_adduser_auth_lookup);
static USERAUTH_CALLBACK(neonserv_cmd_adduser_nick_lookup);
-static void neonserv_cmd_adduser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, int access);
+static void neonserv_cmd_adduser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nick, char *auth, int access);
struct neonserv_cmd_adduser_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
struct ChanNode *chan;
+ struct Event *event;
int access;
char *nick;
};
reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess);
return;
}
- if(caccess >= getChannelAccess(user, chan, 1)) {
- reply(getTextBot(), user, "NS_ACCESS_OUTRANKED");
- return;
+ if(caccess >= getChannelAccess(user, chan, 0)) {
+ if(isGodMode(user)) {
+ event->flags |= CMDFLAG_OPLOG;
+ } else {
+ reply(getTextBot(), user, "NS_ACCESS_OUTRANKED");
+ return;
+ }
}
//check own access
if(argv[0][0] == '*') {
printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[0]));
res = mysql_use();
if ((row = mysql_fetch_row(res)) != NULL) {
- neonserv_cmd_adduser_async1(client, getTextBot(), user, chan, argv[0], row[0], caccess);
+ neonserv_cmd_adduser_async1(client, getTextBot(), user, chan, event, argv[0], row[0], caccess);
} else {
//we need to create a new user...
//but first lookup the auth to check if it really exists
cache->textclient = getTextBot();
cache->user = user;
cache->chan = chan;
+ cache->event = event;
cache->access = caccess;
cache->nick = strdup(argv[0]);
lookup_authname(argv[0], neonserv_cmd_adduser_auth_lookup, cache);
cuser->flags |= USERFLAG_ISTMPUSER;
}
if(cuser->flags & USERFLAG_ISAUTHED) {
- neonserv_cmd_adduser_async1(client, getTextBot(), user, chan, argv[0], cuser->auth, caccess);
+ neonserv_cmd_adduser_async1(client, getTextBot(), user, chan, event, argv[0], cuser->auth, caccess);
} else {
struct neonserv_cmd_adduser_cache *cache = malloc(sizeof(*cache));
if (!cache) {
cache->textclient = getTextBot();
cache->user = user;
cache->chan = chan;
+ cache->event = event;
cache->access = caccess;
cache->nick = strdup(argv[0]);
get_userauth(cuser, neonserv_cmd_adduser_nick_lookup, cache);
//AUTH_DOES_NOT_EXIST
reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->nick);
} else
- neonserv_cmd_adduser_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->nick, auth, cache->access);
+ neonserv_cmd_adduser_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, cache->nick, auth, cache->access);
free(cache->nick);
free(cache);
}
reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick);
}
else
- neonserv_cmd_adduser_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth, cache->access);
+ neonserv_cmd_adduser_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, user->nick, user->auth, cache->access);
free(cache->nick);
free(cache);
}
-static void neonserv_cmd_adduser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, int caccess) {
+static void neonserv_cmd_adduser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nick, char *auth, int caccess) {
//we've got a valid auth now...
MYSQL_RES *res;
MYSQL_ROW row;
}
printf_mysql_query("INSERT INTO `chanusers` (`chanuser_cid`, `chanuser_uid`, `chanuser_access`) VALUES ('%d', '%d', '%d')", chan->channel_id, userid, caccess);
reply(textclient, user, "NS_ADDUSER_DONE", nick, chan->name, caccess);
+ logEvent(event);
}
* argv[0-*] nick[,*auth[,*!*@mask[...]]]
*/
static USERLIST_CALLBACK(neonserv_cmd_ban_userlist_lookup);
-static void neonserv_cmd_ban_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *masks);
+static void neonserv_cmd_ban_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *masks);
struct neonserv_cmd_ban_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
+ struct Event *event;
char *masks;
};
cache->client = client;
cache->textclient = getTextBot();
cache->user = user;
+ cache->event = event;
cache->masks = strdup(merge_argv_char(argv, 0, argc, ','));
- get_userlist(chan, neonserv_cmd_ban_userlist_lookup, cache);
+ get_userlist_with_invisible(chan, neonserv_cmd_ban_userlist_lookup, cache);
}
static USERLIST_CALLBACK(neonserv_cmd_ban_userlist_lookup) {
struct neonserv_cmd_ban_cache *cache = data;
- neonserv_cmd_ban_async1(cache->client, cache->textclient, cache->user, chan, cache->masks);
+ neonserv_cmd_ban_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->masks);
free(cache->masks);
free(cache);
}
-static void neonserv_cmd_ban_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *masks) {
+static void neonserv_cmd_ban_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *masks) {
int done_masks = 0, provided_masks = 0, skip, match_count, total_match;
char *mask, *nextmask;
char hostmask_buffer[NICKLEN+USERLEN+HOSTLEN+3];
reply(getTextBot(), user, "NS_BAN_DONE", done_masks, chan->name, total_match);
else
reply(getTextBot(), user, "NS_BAN_FAIL", client->user->nick);
+ if(done_masks)
+ logEvent(event);
}
putsock(client, "PRIVMSG %s :users %s", botnick, chan->name);
bind_privnotice(neonserv_cmd_chanservsync_notice_listener);
reply(getTextBot(), user, "NS_CHANSERVSYNC_SYNCHRONIZING", chan->name, botnick);
+ logEvent(event);
}
static void neonserv_cmd_chanservsync_notice_listener(struct UserNode *user, struct UserNode *target, char *message) {
* argv[1] - access
*/
static USERAUTH_CALLBACK(neonserv_cmd_clvl_nick_lookup);
-static void neonserv_cmd_clvl_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, int caccess);
+static void neonserv_cmd_clvl_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nick, char *auth, int caccess);
struct neonserv_cmd_clvl_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
struct ChanNode *chan;
+ struct Event *event;
char *nick;
int access;
};
reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess);
return;
}
- if(caccess >= getChannelAccess(user, chan, 1)) {
- reply(getTextBot(), user, "NS_ACCESS_OUTRANKED");
- return;
+ if(caccess >= getChannelAccess(user, chan, 0)) {
+ if(isGodMode(user)) {
+ event->flags |= CMDFLAG_OPLOG;
+ } else {
+ reply(getTextBot(), user, "NS_ACCESS_OUTRANKED");
+ return;
+ }
}
if(argv[0][0] == '*') {
//we've got an auth
argv[0]++;
- neonserv_cmd_clvl_async1(client, getTextBot(), user, chan, argv[0], argv[0], caccess);
+ neonserv_cmd_clvl_async1(client, getTextBot(), user, chan, event, argv[0], argv[0], caccess);
} else {
struct UserNode *cuser = getUserByNick(argv[0]);
if(!cuser) {
cuser->flags |= USERFLAG_ISTMPUSER;
}
if(cuser->flags & USERFLAG_ISAUTHED) {
- neonserv_cmd_clvl_async1(client, getTextBot(), user, chan, argv[0], cuser->auth, caccess);
+ neonserv_cmd_clvl_async1(client, getTextBot(), user, chan, event, argv[0], cuser->auth, caccess);
} else {
struct neonserv_cmd_clvl_cache *cache = malloc(sizeof(*cache));
if (!cache) {
cache->textclient = getTextBot();
cache->user = user;
cache->chan = chan;
+ cache->event = event;
cache->nick = strdup(argv[0]);
cache->access = caccess;
get_userauth(cuser, neonserv_cmd_clvl_nick_lookup, cache);
reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick);
}
else
- neonserv_cmd_clvl_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth, cache->access);
+ neonserv_cmd_clvl_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, user->nick, user->auth, cache->access);
free(cache->nick);
free(cache);
}
-static void neonserv_cmd_clvl_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, int caccess) {
+static void neonserv_cmd_clvl_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nick, char *auth, int caccess) {
//we've got a valid auth now...
MYSQL_RES *res;
MYSQL_ROW row;
}
printf_mysql_query("UPDATE `chanusers` SET `chanuser_access` = '%d' WHERE `chanuser_id` = '%s'", caccess, row[1]);
reply(textclient, user, "NS_CLVL_DONE", nick, caccess, chan->name);
+ logEvent(event);
return;
}
}
if(matching_bans) {
putsock(client, "MODE %s -b %s", chan->name, mask);
reply(getTextBot(), user, "NS_DELBAN_DONE", mask, chan->name);
+ logEvent(event);
} else
reply(getTextBot(), user, "NS_DELBAN_FAIL", mask);
}
//delete
printf_mysql_query("DELETE FROM `chanusers` WHERE `chanuser_id` = '%s'", row[1]);
reply(getTextBot(), user, "NS_DELME_DONE", atoi(row[0]), chan->name);
+ logEvent(event);
return;
}
}
* argv[0] - nick / *auth
*/
static USERAUTH_CALLBACK(neonserv_cmd_deluser_nick_lookup);
-static void neonserv_cmd_deluser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth);
+static void neonserv_cmd_deluser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nick, char *auth);
struct neonserv_cmd_deluser_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
struct ChanNode *chan;
+ struct Event *event;
char *nick;
};
if(argv[0][0] == '*') {
//we've got an auth
argv[0]++;
- neonserv_cmd_deluser_async1(client, getTextBot(), user, chan, argv[0], argv[0]);
+ neonserv_cmd_deluser_async1(client, getTextBot(), user, chan, event, argv[0], argv[0]);
} else {
struct UserNode *cuser = getUserByNick(argv[0]);
if(!cuser) {
cuser->flags |= USERFLAG_ISTMPUSER;
}
if(cuser->flags & USERFLAG_ISAUTHED) {
- neonserv_cmd_deluser_async1(client, getTextBot(), user, chan, argv[0], cuser->auth);
+ neonserv_cmd_deluser_async1(client, getTextBot(), user, chan, event, argv[0], cuser->auth);
} else {
struct neonserv_cmd_deluser_cache *cache = malloc(sizeof(*cache));
if (!cache) {
cache->textclient = getTextBot();
cache->user = user;
cache->chan = chan;
+ cache->event = event;
cache->nick = strdup(argv[0]);
get_userauth(cuser, neonserv_cmd_deluser_nick_lookup, cache);
}
reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick);
}
else
- neonserv_cmd_deluser_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth);
+ neonserv_cmd_deluser_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, user->nick, user->auth);
free(cache->nick);
free(cache);
}
-static void neonserv_cmd_deluser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth) {
+static void neonserv_cmd_deluser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nick, char *auth) {
//we've got a valid auth now...
MYSQL_RES *res;
MYSQL_ROW row;
printf_mysql_query("SELECT `chanuser_access`, `chanuser_id` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid);
res = mysql_use();
if ((row = mysql_fetch_row(res)) != NULL) {
- if(atoi(row[0]) >= getChannelAccess(user, chan, 1)) {
- reply(textclient, user, "NS_USER_OUTRANKED", nick);
- return;
+ if(atoi(row[0]) >= getChannelAccess(user, chan, 0)) {
+ if(isGodMode(user)) {
+ event->flags |= CMDFLAG_OPLOG;
+ } else {
+ reply(textclient, user, "NS_USER_OUTRANKED", nick);
+ return;
+ }
}
//delete
printf_mysql_query("DELETE FROM `chanusers` WHERE `chanuser_id` = '%s'", row[1]);
reply(textclient, user, "NS_DELUSER_DONE", nick, atoi(row[0]), chan->name);
+ logEvent(event);
return;
}
}
* argv[0-*] nicks
*/
static USERLIST_CALLBACK(neonserv_cmd_deop_userlist_lookup);
-static void neonserv_cmd_deop_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char **argv, int argc);
+static void neonserv_cmd_deop_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char **argv, int argc);
struct neonserv_cmd_deop_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
+ struct Event *event;
char **argv;
int argc;
};
cache->client = client;
cache->textclient = getTextBot();
cache->user = user;
+ cache->event = event;
cache->argv = calloc(argc, sizeof(char*));
int i;
for(i = 0; i < argc; i++) {
static USERLIST_CALLBACK(neonserv_cmd_deop_userlist_lookup) {
struct neonserv_cmd_deop_cache *cache = data;
- neonserv_cmd_deop_async1(cache->client, cache->textclient, cache->user, chan, cache->argv, cache->argc);
+ neonserv_cmd_deop_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->argv, cache->argc);
int i;
for(i = 0; i < cache->argc; i++) {
free(cache->argv[i]);
free(cache);
}
-static void neonserv_cmd_deop_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char **argv, int argc) {
+static void neonserv_cmd_deop_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char **argv, int argc) {
int i, done_users = 0;
struct UserNode *cuser;
struct ChanUser *chanuser;
reply(textclient, user, "NS_DEOP_DONE", chan->name);
else
reply(textclient, user, "NS_DEOP_FAIL", client->user->nick);
+ if(done_users)
+ logEvent(event);
}
* argv[0] (optional) nick mask
*/
static USERLIST_CALLBACK(neonserv_cmd_deopall_userlist_lookup);
-static void neonserv_cmd_deopall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char **argv, int argc);
+static void neonserv_cmd_deopall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char **argv, int argc);
struct neonserv_cmd_deopall_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
+ struct Event *event;
char **argv;
int argc;
};
cache->client = client;
cache->textclient = getTextBot();
cache->user = user;
+ cache->event = event;
cache->argv = calloc(argc, sizeof(char*));
int i;
for(i = 0; i < argc; i++) {
static USERLIST_CALLBACK(neonserv_cmd_deopall_userlist_lookup) {
struct neonserv_cmd_deopall_cache *cache = data;
- neonserv_cmd_deopall_async1(cache->client, cache->textclient, cache->user, chan, cache->argv, cache->argc);
+ neonserv_cmd_deopall_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->argv, cache->argc);
int i;
for(i = 0; i < cache->argc; i++) {
free(cache->argv[i]);
free(cache);
}
-static void neonserv_cmd_deopall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char **argv, int argc) {
+static void neonserv_cmd_deopall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char **argv, int argc) {
int issuer_access, victim_access, done_users = 0;
char *nickmask = NULL;
struct ChanUser *chanuser;
struct ModeBuffer *modeBuf;
- if(!checkChannelAccess(user, chan, "channel_canop", 1, 0)) {
- reply(getTextBot(), user, "NS_ACCESS_DENIED");
- return;
- }
if(argc > 0)
nickmask = argv[0];
modeBuf = initModeBuffer(client, chan);
}
freeModeBuffer(modeBuf);
reply(getTextBot(), user, "NS_DEOPALL_DONE", done_users, chan->name);
+ if(done_users)
+ logEvent(event);
}
reply(getTextBot(), user, "NS_DEVOICE_DONE", chan->name);
else
reply(getTextBot(), user, "NS_DEVOICE_FAIL", client->user->nick);
+ if(done_users)
+ logEvent(event);
}
}
freeModeBuffer(modeBuf);
reply(getTextBot(), user, "NS_DEVOICEALL_DONE", done_users, chan->name);
+ if(done_users)
+ logEvent(event);
}
}
if((chanuser->flags & CHANUSERFLAG_OPPED)) {
putsock(client, "MODE %s -ov %s %s", chan->name, user->nick, user->nick);
+ logEvent(event);
} else if((chanuser->flags & CHANUSERFLAG_VOICED)) {
putsock(client, "MODE %s -v %s", chan->name, user->nick);
+ logEvent(event);
} else
reply(getTextBot(), user, "NS_DOWN_ALREADY", chan->name);
}
if(!(chan->flags & CHANFLAG_CHAN_REGISTERED)) continue;
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);
if (mysql_fetch_row(mysql_use()) == NULL) continue;
- if((chanuser->flags & CHANUSERFLAG_OPPED))
+ int done = 0;
+ if((chanuser->flags & CHANUSERFLAG_OPPED)) {
putsock(client, "MODE %s -o %s", chan->name, user->nick);
- if((chanuser->flags & CHANUSERFLAG_VOICED))
+ done = 1;
+ }
+ if((chanuser->flags & CHANUSERFLAG_VOICED)) {
putsock(client, "MODE %s -v %s", chan->name, user->nick);
+ done = 1;
+ }
+ if(done) {
+ //event hack
+ event->chan = chan;
+ logEvent(event);
+ }
}
}
#define GIVEOWNER_TIMEOUT 86400 /* 60*60*24 = 86400 */
static USERAUTH_CALLBACK(neonserv_cmd_giveowner_nick_lookup);
-static void neonserv_cmd_giveowner_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, char *key);
+static void neonserv_cmd_giveowner_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nick, char *auth, char *key);
struct neonserv_cmd_giveowner_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
struct ChanNode *chan;
+ struct Event *event;
char *nick;
char *key;
};
static CMD_BIND(neonserv_cmd_giveowner) {
- if(getChannelAccess(user, chan, 0) != 500) {
- reply(getTextBot(), user, "NS_ACCESS_DENIED");
- return;
- }
MYSQL_RES *res;
MYSQL_ROW row;
printf_mysql_query("SELECT `channel_lastgiveowner` FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id);
if(argv[0][0] == '*') {
//we've got an auth
argv[0]++;
- neonserv_cmd_giveowner_async1(client, getTextBot(), user, chan, argv[0], argv[0], (argc != 1 ? argv[1] : NULL));
+ neonserv_cmd_giveowner_async1(client, getTextBot(), user, chan, event, argv[0], argv[0], (argc != 1 ? argv[1] : NULL));
} else {
struct UserNode *cuser = getUserByNick(argv[0]);
if(!cuser) {
cuser->flags |= USERFLAG_ISTMPUSER;
}
if(cuser->flags & USERFLAG_ISAUTHED) {
- neonserv_cmd_giveowner_async1(client, getTextBot(), user, chan, argv[0], cuser->auth, (argc != 1 ? argv[1] : NULL));
+ neonserv_cmd_giveowner_async1(client, getTextBot(), user, chan, event, argv[0], cuser->auth, (argc != 1 ? argv[1] : NULL));
} else {
struct neonserv_cmd_giveowner_cache *cache = malloc(sizeof(*cache));
if (!cache) {
cache->textclient = getTextBot();
cache->user = user;
cache->chan = chan;
+ cache->event = event;
cache->nick = strdup(argv[0]);
cache->key = (argc != 1 ? strdup(argv[1]) : NULL);
get_userauth(cuser, neonserv_cmd_giveowner_nick_lookup, cache);
reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick);
}
else
- neonserv_cmd_giveowner_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth, cache->key);
+ neonserv_cmd_giveowner_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, user->nick, user->auth, cache->key);
free(cache->nick);
if(cache->key)
free(cache->key);
free(cache);
}
-static void neonserv_cmd_giveowner_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, char *key) {
+static void neonserv_cmd_giveowner_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nick, char *auth, char *key) {
//we've got a valid auth now...
if(!stricmp(user->auth, auth)) {
reply(textclient, user, "NS_GIVEOWNER_SELF");
printf_mysql_query("UPDATE `chanusers` SET `chanuser_access` = '499' WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = (SELECT `user_id` FROM `users` WHERE `user_user` = '%s')", chan->channel_id, escape_string(user->auth));
printf_mysql_query("INSERT INTO `owner_history` (`owner_history_cid`, `owner_history_uid`, `owner_history_time`) VALUE ('%d', '%d', UNIX_TIMESTAMP())", chan->channel_id, userid);
reply(textclient, user, "NS_GIVEOWNER_DONE", chan->name, auth);
+ logEvent(event);
} else {
reply(textclient, user, "NS_GIVEOWNER_CONFIRM", auth, giveownerkey);
}
* argv[1-*] reason
*/
static USERLIST_CALLBACK(neonserv_cmd_kick_userlist_lookup);
-static void neonserv_cmd_kick_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nicks, char *reason);
+static void neonserv_cmd_kick_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nicks, char *reason);
struct neonserv_cmd_kick_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
+ struct Event *event;
char *nicks;
char *reason;
};
cache->client = client;
cache->textclient = getTextBot();
cache->user = user;
+ cache->event = event;
cache->nicks = strdup(argv[0]);
if(argc > 1) {
cache->reason = strdup(merge_argv(argv, 1, argc));
static USERLIST_CALLBACK(neonserv_cmd_kick_userlist_lookup) {
struct neonserv_cmd_kick_cache *cache = data;
- neonserv_cmd_kick_async1(cache->client, cache->textclient, cache->user, chan, cache->nicks, (cache->reason ? cache->reason : "Bye."));
+ neonserv_cmd_kick_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->nicks, (cache->reason ? cache->reason : "Bye."));
free(cache->nicks);
if(cache->reason)
free(cache->reason);
free(cache);
}
-static void neonserv_cmd_kick_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nicks, char *reason) {
+static void neonserv_cmd_kick_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nicks, char *reason) {
int i, kicked_users = 0, provided_nicks = 0;
char *nick, *nextnick;
struct UserNode *cuser;
reply(getTextBot(), user, "NS_KICK_DONE", kicked_users, chan->name);
else
reply(getTextBot(), user, "NS_KICK_FAIL", client->user->nick);
+ if(kicked_users)
+ logEvent(event);
}
* argv[1-*] reason
*/
static USERLIST_CALLBACK(neonserv_cmd_kickban_userlist_lookup);
-static void neonserv_cmd_kickban_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nicks, char *reason);
+static void neonserv_cmd_kickban_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nicks, char *reason);
struct neonserv_cmd_kickban_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
+ struct Event *event;
char *nicks;
char *reason;
};
cache->client = client;
cache->textclient = getTextBot();
cache->user = user;
+ cache->event = event;
cache->nicks = strdup(argv[0]);
if(argc > 1) {
cache->reason = strdup(merge_argv(argv, 1, argc));
} else
cache->reason = NULL;
- get_userlist(chan, neonserv_cmd_kickban_userlist_lookup, cache);
+ get_userlist_with_invisible(chan, neonserv_cmd_kickban_userlist_lookup, cache);
}
static USERLIST_CALLBACK(neonserv_cmd_kickban_userlist_lookup) {
struct neonserv_cmd_kickban_cache *cache = data;
- neonserv_cmd_kickban_async1(cache->client, cache->textclient, cache->user, chan, cache->nicks, (cache->reason ? cache->reason : "Bye."));
+ neonserv_cmd_kickban_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->nicks, (cache->reason ? cache->reason : "Bye."));
free(cache->nicks);
if(cache->reason)
free(cache->reason);
free(cache);
}
-static void neonserv_cmd_kickban_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nicks, char *reason) {
+static void neonserv_cmd_kickban_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nicks, char *reason) {
int i, kicked_users = 0, provided_nicks = 0;
char *nick, *nextnick;
struct UserNode *cuser;
reply(getTextBot(), user, "NS_KICKBAN_DONE", kicked_users, chan->name);
else
reply(getTextBot(), user, "NS_KICKBAN_FAIL", client->user->nick);
+ if(kicked_users)
+ logEvent(event);
}
}
}
reply(getTextBot(), user, "NS_MDELUSER_DONE", del_count, argv[1], min_access, max_access, chan->name);
+ if(del_count)
+ logEvent(event);
}
* argv[0-*] nicks
*/
static USERLIST_CALLBACK(neonserv_cmd_op_userlist_lookup);
-static void neonserv_cmd_op_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nicks);
+static void neonserv_cmd_op_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nicks);
struct neonserv_cmd_op_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
+ struct Event *event;
char *nicks;
};
cache->client = client;
cache->textclient = getTextBot();
cache->user = user;
+ cache->event = event;
cache->nicks = strdup(merge_argv(argv, 0, argc));
get_userlist_with_invisible(chan, neonserv_cmd_op_userlist_lookup, cache);
}
static USERLIST_CALLBACK(neonserv_cmd_op_userlist_lookup) {
struct neonserv_cmd_op_cache *cache = data;
- neonserv_cmd_op_async1(cache->client, cache->textclient, cache->user, chan, cache->nicks);
+ neonserv_cmd_op_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->nicks);
free(cache->nicks);
free(cache);
}
-static void neonserv_cmd_op_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nicks) {
+static void neonserv_cmd_op_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nicks) {
int total_users = 0, done_users = 0;
struct UserNode *cuser;
struct ChanUser *chanuser;
reply(textclient, user, "NS_OP_DONE", chan->name);
else
reply(textclient, user, "NS_OP_FAIL", client->user->nick);
+ if(done_users)
+ logEvent(event);
}
* argv[1] (optional) nick mask
*/
static USERLIST_CALLBACK(neonserv_cmd_opall_userlist_lookup);
-static void neonserv_cmd_opall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nickmask);
+static void neonserv_cmd_opall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nickmask);
struct neonserv_cmd_opall_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
+ struct Event *event;
char *nickmask;
};
cache->client = client;
cache->textclient = getTextBot();
cache->user = user;
+ cache->event = event;
if(argc > 1) {
cache->nickmask = strdup(argv[1]);
} else
static USERLIST_CALLBACK(neonserv_cmd_opall_userlist_lookup) {
struct neonserv_cmd_opall_cache *cache = data;
- neonserv_cmd_opall_async1(cache->client, cache->textclient, cache->user, chan, cache->nickmask);
+ neonserv_cmd_opall_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->nickmask);
if(cache->nickmask)
free(cache->nickmask);
free(cache);
}
-static void neonserv_cmd_opall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nickmask) {
+static void neonserv_cmd_opall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nickmask) {
int done_users = 0;
struct ChanUser *chanuser;
struct ModeBuffer *modeBuf;
}
freeModeBuffer(modeBuf);
reply(textclient, user, "NS_OPALL_DONE", done_users, chan->name);
+ if(done_users)
+ logEvent(event);
}
reply(getTextBot(), user, "NS_REGISTER_DISCONNECTED");
printf_mysql_query("INSERT INTO `bot_channels` (`botid`, `chanid`, `trigger`) VALUES ('%d', '%d', '%s')", botid, chanid, bottrigger);
reply(getTextBot(), user, "NS_RECOVER_DONE", channel);
+ logEvent(event);
}
*/
static AUTHLOOKUP_CALLBACK(neonserv_cmd_register_auth_lookup);
static USERAUTH_CALLBACK(neonserv_cmd_register_nick_lookup);
-static void neonserv_cmd_register_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *channel, char *auth);
+static void neonserv_cmd_register_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *channel, char *auth);
struct neonserv_cmd_register_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
struct ChanNode *chan;
+ struct Event *event;
char *nick;
char *channel;
};
printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[0]));
res = mysql_use();
if ((row = mysql_fetch_row(res)) != NULL) {
- neonserv_cmd_register_async1(client, getTextBot(), user, chan, channel, row[0]);
+ neonserv_cmd_register_async1(client, getTextBot(), user, chan, event, channel, row[0]);
} else {
//we need to create a new user...
//but first lookup the auth to check if it really exists
cache->textclient = getTextBot();
cache->user = user;
cache->chan = chan;
+ cache->event = event;
cache->nick = strdup(argv[1]);
cache->channel = strdup(channel);
lookup_authname(argv[1], neonserv_cmd_register_auth_lookup, cache);
cuser->flags |= USERFLAG_ISTMPUSER;
}
if(cuser->flags & USERFLAG_ISAUTHED) {
- neonserv_cmd_register_async1(client, getTextBot(), user, chan, channel, cuser->auth);
+ neonserv_cmd_register_async1(client, getTextBot(), user, chan, event, channel, cuser->auth);
} else {
struct neonserv_cmd_register_cache *cache = malloc(sizeof(*cache));
if (!cache) {
cache->textclient = getTextBot();
cache->user = user;
cache->chan = chan;
+ cache->event = event;
cache->nick = strdup(argv[1]);
cache->channel = strdup(channel);
get_userauth(cuser, neonserv_cmd_register_nick_lookup, cache);
//AUTH_DOES_NOT_EXIST
reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->nick);
} else
- neonserv_cmd_register_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->channel, auth);
+ neonserv_cmd_register_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, cache->channel, auth);
free(cache->channel);
free(cache->nick);
free(cache);
reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick);
}
else
- neonserv_cmd_register_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->channel, user->auth);
+ neonserv_cmd_register_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, cache->channel, user->auth);
free(cache->channel);
free(cache->nick);
free(cache);
}
-static void neonserv_cmd_register_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *channel, char *auth) {
+static void neonserv_cmd_register_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *channel, char *auth) {
//we've got a valid auth now...
MYSQL_RES *res;
MYSQL_ROW row, row2;
printf_mysql_query("DELETE FROM `chanusers` WHERE `chanuser_cid` = '%d'", chanid);
printf_mysql_query("INSERT INTO `chanusers` (`chanuser_cid`, `chanuser_uid`, `chanuser_access`) VALUES ('%d', '%d', '%d')", chanid, userid, 500);
reply(textclient, user, "NS_REGISTER_DONE", channel, auth);
+ logEvent(event);
}
-typedef char* neonserv_cmd_set_function(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument);
-static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int setting, char *argument);
-static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument);
-static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument);
-static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument);
-static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument);
+typedef char* neonserv_cmd_set_function(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
+static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *argument);
+static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
+static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
+static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
+static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument);
#define NS_VALID_FUNCTION 0x01
#define NS_VALID_STRING 0x02
int i, j;
if(argc && !strcmp(argv[0], "defaults")) {
//reset channel settings
- int uaccess = getChannelAccess(user, chan, 1);
+ int uaccess = getChannelAccess(user, chan, 0);
if(uaccess < 500) {
- reply(getTextBot(), user, "NS_SET_DEFAULTS_OWNER", chan->name);
- return;
+ if(isGodMode(user)) {
+ event->flags |= CMDFLAG_OPLOG;
+ } else {
+ reply(getTextBot(), user, "NS_SET_DEFAULTS_OWNER", chan->name);
+ return;
+ }
}
int seed = 0;
char *tmp;
}
printf_mysql_query("UPDATE `channels` SET %s WHERE `channel_id` = '%d'", query, chan->channel_id);
reply(getTextBot(), user, "NS_SET_DEFAULTS_DONE", chan->name);
+ logEvent(event);
} else {
reply(getTextBot(), user, "NS_SET_DEFAULTS_CODE", chan->name, defaultskey);
}
//setting found
if(channel_settings[i].valid & NS_VALID_FUNCTION) {
neonserv_cmd_set_function *func = channel_settings[i].parameter;
- func(client, user, chan, channel_settings[i].setting, args);
+ func(client, user, chan, event, channel_settings[i].setting, args);
} else {
- neonserv_cmd_set_setting(client, user, chan, i, args);
+ neonserv_cmd_set_setting(client, user, chan, event, i, args);
}
j = 1;
break;
org_value = (row[j] ? row[j] : defaults[j]);
} else if(channel_settings[i].valid & NS_VALID_FUNCTION) {
neonserv_cmd_set_function *func = channel_settings[i].parameter;
- org_value = func(client, user, chan, NULL, NULL);
+ org_value = func(client, user, chan, event, NULL, NULL);
} else
org_value = "0";
value = org_value;
}
}
-static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int setting, char *args) {
+static void neonserv_cmd_set_setting(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, int setting, char *args) {
char *value;
char nameBuf[64];
//get current value
reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess);
return;
}
- int uaccess = getChannelAccess(user, chan, 1);
+ int uaccess = getChannelAccess(user, chan, 0);
if(uaccess == 500) uaccess++;
if(atoi(value) > uaccess) {
- reply(getTextBot(), user, "NS_SET_CANNOT_SET");
- return;
+ if(isGodMode(user)) {
+ event->flags |= CMDFLAG_OPLOG;
+ } else {
+ reply(getTextBot(), user, "NS_SET_CANNOT_SET");
+ return;
+ }
}
if(caccess > uaccess) {
- reply(getTextBot(), user, "NS_SET_BADLEVEL");
- return;
+ if(isGodMode(user)) {
+ event->flags |= CMDFLAG_OPLOG;
+ } else {
+ reply(getTextBot(), user, "NS_SET_BADLEVEL");
+ return;
+ }
}
sprintf(nameBuf, "%d", caccess);
args = nameBuf;
//valid - set it
value = args;
printf_mysql_query("UPDATE `channels` SET `%s` = '%s' WHERE `channel_id` = '%d'", channel_settings[setting].chanfield, escape_string(value), chan->channel_id);
+ logEvent(event);
}
reply(getTextBot(), user, "\002%s\002 %s", channel_settings[setting].setting, value);
if(channel_settings[setting].valid & NS_HAS_HELP) {
}
}
-static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument) {
+static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) {
char *trigger;
//get current trigger
MYSQL_RES *res;
row = mysql_fetch_row(res);
trigger = row[0];
if(argument) {
- int uaccess = getChannelAccess(user, chan, 1);
+ int uaccess = getChannelAccess(user, chan, 0);
if(uaccess < 500) {
- reply(getTextBot(), user, "NS_SET_TRIGGER_OWNER", chan->name);
- return NULL;
+ if(isGodMode(user)) {
+ event->flags |= CMDFLAG_OPLOG;
+ } else {
+ reply(getTextBot(), user, "NS_SET_TRIGGER_OWNER", chan->name);
+ return NULL;
+ }
}
if(strlen(argument) > 15)
argument[15] = '\0';
printf_mysql_query("UPDATE `bot_channels` SET `trigger` = '%s' WHERE `chanid` = '%d' AND `botid` = '%d'", escape_string(argument), chan->channel_id, client->clientid);
trigger = argument;
changeChannelTrigger(client->botid, chan, trigger);
+ logEvent(event);
}
if(setting) {
reply(getTextBot(), user, "\002%s\002 %s", setting, trigger);
return trigger;
}
-static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument) {
+static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) {
char *value;
//get current value
MYSQL_RES *res;
return value;
}
-static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument) {
+static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) {
char *value;
char tmp[64];
//get current value
putsock(client, "MODE %s +l %d", chan->name, (chan->usercount + atoi(argument)));
else if(isModeSet(chan, 'l'))
putsock(client, "MODE %s -l", chan->name);
+ logEvent(event);
}
if(setting) {
reply(getTextBot(), user, "\002%s\002 %s", setting, value);
return value;
}
-static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, const char *setting, char *argument) {
+static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct Event *event, const char *setting, char *argument) {
char *value;
//get current value
MYSQL_RES *res;
return NULL;
}
printf_mysql_query("UPDATE `channels` SET `channel_nodelete` = '%s' WHERE `channel_id` = '%d'", escape_string(argument), chan->channel_id);
+ event->flags |= CMDFLAG_OPLOG;
+ logEvent(event);
}
if(setting) {
reply(getTextBot(), user, "\002%s\002 %s", setting, value);
* argv[0] - nick / *auth
*/
static USERAUTH_CALLBACK(neonserv_cmd_suspend_nick_lookup);
-static void neonserv_cmd_suspend_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth);
+static void neonserv_cmd_suspend_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nick, char *auth);
struct neonserv_cmd_suspend_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
struct ChanNode *chan;
+ struct Event *event;
char *nick;
};
if(argv[0][0] == '*') {
//we've got an auth
argv[0]++;
- neonserv_cmd_suspend_async1(client, getTextBot(), user, chan, argv[0], argv[0]);
+ neonserv_cmd_suspend_async1(client, getTextBot(), user, chan, event, argv[0], argv[0]);
} else {
struct UserNode *cuser = getUserByNick(argv[0]);
if(!cuser) {
cuser->flags |= USERFLAG_ISTMPUSER;
}
if(cuser->flags & USERFLAG_ISAUTHED) {
- neonserv_cmd_suspend_async1(client, getTextBot(), user, chan, argv[0], cuser->auth);
+ neonserv_cmd_suspend_async1(client, getTextBot(), user, chan, event, argv[0], cuser->auth);
} else {
struct neonserv_cmd_suspend_cache *cache = malloc(sizeof(*cache));
if (!cache) {
cache->textclient = getTextBot();
cache->user = user;
cache->chan = chan;
+ cache->event = event;
cache->nick = strdup(argv[0]);
get_userauth(cuser, neonserv_cmd_suspend_nick_lookup, cache);
}
reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick);
}
else
- neonserv_cmd_suspend_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth);
+ neonserv_cmd_suspend_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, user->nick, user->auth);
free(cache->nick);
free(cache);
}
-static void neonserv_cmd_suspend_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth) {
+static void neonserv_cmd_suspend_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nick, char *auth) {
//we've got a valid auth now...
MYSQL_RES *res;
MYSQL_ROW row;
printf_mysql_query("SELECT `chanuser_access`, `chanuser_id`, `chanuser_flags` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid);
res = mysql_use();
if ((row = mysql_fetch_row(res)) != NULL) {
- if(atoi(row[0]) >= getChannelAccess(user, chan, 1)) {
- reply(textclient, user, "NS_USER_OUTRANKED", nick);
- return;
+ if(atoi(row[0]) >= getChannelAccess(user, chan, 0)) {
+ if(isGodMode(user)) {
+ event->flags |= CMDFLAG_OPLOG;
+ } else {
+ reply(textclient, user, "NS_USER_OUTRANKED", nick);
+ return;
+ }
}
//suspend
cflags = atoi(row[2]);
cflags |= DB_CHANUSER_SUSPENDED;
printf_mysql_query("UPDATE `chanusers` SET `chanuser_flags` = '%d' WHERE `chanuser_id` = '%s'", cflags, row[1]);
reply(textclient, user, "NS_SUSPEND_DONE", nick, chan->name);
+ logEvent(event);
return;
}
}
//default topic!
putsock(client, "TOPIC %s :%s", chan->name, row[5]);
reply(getTextBot(), user, "NS_TOPIC_DONE", row[5]);
+ logEvent(event);
return;
}
- int uaccess = getChannelAccess(user, chan, 1);
+ int uaccess = getChannelAccess(user, chan, 0);
if(uaccess >= atoi((row[3] ? row[3] : default_row[1]))) {
//just set the topic
newtopic = merge_argv(argv, 0, argc);
}
putsock(client, "TOPIC %s :%s", chan->name, newtopic);
reply(getTextBot(), user, "NS_TOPIC_DONE", newtopic);
+ logEvent(event);
return;
}
if(advanced_topic) {
topiclist[MAXLEN] = '\0';
putsock(client, "TOPIC %s :%s", chan->name, topiclist);
reply(getTextBot(), user, "NS_TOPIC_DONE", topiclist);
+ logEvent(event);
} else {
newtopic = merge_argv(argv, 0, argc);
char topiclist[MAXLEN*2];
topiclist[MAXLEN] = '\0';
putsock(client, "TOPIC %s :%s", chan->name, topiclist);
reply(getTextBot(), user, "NS_TOPIC_DONE", topiclist);
+ logEvent(event);
}
}
* argv[1] duration
*/
static USERLIST_CALLBACK(neonserv_cmd_trim_userlist_lookup);
-static void neonserv_cmd_trim_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, int min_access, int max_access, int duration);
+static void neonserv_cmd_trim_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int min_access, int max_access, int duration);
struct neonserv_cmd_trim_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
+ struct Event *event;
int min_access;
int max_access;
int duration;
};
static CMD_BIND(neonserv_cmd_trim) {
- if(stricmp(argv[0], "bans") && !checkChannelAccess(user, chan, "channel_candel", 1, 0)) {
- reply(getTextBot(), user, "NS_ACCESS_DENIED");
- return;
+ if(stricmp(argv[0], "bans") && !checkChannelAccess(user, chan, "channel_candel", 0, 0)) {
+ if(isGodMode(user)) {
+ event->flags |= CMDFLAG_OPLOG;
+ } else {
+ reply(getTextBot(), user, "NS_ACCESS_DENIED");
+ return;
+ }
}
int min_access, max_access;
if(!stricmp(argv[0], "users")) {
min_access = 1;
max_access = getChannelAccess(user, chan, 0) - 1;
} else if(!stricmp(argv[0], "bans")) {
- if(!checkChannelAccess(user, chan, "channel_staticban", 1, 0)) {
- reply(getTextBot(), user, "NS_ACCESS_DENIED");
- return;
+ if(!checkChannelAccess(user, chan, "channel_staticban", 0, 0)) {
+ if(isGodMode(user)) {
+ event->flags |= CMDFLAG_OPLOG;
+ } else {
+ reply(getTextBot(), user, "NS_ACCESS_DENIED");
+ return;
+ }
}
//TODO: TRIM BANS
return;
min_access = atoi(argv[0]);
max_access = min_access;
}
- if(max_access >= getChannelAccess(user, chan, 1)) {
- reply(getTextBot(), user, "NS_NO_ACCESS");
- return;
+ if(max_access >= getChannelAccess(user, chan, 0)) {
+ if(isGodMode(user)) {
+ event->flags |= CMDFLAG_OPLOG;
+ } else {
+ reply(getTextBot(), user, "NS_NO_ACCESS");
+ return;
+ }
}
}
//parse duration...
cache->client = client;
cache->textclient = getTextBot();
cache->user = user;
+ cache->event = event;
cache->min_access = min_access;
cache->max_access = max_access;
cache->duration = duration;
- get_userlist(chan, neonserv_cmd_trim_userlist_lookup, cache);
+ get_userlist_with_invisible(chan, neonserv_cmd_trim_userlist_lookup, cache);
}
static USERLIST_CALLBACK(neonserv_cmd_trim_userlist_lookup) {
struct neonserv_cmd_trim_cache *cache = data;
//got userlist
- neonserv_cmd_trim_async1(cache->client, cache->textclient, cache->user, chan, cache->min_access, cache->max_access, cache->duration);
+ neonserv_cmd_trim_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->min_access, cache->max_access, cache->duration);
free(cache);
}
-static void neonserv_cmd_trim_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, int min_access, int max_access, int duration) {
+static void neonserv_cmd_trim_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, int min_access, int max_access, int duration) {
MYSQL_RES *res;
MYSQL_ROW row;
int trim_count = 0, is_here;
}
char timeBuf[MAXLEN];
reply(getTextBot(), user, "NS_TRIM_DONE", trim_count, min_access, max_access, chan->name, timeToStr(user, duration, 3, timeBuf));
+ if(trim_count)
+ logEvent(event);
}
}
printf_mysql_query("DELETE FROM `bot_channels` WHERE `id` = '%s'", row[1]);
reply(getTextBot(), user, "NS_UNREGISTER_DONE", channel);
+ logEvent(event);
}
* argv[0] - nick / *auth
*/
static USERAUTH_CALLBACK(neonserv_cmd_unsuspend_nick_lookup);
-static void neonserv_cmd_unsuspend_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth);
+static void neonserv_cmd_unsuspend_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nick, char *auth);
struct neonserv_cmd_unsuspend_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
struct ChanNode *chan;
+ struct Event *event;
char *nick;
};
if(argv[0][0] == '*') {
//we've got an auth
argv[0]++;
- neonserv_cmd_unsuspend_async1(client, getTextBot(), user, chan, argv[0], argv[0]);
+ neonserv_cmd_unsuspend_async1(client, getTextBot(), user, chan, event, argv[0], argv[0]);
} else {
struct UserNode *cuser = getUserByNick(argv[0]);
if(!cuser) {
cuser->flags |= USERFLAG_ISTMPUSER;
}
if(cuser->flags & USERFLAG_ISAUTHED) {
- neonserv_cmd_unsuspend_async1(client, getTextBot(), user, chan, argv[0], cuser->auth);
+ neonserv_cmd_unsuspend_async1(client, getTextBot(), user, chan, event, argv[0], cuser->auth);
} else {
struct neonserv_cmd_unsuspend_cache *cache = malloc(sizeof(*cache));
if (!cache) {
cache->textclient = getTextBot();
cache->user = user;
cache->chan = chan;
+ cache->event = event;
cache->nick = strdup(argv[0]);
get_userauth(cuser, neonserv_cmd_unsuspend_nick_lookup, cache);
}
reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick);
}
else
- neonserv_cmd_unsuspend_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth);
+ neonserv_cmd_unsuspend_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, user->nick, user->auth);
free(cache->nick);
free(cache);
}
-static void neonserv_cmd_unsuspend_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth) {
+static void neonserv_cmd_unsuspend_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nick, char *auth) {
//we've got a valid auth now...
MYSQL_RES *res;
MYSQL_ROW row;
printf_mysql_query("SELECT `chanuser_access`, `chanuser_id`, `chanuser_flags` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid);
res = mysql_use();
if ((row = mysql_fetch_row(res)) != NULL) {
- if(atoi(row[0]) >= getChannelAccess(user, chan, 1)) {
- reply(textclient, user, "NS_USER_OUTRANKED", nick);
- return;
+ if(atoi(row[0]) >= getChannelAccess(user, chan, 0)) {
+ if(isGodMode(user)) {
+ event->flags |= CMDFLAG_OPLOG;
+ } else {
+ reply(textclient, user, "NS_USER_OUTRANKED", nick);
+ return;
+ }
}
//unsuspend
cflags = atoi(row[2]);
cflags &= ~DB_CHANUSER_SUSPENDED;
printf_mysql_query("UPDATE `chanusers` SET `chanuser_flags` = '%d' WHERE `chanuser_id` = '%s'", cflags, row[1]);
reply(textclient, user, "NS_SUSPEND_RESTORED", nick, chan->name);
+ logEvent(event);
return;
}
}
if(caccess >= chan_getop) {
if(!(chanuser->flags & CHANUSERFLAG_OPPED)) {
putsock(client, "MODE %s +o %s", chan->name, user->nick);
+ logEvent(event);
} else
reply(getTextBot(), user, "NS_UP_ALREADY_OP", chan->name);
} else if(caccess >= chan_getvoice) {
if(!(chanuser->flags & CHANUSERFLAG_VOICED)) {
putsock(client, "MODE %s +v %s", chan->name, user->nick);
+ logEvent(event);
} else
reply(getTextBot(), user, "NS_UP_ALREADY_VOICE", chan->name);
} else
chan_getvoice = atoi(row[2]);
}
caccess = atoi(row[0]);
+ int done = 0;
if(caccess >= chan_getop) {
- if(!(chanuser->flags & CHANUSERFLAG_OPPED))
+ if(!(chanuser->flags & CHANUSERFLAG_OPPED)) {
putsock(client, "MODE %s +o %s", chan->name, user->nick);
+ done = 1;
+ }
} else if(caccess >= chan_getvoice) {
- if(!(chanuser->flags & CHANUSERFLAG_VOICED))
+ if(!(chanuser->flags & CHANUSERFLAG_VOICED)) {
putsock(client, "MODE %s +v %s", chan->name, user->nick);
+ done = 1;
+ }
+ }
+ if(done) {
+ event->chan = chan;
+ logEvent(event);
}
}
}
cache->usermask = (usermask ? strdup(usermask) : NULL);
cache->min_access = min_access;
cache->max_access = max_access;
- get_userlist(chan, neonserv_cmd_users_userlist_lookup, cache);
+ get_userlist_with_invisible(chan, neonserv_cmd_users_userlist_lookup, cache);
}
static USERLIST_CALLBACK(neonserv_cmd_users_userlist_lookup) {
is_here = 0;
for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
if((chanuser->user->flags & USERFLAG_ISAUTHED) && !strcmp(chanuser->user->auth, row[1])) {
- is_here = 1;
- break;
+ if((chanuser->flags & CHANUSERFLAG_INVISIBLE))
+ is_here = 2;
+ else {
+ is_here = 1;
+ break;
+ }
}
}
if(is_here) {
- content[2] = get_language_string(user, "NS_USERS_SEEN_HERE");
+ content[2] = get_language_string(user, (is_here == 2 ? "NS_USERS_SEEN_INVISIBLE" : "NS_USERS_SEEN_HERE"));
} else if(!strcmp(row[2], "0")) {
content[2] = get_language_string(user, "NS_USERS_SEEN_NEVER");
} else {
* argv[0-*] nicks
*/
static USERLIST_CALLBACK(neonserv_cmd_voice_userlist_lookup);
-static void neonserv_cmd_voice_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nicks);
+static void neonserv_cmd_voice_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nicks);
struct neonserv_cmd_voice_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
+ struct Event *event;
char *nicks;
};
cache->client = client;
cache->textclient = getTextBot();
cache->user = user;
+ cache->event = event;
cache->nicks = strdup(merge_argv(argv, 0, argc));
get_userlist_with_invisible(chan, neonserv_cmd_voice_userlist_lookup, cache);
}
static USERLIST_CALLBACK(neonserv_cmd_voice_userlist_lookup) {
struct neonserv_cmd_voice_cache *cache = data;
- neonserv_cmd_voice_async1(cache->client, cache->textclient, cache->user, chan, cache->nicks);
+ neonserv_cmd_voice_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->nicks);
free(cache->nicks);
free(cache);
}
-static void neonserv_cmd_voice_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nicks) {
+static void neonserv_cmd_voice_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nicks) {
int total_users = 0, done_users = 0;
struct UserNode *cuser;
struct ChanUser *chanuser;
reply(textclient, user, "NS_VOICE_DONE", chan->name);
else
reply(textclient, user, "NS_VOICE_FAIL", client->user->nick);
+ if(done_users)
+ logEvent(event);
}
* argv[0] (optional) nick mask
*/
static USERLIST_CALLBACK(neonserv_cmd_voiceall_userlist_lookup);
-static void neonserv_cmd_voiceall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nickmask);
+static void neonserv_cmd_voiceall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nickmask);
struct neonserv_cmd_voiceall_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
+ struct Event *event;
char *nickmask;
};
cache->client = client;
cache->textclient = getTextBot();
cache->user = user;
+ cache->event = event;
if(argc > 0) {
cache->nickmask = strdup(argv[0]);
} else
static USERLIST_CALLBACK(neonserv_cmd_voiceall_userlist_lookup) {
struct neonserv_cmd_voiceall_cache *cache = data;
- neonserv_cmd_voiceall_async1(cache->client, cache->textclient, cache->user, chan, cache->nickmask);
+ neonserv_cmd_voiceall_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->nickmask);
if(cache->nickmask)
free(cache->nickmask);
free(cache);
}
-static void neonserv_cmd_voiceall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nickmask) {
+static void neonserv_cmd_voiceall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nickmask) {
int done_users = 0;
struct ChanUser *chanuser;
struct ModeBuffer *modeBuf;
}
freeModeBuffer(modeBuf);
reply(textclient, user, "NS_VOICEALL_DONE", done_users, chan->name);
+ if(done_users)
+ logEvent(event);
}
* argv[0] - nick / *auth
*/
static USERAUTH_CALLBACK(neonserv_cmd_wipeinfo_nick_lookup);
-static void neonserv_cmd_wipeinfo_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth);
+static void neonserv_cmd_wipeinfo_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nick, char *auth);
struct neonserv_cmd_wipeinfo_cache {
struct ClientSocket *client, *textclient;
struct UserNode *user;
struct ChanNode *chan;
+ struct Event *event;
char *nick;
};
if(argv[0][0] == '*') {
//we've got an auth
argv[0]++;
- neonserv_cmd_wipeinfo_async1(client, getTextBot(), user, chan, argv[0], argv[0]);
+ neonserv_cmd_wipeinfo_async1(client, getTextBot(), user, chan, event, argv[0], argv[0]);
} else {
struct UserNode *cuser = getUserByNick(argv[0]);
if(!cuser) {
cuser->flags |= USERFLAG_ISTMPUSER;
}
if(cuser->flags & USERFLAG_ISAUTHED) {
- neonserv_cmd_wipeinfo_async1(client, getTextBot(), user, chan, argv[0], cuser->auth);
+ neonserv_cmd_wipeinfo_async1(client, getTextBot(), user, chan, event, argv[0], cuser->auth);
} else {
struct neonserv_cmd_wipeinfo_cache *cache = malloc(sizeof(*cache));
if (!cache) {
cache->textclient = getTextBot();
cache->user = user;
cache->chan = chan;
+ cache->event = event;
cache->nick = strdup(argv[0]);
get_userauth(cuser, neonserv_cmd_wipeinfo_nick_lookup, cache);
}
reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick);
}
else
- neonserv_cmd_wipeinfo_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth);
+ neonserv_cmd_wipeinfo_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, user->nick, user->auth);
free(cache->nick);
free(cache);
}
-static void neonserv_cmd_wipeinfo_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth) {
+static void neonserv_cmd_wipeinfo_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nick, char *auth) {
//we've got a valid auth now...
MYSQL_RES *res;
MYSQL_ROW row;
printf_mysql_query("SELECT `chanuser_access`, `chanuser_id` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid);
res = mysql_use();
if ((row = mysql_fetch_row(res)) != NULL) {
- if(atoi(row[0]) >= getChannelAccess(user, chan, 1)) {
- reply(textclient, user, "NS_USER_OUTRANKED", nick);
- return;
+ if(atoi(row[0]) >= getChannelAccess(user, chan, 0)) {
+ if(isGodMode(user)) {
+ event->flags |= CMDFLAG_OPLOG;
+ } else {
+ reply(textclient, user, "NS_USER_OUTRANKED", nick);
+ return;
+ }
}
//delete
printf_mysql_query("UPDATE `chanusers` SET `chanuser_infoline` = '' WHERE `chanuser_id` = '%s'", row[1]);
reply(textclient, user, "NS_WIPEINFO_DONE", nick, chan->name);
+ logEvent(event);
return;
}
}
#include "lang.h"
#include "tools.h"
#include "timeq.h"
+#include "EventLogger.h"
time_t start_time;
timeq_tick();
loop_bots();
clearTempUsers();
+ destroyEvents();
}
}
#include "lang.h"
#include "mysqlConn.h"
#include "DBHelper.h"
+#include "EventLogger.h"
struct trigger_callback {
int botid;
MYSQL_RES *res;
MYSQL_ROW row;
int uaccess;
+ int eventflags = (cbind->func->flags & (CMDFLAG_LOG | CMDFLAG_OPLOG));
if((cbind->func->flags & CMDFLAG_REQUIRE_AUTH) && !(user->flags & USERFLAG_ISAUTHED)) {
reply(tmp_text_client, user, "MODCMD_AUTH_REQUIRED");
return;
chan->flags |= CHANFLAG_CHAN_REGISTERED;
chan->channel_id = atoi(row[0]);
if((sent_chan && sent_chan == chan) || access_count || minaccess) {
- uaccess = getChannelAccess(user, chan, 1);
- if(uaccess < minaccess) {
+ uaccess = getChannelAccess(user, chan, 0);
+ if(uaccess < minaccess && isGodMode(user)) {
+ eventflags |= CMDFLAG_OPLOG;
+ } else if(uaccess < minaccess) {
//ACCESS DENIED
reply(tmp_text_client, user, "MODCMD_ACCESS_DENIED");
return;
defaults = mysql_fetch_row(mysql_use());
}
if(sent_chan && (sent_chan == chan) && uaccess < (row[1] ? atoi(row[1]) : atoi(defaults[1]))) {
- //PUBCMD
- reply(tmp_text_client, user, "MODCMD_PUBCMD", chan->name);
- return;
+ if(isGodMode(user)) {
+ eventflags |= CMDFLAG_OPLOG;
+ } else {
+ //PUBCMD
+ reply(tmp_text_client, user, "MODCMD_PUBCMD", chan->name);
+ return;
+ }
}
int i;
for(i = 0; i < access_count; i++) {
defaults = mysql_fetch_row(mysql_use());
}
if(uaccess < (row[2+i] ? atoi(row[2+i]) : atoi(defaults[2+i]))) {
- reply(tmp_text_client, user, "MODCMD_ACCESS_DENIED");
- return;
+ if(isGodMode(user)) {
+ eventflags |= CMDFLAG_OPLOG;
+ } else {
+ reply(tmp_text_client, user, "MODCMD_ACCESS_DENIED");
+ return;
+ }
}
}
}
reply(tmp_text_client, user, "MODCMD_PRIVILEGED", cbind->cmd);
return;
}
- cbind->func->func(client, user, chan, argv, argc);
+ struct Event *event = createEvent(client, user, chan, cbind->func->name, argv, argc, eventflags);
+ cbind->func->func(client, user, chan, argv, argc, event);
}
static void got_chanmsg(struct UserNode *user, struct ChanNode *chan, char *message) {
#define _modcmd_h
#include "main.h"
-#define CMDFLAG_REQUIRE_CHAN 0x01
-#define CMDFLAG_REQUIRE_AUTH 0x02
-#define CMDFLAG_REQUIRE_GOD 0x04
-#define CMDFLAG_CHECK_AUTH 0x08
-#define CMDFLAG_REGISTERED_CHAN 0x10
-#define CMDFLAG_OVERRIDE_GLOBAL_ACCESS 0x20
-#define CMDFLAG_OVERRIDE_CHANNEL_ACCESS 0x40
-#define CMDFLAG_CHAN_PARAM 0x80
+#define CMDFLAG_REQUIRE_CHAN 0x0001
+#define CMDFLAG_REQUIRE_AUTH 0x0002
+#define CMDFLAG_REQUIRE_GOD 0x0004
+#define CMDFLAG_CHECK_AUTH 0x0008
+#define CMDFLAG_REGISTERED_CHAN 0x0010
+#define CMDFLAG_OVERRIDE_GLOBAL_ACCESS 0x0020
+#define CMDFLAG_OVERRIDE_CHANNEL_ACCESS 0x0040
+#define CMDFLAG_CHAN_PARAM 0x0080
+#define CMDFLAG_LOG 0x0100
+#define CMDFLAG_OPLOG 0x0200
struct ClientSocket;
struct UserNode;
struct ChanNode;
+struct Event;
-#define CMD_BIND(NAME) void NAME(UNUSED_ARG(struct ClientSocket *client), UNUSED_ARG(struct UserNode *user), UNUSED_ARG(struct ChanNode *chan), UNUSED_ARG(char **argv), UNUSED_ARG(char argc))
-typedef void cmd_bind_t(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char **argv, char argc);
+#define CMD_BIND(NAME) void NAME(UNUSED_ARG(struct ClientSocket *client), UNUSED_ARG(struct UserNode *user), UNUSED_ARG(struct ChanNode *chan), UNUSED_ARG(char **argv), UNUSED_ARG(char argc), UNUSED_ARG(struct Event *event))
+typedef void cmd_bind_t(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char **argv, char argc, struct Event *event);
typedef void trigger_callback_t(struct ChanNode *chan, char *trigger);
struct cmd_function {