/*
* ctcp.c: client to client protocol
*
* Copyright(c) 1997-2000 - All Rights Reserved
*
* See the COPYRIGHT file.
*/
#ifndef lint
static char rcsid[] = "@(#)$Id: ctcp.c,v 1.14 2000/07/31 22:33:55 kalt Exp $";
#endif
#include "os.h"
#include "struct.h"
#include "server.h"
#include "utils.h"
#include "patchlevel.h"
extern int cmd_msgnotice(char *, char *);
/*
* user commands
*/
/* cmd_ctcp: send out a CTCP request */
int
cmd_ctcp(p)
char *p;
{
char *wp, *wp2, wbuf[512];
wp = index(p, ' ');
if (!wp)
return -1;
*wp++ = '\0';
wp2 = wp;
while (*wp2 && *wp2 != ' ')
{
*wp2 = toupper(*wp2);
wp2++;
}
sprintf(wbuf, "%s \001%s\001", p, wp);
return cmd_msgnotice("PRIVMSG", wbuf);
}
/* cmd_ping: ping a user */
int
cmd_ping(p)
char *p;
{
char buf[512];
if (!*p)
return -1;
if (index(p, ' '))
return -4;
sprintf(buf, "%s PING %lu", p, time(NULL));
return cmd_ctcp(buf);
}
/*
* basic flood protection stuff.
* I've always said it's easy, and it is, but this is a simple method
* which I don't like much. I'll improve it when I get a chance.
*/
static time_t last_t = 0;
static char last_cnt;
void
sic_ctcp(nick, toself, txt)
char *nick, *txt;
char toself;
{
char *b, *e, *s;
int cnt = 0;
char reply[512] = "", temp[512];
if ((time(NULL) - last_t) < 10)
{
if (++last_cnt >= 3)
return;
}
else
{
last_t = time(NULL);
last_cnt = 1;
}
sprintf(reply, "%s ", nick);
while (b = index(txt, '\001'))
{
if ((e = index(++b, '\001')) == NULL)
break;
if ((s = index(b, ' ')) == NULL)
s = e;
*s = '\0';
temp[0] = '\0';
if (!strcmp("CLIENTINFO", b))
strcpy(temp, "\001CLIENTINFO CLIENTINFO PING TIME VERSION\001");
else if (!strcmp("PING", b))
{
char *sp = index(s+1, ' ');
if (sp && sp < e)
{
*sp++ = '\001';
*sp = '\000';
}
sprintf(temp, "\001PING %s", (s != e) ? s+1 : "");
}
else if (!strcmp("TIME", b))
{
char btime[80];
time_t t;
int gmtoff;
struct tm lt, gmt;
const char *wday[7]={"Sun", "Mon", "Tue", "Wed", "Thu", "Fri","Sat"};
const char *mth[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
t = time(NULL);
lt = *localtime(&t);
gmt = *gmtime(&t);
gmtoff = (lt.tm_hour - gmt.tm_hour) * 60 + lt.tm_min - gmt.tm_min;
if (lt.tm_year < gmt.tm_year)
gmtoff -= 24 * 60;
else if (lt.tm_year > gmt.tm_year)
gmtoff += 24 * 60;
else if (lt.tm_yday < gmt.tm_yday)
gmtoff -= 24 * 60;
else if (lt.tm_yday > gmt.tm_yday)
gmtoff += 24 * 60;
sprintf(temp, "\001TIME %s, %d %s %s %2.2d%2.2d\001",
wday[lt.tm_wday], lt.tm_mday, mth[lt.tm_mon],
my_cftime(btime, 80, "%Y %R", t),
(int) (gmtoff/60), (int) (gmtoff%60));
}
else if (!strcmp("VERSION", b))
sprintf(temp, "\001VERSION sic %s\001", version);
if (s)
if (s == e)
*s = '\001';
else
*s = ' ';
if (strlen(temp) + strlen(reply) > 256)
break;
strcat(reply, temp);
if (cnt++ > 4)
break;
txt = e+1;
}
if (cnt > 0 && cnt <= 5)
cmd_msgnotice("NOTICE", reply);
else
{
}
}
syntax highlighted by Code2HTML, v. 0.9.1