-ircu uses nick chasing for whowas, but also for targetting /kill, /kick, /mode o/v, in case a nick isnt found, the whowas history is check and the intented victim is chased (time limit is 30 seconds)
-
-example without this patch:
-00:01 > NICK newnick
-00:01 > MODE oldnick +w
-00:01 < oldnick!user@host NICK newnick
-00:01 < irc.quakenet.org 403 newnick oldnick :no such channel
-usermode change failed because of the nick change getting in the way
-
-example with this patch:
-00:01 > NICK newnick
-00:01 > MODE oldnick +w
-00:01 < oldnick!user@host NICK newnick
-00:01 < newnick!user@host MODE newnick +w
-usermode change succeeded because ircd uses whowas history and found the previous user with this nick was this user
-much friendlier and simply achieved by using information already available
-
-diff -r 85f3d4ad0a52 include/channel.h
---- a/include/channel.h Mon Jan 26 12:10:57 2009 +0100
-+++ b/include/channel.h Mon Jan 26 12:29:23 2009 +0100
-@@ -390,7 +390,7 @@
- extern void make_zombie(struct Membership* member, struct Client* who,
- struct Client* cptr, struct Client* sptr,
- struct Channel* chptr);
--extern struct Client* find_chasing(struct Client* sptr, const char* user, int* chasing);
-+extern struct Client* find_chasing(struct Client* sptr, const char* user, int* chasing, int error);
- void add_invite(struct Client *cptr, struct Channel *chptr);
- int number_of_zombies(struct Channel *chptr);
-
-diff -r 85f3d4ad0a52 ircd/channel.c
---- a/ircd/channel.c Mon Jan 26 12:10:57 2009 +0100
-+++ b/ircd/channel.c Mon Jan 26 12:29:23 2009 +0100
-@@ -218,9 +218,10 @@
- * @param user a string representing the client to be found
- * @param chasing a variable set to 0 if the user was found directly,
- * 1 otherwise
-+ * @param error send error to source when set to 1, else not
- * @returns a pointer the client, or NULL if the client wasn't found.
- */
--struct Client* find_chasing(struct Client* sptr, const char* user, int* chasing)
-+struct Client* find_chasing(struct Client* sptr, const char* user, int* chasing, int error)
- {
- struct Client* who = FindClient(user);
-
-@@ -230,7 +231,8 @@
- return who;
-
- if (!(who = get_history(user, feature_int(FEAT_KILLCHASETIMELIMIT)))) {
-- send_reply(sptr, ERR_NOSUCHNICK, user);
-+ if (error)
-+ send_reply(sptr, ERR_NOSUCHNICK, user);
- return 0;
- }
- if (chasing)
-@@ -3120,7 +3122,7 @@
- oplevel = req_oplevel;
- }
- /* find client we're manipulating */
-- acptr = find_chasing(state->sptr, t_str, NULL);
-+ acptr = find_chasing(state->sptr, t_str, NULL, 1);
- } else {
- if (t_str[5] == ':') {
- t_str[5] = '\0';
-diff -r 85f3d4ad0a52 ircd/m_kick.c
---- a/ircd/m_kick.c Mon Jan 26 12:10:57 2009 +0100
-+++ b/ircd/m_kick.c Mon Jan 26 12:29:23 2009 +0100
-@@ -127,7 +127,7 @@
- || !IsChanOp(member2))
- return send_reply(sptr, ERR_CHANOPRIVSNEEDED, name);
-
-- if (!(who = find_chasing(sptr, parv[2], 0)))
-+ if (!(who = find_chasing(sptr, parv[2], 0, 1)))
- return 0; /* find_chasing sends the reply for us */
-
- /* Don't allow the channel service to be kicked */
-diff -r 85f3d4ad0a52 ircd/m_mode.c
---- a/ircd/m_mode.c Mon Jan 26 12:10:57 2009 +0100
-+++ b/ircd/m_mode.c Mon Jan 26 12:29:23 2009 +0100
-@@ -117,7 +117,7 @@
- struct Client *acptr;
-
- acptr = FindUser(parv[1]);
-- if (!acptr)
-+ if (!(acptr = find_chasing(sptr, parv[1], 0, 0)))
- {
- send_reply(sptr, ERR_NOSUCHCHANNEL, parv[1]);
- return 0;