+/**
+ * Change the nickname of a client.
+ *
+ * @param Origin The client which caused the nickname change.
+ * @param Target The client of which the nickname should be changed.
+ * @param NewNick The new nickname.
+ */
+static void
+Change_Nick(CLIENT *Origin, CLIENT *Target, char *NewNick, bool InformClient)
+{
+ if (Client_Conn(Target) > NONE) {
+ /* Local client */
+ Log(LOG_INFO,
+ "%s \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".",
+ Client_TypeText(Target), Client_Mask(Target),
+ Client_Conn(Target), Client_ID(Target), NewNick);
+ Conn_UpdateIdle(Client_Conn(Target));
+ } else {
+ /* Remote client */
+ LogDebug("%s \"%s\" changed nick: \"%s\" -> \"%s\".",
+ Client_TypeText(Target),
+ Client_Mask(Target), Client_ID(Target), NewNick);
+ }
+
+ /* Inform all servers and users (which have to know) of the new name */
+ if (InformClient) {
+ IRC_WriteStrClientPrefix(Target, Target, "NICK :%s", NewNick);
+ IRC_WriteStrServersPrefix(NULL, Target, "NICK :%s", NewNick);
+ } else
+ IRC_WriteStrServersPrefix(Origin, Target, "NICK :%s", NewNick);
+ IRC_WriteStrRelatedPrefix(Target, Target, false, "NICK :%s", NewNick);
+
+ /* Register old nickname for WHOWAS queries */
+ Client_RegisterWhowas(Target);
+
+ /* Save new nickname */
+ Client_SetID(Target, NewNick);
+}