/** * group.C: This file contains code for the NickServ GROUP command. * * Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team * Rights to this code are as documented in COPYING. * * * Portions of this file were derived from sources bearing the following license: * Copyright © 2006 Jilles Tjoelker, et al. * Rights to this code are as documented in doc/pod/license.pod. * * $Id: group.C,v 1.9 2007/09/22 14:27:27 pippijn Exp $ */ #include "atheme.h" #include #include #include #include static char const rcsid[] = "$Id: group.C,v 1.9 2007/09/22 14:27:27 pippijn Exp $"; REGISTER_MODULE ("nickserv/group", false, "The Ermyth Team "); static void ns_cmd_group (sourceinfo_t *si, int parc, char *parv[]); static void ns_cmd_ungroup (sourceinfo_t *si, int parc, char *parv[]); static void ns_cmd_fungroup (sourceinfo_t *si, int parc, char *parv[]); command_t const ns_group = { "GROUP", N_("Adds a nickname to your account."), AC_NONE, 0, ns_cmd_group }; command_t const ns_ungroup = { "UNGROUP", N_("Removes a nickname from your account."), AC_NONE, 1, ns_cmd_ungroup }; command_t const ns_fungroup = { "FUNGROUP", N_("Forces removal of a nickname from an account."), PRIV_USER_ADMIN, 1, ns_cmd_fungroup }; E cmdvec ns_cmdtree; E helpvec ns_helptree; bool _modinit (module *m) { ns_cmdtree << ns_group; ns_cmdtree << ns_ungroup; ns_cmdtree << ns_fungroup; help_addentry (ns_helptree, "GROUP", "help/nickserv/group", NULL); help_addentry (ns_helptree, "UNGROUP", "help/nickserv/ungroup", NULL); help_addentry (ns_helptree, "FUNGROUP", "help/nickserv/fungroup", NULL); return true; } void _moddeinit () { ns_cmdtree >> ns_group; ns_cmdtree >> ns_ungroup; ns_cmdtree >> ns_fungroup; help_delentry (ns_helptree, "GROUP"); help_delentry (ns_helptree, "UNGROUP"); help_delentry (ns_helptree, "FUNGROUP"); } static void ns_cmd_group (sourceinfo_t *si, int parc, char *parv[]) { mynick_t *mn; if (si->su == NULL) { command_fail (si, fault::noprivs, _("\2%s\2 can only be executed via IRC."), "GROUP"); return; } if (nicksvs.no_nick_ownership) { command_fail (si, fault::noprivs, _("Nickname ownership is disabled.")); return; } if (si->smu == NULL) { command_fail (si, fault::noprivs, _("You are not logged in.")); return; } if (LIST_LENGTH (&si->smu->nicks) >= me.maxnicks && !has_priv (si, PRIV_REG_NOLIMIT)) { command_fail (si, fault::noprivs, _("You have too many nicks registered already.")); return; } mn = mynick_t::find (si->su->nick); if (mn != NULL) { if (mn->owner == si->smu) command_fail (si, fault::nochange, _("Nick \2%s\2 is already registered to your account."), mn->nick); else command_fail (si, fault::alreadyexists, _("Nick \2%s\2 is already registered to \2%s\2."), mn->nick, mn->owner->name); return; } if (IsDigit (si->su->nick[0])) { command_fail (si, fault::badparams, _("For security reasons, you can't register your UID.")); return; } logcommand (si, CMDLOG_REGISTER, "GROUP"); snoop ("GROUP: \2%s\2 to \2%s\2", si->su->nick, si->smu->name); mn = mynick_t::create (si->smu, si->su->nick); mn->registered = NOW; mn->lastseen = NOW; command_success_nodata (si, _("Nick \2%s\2 is now registered to your account."), mn->nick); mn->callback.group (mn, si->smu, si); } static void ns_cmd_ungroup (sourceinfo_t *si, int parc, char *parv[]) { mynick_t *mn; char const *target; if (si->smu == NULL) { command_fail (si, fault::noprivs, _("You are not logged in.")); return; } if (parc >= 1) target = parv[0]; else if (si->su != NULL) target = si->su->nick; else target = "?"; mn = mynick_t::find (target); if (mn == NULL) { command_fail (si, fault::nosuch_target, _("Nick \2%s\2 is not registered."), target); return; } if (mn->owner != si->smu) { command_fail (si, fault::noprivs, _("Nick \2%s\2 is not registered to your account."), mn->nick); return; } if (!irccasecmp (mn->nick, si->smu->name)) { command_fail (si, fault::noprivs, _("Nick \2%s\2 is your account name; you may not remove it."), mn->nick); return; } logcommand (si, CMDLOG_REGISTER, "UNGROUP %s", mn->nick); snoop ("UNGROUP: \2%s\2 by \2%s\2", target, get_source_name (si)); mn->callback.group (mn, si->smu, si); command_success_nodata (si, _("Nick \2%s\2 has been removed from your account."), mn->nick); mn->refcnt_dec (); } static void ns_cmd_fungroup (sourceinfo_t *si, int parc, char *parv[]) { mynick_t *mn; myuser_t *mu; if (parc < 1) { command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "FUNGROUP"); command_fail (si, fault::needmoreparams, _("Syntax: FUNGROUP ")); return; } mn = mynick_t::find (parv[0]); if (mn == NULL) { command_fail (si, fault::nosuch_target, _("Nick \2%s\2 is not registered."), parv[0]); return; } mu = mn->owner; if (!irccasecmp (mn->nick, mu->name)) { command_fail (si, fault::noprivs, _("Nick \2%s\2 is an account name; you may not remove it."), mn->nick); return; } logcommand (si, CMDLOG_ADMIN | LG_REGISTER, "FUNGROUP %s", mn->nick); wallops ("%s dropped the nick \2%s\2 from %s", get_oper_name (si), mn->nick, mu->name); snoop ("FUNGROUP: \2%s\2 from \2%s\2 by \2%s\2", mn->nick, mu->name, get_source_name (si)); mn->callback.group (mn, mu, si); command_success_nodata (si, _("Nick \2%s\2 has been removed from account \2%s\2."), mn->nick, mu->name); mn->refcnt_dec (); }