Created
February 8, 2015 16:39
-
-
Save fhats/5364cd0d4550be5e6340 to your computer and use it in GitHub Desktop.
sanick for unreal IRCd. Originally found at https://pub.maff.me.uk/code/m_sanick.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Unreal Internet Relay Chat Daemon, src/modules/m_sanick.c | |
* (C) 2000-2001 Carsten V. Munk and the UnrealIRCd Team | |
* | |
* This program is free software; you can redistribute it and/or modify | |
* it under the terms of the GNU General Public License as published by | |
* the Free Software Foundation; either version 1, or (at your option) | |
* any later version. | |
* | |
* This program is distributed in the hope that it will be useful, | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
* GNU General Public License for more details. | |
* | |
* You should have received a copy of the GNU General Public License | |
* along with this program; if not, write to the Free Software | |
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
*/ | |
/* | |
* | |
* SANICK and CHGNICK Module for Unrealircd | |
* by Mouse | |
* Credits to cryptoknight who coded sanick for Ultimate ircd. | |
* http://sourceforge.net/projects/nolimit/ | |
* | |
* why need to waste $30 ? I can make one :P | |
* http://www.codemastr.com/?page=module | |
* | |
*/ | |
/* | |
* SANICK module for UnrealIRCd 3.2.9 | |
* Originally by Mouse, updated source by Maff | |
* Credits to Mouse for original source, UnrealIRCd dev team for source ripped from src/modules/m_svsnick.c | |
*/ | |
#include "config.h" | |
#include "struct.h" | |
#include "common.h" | |
#include "sys.h" | |
#include "numeric.h" | |
#include "msg.h" | |
#include "channel.h" | |
#include <time.h> | |
#include <sys/stat.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#ifdef _WIN32 | |
#include <io.h> | |
#endif | |
#include <fcntl.h> | |
#include "h.h" | |
#include "proto.h" | |
#ifdef STRIPBADWORDS | |
#include "badwords.h" | |
#endif | |
#ifdef _WIN32 | |
#include "version.h" | |
#endif | |
DLLFUNC int m_sanick(aClient *cptr, aClient *sptr, int parc, char *parv[]); | |
/* Place includes here */ | |
#define MSG_SANICK "SANICK" | |
#define TOK_SANICK "SN" | |
ModuleHeader MOD_HEADER(m_sanick) | |
= { | |
"sanick", /* Name of module */ | |
"$Id: m_sanick.c,v 1.2 2012/07/22 06:03:20 Maff Exp $", /* Version */ | |
"command /sanick", /* Short description of module */ | |
"3.2-b8-1", | |
NULL | |
}; | |
/* This is called on module init, before Server Ready */ | |
DLLFUNC int MOD_INIT(m_chgname)(ModuleInfo *modinfo) { | |
//Add the command | |
add_Command(MSG_SANICK, TOK_SANICK, m_sanick, 2); | |
return MOD_SUCCESS; | |
} | |
/* Is first run when server is 100% ready */ | |
DLLFUNC int MOD_LOAD(m_chgname)(int module_load) { | |
return MOD_SUCCESS; | |
} | |
/* Called when module is unloaded */ | |
DLLFUNC int MOD_UNLOAD(m_sanick)(int module_unload) { | |
//Delete commands. Apparently unreal can unload these itself but don't fix what ain't broken. | |
if (del_Command(MSG_SANICK, TOK_SANICK, m_sanick) < 0) { | |
sendto_realops("Failed to delete command sanick when unloading %s", | |
MOD_HEADER(m_sanick).name); | |
} | |
return MOD_SUCCESS; | |
} | |
/* | |
** m_sanick() - PID - 12-19-2002 | |
** | |
** parv[0] - sender | |
** parv[1] - nick to make join | |
** parv[2] - channel(s) to join | |
*/ | |
int m_sanick(aClient * cptr, aClient * sptr, int parc, char *parv[]) { | |
//Clients | |
aClient *acptr; | |
aClient *ocptr; | |
//Prevent non-opers and non-ULined servers from using this command | |
if (!IsOper(sptr) && !IsAdmin(sptr) && !IsULine(sptr)) { | |
sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); | |
return 0; | |
} else if (parc < 3 || (strlen(parv[2]) > NICKLEN)) { | |
//Also prevent incorrect usage of the command - require 3 params and require that the destination nick | |
//be within the network nick length | |
return 0; //Incorrect usage. | |
} | |
//If the target user is on another server, forward the command to that server. | |
if (hunt_server_token(cptr, sptr, MSG_SANICK, TOK_SANICK, "%s %s", 1, parc, parv) != HUNTED_ISME) | |
return 0; //Forwarded | |
//I'm not sure what exactly this does but I guess it does something to validate the new nick | |
if (do_nick_name(parv[2]) == 0) | |
return 0; | |
//Ensure that the target nick is actually in use. | |
if (!(acptr = find_person(parv[1], NULL))) { | |
//Originally this would just silently exit out, but now we notify the user that something went wrong. | |
sendto_one(sptr, "*** Notice -- SANICK: User %s not found", parv[1]); | |
return 0; | |
} | |
//Prevent nick collisions. | |
if ((ocptr = find_client(parv[2], NULL)) && ocptr != acptr) { | |
exit_client(acptr, acptr, sptr, | |
"Nickname collision due to Services enforced " | |
"nickname change, your nick was overruled"); | |
return 0; | |
} | |
//Unsure of what this does. | |
if (acptr != ocptr) | |
acptr->umodes &= ~UMODE_REGNICK; | |
//Set the timestamp of the last nick change for the target user to the current time. | |
//Because I'm lazy, this does not work and is commented out. | |
//Don't try to fix it unless you know more than me about unreal module development (which is likely). | |
//acptr->lastnick = TS2ts(0); | |
//Enact the nick change | |
sendto_common_channels(acptr, ":%s NICK :%s", parv[1], parv[2]); | |
add_history(acptr, 1); | |
//The ":0" in the parameter given to sendto_serv_butone_token() is the timestamp, | |
//and is hardcoded because it works anyway and, again, I'm lazy. | |
sendto_serv_butone_token(NULL, parv[1], MSG_NICK, TOK_NICK, | |
"%s :0", parv[2]); | |
//This is a mystery to me. Pulled from m_svsnick.c. It works perfectly so I'm not about to change it. | |
(void)del_from_client_hash_table(acptr->name, acptr); | |
hash_check_watch(acptr, RPL_LOGOFF); | |
//Notify opers. For some reason, the sendto_realops() by itself only sends to opers on the local server, and stopped working after I fixed everything else | |
//So the sendto_serv_butone was added, and it sends to all servers. Not commenting out the sendto_realops because I don't know if it'll break anything | |
//and I'm too tired to fire my test network back up. | |
sendto_realops("%s used SANICK to change %s to %s", parv[0], parv[1], parv[2]); | |
sendto_serv_butone(NULL, ":%s SMO o :*** Notice -- %s used SANICK to change %s to %s", me.name, parv[0], parv[1], parv[2]); | |
//Enact the nick change locally. | |
RunHook2(HOOKTYPE_LOCAL_NICKCHANGE, acptr, parv[2]); | |
//Do something? I dunno, more mysteries from m_svsnick. Did I mention I'm completely new to unreal module development? | |
strlcpy(acptr->name, parv[2], sizeof acptr->name); | |
add_to_client_hash_table(parv[2], acptr); | |
hash_check_watch(acptr, RPL_LOGON); | |
//We're finished. | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment