cs_kick.c

Go to the documentation of this file.
00001 /* ChanServ core functions
00002  *
00003  * (C) 2003-2007 Anope Team
00004  * Contact us at info@anope.org
00005  *
00006  * Please read COPYING and README for further details.
00007  *
00008  * Based on the original code of Epona by Lara.
00009  * Based on the original code of Services by Andy Church. 
00010  * 
00011  * $Id: cs_kick.c 1265 2007-08-26 15:33:06Z geniusdex $
00012  *
00013  */
00014 /*************************************************************************/
00015 
00016 #include "module.h"
00017 
00018 int do_cs_kick(User * u);
00019 void myChanServHelp(User * u);
00020 
00027 int AnopeInit(int argc, char **argv)
00028 {
00029     Command *c;
00030 
00031     moduleAddAuthor("Anope");
00032     moduleAddVersion("$Id: cs_kick.c 1265 2007-08-26 15:33:06Z geniusdex $");
00033     moduleSetType(CORE);
00034 
00035     c = createCommand("KICK", do_cs_kick, NULL, CHAN_HELP_KICK, -1, -1, -1,
00036                       -1);
00037     moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
00038 
00039     moduleSetChanHelp(myChanServHelp);
00040 
00041     return MOD_CONT;
00042 }
00043 
00047 void AnopeFini(void)
00048 {
00049 
00050 }
00051 
00056 void myChanServHelp(User * u)
00057 {
00058     notice_lang(s_ChanServ, u, CHAN_HELP_CMD_KICK);
00059 }
00060 
00066 int do_cs_kick(User * u)
00067 {
00068     char *chan = strtok(NULL, " ");
00069     char *params = strtok(NULL, " ");
00070     char *reason = strtok(NULL, "");
00071 
00072     Channel *c;
00073     ChannelInfo *ci;
00074     User *u2;
00075 
00076     int is_same;
00077 
00078     if (!reason) {
00079         reason = "Requested";
00080     } else {
00081         if (strlen(reason) > 200)
00082             reason[200] = '\0';
00083     }
00084 
00085     if (!chan) {
00086         struct u_chanlist *uc, *next;
00087 
00088         /* Kicks the user on every channels he is on. */
00089 
00090         for (uc = u->chans; uc; uc = next) {
00091             next = uc->next;
00092             if ((ci = uc->chan->ci) && !(ci->flags & CI_VERBOTEN)
00093                 && check_access(u, ci, CA_KICKME)) {
00094                 char *av[3];
00095 
00096                 if ((ci->flags & CI_SIGNKICK)
00097                     || ((ci->flags & CI_SIGNKICK_LEVEL)
00098                         && !check_access(u, ci, CA_SIGNKICK)))
00099                     anope_cmd_kick(whosends(ci), ci->name, u->nick,
00100                                    "%s (%s)", reason, u->nick);
00101                 else
00102                     anope_cmd_kick(whosends(ci), ci->name, u->nick, "%s",
00103                                    reason);
00104                 av[0] = ci->name;
00105                 av[1] = u->nick;
00106                 av[2] = reason;
00107                 do_kick(s_ChanServ, 3, av);
00108             }
00109         }
00110 
00111         return MOD_CONT;
00112     } else if (!params) {
00113         params = u->nick;
00114     }
00115 
00116     is_same = (params == u->nick) ? 1 : (stricmp(params, u->nick) == 0);
00117 
00118     if (!(c = findchan(chan))) {
00119         notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
00120     } else if (!(ci = c->ci)) {
00121         notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
00122     } else if (ci->flags & CI_VERBOTEN) {
00123         notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
00124     } else if (is_same ? !(u2 = u) : !(u2 = finduser(params))) {
00125         notice_lang(s_ChanServ, u, NICK_X_NOT_IN_USE, params);
00126     } else if (!is_on_chan(c, u2)) {
00127         notice_lang(s_ChanServ, u, NICK_X_NOT_ON_CHAN, u2->nick, c->name);
00128     } else if (!is_same ? !check_access(u, ci, CA_KICK) :
00129                !check_access(u, ci, CA_KICKME)) {
00130         notice_lang(s_ChanServ, u, ACCESS_DENIED);
00131     } else if (!is_same && (ci->flags & CI_PEACE)
00132                && (get_access(u2, ci) >= get_access(u, ci))) {
00133         notice_lang(s_ChanServ, u, PERMISSION_DENIED);
00134     } else if (is_protected(u2)) {
00135         notice_lang(s_ChanServ, u, PERMISSION_DENIED);
00136     } else {
00137         char *av[3];
00138 
00139         if ((ci->flags & CI_SIGNKICK)
00140             || ((ci->flags & CI_SIGNKICK_LEVEL)
00141                 && !check_access(u, ci, CA_SIGNKICK)))
00142             anope_cmd_kick(whosends(ci), ci->name, params, "%s (%s)",
00143                            reason, u->nick);
00144         else
00145             anope_cmd_kick(whosends(ci), ci->name, params, "%s", reason);
00146         av[0] = ci->name;
00147         av[1] = params;
00148         av[2] = reason;
00149         do_kick(s_ChanServ, 3, av);
00150     }
00151     return MOD_CONT;
00152 }

Generated on Sun Dec 30 09:26:46 2007 for Anope by  doxygen 1.5.1-20070107