Initial commit of code released on 2002-07-15
This commit is contained in:
405
Sources/privmsg.c
Normal file
405
Sources/privmsg.c
Normal file
@@ -0,0 +1,405 @@
|
||||
/* @(#)$Id: privmsg.c,v 1.22 2000/10/24 16:04:24 seks Exp $ */
|
||||
|
||||
/* Undernet Channel Service (X)
|
||||
* Copyright (C) 1995-2002 Robin Thellend
|
||||
*
|
||||
* 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 2 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* The author can be contact by email at <csfeedback@robin.pfft.net>
|
||||
*
|
||||
* Please note that this software is unsupported and mostly
|
||||
* obsolete. It was replaced by GNUworld/CMaster. See
|
||||
* http://gnuworld.sourceforge.net/ for more information.
|
||||
*/
|
||||
|
||||
#include "h.h"
|
||||
|
||||
void privmsg(char *source, char *target, char *body)
|
||||
{
|
||||
register auser *user;
|
||||
register achannel *chan;
|
||||
register char *ptr;
|
||||
char global[] = "*";
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("PRIVMSG from %s to %s\n", source, target);
|
||||
#endif
|
||||
|
||||
if ((*target == '#' || *target == '$') && strchr(target, '*'))
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("Received WALL... ignoring.. \n");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
/* CTCP */
|
||||
if (body[1] == '\001' && (ptr = strchr(body + 2, '\001')) != NULL)
|
||||
{
|
||||
if (*target == '#' || *target == '&')
|
||||
{
|
||||
if (CheckFlood(source, target, strlen(ToWord(1, body + 1))))
|
||||
return;
|
||||
}
|
||||
|
||||
*ptr = '\0';
|
||||
if (!IsIgnored(source) &&
|
||||
!CheckPrivateFlood(source, strlen(body), "CTCP-"))
|
||||
parse_ctcp(source, target, body + 2);
|
||||
}
|
||||
|
||||
/* PRIVMSG TO A CHANNEL */
|
||||
else if (*target == '#' || *target == '&')
|
||||
{
|
||||
/* PRIVMSG #blah@channels.undernet.org ?? */
|
||||
if (!(chan = ToChannel(target)))
|
||||
return;
|
||||
chan->lastact = now;
|
||||
user = ToUser(target, source);
|
||||
if (!user)
|
||||
return; /* not on channel.. happens if not +n */
|
||||
user->lastact = now;
|
||||
|
||||
if (CheckFlood(source, target, strlen(ToWord(1, body + 1))))
|
||||
return;
|
||||
|
||||
if (!strncmp(body + 1, COMMAND_PREFIX, strlen(COMMAND_PREFIX)))
|
||||
parse_command(source, target, target, body + strlen(COMMAND_PREFIX) + 1);
|
||||
|
||||
/* PRIVATE PRIVMSG */
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!IsIgnored(source) && !CheckPrivateFlood(source, strlen(body), "MSG-"))
|
||||
{
|
||||
#ifdef FAKE_UWORLD
|
||||
if (!strcasecmp(target, UFAKE_NICK))
|
||||
{
|
||||
parse_uworld_command(source, body + 1);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
parse_command(source, target, global, body + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void parse_command(char *source, char *target, char *channel, char *commandline)
|
||||
{
|
||||
char buffer[1024];
|
||||
char command[80];
|
||||
char global[] = "*";
|
||||
register aluser *user;
|
||||
|
||||
GetWord(0, commandline, command);
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("PARSING COMMAND: %s\nCOMMAND: %s\nARGS: %s\nSOURCE: %s\n",
|
||||
commandline, command, ToWord(1, commandline), source);
|
||||
#endif
|
||||
|
||||
user = ToLuser(source);
|
||||
|
||||
/* all commands must come from a user */
|
||||
if (user == NULL)
|
||||
return;
|
||||
|
||||
if (strcasecmp(command, "pass") && strcasecmp(command, "login") &&
|
||||
strcasecmp(command, "newpass"))
|
||||
{
|
||||
sprintf(buffer, "COMMAND FROM %s!%s@%s on %s: %s",
|
||||
user->nick, user->username, user->site,
|
||||
channel, commandline);
|
||||
log(buffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(buffer, "COMMAND FROM %s!%s@%s on %s: %s XXXXXXX",
|
||||
user->nick, user->username, user->site,
|
||||
channel, command);
|
||||
log(buffer);
|
||||
}
|
||||
|
||||
if (!strcmp(command, "showcommands"))
|
||||
showcommands(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "pass") || !strcmp(command, "login"))
|
||||
validate(source, target, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "deauth"))
|
||||
DeAuth(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "die") && Access(global, source) >= LEVEL_DIE)
|
||||
quit(ToWord(1, commandline), 0);
|
||||
|
||||
else if (!strcmp(command, "restart") && Access(global, source) >= LEVEL_DIE)
|
||||
restart(ToWord(1, commandline)); /* added by Kev; restarts */
|
||||
|
||||
else if (!strcmp(command, "search"))
|
||||
SearchChan(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "join"))
|
||||
join(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "part"))
|
||||
part(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "op"))
|
||||
op(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "deop"))
|
||||
deop(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "banlist"))
|
||||
showbanlist(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "kick"))
|
||||
kick(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "invite"))
|
||||
invite(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "topic"))
|
||||
topic(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "adduser"))
|
||||
AddUser(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "remuser"))
|
||||
RemoveUser(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "modinfo"))
|
||||
ModUserInfo(source, target, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "newpass"))
|
||||
ChPass(source, target, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "set"))
|
||||
SetChanFlag(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "access"))
|
||||
showaccess(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "suspend"))
|
||||
suspend(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "unsuspend"))
|
||||
unsuspend(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "saveuserlist"))
|
||||
SaveUserList(source, channel);
|
||||
|
||||
else if (!strcmp(command, "lbanlist"))
|
||||
ShowShitList(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "ban"))
|
||||
AddToShitList(source, channel, ToWord(1, commandline), 0);
|
||||
|
||||
else if (!strcmp(command, "unban"))
|
||||
RemShitList(source, channel, ToWord(1, commandline), 0);
|
||||
|
||||
else if (!strcmp(command, "cleanbanlist"))
|
||||
CleanShitList(source, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "addchan"))
|
||||
AddChan(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "remchan"))
|
||||
RemChan(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "savedefs"))
|
||||
SaveDefs(source);
|
||||
|
||||
else if (!strcmp(command, "loaddefs"))
|
||||
LoadDefs(source);
|
||||
|
||||
else if (!strcmp(command, "saveshitlist"))
|
||||
SaveShitList(source, channel);
|
||||
|
||||
else if (!strcmp(command, "loadshitlist"))
|
||||
LoadShitList(source);
|
||||
|
||||
else if (!strcmp(command, "status"))
|
||||
showstatus(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "map"))
|
||||
showmap(source);
|
||||
|
||||
else if (!strcmp(command, "help"))
|
||||
showhelp(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "chaninfo"))
|
||||
ShowChanInfo(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "motd"))
|
||||
showmotd(source);
|
||||
|
||||
else if (!strcmp(command, "isreg"))
|
||||
isreg(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "core"))
|
||||
dumpcore(source);
|
||||
|
||||
#ifdef RUSAGE_SELF
|
||||
else if (!strcmp(command, "rusage"))
|
||||
show_rusage(source);
|
||||
#endif
|
||||
|
||||
else if (!strcmp(command, "showignore"))
|
||||
ShowIgnoreList(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "remignore"))
|
||||
AdminRemoveIgnore(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "calmdown"))
|
||||
CalmDown(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "operjoin"))
|
||||
OperJoin(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "operpart"))
|
||||
OperPart(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "clearmode"))
|
||||
ClearMode(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "purge"))
|
||||
purge(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "verify"))
|
||||
verify(source, ToWord(1, commandline));
|
||||
|
||||
#ifdef UPGRADE
|
||||
else if (!strcmp(command, "upgrade"))
|
||||
upgrade(source, ToWord(1, commandline));
|
||||
#endif
|
||||
|
||||
else if (!strcmp(command, "random"))
|
||||
RandomChannel(source);
|
||||
|
||||
else if (!strcmp(command, "say"))
|
||||
Say(source, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "servnotice"))
|
||||
ServNotice(source, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "fuck"))
|
||||
notice(source, "This command is obsolete");
|
||||
|
||||
#ifdef DEBUG
|
||||
else if (!strcmp(command, "db"))
|
||||
db_test(source, channel, ToWord(1, commandline));
|
||||
#endif
|
||||
|
||||
#ifdef DOHTTP
|
||||
else if (!strcmp(command, "rehash"))
|
||||
read_http_conf(source);
|
||||
#endif
|
||||
#ifdef FAKE_UWORLD
|
||||
else if (!strcmp(command, "uworld"))
|
||||
Uworld_switch(source, channel, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "opersuspend"))
|
||||
OperSuspend(source, ToWord(1, commandline));
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
else if (!strcmp(command, "showusers"))
|
||||
showusers(ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "showchannels"))
|
||||
showchannels();
|
||||
#endif
|
||||
|
||||
#ifdef NICKSERV
|
||||
else if (!strcmp(command, "nickserv"))
|
||||
nserv_nickserv(source, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "addnick"))
|
||||
nserv_addnick(source, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "remnick"))
|
||||
nserv_remnick(source, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "addmask"))
|
||||
nserv_addmask(source, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "remmask"))
|
||||
nserv_remmask(source, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "nickinfo"))
|
||||
nserv_nickinfo(source, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "identify"))
|
||||
nserv_identify(source, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "ghost"))
|
||||
nserv_ghost(source, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "nicknewpass"))
|
||||
nserv_nicknewpass(source, ToWord(1, commandline));
|
||||
|
||||
else if (!strcmp(command, "nicknewemail"))
|
||||
nserv_nicknewemail(source, ToWord(1, commandline));
|
||||
#endif
|
||||
#ifdef DOHTTP
|
||||
else if (!strcmp(command, "dccme"))
|
||||
DccMe(source, ToWord(1, commandline));
|
||||
#endif
|
||||
}
|
||||
|
||||
void parse_ctcp(char *source, char *target, char *body)
|
||||
{
|
||||
char func[80];
|
||||
char buffer[1024];
|
||||
char tmp[80];
|
||||
|
||||
GetWord(0, body, func);
|
||||
body = ToWord(1, body);
|
||||
|
||||
if (strcmp(func, "ACTION"))
|
||||
{
|
||||
sprintf(buffer, "CTCP %s from %s [%s]", func, source, body);
|
||||
log(buffer);
|
||||
}
|
||||
|
||||
if (match(func, "PING"))
|
||||
{
|
||||
sprintf(buffer, "\001PING %s\001", body);
|
||||
notice(source, buffer);
|
||||
}
|
||||
else if (match(func, "TIME"))
|
||||
{
|
||||
strcpy(tmp, ctime(&now));
|
||||
*strchr(tmp, '\n') = '\0';
|
||||
sprintf(buffer, "\001TIME %s\001", tmp);
|
||||
notice(source, buffer);
|
||||
}
|
||||
else if (match(func, "ITIME"))
|
||||
{
|
||||
sprintf(buffer, "\001ITIME @%03ld\001",
|
||||
1000 * ((now + 3600) % 86400) / 86400);
|
||||
notice(source, buffer);
|
||||
}
|
||||
else if (match(func, "VERSION"))
|
||||
{
|
||||
sprintf(buffer, "\001VERSION %s\001", VERSION);
|
||||
notice(source, buffer);
|
||||
}
|
||||
else if (match(func, "GENDER"))
|
||||
{
|
||||
notice(source, "\001GENDER I'm a male bot! Are you a pretty young bottesse?\001");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user