]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/spamserv.c
make it so that lamers do not affect users above inviteme level in the channel
[irc/evilnet/x3.git] / src / spamserv.c
index ad4acd4c767146d329eb523baaa520d20cf96109..c31d3341987d6b02b5d7a57003bd0a05dbfdbfa1 100644 (file)
@@ -316,11 +316,14 @@ spamserv_cs_move_merge(struct userNode *user, struct chanNode *channel, struct c
                        spamserv_part_channel(channel, reason);
 
                if(move)
-                       snprintf(reason, sizeof(reason), "$X (channel %s) moved to %s by %s.", channel->name, target->name, user->handle_info->handle);
+                       global_message_args(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, 
+                                            "SSMSG_CHANNEL_MOVED", channel->name, target->name, 
+                                            user->handle_info->handle);
                else
-                       snprintf(reason, sizeof(reason), "$X (channel %s) merged into %s by %s.", channel->name, target->name, user->handle_info->handle);
+                       global_message_args(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, 
+                                            "SSMSG_CHANNEL_MERGED", channel->name, target->name, 
+                                            user->handle_info->handle);
 
-               global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason);
                return 1;
        }
 
@@ -334,20 +337,23 @@ spamserv_cs_unregister(struct userNode *user, struct chanNode *channel, enum cs_
 
        if(cInfo)
        {
-               char global[MAXLEN], partmsg[MAXLEN];
+               char partmsg[MAXLEN];
 
                switch (type)
                {
                case manually:
-                       snprintf(global, sizeof(global), "$X (channel %s) %s by %s.", channel->name, reason, user->handle_info->handle);
+                       global_message_args(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, "SSMSG_UNREG_MANUAL",
+                                           channel->name, reason, user->handle_info->handle);
                        snprintf(partmsg, sizeof(partmsg), "%s %s by %s.", channel->name, reason, user->handle_info->handle);                   
                        break;
                case expire:
-                       snprintf(global, sizeof(global), "$X (channel %s) registration expired.", channel->name);
+                       global_message_args(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, "SSMSG_REG_EXPIRED",
+                                           channel->name);
                        snprintf(partmsg, sizeof(partmsg), "%s registration expired.", channel->name);                  
                        break;
                case lost_all_users:
-                       snprintf(global, sizeof(global), "$X (channel %s) lost all users.", channel->name);
+                       global_message_args(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, "SSMSG_LOST_ALL_USERS",
+                                           channel->name);
                        snprintf(partmsg, sizeof(partmsg), "%s lost all users.", channel->name);                        
                        break;
                }
@@ -356,7 +362,6 @@ spamserv_cs_unregister(struct userNode *user, struct chanNode *channel, enum cs_
                        spamserv_part_channel(channel, partmsg);
                
                spamserv_unregister_channel(cInfo);
-               global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, global);
        }
 }
 
