Skip to content

Instantly share code, notes, and snippets.

@fhats
Created February 8, 2015 16:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save fhats/5364cd0d4550be5e6340 to your computer and use it in GitHub Desktop.
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
/*
* 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