{NULL, NULL}
};
-//define some usefull functions :D
+//define some useful functions :D
static TIMEQ_CALLBACK(channel_ban_timeout);
+static struct ClientSocket *getBotForChannel(struct ChanNode *chan);
/*
INCLUDE ALL CMD's HERE
//#include "cmd_neonserv_iplocate.c"
//#include "cmd_neonserv_calc.c"
-//DEBUG
-#include "cmd_neonserv_modes.c"
+//EVENTS
+#include "event_neonserv_join.c"
+//#include "event_neonserv_part.c"
+//#include "event_neonserv_quit.c"
+//#include "event_neonserv_kick.c"
+//#include "event_neonserv_mode.c"
+//#include "event_neonserv_ctcp.c"
+//#include "event_neonserv_notice.c"
+//#include "event_neonserv_invite.c"
+
+static struct ClientSocket *getBotForChannel(struct ChanNode *chan) {
+ struct ClientSocket *bot, *use_bot = NULL, *second_bot = NULL, *third_bot = NULL;
+ struct ChanUser *chanuser;
+ for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) {
+ if(bot->botid != BOTID) continue;
+ if((chanuser = getChanUser(bot->user, chan)) != NULL) {
+ if((chanuser->flags & CHANUSERFLAG_OPPED)) {
+ use_bot = bot;
+ if(bot->flags & SOCKET_FLAG_PREFERRED) break;
+ } else if(bot->flags & SOCKET_FLAG_PREFERRED)
+ second_bot = bot;
+ else
+ third_bot = bot;
+ }
+ }
+ if(!use_bot) use_bot = second_bot;
+ if(!use_bot) use_bot = third_bot;
+ return use_bot;
+}
static void neonserv_bot_ready(struct ClientSocket *client) {
MYSQL_RES *res;
res = mysql_use();
struct ChanNode *chan;
if((row = mysql_fetch_row(res)) != NULL && (chan = getChanByName(row[1])) != NULL) {
- struct ClientSocket *bot, *use_bot = NULL;
- struct ChanUser *chanuser;
- 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)) {
- use_bot = bot;
- if(bot->flags & SOCKET_FLAG_PREFERRED) break;
- }
- }
+ struct ClientSocket *use_bot = getBotForChannel(chan);
if(use_bot) {
putsock(use_bot, "MODE %s -b %s", chan->name, row[0]);
}
register_command(BOTID, "move", neonserv_cmd_move, 2, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG, NULL, 300);
start_bots();
+
+ //register events
bind_bot_ready(neonserv_bot_ready);
+ bind_join(neonserv_event_join);
+
set_trigger_callback(BOTID, neonserv_trigger_callback);
register_default_language_table(msgtab);
+++ /dev/null
-
-static CMD_BIND(neonserv_cmd_modes) {
- char modeBuf[MAXLEN];
- getModeString(chan->modes, modeBuf);
- putsock(client, "PRIVMSG %s :Modes: %s", chan->name, modeBuf);
-}
--- /dev/null
+
+struct neonserv_event_join_cache {
+ struct ClientSocket *client;
+ struct ChanUser *chanuser;
+};
+
+static USERAUTH_CALLBACK(neonserv_event_join_nick_lookup);
+static void neonserv_event_join_async1(struct ClientSocket *client, struct ChanUser *chanuser);
+
+static int neonserv_event_join(struct ChanUser *chanuser) {
+ struct UserNode *user = chanuser->user;
+ struct ClientSocket *client = getBotForChannel(chanuser->chan);
+ if(!client) return 0; //we can't "see" this event
+ if(user->flags & USERFLAG_ISBOT) {
+ putsock("MODE %s +o %s", chanuser->chan->name, chanuser->user->nick);
+ return 0;
+ }
+ loadChannelSettings(chan);
+ if(!(chan->flags & CHANFLAG_CHAN_REGISTERED)) return 0;
+ char *ban;
+ char usermask[NICKLEN+USERLEN+HOSTLEN+3];
+ sprintf(usermask, "%s!%s@%s", user->nick, user->ident, user->host);
+ if((ban = getBanAffectingMask(chanuser->chan, usermask)) != NULL && !(user->flags & (USERFLAG_ISBOT | USERFLAG_ISIRCOP))) {
+ MYSQL_RES *res;
+ MYSQL_ROW row;
+ printf_mysql_query("SELECT `ban_reason`, `user_user` FROM `bans` LEFT JOIN `users` ON `ban_owner` = `user_id` WHERE `ban_channel` = '%d' AND `ban_mask` = '%s'", chan->channel_id, escape_string(ban));
+ res = mysql_use();
+ if ((row = mysql_fetch_row(res)) != NULL) {
+ putsock(client, "MODE %s +b %s", chanuser->chan->name, ban);
+ putsock(client, "KICK %s %s :(%s) %s", chanuser->chan->name, chanuser->user->nick, row[1], row[0]);
+ return 0;
+ }
+ }
+ if(!(user->flags & USERFLAG_ISAUTHED)) {
+ struct neonserv_event_join_cache *cache = malloc(sizeof(*cache));
+ if (!cache) {
+ perror("malloc() failed");
+ return 0;
+ }
+ cache->client = client;
+ cache->chanuser = chanuser
+ get_userauth(user, neonserv_event_join_nick_lookup, cache);
+ } else
+ neonserv_event_join_async1(client, chanuser);
+ return 1;
+}
+
+static USERAUTH_CALLBACK(neonserv_event_join_nick_lookup) {
+ struct neonserv_event_join_cache *cache = data;
+ if(user) {
+ neonserv_event_join_async1(cache->client, cache->chanuser);
+ }
+ free(cache);
+}
+
+static void neonserv_event_join_async1(struct ClientSocket *client, struct ChanUser *chanuser) {
+ struct ClientSocket *textclient = ((client->flags & SOCKET_FLAG_PREFERRED) ? client : get_prefered_bot(client->botid));
+ struct ChanNode *chan = chanuser->chan;
+ struct UserNode *user = chanuser->user;
+ MYSQL_RES *res;
+ MYSQL_ROW row;
+ printf_mysql_query("SELECT `channel_maxusers` FROM `channels` WHERE `channel_id` = '%d'", chan->channel_id);
+ res = mysql_use();
+ if ((row = mysql_fetch_row(res)) == NULL) return;
+ if(chan->usercount > atoi(row[0])) {
+ //update maxusers
+ printf_mysql_query("UPDATE `channels` SET `channel_maxusers` = '%d' WHERE `channel_id` = '%d'", chan->usercount, chan->channel_id);
+ }
+ //GREETING
+ //USER RIGHTS
+ //INFOLINE / SEEN
+ //DYNLIMIT
+ //AUTOINVITE
+}