#include "module.h" #define AUTHOR "SGR" #define VERSION "1.02" /* ----------------------------------------------------------- * Name : ircd_reportserv * Author: SGR * Date : 09/10/2003 * ----------------------------------------------------------- * Functions: my_privmsgA, my_nickA, report_check, * timeout_version_user, CheckOffDefList, * CheckCustomDefList * Limitations: None Known. * Tested: Ultimate(2.8.x), Unreal(3.2), Ultimate(3.x), Bahamut. * ----------------------------------------------------------- * This version has been tested on Ultimate, Viagra and * Unreal. * * This modules has 17 configurable options, please read * The comments * * This module is desinged for * * Please read the comments by each one. * * ----------------------------------------------------------- */ /* ---------------------------------------------------------------------- */ /* START OF CONFIGURATION BLOCK - please read the comments :) */ /* ---------------------------------------------------------------------- */ #define REPORTServHELP1 "%s is a system which you (the users) can use to report", s_ReportServ #define REPORTServHELP2 "abuse to currently online staff members. Please don't use " #define REPORTServHELP3 "%s for trivial things that you can deal with by", s_ReportServ #define REPORTServHELP4 "ignoring a user [/ignore the_nick_to_ignore_here]. However," #define REPORTServHELP5 "if someone is persistantly harassing you, flooding or" #define REPORTServHELP6 "making obsene remarks, please do make use of this service." //#define REPORTServHELP7 "Help text7" //#define REPORTServHELP8 "Help Text8" //#define REPORTServHELP9 "Help Text9" //#define REPORTServHELP10 "Help Text10" #define reportchan "#services-log-chan" #define REPORT_ACCEPTED "Your report has been logged and will be reviewed as soon as possible." #define REPORTING_DISABLED "This feature is currently disabled." #define REPORT_REJECTED_TOOSMALL "Your report was rejected for being too short. Please make sure all reports are 3 or more words long" char *s_ReportServ = "ReportServ"; /* Nickname - NICKLEN character MAXIMUM */ /* (see your IRCd's protocall responce for this) */ char *s_ReportServHOST = "ReportServ.User-Protection.Bot"; /* HostMask: 64 character MAXIMUM */ char *s_ReportServREALNAME = "Report Bot"; /* Realname 30 character MAXIMUM */ /* ---------------------------------------------------------------------- */ /* DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING */ /* ---------------------------------------------------------------------- */ int dontsayreport=3; int send_reportserv_help(User *u); void send_reportserv_fhelp(User *u); int my_privmsgC(char *source, int ac, char **av); int my_reportserv_killrejoin(char *source, int ac, char **av); int report_check(User * u, char *buf); int AnopeInit(int argc, char **argv) { Message *msg = NULL; int status; msg = createMessage("NOTICE", my_privmsgC); status = moduleAddMessage(msg, MOD_HEAD); msg = createMessage("PRIVMSG", my_privmsgC); status = moduleAddMessage(msg, MOD_HEAD); msg = createMessage("KILL", my_reportserv_killrejoin); status = moduleAddMessage(msg, MOD_HEAD); if (status == MOD_ERR_OK) { NEWNICK( s_ReportServ, s_ReportServ, s_ReportServHOST, s_ReportServREALNAME, "+oS", 1); } moduleAddAuthor(AUTHOR); moduleAddVersion(VERSION); alog("[ircd_reportserv] This module has loaded and is now active."); alog("[ircd_reportserv] For information see /msg %s HELP", s_ReportServ); #ifdef IRC_HYBRID send_cmd(NULL, "SJOIN %ld %s + :@%s", time(NULL), reportchan, s_ReportServ); send_cmd(whosends(ci), "MODE %s +ovs %s %lu", reportchan, s_ReportServ, time(NULL)); #endif return MOD_CONT; } void AnopeFini(void) { send_cmd( s_ReportServ, "QUIT :Module Unloaded!"); } int my_privmsgC(char *source, int ac, char **msg) { /* an uglier version of Rob's CatServ module code */ User *u; char *s; /* First, some basic checks */ if (ac != 2) { /* bleh */ return MOD_CONT; } if (!(u = finduser(source))) { return MOD_CONT; } /* non-user source */ if (*msg[0] == '#') { return MOD_CONT; } /* Channel message */ s = strchr(msg[0], '@'); if (s) { *s++ = 0; if (stricmp(s, ServerName) != 0) { return MOD_CONT; } } if ((stricmp(msg[0], s_ReportServ)) == 0) { /* its for US! */ report_check(u, msg[1]); return MOD_CONT; } else { /* ok it isnt us, let the old code have it */ return MOD_CONT; } } /*****************************************************************************/ int report_check(User * u, char *buf) { char *FirstWord; char *SecondWord; char *buffer; FirstWord = strtok(buf," "); SecondWord = strtok(NULL," "); buffer = strtok(NULL,""); if (!is_oper(u)) { if (dontsayreport == 1) { return MOD_CONT; } } if (!FirstWord) { return MOD_CONT; } if (stricmp(FirstWord, "\1PING") == 0) { if (!SecondWord) { SecondWord = "\1"; } notice(s_ReportServ, u->nick, "\1PING %s", SecondWord); return MOD_CONT; } if (skeleton) { notice_lang(s_ReportServ, u, SERVICE_OFFLINE, s_ReportServ); return MOD_CONT; } if ((stricmp(FirstWord, "HELP") == 0) && (!SecondWord)) { if (dontsayreport != 1) { send_reportserv_help(u); } return MOD_CONT; } if (!is_oper(u)) { if (dontsayreport == 2) { notice(s_ReportServ, u->nick, REPORTING_DISABLED); return MOD_CONT; } } if (is_services_admin(u)) { if (stricmp(FirstWord, "SET") == 0) { if (!SecondWord) { notice(s_ReportServ, u->nick, "See \2/msg %s HELP\2 for more information.", s_ReportServ); return MOD_CONT; } if (stricmp(SecondWord, "REPORT") == 0) { if (!buffer) { notice(s_ReportServ, u->nick, "See \2/msg %s HELP\2 for more information.", s_ReportServ); return MOD_CONT; } if (stricmp(buffer, "ON") == 0) { dontsayreport = 3; notice( s_ReportServ, u->nick, "Reporting sucessfully set ON"); wallops( s_ReportServ, "%s set %s reporting ON", u->nick, s_ReportServ); return MOD_CONT; } if (stricmp(buffer, "OFF") == 0) { dontsayreport = 2; notice( s_ReportServ, u->nick, "Reporting sucessfully set OFF"); wallops( s_ReportServ, "%s set %s reporting OFF", u->nick, s_ReportServ); return MOD_CONT; } if (stricmp(buffer, "SILENT") == 0) { dontsayreport = 1; notice( s_ReportServ, u->nick, "Reporting sucessfully set OFF [SILENT]"); wallops( s_ReportServ, "%s set %s reporting OFF [SILENT]", u->nick, s_ReportServ); return MOD_CONT; } return MOD_CONT; } } } if (!SecondWord) { if (dontsayreport == 2) { notice(s_ReportServ, u->nick, REPORT_REJECTED_TOOSMALL); return MOD_CONT; } } if (!buffer) { notice(s_ReportServ, u->nick, REPORT_REJECTED_TOOSMALL); return MOD_CONT; } if (buffer) { if (dontsayreport == 3) { send_cmd(s_ReportServ, "PRIVMSG %s :[%s!%s@%s] %s %s %s", reportchan, u->nick, u->username, u->host, FirstWord, SecondWord, buffer); notice(s_ReportServ, u->nick, REPORT_ACCEPTED); return MOD_CONT; } } return MOD_CONT; } int send_reportserv_help(User *u) { if (is_oper(u)) { notice( s_ReportServ, u->nick, "-----------------------------------------------------------------------"); notice( s_ReportServ, u->nick, "%s is a service which users can use to report abuse.", s_ReportServ); notice( s_ReportServ, u->nick, "Services Admins have access to the following settings -"); notice( s_ReportServ, u->nick, "/msg %s SET REPORT [on|off|silent]", s_ReportServ); notice( s_ReportServ, u->nick, "When ON ReportServ will send its reports to %s", reportchan); notice( s_ReportServ, u->nick, "When OFF users will be told the service is unavailable"); notice( s_ReportServ, u->nick, "but will still be able to see %s HELP. When set", s_ReportServ); notice( s_ReportServ, u->nick, "to SILENT %s will ignore all non-opers.", s_ReportServ); notice( s_ReportServ, u->nick, " "); notice( s_ReportServ, u->nick, "Below is a copy of the HELP users will see:"); notice( s_ReportServ, u->nick, " "); send_reportserv_fhelp(u); return MOD_CONT; } send_reportserv_fhelp(u); return MOD_CONT; /*}*/ } void send_reportserv_fhelp(User *u) { if (!is_oper(u)) { notice(s_ReportServ, u->nick, "-----------------------------------------------------------------------"); } #ifdef REPORTServHELP1 notice(s_ReportServ, u->nick, REPORTServHELP1); #endif #ifdef REPORTServHELP2 notice(s_ReportServ, u->nick, REPORTServHELP2); #endif #ifdef REPORTServHELP3 notice(s_ReportServ, u->nick, REPORTServHELP3); #endif #ifdef REPORTServHELP4 notice(s_ReportServ, u->nick, REPORTServHELP4); #endif #ifdef REPORTServHELP5 notice(s_ReportServ, u->nick, REPORTServHELP5); #endif #ifdef REPORTServHELP6 notice(s_ReportServ, u->nick, REPORTServHELP6); #endif #ifdef REPORTServHELP7 notice(s_ReportServ, u->nick, REPORTServHELP7); #endif #ifdef REPORTServHELP8 notice(s_ReportServ, u->nick, REPORTServHELP8); #endif #ifdef REPORTServHELP9 notice(s_ReportServ, u->nick, REPORTServHELP9); #endif #ifdef REPORTServHELP10 notice(s_ReportServ, u->nick, REPORTServHELP10); #endif notice(s_ReportServ, u->nick, "-----------------------------------------------------------------------"); return; } int my_reportserv_killrejoin(char *source, int ac, char **av) { if (ac != 2) { return MOD_STOP; } if (stricmp(av[0], s_ReportServ) == 0) { alog("[ircd_reportserv] %s got KILLED, rejoining.", s_ReportServ); NEWNICK( s_ReportServ, s_ReportServ, s_ReportServHOST, s_ReportServREALNAME, "+oS", 1); return MOD_STOP; } return MOD_CONT; }