diff --git a/ChangeLog b/ChangeLog index e71670f0..72d195cd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,8 @@ Anything we add/remove/fix/change is in here (even our rants) Fish (F), Mark (M) =============================================================================== * NeoStats * Version 3.0.genesis + - Add support for online bot realname, host and ident changes. (M) + - Add support for IRCd SETNAME, SETIDENT and SETHOST functions. (M) - Add support for online bot nick changes. (M) - Combined BOTCHANLIST command with BOTLIST command. (M) - Remove redundant botchanhash code and tables. We can get this information diff --git a/include/ircd.h b/include/ircd.h index 1429f19c..ecb4c755 100644 --- a/include/ircd.h +++ b/include/ircd.h @@ -95,17 +95,17 @@ typedef struct ProtocolInfo { char* services_cmode; } ProtocolInfo; -#ifndef NEOSTATSCORE +#ifdef NEOSTATSCORE +extern cumode_init* chan_umodes; +extern cmode_init* chan_modes; +extern umode_init* user_umodes; +extern umode_init* user_smodes; +#else MODULEVAR extern ircd_cmd cmd_list[]; MODULEVAR extern cumode_init chan_umodes[]; MODULEVAR extern cmode_init chan_modes[]; MODULEVAR extern umode_init user_umodes[]; MODULEVAR extern umode_init user_smodes[]; -#else -extern cumode_init* chan_umodes; -extern cmode_init* chan_modes; -extern umode_init* user_umodes; -extern umode_init* user_smodes; #endif EXPORTVAR extern ircd_server ircd_srv; @@ -177,6 +177,9 @@ EXPORTFUNC void do_burst (char *origin, char **argv, int argc); EXPORTFUNC void do_swhois (char *who, char *swhois); EXPORTFUNC void do_tkl(const char *add, const char *type, const char *user, const char *host, const char *setby, const char *tsexpire, const char *tsset, const char *reason); EXPORTFUNC void do_eos(const char *name); +EXPORTFUNC void do_setname(const char* nick, const char* realname); +EXPORTFUNC void do_sethost (const char *nick, const char *host); +EXPORTFUNC void do_setident (const char *nick, const char *ident); /* Defined in ircd specific files */ MODULEFUNC void send_privmsg (const char *source, const char *to, const char *buf); @@ -216,6 +219,9 @@ MODULEFUNC void send_svinfo (const int tscurrent, const int tsmin, const unsigne MODULEFUNC void send_vctrl (const int uprot, const int nicklen, const int modex, const int gc, const char* netname); MODULEFUNC void send_burst (int b); MODULEFUNC void send_svstime (const char *source, const unsigned long ts); +MODULEFUNC void send_setname(const char* nick, const char* realname); +MODULEFUNC void send_sethost (const char *nick, const char *host); +MODULEFUNC void send_setident (const char *nick, const char *ident); int InitIrcd (void); int irc_connect (const char *name, const int numeric, const char *infoline, const char *pass, const unsigned long tsboot, const unsigned long tslink); diff --git a/include/neostats.h b/include/neostats.h index 2e8befff..ed14735f 100755 --- a/include/neostats.h +++ b/include/neostats.h @@ -963,6 +963,9 @@ EXPORTFUNC int irc_part (const Bot *botptr, const char *chan); EXPORTFUNC int irc_kick (const Bot *botptr, const char *chan, const char *target, const char *reason); EXPORTFUNC int irc_invite (const Bot *botptr, const char *target, const char *chan); EXPORTFUNC int irc_cloakhost (const Bot *botptr); +EXPORTFUNC int irc_setname (const Bot *botptr, const char* realname); +EXPORTFUNC int irc_sethost (const Bot *botptr, const char* host); +EXPORTFUNC int irc_setident (const Bot *botptr, const char* ident); /* Mode functions * Require a bot to operate diff --git a/src/commands.c b/src/commands.c index f9fe4cbe..f13361a6 100755 --- a/src/commands.c +++ b/src/commands.c @@ -1181,16 +1181,23 @@ int bot_set_altnick_cb(CmdParams* cmdparams) int bot_set_user_cb(CmdParams* cmdparams) { + irc_setident (cmdparams->bot, cmdparams->av[1]); return NS_SUCCESS; } int bot_set_host_cb(CmdParams* cmdparams) { + irc_sethost (cmdparams->bot, cmdparams->av[1]); return NS_SUCCESS; } int bot_set_realname_cb(CmdParams* cmdparams) { + char *buf; + + buf = joinbuf(cmdparams->av, cmdparams->ac, 1); + irc_setname(cmdparams->bot, buf); + sfree(buf); return NS_SUCCESS; } diff --git a/src/ircd.c b/src/ircd.c index 49d603bd..aee5e8d4 100644 --- a/src/ircd.c +++ b/src/ircd.c @@ -85,6 +85,9 @@ void (*irc_send_svinfo) (const int tscurrent, const int tsmin, const unsigned lo void (*irc_send_vctrl) (const int uprot, const int nicklen, const int modex, const int gc, const char* netname); void (*irc_send_burst) (int b); void (*irc_send_svstime) (const char *source, const unsigned long ts); +void (*irc_send_setname) (const char* nick, const char* realname); +void (*irc_send_sethost) (const char* nick, const char* host); +void (*irc_send_setident) (const char* nick, const char* ident); static void m_numeric242 (char *origin, char **argv, int argc, int srv); static void m_numeric351 (char *origin, char **argv, int argc, int srv); @@ -234,6 +237,10 @@ InitIrcdSymbols (void) irc_send_svinfo = ns_dlsym( protocol_module_handle, "send_svinfo"); irc_send_vctrl = ns_dlsym( protocol_module_handle, "send_vctrl"); irc_send_burst = ns_dlsym( protocol_module_handle, "send_burst"); + irc_send_setname = ns_dlsym( protocol_module_handle, "send_setname"); + irc_send_sethost = ns_dlsym( protocol_module_handle, "send_sethost"); + irc_send_setident = ns_dlsym( protocol_module_handle, "send_setident"); + return NS_SUCCESS; } @@ -934,6 +941,40 @@ irc_nickchange (const Bot *botptr, const char *newnick) return NS_SUCCESS; } +int irc_setname(const Bot *botptr, const char* realname) +{ + if (!irc_send_setname) { + unsupported_cmd ("SETNAME"); + return NS_FAILURE; + } + irc_send_setname (botptr->name, realname); + strlcpy (botptr->u->info, (char*)realname, MAXHOST); + return NS_SUCCESS; +} + +int irc_sethost (const Bot *botptr, const char* host) +{ + if (!irc_send_sethost) { + unsupported_cmd("SETNAME"); + return NS_FAILURE; + } + irc_send_sethost (botptr->name, host); + strlcpy (botptr->u->user->hostname, (char*)host, MAXHOST); + return NS_SUCCESS; +} + +int irc_setident (const Bot *botptr, const char* ident) +{ + if (!irc_send_setident) { + unsupported_cmd ("SETNAME"); + return NS_FAILURE; + } + irc_send_setident (botptr->name, ident); + strlcpy (botptr->u->user->username, (char*)ident, MAXHOST); + return NS_SUCCESS; +} + + int irc_chanmode (const Bot *botptr, const char *chan, const char *mode, const char *args) { @@ -1558,14 +1599,53 @@ do_eos (const char *name) Client *s; s = find_server (name); - if(s) { + if (s) { SynchServer(s); - dlog(DEBUG1, "do_eos: server %s is now synched", name); + dlog (DEBUG1, "do_eos: server %s is now synched", name); } else { nlog (LOG_WARNING, "do_eos: server %s not found", name); } } +void do_setname (const char* nick, const char* realname) +{ + Client *u; + + u = find_user(nick); + if (u) { + dlog (DEBUG1, "do_setname: setting realname of user %s to %s", nick, realname); + strlcpy(u->info, (char*)realname, MAXHOST); + } else { + nlog (LOG_WARNING, "do_setname: user %s not found", nick); + } +} + +void do_sethost (const char* nick, const char* host) +{ + Client *u; + + u = find_user(nick); + if (u) { + dlog (DEBUG1, "do_sethost: setting host of user %s to %s", nick, host); + strlcpy(u->user->hostname, (char*)host, MAXHOST); + } else { + nlog (LOG_WARNING, "do_sethost: user %s not found", nick); + } +} + +void do_setident (const char* nick, const char* ident) +{ + Client *u; + + u = find_user(nick); + if (u) { + dlog (DEBUG1, "do_setident: setting ident of user %s to %s", nick, ident); + strlcpy(u->user->username, (char*)ident, MAXHOST); + } else { + nlog (LOG_WARNING, "do_setident: user %s not found", nick); + } +} + void send_cmd (char *fmt, ...) { diff --git a/src/protocol/unreal32.c b/src/protocol/unreal32.c index 38057580..157fa4bd 100644 --- a/src/protocol/unreal32.c +++ b/src/protocol/unreal32.c @@ -58,6 +58,9 @@ static void m_whois (char *origin, char **argv, int argc, int srv); static void m_smo (char *origin, char **argv, int argc, int srv); static void m_swhois (char *origin, char **argv, int argc, int srv); static void m_tkl (char *origin, char **argv, int argc, int srv); +static void m_setname (char *origin, char **argv, int argc, int srv); +static void m_sethost (char *origin, char **argv, int argc, int srv); +static void m_setident (char *origin, char **argv, int argc, int srv); #define NICKV2 #define NICKIP @@ -118,6 +121,9 @@ ircd_cmd cmd_list[] = { {MSG_SMO, TOK_SMO, m_smo, 0}, {MSG_EOS, TOK_EOS, m_eos, 0}, {MSG_TKL, TOK_TKL, m_tkl, 0}, + {MSG_SETNAME, TOK_SETNAME, m_setname, 0}, + {MSG_SETHOST, TOK_SETHOST, m_sethost, 0}, + {MSG_SETIDENT, TOK_SETIDENT, m_setident, 0}, {0, 0, 0, 0}, }; @@ -447,6 +453,24 @@ send_nickchange (const char *oldnick, const char *newnick, const unsigned long t send_cmd (":%s %s %s %lu", oldnick, MSGTOK(NICK), newnick, ts); } +void +send_setname (const char *nick, const char *realname) +{ + send_cmd (":%s %s :%s", nick, MSGTOK(SETNAME), realname); +} + +void +send_sethost (const char *nick, const char *host) +{ + send_cmd (":%s %s :%s", nick, MSGTOK(SETHOST), host); +} + +void +send_setident (const char *nick, const char *ident) +{ + send_cmd (":%s %s :%s", nick, MSGTOK(SETIDENT), ident); +} + void send_swhois (const char *source, const char *target, const char *swhois) { @@ -948,3 +972,18 @@ static void m_tkl (char *origin, char **argv, int argc, int srv) { do_tkl(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]); } + +static void m_setname (char *origin, char **argv, int argc, int srv) +{ + do_setname(origin, argv[0]); +} + +static void m_sethost (char *origin, char **argv, int argc, int srv) +{ + do_sethost(origin, argv[0]); +} + +static void m_setident (char *origin, char **argv, int argc, int srv) +{ + do_setident(origin, argv[0]); +}