⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m_htm.c

📁 Unreal irc 服务器源代码
💻 C
字号:
/* *   Unreal Internet Relay Chat Daemon, src/modules/m_htm.c *   (C) 2000-2001 Carsten V. Munk and the UnrealIRCd Team *   Moved to modules by Fish (Justin Hammond) * *   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. */#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"#endifDLLFUNC int m_htm(aClient *cptr, aClient *sptr, int parc, char *parv[]);EVENT(lcf_check);EVENT(htm_calc);Event *e_lcf, *e_htmcalc;/* Place includes here */#define MSG_HTM         "HTM"#define TOK_HTM         "BH"DLLFUNC int htm_config_test(ConfigFile *, ConfigEntry *, int, int *);DLLFUNC int htm_config_run(ConfigFile *, ConfigEntry *, int);DLLFUNC int htm_stats(aClient *, char *); ModuleInfo *HtmModInfo;static Hook *ConfTest, *ConfRun, *ServerStats;ModuleHeader MOD_HEADER(m_htm)  = {	"htm",	/* Name of module */	"$Id: m_htm.c,v 1.1.6.10 2006/12/22 21:10:33 syzop Exp $", /* Version */	"command /htm", /* Short description of module */	"3.2-b8-1",	NULL     };DLLFUNC int MOD_TEST(m_htm)(ModuleInfo *modinfo){	/*	 * We call our add_Command crap here	*/	HtmModInfo = modinfo;	ConfTest = HookAddEx(HtmModInfo->handle, HOOKTYPE_CONFIGTEST, htm_config_test);	return MOD_SUCCESS;}/* This is called on module init, before Server Ready */DLLFUNC int MOD_INIT(m_htm)(ModuleInfo *modinfo){	/*	 * We call our add_Command crap here	*/	add_Command(MSG_HTM, TOK_HTM, m_htm, MAXPARA);	ConfRun = HookAddEx(HtmModInfo->handle, HOOKTYPE_CONFIGRUN, htm_config_run);	ServerStats = HookAddEx(HtmModInfo->handle, HOOKTYPE_STATS, htm_stats);#ifndef NO_FDLIST	LockEventSystem();	e_lcf = EventAddEx(HtmModInfo->handle, "lcf", LCF, 0, lcf_check, NULL);	e_htmcalc = EventAddEx(HtmModInfo->handle, "htmcalc", 1, 0, htm_calc, NULL);	UnlockEventSystem();#endif	MARK_AS_OFFICIAL_MODULE(modinfo);	return MOD_SUCCESS;}/* Is first run when server is 100% ready */DLLFUNC int MOD_LOAD(m_htm)(int module_load){	return MOD_SUCCESS;}/* Called when module is unloaded */DLLFUNC int MOD_UNLOAD(m_htm)(int module_unload){	if (del_Command(MSG_HTM, TOK_HTM, m_htm) < 0)	{		sendto_realops("Failed to delete commands when unloading %s",				MOD_HEADER(m_htm).name);	}#ifndef NO_FDLIST	LockEventSystem();	EventDel(e_lcf);	EventDel(e_htmcalc);	UnlockEventSystem();#endif	return MOD_SUCCESS;}/* m_htm recoded by grieverparametersHTM [server] [command] [param]*/DLLFUNC int m_htm(aClient *cptr, aClient *sptr, int parc, char *parv[]){	int  x = HUNTED_NOSUCH;	char *command, *param;	if (!IsOper(sptr))	{		sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, sptr->name);		return 0;	}	switch(parc) {		case 1:			break;		case 2:			x = hunt_server_token_quiet(cptr, sptr, MSG_HTM, TOK_HTM, "%s", 1, parc, parv);			break;		case 3:			x = hunt_server_token_quiet(cptr, sptr, MSG_HTM, TOK_HTM, "%s %s", 1, parc, parv);			break;		default:			x = hunt_server_token_quiet(cptr, sptr, MSG_HTM, TOK_HTM, "%s %s %s", 1, parc, parv);	}	switch (x) {		case HUNTED_NOSUCH:			command = (parv[1]);			param = (parv[2]);			break;		case HUNTED_ISME:			command = (parv[2]);			param = (parv[3]);			break;		default:			return 0;	}#ifndef NO_FDLIST	if (!command)	{		sendto_one(sptr,		    ":%s NOTICE %s :*** Current incoming rate: %0.2f kb/s",		    me.name, parv[0], currentrate);		sendto_one(sptr,		    ":%s NOTICE %s :*** Current outgoing rate: %0.2f kb/s",		    me.name, parv[0], currentrate2);		sendto_one(sptr,		    ":%s NOTICE %s :*** Highest incoming rate: %0.2f kb/s",		    me.name, parv[0], highest_rate);		sendto_one(sptr,		    ":%s NOTICE %s :*** Highest outgoing rate: %0.2f kb/s",		    me.name, parv[0], highest_rate2);		sendto_one(sptr,		    ":%s NOTICE %s :*** High traffic mode is currently \2%s\2",		    me.name, parv[0], (lifesux ? "ON" : "OFF"));		sendto_one(sptr,		    ":%s NOTICE %s :*** High traffic mode is currently in \2%s\2 mode",		    me.name, parv[0], (noisy_htm ? "NOISY" : "QUIET"));		sendto_one(sptr,		    ":%s NOTICE %s :*** HTM will be activated if incoming > %i kb/s",		    me.name, parv[0], LRV);	}	else	{		if (!stricmp(command, "ON"))		{			EventInfo mod;			lifesux = 1;			sendto_one(sptr,			    ":%s NOTICE %s :High traffic mode is now ON.",			    me.name, parv[0]);			sendto_ops			    ("%s (%s@%s) forced High traffic mode to activate",			    parv[0], sptr->user->username,			    GetHost(sptr));			LCF = 60;	/* 60 seconds */			mod.flags = EMOD_EVERY;			mod.every = LCF;			LockEventSystem();			EventMod(e_lcf, &mod);			UnlockEventSystem();		}		else if (!stricmp(command, "OFF"))		{			EventInfo mod;			lifesux = 0;			LCF = LOADCFREQ;			mod.flags = EMOD_EVERY;			mod.every = LCF;			LockEventSystem();			EventMod(e_lcf, &mod);			UnlockEventSystem();			sendto_one(sptr,			    ":%s NOTICE %s :High traffic mode is now OFF.",			    me.name, parv[0]);			sendto_ops			    ("%s (%s@%s) forced High traffic mode to deactivate",			    parv[0], sptr->user->username,			    GetHost(sptr));		}		else if (!stricmp(command, "TO"))		{			if (!param)				sendto_one(sptr,				    ":%s NOTICE %s :You must specify an integer value",				    me.name, parv[0]);			else			{				int  new_val = atoi(param);				if (new_val < 10)					sendto_one(sptr,					    ":%s NOTICE %s :New value must be > 10",					    me.name, parv[0]);				else				{					LRV = new_val;					sendto_one(sptr,					    ":%s NOTICE %s :New max rate is %dkb/s",					    me.name, parv[0], LRV);					sendto_ops					    ("%s (%s@%s) changed the High traffic mode max rate to %dkb/s",					    parv[0], sptr->user->username,					    GetHost(sptr), LRV);				}			}		}		else if (!stricmp(command, "QUIET"))		{			noisy_htm = 0;			sendto_one(sptr,			    ":%s NOTICE %s :High traffic mode is now QUIET",			    me.name, parv[0]);			sendto_ops("%s (%s@%s) set High traffic mode to QUIET",			    parv[0], sptr->user->username,			    GetHost(sptr));		}		else if (!stricmp(command, "NOISY"))		{			noisy_htm = 1;			sendto_one(sptr,			    ":%s NOTICE %s :High traffic mode is now NOISY",			    me.name, parv[0]);			sendto_ops("%s (%s@%s) set High traffic mode to NOISY",			    parv[0], sptr->user->username,			    GetHost(sptr));		}		else			sendto_one(sptr, ":%s NOTICE %s :Unknown option: %s",			    me.name, parv[0], command);	}#else	sendto_one(sptr,	    ":%s NOTICE %s :*** High traffic mode and fdlists are not enabled on this server",	    me.name, sptr->name);#endif	return 0;}#ifndef NO_FDLISTEVENT(lcf_check){	static int lrv;	lrv = LRV * LCF;	if ((me.receiveK - lrv >= lastrecvK) || HTMLOCK == 1)	{		if (!lifesux)		{			lifesux = 1;			if (noisy_htm)				sendto_realops					    ("Entering high-traffic mode (incoming = %0.2f kb/s (LRV = %dk/s, outgoing = %0.2f kb/s currently)",					    currentrate, LRV,						   currentrate2);}			else			{				EventInfo mod;				lifesux++;	/* Ok, life really sucks! */				LCF += 2;	/* wait even longer */				mod.flags = EMOD_EVERY;				mod.every = LCF;				EventMod(e_lcf, &mod);				if (noisy_htm)					sendto_realops					    ("Still high-traffic mode %d%s (%d delay): %0.2f kb/s",					    lifesux,					    (lifesux >					    9) ? " (TURBO)" :					    "", (int)LCF, currentrate);				/* Reset htm here, because its been on a little too long.				 * Bad Things(tm) tend to happen with HTM on too long -epi */				if (lifesux > 15)				{					EventInfo mod;					if (noisy_htm)						sendto_realops						    ("Resetting HTM and raising limit to: %dk/s\n",						    LRV + 5);					LCF = LOADCFREQ;					mod.flags = EMOD_EVERY;					mod.every = LCF;					EventMod(e_lcf, &mod);					lifesux = 0;					LRV += 5;				}			}		}		else		{			EventInfo mod;			LCF = LOADCFREQ;			mod.flags = EMOD_EVERY;			mod.every = LCF;			EventMod(e_lcf, &mod);			if (lifesux)			{				lifesux = 0;				if (noisy_htm)					sendto_realops					    ("Resuming standard operation (incoming = %0.2f kb/s, outgoing = %0.2f kb/s now)",					    currentrate, currentrate2);			}		}}EVENT(htm_calc){	static time_t last = 0;	if (last == 0)		last = TStime();		if (timeofday - last == 0)		return;			currentrate =		   ((float)(me.receiveK -		    lastrecvK)) / ((float)(timeofday - last));	currentrate2 =		   ((float)(me.sendK -			 lastsendK)) / ((float)(timeofday - last));	if (currentrate > highest_rate)			highest_rate = currentrate;	if (currentrate2 > highest_rate2)			highest_rate2 = currentrate2;	last = TStime();}#endifDLLFUNC int htm_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) {	ConfigEntry *cep;	int errors = 0;	if (type != CONFIG_SET)		return 0;	if (!strcmp(ce->ce_varname, "htm"))	{		for (cep = ce->ce_entries; cep; cep = cep->ce_next)		{			if (!cep->ce_varname)			{				config_error("%s:%i: blank set::htm item",					cep->ce_fileptr->cf_filename,					cep->ce_varlinenum);					errors++;				continue;			}			if (!cep->ce_vardata)			{				config_error("%s:%i: set::htm::%s item without value",					cep->ce_fileptr->cf_filename,					cep->ce_varlinenum, cep->ce_varname);				errors++;				continue;			}			if (!strcmp(cep->ce_varname, "mode"))			{				if (stricmp(cep->ce_vardata, "noisy") && stricmp(cep->ce_vardata, "quiet"))				{					config_error("%s%i: set::htm::mode: illegal mode",						cep->ce_fileptr->cf_filename, cep->ce_varlinenum);					errors++;				}			}			else if (!strcmp(cep->ce_varname, "incoming-rate"))			{				int value = config_checkval(cep->ce_vardata, CFG_SIZE);				if (value < 10240)				{					config_error("%s%i: set::htm::incoming-rate: must be at least 10kb",						cep->ce_fileptr->cf_filename, cep->ce_varlinenum);					errors++;				}			}			else 			{				config_error("%s:%i: unknown directive set::htm::%s",					cep->ce_fileptr->cf_filename, cep->ce_varlinenum,					cep->ce_varname);				errors++;			}					}		*errs = errors;		return errors ? -1 : 1;	}	else		return 0;}DLLFUNC int htm_config_run(ConfigFile *cf, ConfigEntry *ce, int type) {	ConfigEntry *cep;	if (type != CONFIG_SET)		return 0;	if (!strcmp(ce->ce_varname, "htm"))	{		for (cep = ce->ce_entries; cep; cep = cep->ce_next)		{			if (!strcmp(cep->ce_varname, "mode"))			{				if (!stricmp(cep->ce_vardata, "noisy"))					noisy_htm = 1;				else					noisy_htm = 0;			}			else if (!strcmp(cep->ce_varname, "incoming-rate"))			{				LRV = config_checkval(cep->ce_vardata, CFG_SIZE);				LRV /= 1024;			}		}		return 1;			}	return 0;}DLLFUNC int htm_stats(aClient *sptr, char *stats) {	if (*stats == 'S') {		sendto_one(sptr, ":%s %i %s :htm::mode: %s", me.name, RPL_TEXT,			   sptr->name, noisy_htm ? "noisy" : "quiet");		sendto_one(sptr, ":%s %i %s :htm::incoming-rate: %d kb/s", me.name, RPL_TEXT,			   sptr->name, LRV);	}        return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -