/* This is a reply on ISON :<current> <orig> [<alt>] */ static void got303(char *from, char *msg) { char *tmp, *alt; int ison_orig = 0, ison_alt = 0; if (!keepnick || !strncmp(botname, origbotname, strlen(botname))) { return; } newsplit(&msg); fixcolon(msg); alt = get_altbotnick(); tmp = newsplit(&msg); if (tmp[0] && !rfc_casecmp(botname, tmp)) { while ((tmp = newsplit(&msg))[0]) { /* no, it's NOT == */ if (!rfc_casecmp(tmp, origbotname)) ison_orig = 1; else if (alt[0] && !rfc_casecmp(tmp, alt)) ison_alt = 1; } if (!ison_orig) { if (!nick_juped) putlog(LOG_MISC, "*", IRC_GETORIGNICK, origbotname); dprintf(DP_SERVER, "NICK %s\n", origbotname); } else if (alt[0] && !ison_alt && rfc_casecmp(botname, alt)) { putlog(LOG_MISC, "*", IRC_GETALTNICK, alt); dprintf(DP_SERVER, "NICK %s\n", alt); } } }
/* We try to change to a preferred unique nick here. We always first try the * specified alternate nick. If that failes, we repeatedly modify the nick * until it gets accepted. * * sent nick: * "<altnick><c>" * ^--- additional count character: 1-9^-_\\[]`a-z * ^--------- given, alternate nick * * The last added character is always saved in altnick_char. At the very first * attempt (were altnick_char is 0), we try the alternate nick without any * additions. * * fixed by guppy (1999/02/24) and Fabian (1999/11/26) */ static int gotfake433(char *from) { int l = strlen(botname) - 1; /* First run? */ if (altnick_char == 0) { char *alt = get_altbotnick(); if (alt[0] && (rfc_casecmp(alt, botname))) /* Alternate nickname defined. Let's try that first. */ strcpy(botname, alt); else { /* Fall back to appending count char. */ altnick_char = '0'; if ((l + 1) == nick_len) { botname[l] = altnick_char; } else { botname[++l] = altnick_char; botname[l + 1] = 0; } } /* No, we already tried the default stuff. Now we'll go through variations * of the original alternate nick. */ } else { char *oknicks = "^-_\\[]`"; char *p = strchr(oknicks, altnick_char); if (p == NULL) { if (altnick_char == '9') altnick_char = oknicks[0]; else altnick_char = altnick_char + 1; } else { p++; if (!*p) altnick_char = 'a' + randint(26); else altnick_char = (*p); } botname[l] = altnick_char; } putlog(LOG_MISC, "*", IRC_BOTNICKINUSE, botname); dprintf(DP_MODE, "NICK %s\n", botname); return 0; }
/* Got nick change. */ static int gotnick(char *from, char *msg) { char *nick, *alt = get_altbotnick(); nick = splitnick(&from); fixcolon(msg); check_queues(nick, msg); if (match_my_nick(nick)) { /* Regained nick! */ strncpyz(botname, msg, NICKLEN); altnick_char = 0; if (!strcmp(msg, origbotname)) { putlog(LOG_SERV | LOG_MISC, "*", "Regained nickname '%s'.", msg); nick_juped = 0; } else if (alt[0] && !strcmp(msg, alt)) putlog(LOG_SERV | LOG_MISC, "*", "Regained alternate nickname '%s'.", msg); else if (keepnick && strcmp(nick, msg)) { putlog(LOG_SERV | LOG_MISC, "*", "Nickname changed to '%s'???", msg); if (!rfc_casecmp(nick, origbotname)) { putlog(LOG_MISC, "*", IRC_GETORIGNICK, origbotname); dprintf(DP_SERVER, "NICK %s\n", origbotname); } else if (alt[0] && !rfc_casecmp(nick, alt) && egg_strcasecmp(botname, origbotname)) { putlog(LOG_MISC, "*", IRC_GETALTNICK, alt); dprintf(DP_SERVER, "NICK %s\n", alt); } } else putlog(LOG_SERV | LOG_MISC, "*", "Nickname changed to '%s'???", msg); } else if ((keepnick) && (rfc_casecmp(nick, msg))) { /* Only do the below if there was actual nick change, case doesn't count */ if (!rfc_casecmp(nick, origbotname)) { putlog(LOG_MISC, "*", IRC_GETORIGNICK, origbotname); dprintf(DP_SERVER, "NICK %s\n", origbotname); } else if (alt[0] && !rfc_casecmp(nick, alt) && egg_strcasecmp(botname, origbotname)) { putlog(LOG_MISC, "*", IRC_GETALTNICK, altnick); dprintf(DP_SERVER, "NICK %s\n", altnick); } } return 0; }
/* Called once a minute... */ static void minutely_checks() { char *alt; /* Only check if we have already successfully logged in. */ if (!server_online) return; if (keepnick) { /* NOTE: now that botname can but upto NICKLEN bytes long, * check that it's not just a truncation of the full nick. */ if (strncmp(botname, origbotname, strlen(botname))) { /* See if my nickname is in use and if if my nick is right. */ alt = get_altbotnick(); if (alt[0] && egg_strcasecmp(botname, alt)) dprintf(DP_SERVER, "ISON :%s %s %s\n", botname, origbotname, alt); else dprintf(DP_SERVER, "ISON :%s %s\n", botname, origbotname); } } }
/* Called once a minute... but if we're the only one on the * channel, we only wanna send out "lusers" once every 5 mins. */ static void minutely_checks() { char *alt; static int count = 4; int ok = 0; struct chanset_t *chan; /* Only check if we have already successfully logged in. */ if (!server_online) return; if (keepnick) { /* NOTE: now that botname can but upto NICKLEN bytes long, * check that it's not just a truncation of the full nick. */ if (strncmp(botname, origbotname, strlen(botname))) { /* See if my nickname is in use and if if my nick is right. */ alt = get_altbotnick(); if (alt[0] && egg_strcasecmp(botname, alt)) dprintf(DP_SERVER, "ISON :%s %s %s\n", botname, origbotname, alt); else dprintf(DP_SERVER, "ISON :%s %s\n", botname, origbotname); } } if (min_servs == 0) return; for (chan = chanset; chan; chan = chan->next) if (channel_active(chan) && chan->channel.members == 1) { ok = 1; break; } if (!ok) return; count++; if (count >= 5) { dprintf(DP_SERVER, "LUSERS\n"); count = 0; } }