All pastes #567585 Raw Edit

Something

public text v1 · immutable
·published 2007-06-15 01:02 UTC
rendered paste body
#include <module.h>

#define AUTHOR "Vadtec"
#define VERSION "0.1.6"

/* common defines */
#define ERR_BAD_FP    -1
#define ERR_BAD_CHAN  -2
#define ERR_BAD_ADMIN -3

#define SUCCESS 1
#define FAILURE 0
#define EXCEPT  -1

#define FILE_EXIST 1
#define FILE_NOT_EXIST 0
#define FILE_OTHER_ERROR -1

/* absolute defaults for configureable options*/
#define BOTKILLERDB         "botkiller.db"
#define BOTKILLERNICK       "BotKiller"
#define BOTKILLERIDENT      "BotKiller"
#define BOTKILLERHOST       "I.Kill.Botnet.Drones"
#define BOTKILLERREALNAME   "Bot Killer"
#define BOTKILLERMODES      NULL
#define BOTKILLERAKILLLIMIT "3"
#define BOTKILLERAKILLONE   "1d"
#define BOTKILLERAKILLTWO   "7d"

/* typedefs */
typedef struct chanrec chanrec;

/* structs */
struct chanrec {
	int num;
	char *name;
	char *admin;
	char *reason;
	chanrec *next;
};

/* globals */
int i = 0; // general counter
int *db_fp = ERR_BAD_FP; // int pointer for the db, make it global for simplicity

/* pointers to the configurable options */
char *_botkillerdb            = NULL;
char *_botkillernick          = NULL;
char *_botkillerident         = NULL;
char *_botkillerhost          = NULL;
char *_botkillerrealname      = NULL;
char *_botkillermodes         = NULL;
char *_botkillerakilllimit    = NULL;
char *_botkillerakillone      = NULL;
char *_botkillerakilltwo      = NULL;

/* Directives structure to hold the configurable options */
// Thanks to Rob for pointing out how to make this work with a for loop.
Directive _botkiller_confvals[][1] = {
     { { "BotKillerDB", { { PARAM_STRING, PARAM_RELOAD, &_botkillerdb } } } },
     { { "BotKillerNick", { { PARAM_STRING, PARAM_RELOAD, &_botkillernick } } } },
     { { "BotKillerIdent", { { PARAM_STRING, PARAM_RELOAD, &_botkillerident } } } },
     { { "BotKillerHost", { { PARAM_STRING, PARAM_RELOAD, &_botkillerhost } } } },
     { { "BotKillerRealName", { { PARAM_STRING, PARAM_RELOAD, &_botkillerrealname } } } },
     { { "BotKillerModes", { { PARAM_STRING, PARAM_RELOAD, &_botkillermodes } } } },
     { { "BotKillerAkillLimit", { { PARAM_STRING, PARAM_RELOAD, &_botkillerakilllimit } } } },
     { { "BotKillerAkill1st", { { PARAM_STRING, PARAM_RELOAD, &_botkillerakillone } } } },
     { { "BotKillerAkill2nd", { { PARAM_STRING, PARAM_RELOAD, &_botkillerakilltwo } } } }
};

/* function prototypes */
int cst_open_db(char *name, int *fp);
int cst_close_db(int *fp);
int cst_load_db(int *fp);
int cst_save_db(int *fp);
int cst_read_db(int *fp, int rec);
int cst_write_db(int *fp, int rec);
int cst_check_file(char *name);

int AnopeInit(int argc, char **argv) {
	
	moduleAddAuthor(AUTHOR);
	moduleAddVersion(VERSION);
	
	/* Gather the config values from the config file, or use defaults */
	for (i=0; i < 9; i++) {
		moduleGetConfigDirective(_botkiller_confvals[i]);
	}
	
	/* check and set the configurable options */
	_botkillerdb = _botkillerdb ? _botkillerdb : BOTKILLERDB;
	_botkillernick = _botkillernick ? _botkillernick : BOTKILLERNICK;
	_botkillerident = _botkillerident ? _botkillerident : BOTKILLERNICK;
	_botkillerhost = _botkillerhost ? _botkillerhost : BOTKILLERHOST;
	_botkillerrealname = _botkillerrealname ? _botkillerrealname : BOTKILLERREALNAME;
	_botkillermodes = _botkillermodes ? _botkillermodes : BOTKILLERMODES ? BOTKILLERMODES : ircd->nickservmode;
	_botkillerakilllimit = _botkillerakilllimit ? _botkillerakilllimit : BOTKILLERAKILLLIMIT;
	_botkillerakillone = _botkillerakillone ? _botkillerakillone : BOTKILLERAKILLONE;
	_botkillerakilltwo = _botkillerakilltwo ? _botkillerakilltwo : BOTKILLERAKILLTWO;
	alog("\n[begin cs_trap]\n DB: %s\n Nick: %s\n Ident: %s\n Host: %s\n Real Name: %s\n Modes: %s\n Akill Limit: %s\n Akill Time 1st: %s\n Akill Time 2nd+: %s\n[end cs_trap]", _botkillerdb, _botkillernick, _botkillerident, _botkillerhost, _botkillerrealname, _botkillermodes, _botkillerakilllimit, _botkillerakillone, _botkillerakilltwo);
	
	cst_open_db(_botkillerdb, &db_fp);
	
	anope_cmd_bot_nick(_botkillernick, _botkillerident, _botkillerhost, _botkillerrealname, _botkillermodes);
	
	return MOD_CONT;
}

void AnopeFini(void) {
	cst_close_db(&db_fp);
	anope_cmd_quit(_botkillernick, "Shutting down...");
}

int cst_open_db(char *name, int *fp) {

	*fp = open(name, O_CREAT | O_EXCL, 0666);
	
	if (*fp == ERR_BAD_FP) {
		alog("\t[cs_trap] Found %s database file, using it.", name);

		*fp = open(name, O_WRONLY, 0666);
		
		if (*fp == ERR_BAD_FP) {
			alog("\t[cs_trap] ERROR: Unable to open %s for use.", name);
		
			*fp = ERR_BAD_FP;
		
			return FAILURE;
		}

		return SUCCESS;
	}
	else {
		alog("\t[cs_trap] First use of %s. Creating database...", name);
		
		return SUCCESS;
	}
	return ERR_BAD_FP;
}

int cst_close_db(int *fp) {
	
	if (!close(*fp)) {
		alog("\t[cs_trap] Closed the database...");
		
		*fp = ERR_BAD_FP;
		
		return !SUCCESS;
	}
	else {
		alog("\t[cs_trap] Error closing the database...");
		
		return FAILURE;
	}
	return EXCEPT;
}

int cst_load_db(int *fp) {
	return EXCEPT;
}

int cst_save_db(int *fp) {
	return EXCEPT;
}

int cst_read_db(int *fp, int rec) {
	return EXCEPT;
}

int cst_write_db(int *fp, int rec) {
	return EXCEPT;
}

int cst_check_file(char *name) {
	return FILE_OTHER_ERROR;
}