/**********************************************************************
* PTlink IRC Services is (C) CopyRight PTlink IRC Software 1999-2005 *
* http://software.pt-link.net *
* This program is distributed under GNU Public License *
* Please read the file COPYING for copyright information.
**********************************************************************
Description: operserv sline command
* $Id: os_sline.c,v 1.7 2005/11/03 22:21:38 jpinto Exp $
*/
#include "module.h"
#include "my_sql.h"
#include "nsmacros.h"
#include "path.h"
#include "ns_group.h"
#include "lang/common.lh"
#include "lang/os_sline.lh"
SVS_Module mod_info =
/* module, version, description */
{"os_sline", "2.2", "operserv sline module" };
/* Change Log
2.2 - security fix
2.1 - 0000349: os_sline should support list by line type
2.0 - 0000265: remove nickserv cache system
*/
#define DB_VERSION 2
/** functions/events we require **/
/* void (*FunctionPointer)(void);*/
ServiceUser* (*operserv_suser)(void);
MOD_REQUIRES
MOD_FUNC(operserv_suser)
MOD_FUNC(is_soper)
MOD_END
/** functions/events we provide **/
/* void my_function(void); */
/** Internal functions declaration **/
/* void internal_function(void); */
void os_sline(IRC_User *s, IRC_User *u);
void ev_os_new_server(IRC_Server* nserver, IRC_Server* from);
u_int32_t find_sline(char letter, char* mask);
u_int32_t insert_sline(char* who, char letter, char* mask, char* message);
/** Local variables **/
/* int my_local_variable; */
ServiceUser *osu;
/** load code **/
int mod_load(void)
{
if(sql_check_inst_upgrade(mod_info.name, DB_VERSION, NULL) < 0)
return -4;
osu = operserv_suser();
suser_add_cmd(osu, "SLINE", (void*) os_sline, SLINE_SUMMARY, SLINE_HELP);
irc_AddEvent(ET_NEW_SERVER, (void*) ev_os_new_server);
return 0;
}
/** unload code **/
void mod_unload(void)
{
irc_DelEvent(ET_NEW_SERVER, (void*) ev_os_new_server);
suser_del_mod_cmds(osu, &mod_info);
return;
}
/** internal functions implementation starts here **/
void os_sline(IRC_User *s, IRC_User *u)
{
u_int32_t source_snid;
char *cmd;
/* status validation */
CHECK_IF_IDENTIFIED_NICK
if (!is_soper(u->snid))
{
send_lang(u, s, PERMISSION_DENIED);
return;
}
/* syntax validation */
cmd = strtok(NULL, " ");
if(IsNull(cmd))
send_lang(u, s, SLINE_SYNTAX);
/* sub-command */
else if(strcasecmp(cmd, "ADD") == 0)
{
u_int32_t id;
char* letter = strtok(NULL, " ");
char* mask = strtok(NULL, " ");
char* message = strtok(NULL, "");
if(letter)
letter[0] = toupper(letter[0]);
if(letter && strlen(letter)>1)
letter[1] = '\0';
if(mask && strlen(mask)>128)
letter[128] = '\0';
if(message && strlen(message)>128)
message[128] = '\0';
/* syntax validation */
if(IsNull(letter) || IsNull(mask) || IsNull(message))
send_lang(u, s, SLINE_SYNTAX);
/* avoid duplicates */
else if(find_sline(*letter, mask) > 0)
send_lang(u, s, SLINE_ALREADY_EXISTS_X_X, *letter, mask);
/* execute operation */
else if((id = insert_sline(u->nick ,*letter, mask, message)) != 0)
{
send_lang(u, s, ADDED_SLINE_X_X, *letter, id);
irc_SendRaw(NULL, "S%cLINE %s :%s", *letter, mask, message);
}
else
send_lang(u, s, UPDATE_FAIL);
}
/* sub-command */
else if(strcasecmp(cmd, "DEL") == 0)
{
u_int32_t id = 0;
char *strid;
strid = strtok(NULL, " ");
if(strid)
id = atoi(strid);
/* syntax validation */
if(IsNull(strid))
send_lang(u, s, SLINE_SYNTAX);
else if(sql_singlequery("SELECT id, letter, mask FROM os_sline WHERE id=%d", id) == 0)
send_lang(u, s, SLINE_X_NOT_FOUND, id);
/* execute operation */
else if(sql_execute("DELETE FROM os_sline WHERE id=%d", id) > 0)
{
send_lang(u, s, DELETED_SLINE_X, id);
irc_SendRaw(NULL, "UNS%cLINE %s", *sql_field(1), sql_field(2));
}
else
send_lang(u, s, UPDATE_FAIL);
}
/* sub-command */
else if(strcasecmp(cmd, "LIST") == 0)
{
MYSQL_RES* res;
MYSQL_ROW row;
int rowc = 0;
char* letter = strtok(NULL, " ");
if(letter)
res = sql_query("SELECT "
"id, letter, mask, message, who_nick, t_create FROM os_sline"
" WHERE letter=%s", sql_str(letter));
else
res = sql_query("SELECT id, letter, mask, message, who_nick, t_create FROM os_sline");
if(res)
rowc = mysql_num_rows(res);
send_lang(u, s, SLINE_LIST_HEADER_X, rowc);
while((row = sql_next_row(res)))
{
send_lang(u, s, SLINE_LIST_FORMAT,
atoi(row[0]), *row[1], row[2], row[3], row[4], row[5]);
}
send_lang(u, s, SLINE_LIST_TAIL);
sql_free(res);
}
else
send_lang(u, s, SLINE_SYNTAX);
}
u_int32_t find_sline(char letter, char* mask)
{
if(sql_singlequery("SELECT id FROM os_sline WHERE letter='%c' AND "
"mask=%s", letter, sql_str(mask)) > 0)
return atoi(sql_field(0));
return 0;
}
u_int32_t insert_sline(char* who, char letter, char* mask, char* message)
{
return sql_execute("INSERT INTO os_sline VALUES(0"
", '%c', %s, %s, NOW(), %s)",
letter, sql_str(who), sql_str(mask), sql_str(message));
}
/* this is called when a new server is introduced */
void ev_os_new_server(IRC_Server* nserver, IRC_Server *from)
{
static int already_loaded = 0;
MYSQL_RES* res;
MYSQL_ROW row;
if(already_loaded)
return;
res = sql_query("SELECT letter, mask, message FROM os_sline");
while((row = sql_next_row(res)))
irc_SendRaw(NULL, "S%cLINE %s :%s", *row[0], row[1], row[2]);
sql_free(res);
already_loaded = -1;
}
/* End of module */
syntax highlighted by Code2HTML, v. 0.9.1