From 09cfeaae68073836fe62b4c7ba40afb847c80f4d Mon Sep 17 00:00:00 2001 From: pk910 Date: Wed, 21 Sep 2011 02:07:32 +0200 Subject: [PATCH] started event_join & removed cmd_modes (debug cmd) --- bot_NeonServ.c | 47 ++++++++++++++++++++------- cmd_neonserv_modes.c | 6 ---- event_neonserv_join.c | 74 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 17 deletions(-) delete mode 100644 cmd_neonserv_modes.c create mode 100644 event_neonserv_join.c diff --git a/bot_NeonServ.c b/bot_NeonServ.c index e9a4677..a85169b 100644 --- a/bot_NeonServ.c +++ b/bot_NeonServ.c @@ -213,8 +213,9 @@ static const struct default_language_entry msgtab[] = { {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 @@ -300,8 +301,35 @@ 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; @@ -385,14 +413,7 @@ static TIMEQ_CALLBACK(channel_ban_timeout) { 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]); } @@ -467,7 +488,11 @@ void init_NeonServ() { 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); diff --git a/cmd_neonserv_modes.c b/cmd_neonserv_modes.c deleted file mode 100644 index b695054..0000000 --- a/cmd_neonserv_modes.c +++ /dev/null @@ -1,6 +0,0 @@ - -static CMD_BIND(neonserv_cmd_modes) { - char modeBuf[MAXLEN]; - getModeString(chan->modes, modeBuf); - putsock(client, "PRIVMSG %s :Modes: %s", chan->name, modeBuf); -} diff --git a/event_neonserv_join.c b/event_neonserv_join.c new file mode 100644 index 0000000..d192fc3 --- /dev/null +++ b/event_neonserv_join.c @@ -0,0 +1,74 @@ + +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 +} -- 2.20.1