started event_join & removed cmd_modes (debug cmd)
authorpk910 <philipp@zoelle1.de>
Wed, 21 Sep 2011 00:07:32 +0000 (02:07 +0200)
committerpk910 <philipp@zoelle1.de>
Wed, 21 Sep 2011 00:07:32 +0000 (02:07 +0200)
bot_NeonServ.c
cmd_neonserv_modes.c [deleted file]
event_neonserv_join.c [new file with mode: 0644]

index e9a46779f975bc7234faff73764871bec73a0c98..a85169b3884c07ea305501aff5c9bb9da13d9bac 100644 (file)
@@ -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 (file)
index b695054..0000000
+++ /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 (file)
index 0000000..d192fc3
--- /dev/null
@@ -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
+}