if HAS_GIT
checkversion:
- @GIT_VERSION=`$(GIT) describe`; \
+ @GIT_VERSION=`$(GIT) log -n 1 --pretty="format:%h"`; \
[ "z$$GIT_VERSION" != "z" ] || exit 0; \
TMPFILE=`mktemp git-version.c.XXXXXX` || exit 1 ; \
- echo "const char git_version[] = \"$${GIT_VERSION}\";" >> $$TMPFILE ; \
+ GIT_LASTCOMMIT=$$GIT_VERSION; \
+ GIT_COMMITCOUNT=`$(GIT) rev-list --all | wc -l | sed "s/[ \t]//g"`; \
+ GIT_REVISION="git-$${GIT_COMMITCOUNT}-$${GIT_LASTCOMMIT}"; \
+ echo "const char git_version[] = \"$${GIT_REVISION}\";" >> $$TMPFILE ; \
if diff -q git-version.c $$TMPFILE >/dev/null 2>&1 ; then \
rm $$TMPFILE ; \
else \
fi
else
checkversion:
- echo "const char git_version[] = \"\";" >> git-version.c ;
+ echo "const char git_version[] = \"git-0-0\";" >> git-version.c ;
endif
EXTRA_srvx_SOURCES = \
#define KEY_DNR_EXPIRE_FREQ "dnr_expire_freq"
#define KEY_MAX_CHAN_USERS "max_chan_users"
#define KEY_MAX_CHAN_BANS "max_chan_bans"
+#define KEY_MIN_TIME_BANS "min_time_bans"
#define KEY_NICK "nick"
#define KEY_OLD_CHANSERV_NAME "old_chanserv_name"
#define KEY_8BALL_RESPONSES "8ball"
unsigned int max_owned;
unsigned int max_chan_users;
unsigned int max_chan_bans;
+ unsigned int min_time_bans;
unsigned int max_userinfo_length;
unsigned int revoke_mode_a;
{
duration = ParseInterval(argv[2]);
- if(duration < 15)
+ if(duration < chanserv_conf.min_time_bans)
{
reply("CSMSG_DURATION_TOO_LOW");
free(ban);
ary[1] = uData->handle->handle;
if(uData->present)
ary[2] = "Here";
+ else if(HANDLE_FLAGGED(uData->handle, NETWORK))
+ ary[2] = "Here";
else if(!uData->seen)
ary[2] = "Never";
else
ary[2] = strdup(ary[2]);
if(IsUserSuspended(uData))
ary[3] = "Suspended";
+ else if(HANDLE_FLAGGED(uData->handle, OPER))
+ ary[3] = "Operator";
+ else if(HANDLE_FLAGGED(uData->handle, HELPING))
+ ary[3] = "Staff";
+ else if(HANDLE_FLAGGED(uData->handle, NETWORK))
+ ary[3] = "Network";
else if(HANDLE_FLAGGED(uData->handle, FROZEN))
ary[3] = "Vacation";
else if(HANDLE_FLAGGED(uData->handle, BOT))
return 1;
}
+static void
+chanserv_expire_user_suspension(void *data)
+{
+ struct userData *target = data;
+
+ target->expires = 0;
+ target->flags &= ~USER_SUSPENDED;
+}
+
static CHANSERV_FUNC(cmd_suspend)
{
struct handle_info *hi;
struct userData *actor, *real_actor, *target;
unsigned int override = 0;
+ time_t expiry;
- REQUIRE_PARAMS(2);
+ REQUIRE_PARAMS(3);
if(!(hi = modcmd_get_handle_info(user, argv[1]))) return 0;
actor = GetChannelUser(channel->channel_info, user->handle_info);
real_actor = GetChannelAccess(channel->channel_info, user->handle_info);
}
if(!real_actor || target->access >= real_actor->access)
override = CMD_LOG_OVERRIDE;
+ if(!strcmp(argv[2], "0"))
+ expiry = 0;
+ else
+ {
+ unsigned int duration;
+ if(!(duration = ParseInterval(argv[2])))
+ {
+ reply("MSG_INVALID_DURATION", argv[2]);
+ return 0;
+ }
+ expiry = now + duration;
+ }
+
+ target->expires = expiry;
+
+ if(target->expires)
+ timeq_add(target->expires, chanserv_expire_user_suspension, target);
+
target->flags |= USER_SUSPENDED;
reply("CSMSG_USER_SUSPENDED", hi->handle, channel->name);
return 1 | override;
}
if(!real_actor || target->access >= real_actor->access)
override = CMD_LOG_OVERRIDE;
+ timeq_del(target->expires, chanserv_expire_user_suspension, target, 0);
target->flags &= ~USER_SUSPENDED;
scan_user_presence(target, NULL);
reply("CSMSG_USER_UNSUSPENDED", hi->handle, channel->name);
chanserv_conf.max_chan_users = str ? atoi(str) : 512;
str = database_get_data(conf_node, KEY_MAX_CHAN_BANS, RECDB_QSTRING);
chanserv_conf.max_chan_bans = str ? atoi(str) : 512;
+ str = database_get_data(conf_node, KEY_MIN_TIME_BANS, RECDB_QSTRING);
+ chanserv_conf.min_time_bans = str ? atoi(str) : 5;
str = database_get_data(conf_node, KEY_MAX_USERINFO_LENGTH, RECDB_QSTRING);
chanserv_conf.max_userinfo_length = str ? atoi(str) : 400;
str = database_get_data(conf_node, KEY_NICK, RECDB_QSTRING);
{
struct handle_info *handle;
struct userData *uData;
- char *seen, *inf, *flags, *voted, *votefor;
+ char *seen, *inf, *flags, *voted, *votefor, *expires;
unsigned long last_seen;
unsigned short access_level;
seen = database_get_data(rd->d.object, KEY_SEEN, RECDB_QSTRING);
last_seen = seen ? strtoul(seen, NULL, 0) : now;
flags = database_get_data(rd->d.object, KEY_FLAGS, RECDB_QSTRING);
+ expires = database_get_data(rd->d.object, KEY_EXPIRES, RECDB_QSTRING);
voted = database_get_data(rd->d.object, KEY_VOTE_VOTED, RECDB_QSTRING);
votefor = database_get_data(rd->d.object, KEY_VOTE_VOTEDFOR, RECDB_QSTRING);
handle = get_handle_info(key);
uData = add_channel_user(chan, handle, access_level, last_seen, inf);
uData->flags = flags ? strtoul(flags, NULL, 0) : 0;
+ uData->expires = expires ? (signed)strtoul(expires, NULL, 0) : 0;
+
+ if((uData->flags & USER_SUSPENDED) && uData->expires)
+ {
+ if(uData->expires > now)
+ timeq_add(uData->expires, chanserv_expire_user_suspension, uData);
+ else
+ uData->flags &= ~USER_SUSPENDED;
+ }
if(chan->vote) {
uData->voted = voted ? strtoul(voted, NULL, 0) : 0;
uData->votefor = votefor ? strtoul(votefor, NULL, 0) : 0;
saxdb_write_int(ctx, KEY_SEEN, uData->seen);
if(uData->flags)
saxdb_write_int(ctx, KEY_FLAGS, uData->flags);
+ if(uData->expires)
+ saxdb_write_int(ctx, KEY_EXPIRES, uData->expires);
if(uData->channel->vote && uData->voted)
saxdb_write_int(ctx, KEY_VOTE_VOTED, uData->voted);
if(uData->channel->vote && uData->votefor)
char *info;
unsigned long seen;
+ time_t expires; /* suspend */
unsigned short access;
unsigned int present : 1;
unsigned int flags : USER_FLAGS_SIZE;
"STAFF" ("/msg $C STAFF",
"Lists all the IRC operators and helpers currently online. Nicknames enclosed in parentheses are away, and likely unavailable.",
"$uSee Also:$u helpers, ircops, netinfo");
-"SUSPEND" ("/msg $C SUSPEND <#channel> <nick|*account>",
+"SUSPEND" ("/msg $C SUSPEND <#channel> <nick|*account> <duration>",
"This disables the target's access to the channel. That access can be restored using the unsuspend command.",
+ "The duration may be \"0\" to make it never expire; otherwise, $C will automatically unsuspend the user after $uduration$u.",
"$uSee Also:$u unsuspend, deluser");
"TOPIC" ("/msg $C TOPIC <#channel> [topic]",
"Sets the current topic for the specified channel. If no topic is specified, then set the current topic to the default topic.");
#define MAXOPLEVEL 999
#define MAXMODEPARAMS 6
-#define MAXBANS 45
+#define MAXBANS 999
/* IDLEN is 6 because it takes 5.33 Base64 digits to store 32 bytes. */
#define IDLEN 6
struct logDest_irc *dest = (struct logDest_irc*)dest_;
if (entry->channel_name) {
- send_target_message(4, dest->target, entry->bot, "(%s", strchr(strchr(entry->default_desc, ' '), ':')+1);
+ send_target_message(5, dest->target, entry->bot, "(%s", strchr(strchr(entry->default_desc, ' '), ':')+1);
} else {
- send_target_message(4, dest->target, entry->bot, "%s", strchr(entry->default_desc, ')')+2);
+ send_target_message(5, dest->target, entry->bot, "%s", strchr(entry->default_desc, ')')+2);
}
}
struct logDest_irc *dest = (struct logDest_irc*)dest_;
extern struct userNode *opserv;
- send_target_message(4, dest->target, opserv, "%s %s: %s\n", type->name, log_severity_names[sev], message);
+ send_target_message(5, dest->target, opserv, "%s %s: %s\n", type->name, log_severity_names[sev], message);
}
static struct logDest_vtable ldIrc_vtbl = {
#define KEY_BADWORD_MASK "mask"
#define KEY_BADWORD_TRIGGERED "count"
#define KEY_BADWORD_ACTION "action"
+#define KEY_BADWOR_ALERT "alert"
#define KEY_CHANNELS "channel"
#define KEY_BADWORDID "badwordid"
{ "WDMSG_BADWORD_SET", "Settings for BadWord entry $b%s$b" },
{ "WDMSG_BADWORD_SET_MASK", "$bMASK$b: %s" },
{ "WDMSG_BADWORD_SET_ACTION", "$bACTION$b: %s" },
+ { "WDMSG_BADWORD_SET_ALERT", "$bALERT$b: %d" },
{ NULL, NULL }
};
char *badword_mask;
unsigned int triggered : 29;
unsigned int action : 3;
+ unsigned int alert;
};
struct watchdog_channel {
#define BADACTION_KILL 2
#define BADACTION_GLINE 3
+#define WDMSG_BADWORD_ALERT "%s used badword '%s' in channel: %s"
+
static struct {
const char *nick;
const char *modes;
const char *punishment_reason;
unsigned long ban_duration;
unsigned long gline_duration;
+ struct chanNode *alert_channel;
} watchdog_conf;
const char *watchdog_module_deps[] = { NULL };
static unsigned int last_badword_id = 0;
static struct watchdog_channel *add_channel(const char *name);
-static struct badword *add_badword(const char *badword_mask, unsigned int triggered, unsigned int action, const char *id);
+static struct badword *add_badword(const char *badword_mask, unsigned int triggered, unsigned int action, unsigned int alert, const char *id);
#define watchdog_notice(target, format...) send_message(target , watchdog , ## format)
+#define watchdog_debug(format...) do { if(watchdog_conf.alert_channel) send_channel_message(watchdog_conf.alert_channel , watchdog , ## format); } while(0)
static MODCMD_FUNC(cmd_addbad)
{
}
}
- struct badword *new_badword = add_badword(mask, 0, BADACTION_KICK, NULL);
+ struct badword *new_badword = add_badword(mask, 0, BADACTION_KICK, 0, NULL);
for (it = dict_first(shitlist); it; it = iter_next(it)) {
struct badword *badword = iter_data(it);
if(match_ircglob(badword->badword_mask, new_badword->badword_mask) && badword != new_badword) {
} else {
reply("WDMSG_BADWORD_SET_INVALID", setting);
}
+ }
+ else if(!strcmp("ALERT",setting)) {
+ if (!strcmp("0",value)) {
+ badword->alert = 0;
+ reply("WDMSG_BADWORD_SET_DONE");
+ } else if (!strcmp("1",value)) {
+ badword->alert = 1;
+ reply("WDMSG_BADWORD_SET_DONE");
+ } else {
+ reply("WDMSG_BADWORD_SET_INVALID", setting);
+ }
} else {
reply("WDMSG_BADWORD_SETTING_INVALID", setting);
}
default:
reply("WDMSG_BADWORD_SET_ACTION", "*undef*");
}
+ reply("WDMSG_BADWORD_SET_ALERT", badword->alert);
}
} else {
reply("WDMSG_BADWORD_NOT_FOUND", argv[1]);
count++;
}
tbl.length = count+1;
- tbl.width = 4;
+ tbl.width = 5;
tbl.flags = 0;
tbl.flags = TABLE_NO_FREE;
tbl.contents = malloc(tbl.length * sizeof(tbl.contents[0]));
tbl.contents[0][1] = "Badword";
tbl.contents[0][2] = "Action";
tbl.contents[0][3] = "(Triggered)";
+ tbl.contents[0][4] = "Alert";
if(!count)
{
table_send(cmd->parent->bot, user->nick, 0, NULL, tbl);
tbl.contents[ii][2] = "*undef*";
}
tbl.contents[ii][3] = strtab(bw->triggered);
+ tbl.contents[ii][4] = strtab(bw->alert);
}
table_send(cmd->parent->bot, user->nick, 0, NULL, tbl);
for(ii = 1; ii < tbl.length; ++ii)
char *hostmask;
char *reason = watchdog_conf.punishment_reason;
char mask[IRC_NTOP_MAX_SIZE+3] = { '*', '@', '\0' };
- switch(badword->action) {
- case BADACTION_BAN:
- hostmask = generate_hostmask(user, GENMASK_STRICT_HOST | GENMASK_ANY_IDENT);
- sanitize_ircmask(hostmask);
- if(chan->channel_info) {
- //registered channel
- add_channel_ban(chan->channel_info, hostmask, watchdog->nick, now, now, now + watchdog_conf.ban_duration, reason);
- }
- struct mod_chanmode change;
- mod_chanmode_init(&change);
- change.argc = 1;
- change.args[0].mode = MODE_BAN;
- change.args[0].u.hostmask = hostmask;
- mod_chanmode_announce(watchdog, chan, &change);
- free(hostmask);
-
- case BADACTION_KICK:
- if(GetUserMode(chan, user))
- KickChannelUser(user, chan, watchdog, reason);
- break;
- case BADACTION_KILL:
- DelUser(user, watchdog, 1, reason);
- break;
- case BADACTION_GLINE:
- irc_ntop(mask + 2, sizeof(mask) - 2, &user->ip);
- gline_add(watchdog->nick, mask, watchdog_conf.gline_duration, reason, now, now, 0, 1);
- break;
- default:
- //error?
- break;
- }
+ if(!IsOper(user)) {
+ if(badword->alert == 1) {
+ log_module(MS_LOG, LOG_WARNING, "%s used badword '%s' in channel: %s", user->nick, badword->badword_mask, chan->name);
+ watchdog_debug(WDMSG_BADWORD_ALERT, user->nick, badword->badword_mask, chan->name);
+ }
+ switch(badword->action) {
+ case BADACTION_BAN:
+ hostmask = generate_hostmask(user, GENMASK_STRICT_HOST | GENMASK_ANY_IDENT);
+ sanitize_ircmask(hostmask);
+ if(chan->channel_info) {
+ //registered channel
+ add_channel_ban(chan->channel_info, hostmask, watchdog->nick, now, now, now + watchdog_conf.ban_duration, reason);
+ }
+ struct mod_chanmode change;
+ mod_chanmode_init(&change);
+ change.argc = 1;
+ change.args[0].mode = MODE_BAN;
+ change.args[0].u.hostmask = hostmask;
+ mod_chanmode_announce(watchdog, chan, &change);
+ free(hostmask);
+
+ case BADACTION_KICK:
+ if(GetUserMode(chan, user))
+ KickChannelUser(user, chan, watchdog, reason);
+ break;
+ case BADACTION_KILL:
+ DelUser(user, watchdog, 1, reason);
+ break;
+ case BADACTION_GLINE:
+ irc_ntop(mask + 2, sizeof(mask) - 2, &user->ip);
+ gline_add(watchdog->nick, mask, watchdog_conf.gline_duration, reason, now, now, 0, 1);
+ break;
+ default:
+ //error?
+ break;
+ }
+ }
}
static void
}
static struct badword*
-add_badword(const char *badword_mask, unsigned int triggered, unsigned int action, const char *id)
+add_badword(const char *badword_mask, unsigned int triggered, unsigned int action, unsigned int alert, const char *id)
{
struct badword *badword;
badword->badword_mask = strdup(badword_mask);
badword->triggered = triggered;
badword->action = action;
+ badword->alert = alert;
dict_insert(shitlist, badword->id, badword);
return badword;
}
str = database_get_data(conf_node, "punishment_reason", RECDB_QSTRING);
watchdog_conf.punishment_reason = (str ? str : "Your message contained a forbidden word.");
+
+ str = database_get_data(conf_node, "alert_chan", RECDB_QSTRING);
+ if(str)
+ {
+ watchdog_conf.alert_channel = AddChannel(str, now, "+tinms", NULL);
+ }
+ else
+ {
+ watchdog_conf.alert_channel = NULL;
+ }
}
{
struct record_data *rd = data;
char *badword;
- char *triggered, *action;
+ char *triggered, *action, *alert;
if (rd->type == RECDB_OBJECT) {
dict_t obj = GET_RECORD_OBJECT(rd);
badword = database_get_data(obj, KEY_BADWORD_MASK, RECDB_QSTRING);
triggered = database_get_data(obj, KEY_BADWORD_TRIGGERED, RECDB_QSTRING);
action = database_get_data(obj, KEY_BADWORD_ACTION, RECDB_QSTRING);
+ alert = database_get_data(obj, KEY_BADWOR_ALERT, RECDB_QSTRING);
- add_badword(badword, strtoul(triggered, NULL, 0), strtoul(action, NULL, 0), name);
+ add_badword(badword, strtoul(triggered, NULL, 0), strtoul(action, NULL, 0), strtoul(alert, NULL, 0), name);
}
return 0;
}
saxdb_write_string(ctx, KEY_BADWORD_MASK, badword->badword_mask);
saxdb_write_int(ctx, KEY_BADWORD_TRIGGERED, badword->triggered);
saxdb_write_int(ctx, KEY_BADWORD_ACTION, badword->action);
+ saxdb_write_int(ctx, KEY_BADWOR_ALERT, badword->alert);
saxdb_end_record(ctx);
}
* users, except to add copyright information pertaining
* to changes you make to srvx.
*/
- snprintf(response, sizeof(response), "\x01VERSION %s (%s) %s\x01", PACKAGE_STRING, CODENAME, git_version);
+ snprintf(response, sizeof(response), "\x01VERSION %s (%s) GIT Revision: %s\x01", PACKAGE_STRING, CODENAME, git_version);
irc_notice_user(bot, user, response);
}
return;
if (argc < 2) {
tbl.length = dict_size(services) + 1;
- tbl.width = 4;
+ tbl.width = 5;
tbl.flags = TABLE_PAD_LEFT;
tbl.contents = calloc(tbl.length, sizeof(tbl.contents[0]));
tbl.contents[0] = calloc(tbl.width, sizeof(tbl.contents[0][0]));
tbl.contents[0][1] = "Commands";
tbl.contents[0][2] = "Priv'd?";
tbl.contents[0][3] = "Trigger";
+ tbl.contents[0][4] = "Offchannel";
extra = calloc(2, tbl.length);
for (ii=1, it=dict_first(services); it; it=iter_next(it), ii++) {
service = iter_data(it);
tbl.contents[ii][2] = service->privileged ? "yes" : "no";
extra[ii*2] = service->trigger;
tbl.contents[ii][3] = extra+ii*2;
+ tbl.contents[ii][4] = offchannel_allowed[(unsigned char)service->trigger] ? "yes" : "no";
}
table_send(cmd->parent->bot, user->nick, 0, 0, tbl);
free(extra);
* command or its accessibility to normal IRC users, except to add
* copyright information pertaining to changes you make to srvx.
*/
- send_message_type(4, user, cmd->parent->bot, "$b"PACKAGE_STRING"$b ("CODENAME"), Built: "__DATE__", "__TIME__". Copyright 2000-2008 srvx Development Team.");
- if (argc > 1)
- send_message_type(4, user, cmd->parent->bot, "%s", git_version);
- else
- send_message_type(12, user, cmd->parent->bot, "The srvx Development Team includes Paul Chang, Adrian Dewhurst, Miles Peterson, Michael Poole and others.\nThe srvx Development Team can be reached at http://sf.net/projects/srvx/ or in #srvx on irc.gamesurge.net.\nThis version has been modified by pk910 - visit #srvx @ irc.webgamesnet.net.");
+ send_message_type(4, user, cmd->parent->bot, "$b"PACKAGE_STRING"$b ("CODENAME"), GIT Revision: %s, Built: "__DATE__", "__TIME__". Copyright 2000-2008 srvx Development Team.", git_version);
+ send_message_type(12, user, cmd->parent->bot, "The srvx Development Team includes Paul Chang, Adrian Dewhurst, Miles Peterson, Michael Poole and others.\nThe srvx Development Team can be reached at http://sf.net/projects/srvx/ or in #srvx on irc.gamesurge.net.\nThis version has been modified by pk910 - visit #srvx @ irc.nextirc.net.\nThis version has been modified by Stricted, NurPech - visit #dev @ irc.easy-scripting.net.");
return 1;
}
#define HI_FLAG_BOT 0x00000200
#define HI_FLAG_AUTOHIDE 0x00000400
#define HI_FLAG_INVI 0x00000800
+#define HI_FLAG_OPER 0x00001000
+#define HI_FLAG_NETWORK 0x00002000
/* Flag characters for the above. First char is LSB, etc. */
-#define HANDLE_FLAGS "SphgscfnHbxI"
+#define HANDLE_FLAGS "SphgscfnHbxIoN"
/* HI_STYLE_* go into handle_info.userlist_style */
#define HI_STYLE_DEF 'd'
{ "OSMSG_SVSNICKUSED", "$b%s$b is an already used nickname." },
{ "OSMSG_SVSNICK", "You have renamed $b%s$b to $b%s$b." },
{ "OSMSG_SVSJOIN", "$b%s$b joined $b%s$b." },
+ { "OSMSG_SVSPART", "$b%s$b parted $b%s$b." },
+ { "OSMSG_SVSKILL", "$b%s$b killed: $b%s$b." },
{ "OSMSG_SVSMODE", "You have set mode $b%s$b for $b%s$b." },
{ "OSMSG_SIMUL", "You have simuled $b%s$b: %s" },
{ "OSMSG_DEVNULL_USER" , "[%s] %s %s" },
return 1;
}
+static MODCMD_FUNC(cmd_svspart)
+{
+ struct userNode *target;
+ if(!(target=GetUserH(argv[1]))) {
+ reply("OSMSG_SVSNONICK", argv[1]);
+ return 0;
+ }
+ if(!IsChannelName(argv[2]))
+ {
+ reply("MSG_NOT_CHANNEL_NAME");
+ return 0;
+ }
+ irc_svspartchan(opserv,target,argv[2]);
+ reply("OSMSG_SVSPART",target->nick,argv[2]);
+ return 1;
+}
+
+static MODCMD_FUNC(cmd_svskill)
+{
+ struct userNode *target;
+ if(!(target=GetUserH(argv[1]))) {
+ reply("OSMSG_SVSNONICK", argv[1]);
+ return 0;
+ }
+ DelUser(target, opserv, 1, argv[2]);
+ reply("OSMSG_SVSKILL",target->nick,argv[2]);
+ return 1;
+}
static MODCMD_FUNC(cmd_svsnick)
{
struct userNode *target;
{
struct userNode *target;
char *line;
- if(!(target=GetUserH(argv[1]))) {
- reply("OSMSG_SVSNONICK", argv[1]);
- return 0;
+ if(argc > 2) {
+ if(!(target=GetUserH(argv[1]))) {
+ reply("OSMSG_SVSNONICK", argv[1]);
+ return 0;
+ }
+ line = unsplit_string(argv + 2, argc - 2, NULL);
+ irc_simul(target,line);
+ reply("OSMSG_SIMUL",target->nick,line);
+ return 1;
}
- line = unsplit_string(argv + 2, argc - 2, NULL);
- irc_simul(target,line);
- reply("OSMSG_SIMUL",target->nick,line);
- return 1;
+ return 0;
}
static MODCMD_FUNC(cmd_relay)
opserv_define_func("DEVNULL SET", cmd_setdevnull, 200, 0, 2);
opserv_define_func("DEVNULL LIST", cmd_listdevnull, 200, 0, 0);
opserv_define_func("SVSJOIN", cmd_svsjoin, 800, 0, 3);
+ opserv_define_func("SVSPART", cmd_svspart, 800, 0, 3);
+ opserv_define_func("SVSKILL", cmd_svskill, 800, 0, 3);
opserv_define_func("SVSMODE", cmd_svsmode, 800, 0, 3);
opserv_define_func("SVSNICK", cmd_svsnick, 800, 0, 3);
opserv_define_func("RELAY", cmd_relay, 800, 0, 0);
- opserv_define_func("SIMUL", cmd_simul, 999, 0, 2);
+ opserv_define_func("SIMUL", cmd_simul, 999, 0, 3);
opserv_define_func("TRACE", cmd_trace, 100, 0, 3);
opserv_define_func("TRACE PRINT", NULL, 0, 0, 0);
opserv_define_func("TRACE COUNT", NULL, 0, 0, 0);
#define CMD_SVSNICK "SVSNICK"
#define CMD_SVSMODE "SVSMODE"
#define CMD_SVSJOIN "SVSJOIN"
+#define CMD_SVSPART "SVSPART"
#define CMD_TIME "TIME"
#define CMD_TOPIC "TOPIC"
#define CMD_TRACE "TRACE"
#define TOK_SVSNICK "SN"
#define TOK_SVSMODE "SM"
#define TOK_SVSJOIN "SJ"
+#define TOK_SVSPART "SP"
#define TOK_TIME "TI"
#define TOK_TOPIC "T"
#define TOK_TRACE "TR"
#define P10_SVSNICK TYPE(SVSNICK)
#define P10_SVSMODE TYPE(SVSMODE)
#define P10_SVSJOIN TYPE(SVSJOIN)
+#define P10_SVSPART TYPE(SVSPART)
#define P10_TIME TYPE(TIME)
#define P10_TOPIC TYPE(TOPIC)
#define P10_TRACE TYPE(TRACE)
putsock("%s " P10_SVSJOIN " %s %s", from->numeric, user->numeric, chan);
}
+void
+irc_svspart(struct userNode *from, struct userNode *user, struct chanNode *chan)
+{
+putsock("%s " P10_SVSPART " %s %s", from->numeric, user->numeric, chan->name);
+}
+
+void
+irc_svspartchan(struct userNode *from, struct userNode *user, const char *chan)
+{
+putsock("%s " P10_SVSPART " %s %s", from->numeric, user->numeric, chan);
+}
+
void
irc_eob(void)
{
void irc_svsmode(struct userNode *from, struct userNode *user, const char *modes);
void irc_svsjoin(struct userNode *from, struct userNode *user, struct chanNode *chan);
void irc_svsjoinchan(struct userNode *from, struct userNode *user, const char *chan);
+void irc_svspart(struct userNode *from, struct userNode *user, struct chanNode *chan);
+void irc_svspartchan(struct userNode *from, struct userNode *user, const char *chan);
void irc_relay(char *message);
void irc_simul(struct userNode *target, char *command);
dict_t killed_users_dict;
#define spamserv_notice(target, format...) send_message(target , spamserv , ## format)
-#define spamserv_debug(format...) do { if(spamserv_conf.debug_channel) send_channel_notice(spamserv_conf.debug_channel , spamserv , ## format); } while(0)
+#define spamserv_debug(format...) do { if(spamserv_conf.debug_channel) send_channel_message(spamserv_conf.debug_channel , spamserv , ## format); } while(0)
#define ss_reply(format...) send_message(user , spamserv , ## format)
#define SET_SUBCMDS_SIZE 10
badwordid = str ? atoi(str) : 0;
cInfo->last_badword_id = badwordid;
if ((badwords = database_get_data(hir->d.object, KEY_BADWORDS, RECDB_OBJECT)))
- dict_foreach(object, spamserv_saxdb_read_shitlist, cInfo);
+ dict_foreach(badwords, spamserv_saxdb_read_shitlist, cInfo);
}
}
else
"max_chan_users" "512";
// maximum bans on a channel banlist
"max_chan_bans" "512";
+ //min time of timebans
+ "min_time_bans" "5";
// maximum length of a user's infoline
"max_userinfo_length" "400";
// If DynLimit is on and there are N users in the channel, ChanServ will
"ban_duration" "2h"; //only if the channel is registered with chanserv
"gline_duration" "1h";
"punishment_reason" "Your message contained a forbidden word.";
+ "alert_chan" "#opers";
};
"hostserv" {