@@ -729,6 +734,9 @@ timeq_flood(UNUSED_ARG(void *data))
        {
                uInfo = iter_data(it);
 
+                if (!uInfo)
+                    continue;
+
                if(!(fNode = uInfo->flood))
                        continue;
 
@@ -1125,7 +1133,6 @@ static
 SPAMSERV_FUNC(cmd_register)
 {
        struct chanInfo *cInfo;
-       char reason[MAXLEN];
 
        if(!channel || !channel->channel_info)
        {
@@ -1159,8 +1166,8 @@ SPAMSERV_FUNC(cmd_register)
 
        spamserv_join_channel(cInfo->channel);
        
-       snprintf(reason, sizeof(reason), "%s (channel %s) registered by %s.", spamserv->nick, channel->name, user->handle_info->handle);
-       global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason);
+       global_message_args(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, "SSMSG_REGISTERED_BY",
+                           channel->name, user->handle_info->handle);
        ss_reply("SSMSG_REG_SUCCESS", channel->name);
 
        return 1;
@@ -1209,8 +1216,8 @@ SPAMSERV_FUNC(cmd_unregister)
        
        spamserv_unregister_channel(cInfo);     
 
-       snprintf(reason, sizeof(reason), "%s (channel %s) unregistered by %s.", spamserv->nick, channel->name, user->handle_info->handle);
-       global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason);
+       global_message_args(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, "SSMSG_UNREGISTERED_BY",
+                           channel->name, user->handle_info->handle);
        ss_reply("SSMSG_UNREG_SUCCESS", channel->name);
 
        return 1;
@@ -1796,35 +1803,51 @@ spamserv_punish(struct chanNode *channel, struct userNode *user, time_t expires,
 void
 spamserv_channel_message(struct chanNode *channel, struct userNode *user, char *text)
 {
+       struct chanData *cData;
        struct chanInfo *cInfo;
        struct userInfo *uInfo;
+       struct userData *uData;
        struct spamNode *sNode;
        struct floodNode *fNode;
        unsigned int violation = 0;
        char reason[MAXLEN];
 
        /* make sure: spamserv is not disabled; x3 is running; spamserv is in the chan; chan is regged, user does exist */
-       if(!spamserv || quit_services || !GetUserMode(channel, spamserv) || !(cInfo = get_chanInfo(channel->name)) || !(uInfo = get_userInfo(user->nick)))
+       if(!spamserv || quit_services || !GetUserMode(channel, spamserv) || IsOper(user) || !(cInfo = get_chanInfo(channel->name)) || !(uInfo = get_userInfo(user->nick)))
                return;
 
+       cData = channel->channel_info;
+       uData = GetChannelUser(cData, user->handle_info);
+
        if(!CHECK_CHANOPS(cInfo))
        {
                struct modeNode *mn = GetUserMode(channel, user);
-               if(mn->modes & MODE_CHANOP)
+               if (mn && (mn->modes & MODE_CHANOP))
+                       return;
+
+               /* Chan Ops covers all levels except peon and half op */
+               if(uData && ((uData->access < UL_OP) || (uData->access < UL_MANAGER) || 
+                 (uData->access < UL_COOWNER) || (uData->access < UL_OWNER)))
                        return;
        }
 
        if(!CHECK_HALFOPS(cInfo))
        {
                struct modeNode *mn = GetUserMode(channel, user);
-               if(mn->modes & MODE_HALFOP)
+               if (mn && (mn->modes & MODE_HALFOP))
+                       return;
+
+               if(uData && (uData->access < UL_HALFOP))
                        return;
        }
        
        if(!CHECK_VOICED(cInfo))
        {
                struct modeNode *mn = GetUserMode(channel, user);
-               if((mn->modes & MODE_VOICE) && !(mn->modes & MODE_CHANOP) && !(mn->modes & MODE_HALFOP))
+               if (mn && ((mn->modes & MODE_VOICE) && !(mn->modes & MODE_CHANOP) && !(mn->modes & MODE_HALFOP)))
+                       return;
+
+               if(uData && (uData->access < UL_PEON))
                        return;
        }
 
@@ -2104,6 +2127,7 @@ spamserv_saxdb_read(struct dict *database)
                }
 
                channel = GetChannel(iter_key(it));
+
                strlist = database_get_data(hir->d.object, KEY_EXCEPTIONS, RECDB_STRING_LIST);
                strlist2 = database_get_data(hir->d.object, KEY_BADWORDS, RECDB_STRING_LIST);
 
@@ -2283,6 +2307,8 @@ init_spamserv(const char *nick)
        connected_users_dict = dict_new();
        killed_users_dict = dict_new();
 
+       saxdb_register("SpamServ", spamserv_saxdb_read, spamserv_saxdb_write);
+
        reg_new_user_func(spamserv_new_user_func);
        reg_del_user_func(spamserv_del_user_func);
        reg_nick_change_func(spamserv_nick_change_func);
@@ -2328,7 +2354,6 @@ init_spamserv(const char *nick)
             }
         }
 
-       saxdb_register("SpamServ", spamserv_saxdb_read, spamserv_saxdb_write);
        reg_exit_func(spamserv_db_cleanup);
        message_register_table(msgtab);
        crc32_init();