00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "module.h"
00020
00021 #define AUTHOR "Rob"
00022 #define VERSION VERSION_STRING
00023
00024 static void myHelp(User * u);
00025 static void myFullHelpSyntax(User * u);
00026 static int myFullHelp(User * u);
00027 static void mySendResponse(User * u, char *channel, char *mask, char *time);
00028
00029 static int do_tban(User * u);
00030 static void addBan(Channel * c, time_t timeout, char *banmask);
00031 static int delBan(int argc, char **argv);
00032 static int canBanUser(Channel * c, User * u, User * u2);
00033
00034 static void mAddLanguages(void);
00035
00036 #define LANG_NUM_STRINGS 4
00037 #define TBAN_HELP 0
00038 #define TBAN_SYNTAX 1
00039 #define TBAN_HELP_DETAIL 2
00040 #define TBAN_RESPONSE 3
00041
00042 int AnopeInit(int argc, char **argv)
00043 {
00044 Command *c;
00045 int status = 0;
00046
00047 moduleSetChanHelp(myHelp);
00048 c = createCommand("TBAN", do_tban, NULL, -1, -1, -1, -1, -1);
00049 moduleAddHelp(c, myFullHelp);
00050 status = moduleAddCommand(CHANSERV, c, MOD_HEAD);
00051
00052 mAddLanguages();
00053
00054 moduleAddAuthor(AUTHOR);
00055 moduleAddVersion(VERSION);
00056 moduleSetType(SUPPORTED);
00057
00058 if (status != MOD_ERR_OK) {
00059 return MOD_STOP;
00060 }
00061 return MOD_CONT;
00062 }
00063
00064 void AnopeFini(void)
00065 {
00066
00067 }
00068
00069 static void myHelp(User * u)
00070 {
00071 moduleNoticeLang(s_ChanServ, u, TBAN_HELP);
00072 }
00073
00074 static void myFullHelpSyntax(User * u)
00075 {
00076 moduleNoticeLang(s_ChanServ, u, TBAN_SYNTAX);
00077 }
00078
00079 static int myFullHelp(User * u)
00080 {
00081 myFullHelpSyntax(u);
00082 notice(s_ChanServ, u->nick, "");
00083 moduleNoticeLang(s_ChanServ, u, TBAN_HELP_DETAIL);
00084 return MOD_CONT;
00085 }
00086
00087 static void mySendResponse(User * u, char *channel, char *mask, char *time)
00088 {
00089 moduleNoticeLang(s_ChanServ, u, TBAN_RESPONSE, mask, channel, time);
00090 }
00091
00092 static int do_tban(User * u)
00093 {
00094 char mask[BUFSIZE];
00095 Channel *c;
00096 User *u2 = NULL;
00097
00098 char *buffer = moduleGetLastBuffer();
00099 char *chan;
00100 char *nick;
00101 char *time;
00102
00103 chan = myStrGetToken(buffer, ' ', 0);
00104 nick = myStrGetToken(buffer, ' ', 1);
00105 time = myStrGetToken(buffer, ' ', 2);
00106
00107 if (time && chan && nick) {
00108
00109 if (!(c = findchan(chan))) {
00110 notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
00111 } else if (!(u2 = finduser(nick))) {
00112 notice_lang(s_ChanServ, u, NICK_X_NOT_IN_USE, nick);
00113 } else {
00114 if (canBanUser(c, u, u2)) {
00115 get_idealban(c->ci, u2, mask, sizeof(mask));
00116 addBan(c, dotime(time), mask);
00117 mySendResponse(u, chan, mask, time);
00118 }
00119 }
00120 } else {
00121 myFullHelpSyntax(u);
00122 }
00123 if (time)
00124 free(time);
00125 if (nick)
00126 free(nick);
00127 if (chan)
00128 free(chan);
00129
00130 return MOD_CONT;
00131 }
00132
00133 static void addBan(Channel * c, time_t timeout, char *banmask)
00134 {
00135 char *av[3];
00136 char *cb[2];
00137
00138 cb[0] = c->name;
00139 cb[1] = banmask;
00140
00141 av[0] = sstrdup("+b");
00142 av[1] = banmask;
00143
00144 anope_cmd_mode(whosends(c->ci), c->name, "+b %s", av[1]);
00145 chan_set_modes(s_ChanServ, c, 2, av, 1);
00146
00147 free(av[0]);
00148 moduleAddCallback("tban", time(NULL) + timeout, delBan, 2, cb);
00149 }
00150
00151 static int delBan(int argc, char **argv)
00152 {
00153 char *av[3];
00154 Channel *c;
00155
00156 av[0] = sstrdup("-b");
00157 av[1] = argv[1];
00158
00159 if ((c = findchan(argv[0])) && c->ci) {
00160 anope_cmd_mode(whosends(c->ci), c->name, "-b %s", av[1]);
00161 chan_set_modes(s_ChanServ, c, 2, av, 1);
00162 }
00163
00164 free(av[0]);
00165
00166 return MOD_CONT;
00167 }
00168
00169 static int canBanUser(Channel * c, User * u, User * u2)
00170 {
00171 ChannelInfo *ci;
00172 int ok = 0;
00173 if (!(ci = c->ci)) {
00174 notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, c->name);
00175 } else if (ci->flags & CI_VERBOTEN) {
00176 notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, c->name);
00177 } else if (!check_access(u, ci, CA_BAN)) {
00178 notice_lang(s_ChanServ, u, ACCESS_DENIED);
00179 } else if (ircd->except && is_excepted(ci, u2)) {
00180 notice_lang(s_ChanServ, u, CHAN_EXCEPTED, u2->nick, ci->name);
00181 } else if (ircd->protectedumode && is_protected(u2)) {
00182 notice_lang(s_ChanServ, u, PERMISSION_DENIED);
00183 } else {
00184 ok = 1;
00185 }
00186
00187 return ok;
00188 }
00189
00190
00191 static void mAddLanguages(void)
00192 {
00193 char *langtable_en_us[] = {
00194 " TBAN Bans the user for a given length of time",
00195 "Syntax: TBAN channel nick time",
00196 "Bans the given user from a channel for a specified length of\n"
00197 "time. If the ban is removed before by hand, it will NOT be replaced.",
00198 "%s banned from %s, will auto-expire in %s"
00199 };
00200
00201 char *langtable_nl[] = {
00202 " TBAN Verban een gebruiker voor een bepaalde tijd",
00203 "Syntax: TBAN kanaal nick tijd",
00204 "Verbant de gegeven gebruiken van het gegeven kanaal voor de\n"
00205 "gegeven tijdsduur. Als de verbanning eerder wordt verwijderd,\n"
00206 "zal deze NIET worden vervangen.",
00207 "%s verbannen van %s, zal verlopen in %s"
00208 };
00209
00210 char *langtable_de[] = {
00211 " TBAN Bant ein User fьr eine bestimmte Zeit aus ein Channel",
00212 "Syntax: TBAN Channel Nickname Zeit",
00213 "Bant ein User fьr eine bestimmte Zeit aus ein Channel\n"
00214 "Wenn der Ban manuell entfernt wird, wird es NICHT ersetzt.",
00215 "%s gebannt von %s, wird auto-auslaufen in %s"
00216 };
00217
00218 char *langtable_pt[] = {
00219 " TBAN Bane o usuбrio por um determinado perнodo de tempo",
00220 "Sintaxe: TBAN canal nick tempo",
00221 "Bane de um canal o usuбrio especificado por um determinado perнodo de\n"
00222 "tempo. Se o ban for removido manualmente antes do tempo, ele nгo serб recolocado.",
00223 "%s foi banido do %s, irб auto-expirar em %s"
00224 };
00225
00226 char *langtable_ru[] = {
00227 " TBAN Банит пользователя на указанный промежуток времени",
00228 "Синтаксис: TBAN #канал ник время",
00229 "Банит пользователя на указанный промежуток времени в секундах\n"
00230 "Примечание: удаленный вручную (до своего истечения) бан НЕ БУДЕТ\n"
00231 "переустановлен сервисами автоматически!",
00232 "Установленный бан %s на канале %s истечет через %s секунд"
00233 };
00234
00235 char *langtable_it[] = {
00236 " TBAN Banna l'utente per un periodo di tempo specificato",
00237 "Sintassi: TBAN canale nick tempo",
00238 "Banna l'utente specificato da un canale per un periodo di tempo\n"
00239 "specificato. Se il ban viene rimosso a mano prima della scadenza, NON verrа rimpiazzato.",
00240 "%s bannato da %s, scadrа automaticamente tra %s"
00241 };
00242
00243 char *langtable_fr[] = {
00244 " TBAN Bannit l'utilisateur pour une pйriode dйfinie",
00245 "Syntaxe: \002TBAN \037canal\037 \037pseudo\037 \037durйe\037\002",
00246 "Bannit un utilisateur d'un canal pour une durйe spйcifiйe.\n"
00247 "Si le ban est retirй manuellement avant la fin du dйlai, il ne sera PAS remis.",
00248 "%s banni de %s, avec expiration dans %s"
00249 };
00250
00251 moduleInsertLanguage(LANG_EN_US, LANG_NUM_STRINGS, langtable_en_us);
00252 moduleInsertLanguage(LANG_NL, LANG_NUM_STRINGS, langtable_nl);
00253 moduleInsertLanguage(LANG_DE, LANG_NUM_STRINGS, langtable_de);
00254 moduleInsertLanguage(LANG_PT, LANG_NUM_STRINGS, langtable_pt);
00255 moduleInsertLanguage(LANG_RU, LANG_NUM_STRINGS, langtable_ru);
00256 moduleInsertLanguage(LANG_IT, LANG_NUM_STRINGS, langtable_it);
00257 moduleInsertLanguage(LANG_FR, LANG_NUM_STRINGS, langtable_fr);
00258 }
00259
00260
00261