/**
 * Handle kick/k fantasy commands.
 * @param argc Argument count
 * @param argv Argument list
 * @return MOD_CONT or MOD_STOP
 **/
int do_fantasy(int argc, char **argv)
{
    User *u, *u2;
    ChannelInfo *ci;
    char *target = NULL;
    char *reason = NULL;

    if (argc < 3)
        return MOD_CONT;

    if ((stricmp(argv[0], "kick") == 0) || (stricmp(argv[0], "k") == 0)) {
        u = finduser(argv[1]);
        ci = cs_findchan(argv[2]);
        if (!u || !ci)
            return MOD_CONT;

        if (argc >= 4) {
            target = myStrGetToken(argv[3], ' ', 0);
            reason = myStrGetTokenRemainder(argv[3], ' ', 1);
        }
        if (!target && check_access(u, ci, CA_KICKME)) {
            bot_raw_kick(u, ci, u->nick, "Requested");
        } else if (target && check_access(u, ci, CA_KICK)) {
            if (!stricmp(target, ci->bi->nick))
                bot_raw_kick(u, ci, u->nick, "Oops!");
            else {
                u2 = finduser(target);
                if (u2 && ci->c && is_on_chan(ci->c, u2)) {
                    if (!reason && !is_protected(u2))
                        bot_raw_kick(u, ci, target, "Requested");
                    else if (!is_protected(u2))
                        bot_raw_kick(u, ci, target, reason);
                }
            }
        }
    }

    if (target)
       free(target);
    if (reason)
       free(reason);

    return MOD_CONT;
}
int fantasy_defkick(int argc, char **argv)
{
    User *u, *u2;
    ChannelInfo *ci;
    char *target = NULL;
    char *reason = NULL;

    if (argc < 3)
        return MOD_CONT;
    if (!stricmp(argv[0], "help")) 
    {
            u = finduser(argv[1]);
       		if (argc >= 4) 
            {
			   int ret = MOD_CONT;
			   char *cmd, *param;
			   cmd = myStrGetToken(argv[3],' ',0);
			   param = myStrGetToken(argv[3],' ',1);
			   if (!stricmp(cmd, "kickr")) 
               {
                  notice(s_BotServ, u->nick, "\037Syntax\037: \002!kickr [NICK] [TRIGGER]\002   or");
                  notice(s_BotServ, u->nick, "\037Syntax\037: \002!kr [NICK] [TRIGGER]\002");
                  notice(s_BotServ, u->nick, "(For example: !kr VisioN idling  or !kickr VisioN idling)");
                  notice(s_BotServ, u->nick, "\n");
                  notice(s_BotServ, u->nick, "----------------------------------------------------------------------------------------------------------");
                  notice(s_BotServ, u->nick, "\n");
                  notice(s_BotServ, u->nick, "\037Description\037: This command allows you to kick a user from a channel, using the bot's default kick reasons.");
                  notice(s_BotServ, u->nick, "The bot supports multipule kick reasons for each of the basic abuses for channels, a list of which");
                  notice(s_BotServ, u->nick, "you can find below.");
                  notice(s_BotServ, u->nick, "\n");
                  notice(s_BotServ, u->nick, "List of triggers:");
                  notice(s_BotServ, u->nick, "\037\002Name\002\037           \037\002Description\002\037");
                  notice(s_BotServ, u->nick, "badlang        Kicks for bad language (insults etc)");
                  notice(s_BotServ, u->nick, "caps             Kicks for capital letters ");
                  notice(s_BotServ, u->nick, "flood            Kicks for channel flooding ");
                  notice(s_BotServ, u->nick, "bold             Kicks for bold letters ");
                  notice(s_BotServ, u->nick, "advertise      Kicks for Spam/Advertising ");
                  notice(s_BotServ, u->nick, "repeat          Kicks for repetition ");
                  notice(s_BotServ, u->nick, "idle               Kicks for idling (mostly for help chans) ");
                  notice(s_BotServ, u->nick, "badnick        Kicks for bad nicknames ");
                  ret = MOD_CONT;
               }
			free(cmd);
			if (param) free(param);
			return ret;
            }
   }
   else if ((stricmp(argv[0], "kickr") == 0) || (stricmp(argv[0], "kr") == 0)) 
   {
        u = finduser(argv[1]);
        ci = cs_findchan(argv[2]);
        if (!u || !ci)
            return MOD_CONT;
        if (argc >= 4) 
        {
            target = myStrGetToken(argv[3], ' ', 0);
            reason = myStrGetTokenRemainder(argv[3], ' ', 1);
        }
        if (!check_access(u, ci, CA_KICK)) 
        {
            notice(s_BotServ, u->nick, "You are not authorised to kick the selected user.");
        }
        else if (!target && check_access(u, ci, CA_KICKME)) 
        {
            notice(s_BotServ, u->nick, "\037Syntax\037: \002!kickr [NICK] [TRIGGER]\002   or");
            notice(s_BotServ, u->nick, "\037Syntax\037: \002!kr [NICK] [TRIGGER]\002");
            notice(s_BotServ, u->nick, "For detailed information about this command and");
            notice(s_BotServ, u->nick, "for a list of triggers, type \002!help kickr\002");
        } 
        else if (target && check_access(u, ci, CA_KICK)) 
        {
            if (!stricmp(target, ci->bi->nick))
                bot_raw_kick(u, ci, u->nick, "Wrong Move!");
            else 
            {
                u2 = finduser(target);
                if (u2 && ci->c && is_on_chan(ci->c, u2)) 
                {   
                    if (!reason && !is_protected(u2))
                        bot_raw_kick(u, ci, target, "Requested");
                    else if (!is_protected(u2)) 
                    {
                         if ((stricmp(reason , "badlang") == 0))  
                            bot_raw_kick(u, ci, target, BADLANG);
			             else if ((stricmp(reason , "caps") == 0)) 
                              bot_raw_kick(u, ci, target, CAPS);
			             else if ((stricmp(reason , "flood") == 0)) 
				              bot_raw_kick(u, ci, target, FLOOD);
			             else if ((stricmp(reason , "bold") == 0))
				              bot_raw_kick(u, ci, target, BOLD);
                         else if ((stricmp(reason , "advertise") == 0)) 
				              bot_raw_kick(u, ci, target, ADVERTISE);
	                     else if ((stricmp(reason , "repeat") == 0)) 
				              bot_raw_kick(u, ci, target, REPEAT);
	                     else if ((stricmp(reason , "idle") == 0)) 
				              bot_raw_kick(u, ci, target, IDLE);
	                     else if ((stricmp(reason , "badnick") == 0)) 
				              bot_raw_kick(u, ci, target, BADNICK);

                     else     
                     {
                           notice(s_BotServ, u->nick, "The number you chose does not correspond to a kick reason.");
                           notice(s_BotServ, u->nick, "If you want to kick with your own custom reason , use !kick trigger");
                     }
                 }      
                    
              }
            }
        }
    }
    if (target) free(target);
    if (reason) free(reason);
    return MOD_CONT;
}
Example #3
0
int do_core_kick(User * u, Channel *c, char *target, char *reason) {
	ChannelInfo *ci = c->ci;
	User *u2;
	int is_same, exists;

	if (!target)
		target = u->nick;

	is_same = (target == u->nick) ? 1 : (stricmp(target, u->nick) == 0);

	if (is_same) {
		u2 = u;
		exists = 1;
	} else
		exists = ((u2 = finduser(target)) ? 1 : 0);

	if (!is_same ? !check_access(u, ci, CA_KICK) : !check_access(u, ci, CA_KICKME)) {
		notice_lang(ci->bi->nick, u, ACCESS_DENIED);
	} else if (!is_same && exists && (ci->flags & CI_PEACE) && (get_access(u2, ci) >= get_access(u, ci))) {
		notice_lang(ci->bi->nick, u, PERMISSION_DENIED);
	} else if (exists && ((ircd->protectedumode && is_protected(u2)) && !is_founder(u, ci))) {
		notice_lang(ci->bi->nick, u, PERMISSION_DENIED);
	} else if (exists && RestrictKB && ((!is_founder(u, ci) && is_services_oper(u2)) ||
			(is_founder(u, ci) && is_services_admin(u2)))) {
		notice_lang(ci->bi->nick, u, PERMISSION_DENIED);
	} else if (stricmp(target, ci->bi->nick) == 0) {
		bot_raw_kick(u, ci, u->nick, "Oops!");
	} else {
		if (exists) {
			if (is_on_chan(ci->c, u2)) {
				if (!reason)
					bot_raw_kick(u, ci, target, "Requested");
				else
					bot_raw_kick(u, ci, target, reason);
			}

		} else {
			char mask[BUFSIZE];
			struct c_userlist *cu = NULL, *next = NULL;

			if (my_match_wild_nocase("*!*@*", target))
				snprintf(mask, BUFSIZE, "%s", target);
			/* If we get a *@* target we need to add the *!... */
			else if (my_match_wild_nocase("*@*", target))
				snprintf(mask, BUFSIZE, "*!%s", target);
			else if (my_match_wild_nocase("*!*", target))
				snprintf(mask, BUFSIZE, "%s@*", target);
			/* If we get a * target we need to add the !*@* (assume nick)... */
			else
				snprintf(mask, BUFSIZE, "%s!*@*", target);

			cu = c->users;
			while (cu) {
				next = cu->next;
				/* This only checks against the cloacked host & vhost for normal users.
				 * IPs are only checked when triggered by an oper.. */
				if (is_oper(u) ? match_usermask_full(mask, cu->user, true) : match_usermask(mask, cu->user)) {
					/* Check whether we are allowed to kick this matching user.. */
					if (!((ircd->protectedumode && is_protected(cu->user) && !is_founder(u, ci))
							|| ((ci->flags & CI_PEACE) && (get_access(cu->user, ci) >= get_access(u, ci)))
							|| (RestrictKB && ((!is_founder(u, ci) && is_services_oper(cu->user)) ||
							(is_founder(u, ci) && is_services_admin(cu->user)))))) {
						if (!reason)
							bot_raw_kick(u, ci, cu->user->nick, "Requested");
						else
							bot_raw_kick(u, ci, cu->user->nick, reason);
					}
				}
				cu = next;
			}
		}
	}
	return MOD_CONT;
}
Example #4
0
int do_core_kickban(User * u, Channel *c, char *target, char *reason) {
	ChannelInfo *ci = c->ci;
	User *u2;
	int is_same, exists;
	char *av[2];

	if (!target)
		target = u->nick;

	is_same = (target == u->nick) ? 1 : (stricmp(target, u->nick) == 0);

	if (is_same) {
		u2 = u;
		exists = 1;
	} else
		exists = ((u2 = finduser(target)) ? 1 : 0);

	if (!is_same ? !check_access(u, ci, CA_BAN) : !check_access(u, ci, CA_BANME)) {
		notice_lang(ci->bi->nick, u, ACCESS_DENIED);
	} else if (!is_same && exists && (ci->flags & CI_PEACE) && (get_access(u2, ci) >= get_access(u, ci))) {
		notice_lang(ci->bi->nick, u, PERMISSION_DENIED);
	} else if (exists && ((ircd->protectedumode && is_protected(u2)) && !is_founder(u, ci))) {
		notice_lang(ci->bi->nick, u, PERMISSION_DENIED);
	/**
	 * Dont ban the user on channels where he is excepted
	 * to prevent services <-> server wars.
	 **/
	} else if (exists && (ircd->except && is_excepted(ci, u2))) {
		notice_lang(ci->bi->nick, u, CHAN_EXCEPTED, u2->nick, ci->name);
	} else if (!exists && (ircd->except && is_excepted_mask(ci, target))) {
		notice_lang(ci->bi->nick, u, CHAN_EXCEPTED, target, ci->name);
	} else if (exists && RestrictKB && ((!is_founder(u, ci) && is_services_oper(u2)) ||
			(is_founder(u, ci) && is_services_admin(u2)))) {
		notice_lang(ci->bi->nick, u, PERMISSION_DENIED);
	} else if (stricmp(target, ci->bi->nick) == 0) {
		bot_raw_ban(u, ci, u->nick, "Oops!");
	} else {
		if (exists) {
			if (is_on_chan(ci->c, u2)) {
				if (!reason)
					bot_raw_ban(u, ci, target, "Requested");
				else
					bot_raw_ban(u, ci, target, reason);
			}

		} else if (my_match_wild_nocase("*@*", target)) {
			char mask[BUFSIZE];

			/* If we get a *@* target we need to add the *!... */
			if (!my_match_wild_nocase("*!*@*", target))
				snprintf(mask, BUFSIZE, "*!%s", target);
			else
				snprintf(mask, BUFSIZE, "%s", target);

			/* Only continue if the mask doesn't match an exception or is otherwise prohibited.. */
			if (check_banmask(u, c, mask)) {
				struct c_userlist *cu = NULL, *next = NULL;

				av[0] = "+b";
				av[1] = mask;

				anope_cmd_mode(ci->bi->nick, c->name, "+b %s", av[1]);
				chan_set_modes(ci->bi->nick, c, 2, av, 1);

				cu = c->users;
				while (cu) {
					next = cu->next;
					/* This only checks against the cloacked host & vhost for normal users.
					 * IPs are only checked when triggered by an oper.. */
					if (is_oper(u) ? match_usermask_full(mask, cu->user, true) : match_usermask(mask, cu->user)) {
						if (!reason)
							bot_raw_kick(u, ci, cu->user->nick, "Requested");
						else
							bot_raw_kick(u, ci, cu->user->nick, reason);
					}
					cu = next;
				}
			}
		} else
			noticeLang(ci->bi->nick, u, LANG_REQ_NICK_OR_MASK);
	}
	return MOD_CONT;
}