/** * ignore.C: This file contains code for the Memoserv IGNORE functions * * 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 © 2005 Atheme Development Group * Rights to this code are as documented in doc/pod/license.pod. * * $Id: ignore.C,v 1.8 2007/09/22 14:27:27 pippijn Exp $ */ #include "atheme.h" #include #include static char const rcsid[] = "$Id: ignore.C,v 1.8 2007/09/22 14:27:27 pippijn Exp $"; REGISTER_MODULE ("memoserv/ignore", false, "The Ermyth Team "); static void ms_cmd_ignore (sourceinfo_t *si, int parc, char *parv[]); static void ms_cmd_ignore_add (sourceinfo_t *si, int parc, char *parv[]); static void ms_cmd_ignore_del (sourceinfo_t *si, int parc, char *parv[]); static void ms_cmd_ignore_clear (sourceinfo_t *si, int parc, char *parv[]); static void ms_cmd_ignore_list (sourceinfo_t *si, int parc, char *parv[]); command_t const ms_ignore = { "IGNORE", N_(N_("Ignores memos.")), AC_NONE, 2, ms_cmd_ignore }; command_t const ms_ignore_add = { "ADD", N_(N_("Ignores memos from a user.")), AC_NONE, 1, ms_cmd_ignore_add }; command_t const ms_ignore_del = { "DEL", N_(N_("Stops ignoring memos from a user.")), AC_NONE, 1, ms_cmd_ignore_del }; command_t const ms_ignore_clear = { "CLEAR", N_(N_("Clears your memo ignore list.")), AC_NONE, 1, ms_cmd_ignore_clear }; command_t const ms_ignore_list = { "LIST", N_(N_("Shows all users you are ignoring memos from.")), AC_NONE, 1, ms_cmd_ignore_list }; E cmdvec ms_cmdtree; E helpvec ms_helptree; cmdvec ms_ignore_cmds; bool _modinit (module *m) { ms_cmdtree << ms_ignore; help_addentry (ms_helptree, "IGNORE", "help/memoserv/ignore", NULL); /* Add sub-commands */ ms_ignore_cmds << ms_ignore_add; ms_ignore_cmds << ms_ignore_del; ms_ignore_cmds << ms_ignore_clear; ms_ignore_cmds << ms_ignore_list; return true; } void _moddeinit () { ms_cmdtree >> ms_ignore; help_delentry (ms_helptree, "IGNORE"); /* Delete sub-commands */ ms_ignore_cmds >> ms_ignore_add; ms_ignore_cmds >> ms_ignore_del; ms_ignore_cmds >> ms_ignore_clear; ms_ignore_cmds >> ms_ignore_list; } static void ms_cmd_ignore (sourceinfo_t *si, int parc, char *parv[]) { /* Grab args */ char *cmd = parv[0]; command_t const *c; /* Bad/missing arg */ if (!cmd) { command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "IGNORE"); command_fail (si, fault::needmoreparams, _("Syntax: IGNORE ADD|DEL|LIST|CLEAR [account]")); return; } /* User logged in? */ if (si->smu == NULL) { command_fail (si, fault::noprivs, _("You are not logged in.")); return; } c = ms_ignore_cmds.find (cmd); if (c == NULL) { command_fail (si, fault::badparams, _("Invalid command. Use \2/%s%s help\2 for a command listing."), (ircd->uses_rcommand == false) ? "msg " : "", memosvs.me->disp); return; } c->exec (si->service, si, parc - 1, parv + 1); } static void ms_cmd_ignore_add (sourceinfo_t *si, int parc, char *parv[]) { myuser_t *tmu; myuser_t::mzignore_vector::iterator miit, miit_end; char *temp; /* Arg check */ if (parc < 1) { command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "IGNORE"); command_fail (si, fault::needmoreparams, _("Syntax: IGNORE ADD|DEL|LIST|CLEAR ")); return; } /* User attempting to ignore themself? */ if (!irccasecmp (parv[0], si->smu->name)) { command_fail (si, fault::badparams, _("Silly wabbit, you can't ignore yourself.")); return; } /* Does the target account exist? */ if (!(tmu = myuser_t::find_ext (parv[0]))) { command_fail (si, fault::nosuch_target, _("\2%s\2 is not registered."), parv[0]); return; } /* Ignore list is full */ if (si->smu->memo_ignores.size () >= MAXMSIGNORES) { command_fail (si, fault::toomany, _("Your ignore list is full, please DEL an account.")); return; } /* Iterate through list, make sure target not in it, if last node append */ for (miit = si->smu->memo_ignores.begin (), miit_end = si->smu->memo_ignores.end (); miit != miit_end; ++miit) { temp = *miit; /* Already in the list */ if (!irccasecmp (temp, parv[0])) { command_fail (si, fault::nochange, _("Account \2%s\2 is already in your ignore list."), temp); return; } } /* Add to ignore list */ si->smu->memo_ignores.insert (sstrdup (tmu->name)); logcommand (si, CMDLOG_SET, "IGNORE ADD %s", tmu->name); command_success_nodata (si, _("Account \2%s\2 added to your ignore list."), tmu->name); return; } static void ms_cmd_ignore_del (sourceinfo_t *si, int parc, char *parv[]) { int i = 0; size_t ignorenum = 0; myuser_t::mzignore_vector::iterator miit, miit_end; char *temp; /* Arg check */ if (parc < 1) { command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "IGNORE"); command_fail (si, fault::needmoreparams, _("Syntax: IGNORE ADD|DEL|LIST|CLEAR ")); return; } ignorenum = atoi (parv[0]); if (ignorenum > si->smu->memo_ignores.size ()) { command_fail (si, fault::badparams, _("Invalid ignore index")); return; } if (ignorenum > 0) { temp = si->smu->memo_ignores[ignorenum - 1]; logcommand (si, CMDLOG_SET, "IGNORE DEL %s", temp); command_success_nodata (si, _("Account \2%s\2 removed from ignore list."), temp); si->smu->memo_ignores.erase (ignorenum - 1); sfree (temp); return; } /* Iterate through list, make sure they're not in it, if last node append */ for (miit = si->smu->memo_ignores.begin (), miit_end = si->smu->memo_ignores.end (); miit != miit_end; ++miit) { temp = *miit; /* Not using list or clear, but we've found our target in the ignore list */ if (!irccasecmp (temp, parv[0])) { logcommand (si, CMDLOG_SET, "IGNORE DEL %s", temp); command_success_nodata (si, _("Account \2%s\2 removed from ignore list."), temp); si->smu->memo_ignores.erase (i); sfree (temp); return; } ++i; } command_fail (si, fault::nosuch_target, _("\2%s\2 is not in your ignore list."), parv[0]); return; } static void ms_cmd_ignore_clear (sourceinfo_t *si, int parc, char *parv[]) { if (si->smu->memo_ignores.empty ()) { command_fail (si, fault::nochange, _("Ignore list already empty.")); return; } while (!si->smu->memo_ignores.empty ()) { sfree (si->smu->memo_ignores.back ()); si->smu->memo_ignores.pop_back (); } /* Let them know list is clear */ command_success_nodata (si, _("Ignore list cleared.")); logcommand (si, CMDLOG_SET, "IGNORE CLEAR"); return; } static void ms_cmd_ignore_list (sourceinfo_t *si, int parc, char *parv[]) { unsigned int i = 1; myuser_t::mzignore_vector::iterator miit, miit_end; /* Throw in list header */ command_success_nodata (si, _("Ignore list:")); command_success_nodata (si, "-------------------------"); /* Iterate through list, make sure they're not in it, if last node append */ for (miit = si->smu->memo_ignores.begin (), miit_end = si->smu->memo_ignores.end (); miit != miit_end; ++miit) { command_success_nodata (si, "%d - %s", i, *miit); i++; } /* Ignore list footer */ if (i == 1) command_success_nodata (si, _("list empty")); command_success_nodata (si, "-------------------------"); return; }