|
@@ -1029,189 +1029,6 @@ request_in(struct chanset_t *chan)
|
|
|
putlog(LOG_GETIN, "*", "Requested help to join %s", chan->dname);
|
|
putlog(LOG_GETIN, "*", "Requested help to join %s", chan->dname);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-#ifdef REVENGE
|
|
|
|
|
-/* Contains the logic to decide wether we want to punish someone. Returns
|
|
|
|
|
- * true (1) if we want to, false (0) if not.
|
|
|
|
|
- */
|
|
|
|
|
-static bool
|
|
|
|
|
-want_to_revenge(struct chanset_t *chan, struct userrec *u,
|
|
|
|
|
- struct userrec *u2, char *badnick, char *victimstr, bool mevictim)
|
|
|
|
|
-{
|
|
|
|
|
- struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
|
|
|
|
|
-
|
|
|
|
|
- /* Do not take revenge upon ourselves. */
|
|
|
|
|
- if (match_my_nick(badnick))
|
|
|
|
|
- return 0;
|
|
|
|
|
-
|
|
|
|
|
- get_user_flagrec(u, &fr, chan->dname, chan);
|
|
|
|
|
-
|
|
|
|
|
- /* Kickee didn't kick themself? */
|
|
|
|
|
- if (rfc_casecmp(badnick, victimstr)) {
|
|
|
|
|
- /* They kicked me? */
|
|
|
|
|
- if (mevictim) {
|
|
|
|
|
- /* ... and I'm allowed to take revenge? <snicker> */
|
|
|
|
|
- if (channel_revengebot(chan))
|
|
|
|
|
- return 1;
|
|
|
|
|
- /* Do we revenge for our users ... and do we actually know the victim? */
|
|
|
|
|
- } else if (channel_revenge(chan) && u2) {
|
|
|
|
|
- struct flag_record fr2 = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
|
|
|
|
|
-
|
|
|
|
|
- get_user_flagrec(u2, &fr2, chan->dname, chan);
|
|
|
|
|
- /* Protecting friends? */
|
|
|
|
|
- /* Protecting ops? */
|
|
|
|
|
- if ((channel_protectops(chan) && chk_op(fr2, chan)))
|
|
|
|
|
- return 1;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- return 0;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-/* Dependant on revenge_mode, punish the offender.
|
|
|
|
|
- */
|
|
|
|
|
-static void
|
|
|
|
|
-punish_badguy(struct chanset_t *chan, char *whobad,
|
|
|
|
|
- struct userrec *u, char *badnick, char *victimstr, bool mevictim, int type)
|
|
|
|
|
-{
|
|
|
|
|
- memberlist *m = ismember(chan, badnick);
|
|
|
|
|
-
|
|
|
|
|
- if (!m)
|
|
|
|
|
- return;
|
|
|
|
|
-
|
|
|
|
|
- char reason[1024] = "", ct[81] = "", *kick_msg = NULL;
|
|
|
|
|
- struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
|
|
|
|
|
-
|
|
|
|
|
- get_user_flagrec(u, &fr, chan->dname, chan);
|
|
|
|
|
-
|
|
|
|
|
- /* Get current time into a string */
|
|
|
|
|
- strftime(ct, sizeof ct, "%d %b %Z", gmtime(&now));
|
|
|
|
|
-
|
|
|
|
|
- /* Put together log and kick messages */
|
|
|
|
|
- reason[0] = 0;
|
|
|
|
|
- switch (type) {
|
|
|
|
|
- case REVENGE_KICK:
|
|
|
|
|
- kick_msg = "don't kick my friends, bud";
|
|
|
|
|
- simple_snprintf(reason, sizeof(reason), "kicked %s off %s", victimstr, chan->dname);
|
|
|
|
|
- break;
|
|
|
|
|
- case REVENGE_DEOP:
|
|
|
|
|
- simple_snprintf(reason, sizeof(reason), "deopped %s on %s", victimstr, chan->dname);
|
|
|
|
|
- kick_msg = "don't deop my friends, bud";
|
|
|
|
|
- break;
|
|
|
|
|
- default:
|
|
|
|
|
- kick_msg = "revenge!";
|
|
|
|
|
- }
|
|
|
|
|
- putlog(LOG_MISC, chan->dname, "Punishing %s (%s)", badnick, reason);
|
|
|
|
|
-
|
|
|
|
|
- /* Set the offender +d */
|
|
|
|
|
- if ((chan->revenge_mode > 0) &&
|
|
|
|
|
- /* ... unless there's no more to do */
|
|
|
|
|
- !(chan_deop(fr) || glob_deop(fr))) {
|
|
|
|
|
- char s[UHOSTLEN], s1[UHOSTLEN];
|
|
|
|
|
- memberlist *mx = NULL;
|
|
|
|
|
-
|
|
|
|
|
- /* Removing op */
|
|
|
|
|
- if (chk_op(fr, chan)) {
|
|
|
|
|
- fr.match = FR_CHAN;
|
|
|
|
|
- if (chan_op(fr)) {
|
|
|
|
|
- fr.chan &= ~USER_OP;
|
|
|
|
|
- } else {
|
|
|
|
|
- fr.chan |= USER_DEOP;
|
|
|
|
|
- }
|
|
|
|
|
- set_user_flagrec(u, &fr, chan->dname);
|
|
|
|
|
- putlog(LOG_MISC, "*", "No longer opping %s[%s] (%s)", u->handle, whobad, reason);
|
|
|
|
|
- }
|
|
|
|
|
- /* ... or just setting to deop */
|
|
|
|
|
- else if (u) {
|
|
|
|
|
- /* In the user list already, cool :) */
|
|
|
|
|
- fr.match = FR_CHAN;
|
|
|
|
|
- fr.chan |= USER_DEOP;
|
|
|
|
|
- set_user_flagrec(u, &fr, chan->dname);
|
|
|
|
|
- simple_snprintf(s, sizeof(s), "(%s) %s", ct, reason);
|
|
|
|
|
- putlog(LOG_MISC, "*", "Now deopping %s[%s] (%s)", u->handle, whobad, s);
|
|
|
|
|
- }
|
|
|
|
|
- /* ... or creating new user and setting that to deop */
|
|
|
|
|
- else {
|
|
|
|
|
- strlcpy(s1, whobad, sizeof(s1));
|
|
|
|
|
- maskhost(s1, s);
|
|
|
|
|
- strlcpy(s1, badnick, sizeof(s1));
|
|
|
|
|
- /* If that handle exists use "badX" (where X is an increasing number)
|
|
|
|
|
- * instead.
|
|
|
|
|
- */
|
|
|
|
|
- while (get_user_by_handle(userlist, s1)) {
|
|
|
|
|
- if (!strncmp(s1, "bad", 3)) {
|
|
|
|
|
- int i;
|
|
|
|
|
-
|
|
|
|
|
- i = atoi(s1 + 3);
|
|
|
|
|
- simple_snprintf(s1 + 3, sizeof(s1) - 3, "%d", i + 1);
|
|
|
|
|
- } else
|
|
|
|
|
- strlcpy(s1, "bad1", sizeof(s1)); /* Start with '1' */
|
|
|
|
|
- }
|
|
|
|
|
- userlist = adduser(userlist, s1, s, "-", 0, 0);
|
|
|
|
|
- fr.match = FR_CHAN;
|
|
|
|
|
- fr.chan = USER_DEOP;
|
|
|
|
|
- u = get_user_by_handle(userlist, s1);
|
|
|
|
|
- if ((mx = ismember(chan, badnick)))
|
|
|
|
|
- mx->user = u;
|
|
|
|
|
- set_user_flagrec(u, &fr, chan->dname);
|
|
|
|
|
- simple_snprintf(s, sizeof(s), "(%s) %s (%s)", ct, reason, whobad);
|
|
|
|
|
- set_user(&USERENTRY_COMMENT, u, (void *) s);
|
|
|
|
|
- putlog(LOG_MISC, "*", "Now deopping %s (%s)", whobad, reason);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /* Always try to deop the offender */
|
|
|
|
|
- if (!mevictim)
|
|
|
|
|
- add_mode(chan, '-', 'o', badnick);
|
|
|
|
|
- /* Ban. Should be done before kicking. */
|
|
|
|
|
- if (chan->revenge_mode > 2) {
|
|
|
|
|
- char s[UHOSTLEN] = "", s1[UHOSTLEN] = "";
|
|
|
|
|
-
|
|
|
|
|
- splitnick(&whobad);
|
|
|
|
|
- maskhost(whobad, s1);
|
|
|
|
|
- simple_snprintf(s, sizeof(s), "(%s) %s", ct, reason);
|
|
|
|
|
- u_addmask('b', chan, s1, conf.bot->nick, s, now + (60 * chan->ban_time), 0);
|
|
|
|
|
- if (!mevictim && me_op(chan)) {
|
|
|
|
|
- add_mode(chan, '+', 'b', s1);
|
|
|
|
|
- flush_mode(chan, QUICK);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- /* Kick the offender */
|
|
|
|
|
- if ((chan->revenge_mode > 1) && !chan_sentkick(m) &&
|
|
|
|
|
- /* ... and can I actually do anything about it? */
|
|
|
|
|
- me_op(chan) && !mevictim) {
|
|
|
|
|
- dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, m->nick, bankickprefix, response(RES_MEAN));
|
|
|
|
|
- m->flags |= SENTKICK;
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-/* Punishes bad guys under certain circumstances using methods as defined
|
|
|
|
|
- * by the revenge_mode flag.
|
|
|
|
|
- */
|
|
|
|
|
-static void
|
|
|
|
|
-maybe_revenge(struct chanset_t *chan, char *whobad, char *whovictim, int type)
|
|
|
|
|
-{
|
|
|
|
|
- if (!chan || (type < 0))
|
|
|
|
|
- return;
|
|
|
|
|
-
|
|
|
|
|
- /* Get info about offender */
|
|
|
|
|
- struct userrec *u = get_user_by_host(whobad), *u2 = NULL;
|
|
|
|
|
- char *badnick = splitnick(&whobad), *victimstr = NULL;
|
|
|
|
|
- bool mevictim;
|
|
|
|
|
-
|
|
|
|
|
- /* Get info about victim */
|
|
|
|
|
- u2 = get_user_by_host(whovictim);
|
|
|
|
|
- victimstr = splitnick(&whovictim);
|
|
|
|
|
- mevictim = match_my_nick(victimstr);
|
|
|
|
|
-
|
|
|
|
|
- /* Do we want to revenge? */
|
|
|
|
|
- if (!want_to_revenge(chan, u, u2, badnick, victimstr, mevictim))
|
|
|
|
|
- return; /* No, leave them alone ... */
|
|
|
|
|
-
|
|
|
|
|
- /* Haha! Do the vengeful thing ... */
|
|
|
|
|
- punish_badguy(chan, whobad, u, badnick, victimstr, mevictim, type);
|
|
|
|
|
-}
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
/* Set the key.
|
|
/* Set the key.
|
|
|
*/
|
|
*/
|
|
|
void
|
|
void
|