|
@@ -804,10 +804,17 @@ void server_send_ison()
|
|
|
bool have_jupenick = jupenick[0] ? match_my_nick(jupenick) : 0;
|
|
bool have_jupenick = jupenick[0] ? match_my_nick(jupenick) : 0;
|
|
|
if (!have_jupenick) {
|
|
if (!have_jupenick) {
|
|
|
/* See if my nickname is in use and if if my nick is right. */
|
|
/* See if my nickname is in use and if if my nick is right. */
|
|
|
- if (jupenick[0] && !have_jupenick)
|
|
|
|
|
- dprintf(DP_SERVER, "ISON %s %s\n", origbotname, jupenick);
|
|
|
|
|
- else if (!match_my_nick(origbotname))
|
|
|
|
|
- dprintf(DP_SERVER, "ISON %s\n", origbotname);
|
|
|
|
|
|
|
+ if (jupenick[0] && !have_jupenick) {
|
|
|
|
|
+ if (use_monitor) // If our nick is juped due to split, we will NOT get a RPL_MONOFFLINE when it is available. So check periodically.
|
|
|
|
|
+ dprintf(DP_SERVER, "MONITOR S\n");
|
|
|
|
|
+ else
|
|
|
|
|
+ dprintf(DP_SERVER, "ISON %s %s\n", origbotname, jupenick);
|
|
|
|
|
+ } else if (!match_my_nick(origbotname)) {
|
|
|
|
|
+ if (use_monitor) // If our nick is juped due to split, we will NOT get a RPL_MONOFFLINE when it is available. So check periodically.
|
|
|
|
|
+ dprintf(DP_SERVER, "MONITOR S\n");
|
|
|
|
|
+ else
|
|
|
|
|
+ dprintf(DP_SERVER, "ISON %s\n", origbotname);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -871,7 +878,7 @@ static int nick_which(const char* nick, bool& is_jupe, bool& is_orig) {
|
|
|
static void nick_available(bool is_jupe, bool is_orig) {
|
|
static void nick_available(bool is_jupe, bool is_orig) {
|
|
|
if (jupenick[0] && is_jupe && !match_my_nick((jupenick))) {
|
|
if (jupenick[0] && is_jupe && !match_my_nick((jupenick))) {
|
|
|
/* Ensure we aren't processing a QUIT/NICK and a MONITOR, or just some screw up */
|
|
/* Ensure we aren't processing a QUIT/NICK and a MONITOR, or just some screw up */
|
|
|
- if (!tried_jupenick || ((now - tried_jupenick) > 1)) {
|
|
|
|
|
|
|
+ if (!tried_jupenick || ((now - tried_jupenick) > 2)) {
|
|
|
tried_jupenick = now;
|
|
tried_jupenick = now;
|
|
|
dprintf(DP_DUMP, "NICK %s\n", jupenick);
|
|
dprintf(DP_DUMP, "NICK %s\n", jupenick);
|
|
|
if (!jnick_juped)
|
|
if (!jnick_juped)
|
|
@@ -879,7 +886,7 @@ static void nick_available(bool is_jupe, bool is_orig) {
|
|
|
}
|
|
}
|
|
|
// Don't switch to the nick if already on jupenick
|
|
// Don't switch to the nick if already on jupenick
|
|
|
} else if (is_orig && !match_my_nick(origbotname) && (!jupenick[0] || !match_my_nick(jupenick))) {
|
|
} else if (is_orig && !match_my_nick(origbotname) && (!jupenick[0] || !match_my_nick(jupenick))) {
|
|
|
- if (!tried_nick || ((now - tried_nick) > 1)) {
|
|
|
|
|
|
|
+ if (!tried_nick || ((now - tried_nick) > 2)) {
|
|
|
altnick_char = rolls = 0;
|
|
altnick_char = rolls = 0;
|
|
|
tried_nick = now;
|
|
tried_nick = now;
|
|
|
dprintf(DP_DUMP, "NICK %s\n", origbotname);
|
|
dprintf(DP_DUMP, "NICK %s\n", origbotname);
|
|
@@ -928,9 +935,32 @@ void release_nick(const char* nick) {
|
|
|
putlog(LOG_CMDS, "*", "Not releasing nickname. (Not currently on a jupenick)");
|
|
putlog(LOG_CMDS, "*", "Not releasing nickname. (Not currently on a jupenick)");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/* This is a reply to MONITOR: Online
|
|
|
|
|
+ * RPL_MONONLINE
|
|
|
|
|
+ * :<server> 730 <nick|*> :nick!user@host[,nick!user@host]*
|
|
|
|
|
+ */
|
|
|
|
|
+static void got730(char* from, char* msg)
|
|
|
|
|
+{
|
|
|
|
|
+ char *tmp = newsplit(&msg);
|
|
|
|
|
+ fixcolon(msg);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ if (tmp[0] && (!strcmp(tmp, "*") || match_my_nick(tmp))) {
|
|
|
|
|
+ // If any of the nicks online match my jupenick or nick, unset nick_juped and jnick_juped
|
|
|
|
|
+ // This will prevent the bot from thinking its nick is juped if someone else got it after a netsplit
|
|
|
|
|
+ char *nick = NULL;
|
|
|
|
|
+ while ((nick = newsplit(&msg, ','))[0]) {
|
|
|
|
|
+ bool is_jupe = 0, is_orig = 0;
|
|
|
|
|
+ nick_which(nick, is_jupe, is_orig);
|
|
|
|
|
+ if (is_jupe && jnick_juped) jnick_juped = 0;
|
|
|
|
|
+ else if (is_orig && nick_juped) nick_juped = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/* This is a reply to MONITOR: Offline
|
|
/* This is a reply to MONITOR: Offline
|
|
|
* RPL_MONOFFLINE
|
|
* RPL_MONOFFLINE
|
|
|
- * :<server> 731 <nick> :nick[,nick1]*
|
|
|
|
|
|
|
+ * :<server> 731 <nick|*> :nick[,nick1]*
|
|
|
*/
|
|
*/
|
|
|
static void got731(char* from, char* msg)
|
|
static void got731(char* from, char* msg)
|
|
|
{
|
|
{
|
|
@@ -965,7 +995,8 @@ static int got432(char *from, char *msg)
|
|
|
|
|
|
|
|
if (jupenick[0] && !strcmp(erroneus, jupenick)) {
|
|
if (jupenick[0] && !strcmp(erroneus, jupenick)) {
|
|
|
was_juped = jnick_juped;
|
|
was_juped = jnick_juped;
|
|
|
- is_jnick = jnick_juped = 1;
|
|
|
|
|
|
|
+ is_jnick = 1;
|
|
|
|
|
+ jnick_juped = 1;
|
|
|
} else {
|
|
} else {
|
|
|
was_juped = nick_juped;
|
|
was_juped = nick_juped;
|
|
|
nick_juped = 1;
|
|
nick_juped = 1;
|
|
@@ -1068,11 +1099,11 @@ static int got437(char *from, char *msg)
|
|
|
if (!rfc_casecmp(s, origbotname)) {
|
|
if (!rfc_casecmp(s, origbotname)) {
|
|
|
if (!nick_juped)
|
|
if (!nick_juped)
|
|
|
putlog(LOG_MISC, "*", "NICK IS TEMPORARILY UNAVAILABLE: '%s' (keeping '%s').", s, botname);
|
|
putlog(LOG_MISC, "*", "NICK IS TEMPORARILY UNAVAILABLE: '%s' (keeping '%s').", s, botname);
|
|
|
- nick_juped = 1;
|
|
|
|
|
|
|
+ nick_juped = 2;
|
|
|
} else if (jupenick[0] && !rfc_casecmp(s, jupenick)) {
|
|
} else if (jupenick[0] && !rfc_casecmp(s, jupenick)) {
|
|
|
if (!jnick_juped)
|
|
if (!jnick_juped)
|
|
|
putlog(LOG_MISC, "*", "JUPENICK IS TEMPORARILY UNAVAILABLE: '%s' (keeping '%s').", s, botname);
|
|
putlog(LOG_MISC, "*", "JUPENICK IS TEMPORARILY UNAVAILABLE: '%s' (keeping '%s').", s, botname);
|
|
|
- jnick_juped = 1;
|
|
|
|
|
|
|
+ jnick_juped = 2;
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
putlog(LOG_MISC, "*", "%s: %s", "Nickname has been juped", s);
|
|
putlog(LOG_MISC, "*", "%s: %s", "Nickname has been juped", s);
|
|
@@ -1144,6 +1175,7 @@ static int gotnick(char *from, char *msg)
|
|
|
altnick_char = rolls = 0;
|
|
altnick_char = rolls = 0;
|
|
|
putlog(LOG_SERV | LOG_MISC, "*", "Regained jupenick '%s'.", msg);
|
|
putlog(LOG_SERV | LOG_MISC, "*", "Regained jupenick '%s'.", msg);
|
|
|
jnick_juped = 0;
|
|
jnick_juped = 0;
|
|
|
|
|
+ nick_juped = 0; // Unset this, no reason for it now.
|
|
|
} else if (!strcmp(msg, origbotname)) {
|
|
} else if (!strcmp(msg, origbotname)) {
|
|
|
altnick_char = rolls = 0;
|
|
altnick_char = rolls = 0;
|
|
|
putlog(LOG_SERV | LOG_MISC, "*", "Regained nickname '%s'.", msg);
|
|
putlog(LOG_SERV | LOG_MISC, "*", "Regained nickname '%s'.", msg);
|
|
@@ -1746,6 +1778,7 @@ static cmd_t my_raw_binds[] =
|
|
|
{"318", "", (Function) whoispenalty, NULL, LEAF}, /* :End of /WHOIS */
|
|
{"318", "", (Function) whoispenalty, NULL, LEAF}, /* :End of /WHOIS */
|
|
|
{"369", "", (Function) got369, NULL, LEAF}, /* :End of /WHOWAS */
|
|
{"369", "", (Function) got369, NULL, LEAF}, /* :End of /WHOWAS */
|
|
|
{"718", "", (Function) got718, NULL, LEAF},
|
|
{"718", "", (Function) got718, NULL, LEAF},
|
|
|
|
|
+ {"730", "", (Function) got730, NULL, LEAF}, /* RPL_MONONLINE */
|
|
|
{"731", "", (Function) got731, NULL, LEAF}, /* RPL_MONOFFLINE */
|
|
{"731", "", (Function) got731, NULL, LEAF}, /* RPL_MONOFFLINE */
|
|
|
{NULL, NULL, NULL, NULL, 0}
|
|
{NULL, NULL, NULL, NULL, 0}
|
|
|
};
|
|
};
|