/*
* IMC2 - an inter-mud communications protocol
*
* ice.c: IMC-channel-extensions (ICE) common code
*
* Copyright (C) 1997 Oliver Jowett <oliver@jowett.manawatu.planet.co.nz>
*
* 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 (see the file COPYING); if not, write to the
* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include "imc.h"
#include "ice.h"
/* see if someone can talk on a channel - lots of string stuff here! */
int ice_audible(ice_channel *c, const char *who)
{
/* checking a mud? */
if (!strchr(who, '@'))
{
char arg[IMC_DATA_LENGTH];
const char *p;
int invited=0;
if (c->policy != ICE_PRIVATE)
return 1;
if (!strcasecmp(ice_mudof(c->name), imc_name))
return 1;
/* Private channel - can only hear if someone with the right mud name is
* there.
*/
p=imc_getarg(c->invited, arg, IMC_NAME_LENGTH);
while (arg[0])
{
if (!strcasecmp(who, arg) ||
!strcasecmp(who, imc_mudof(arg)))
{
invited=1;
break;
}
p=imc_getarg(p, arg, IMC_NAME_LENGTH);
}
if (!invited)
return 0;
p=imc_getarg(c->excluded, arg, IMC_NAME_LENGTH);
while (arg[0])
{
if (!strcasecmp(who, arg) ||
!strcasecmp(who, imc_mudof(arg)))
return 0;
p=imc_getarg(p, arg, IMC_NAME_LENGTH);
}
return 1;
}
/* owners and operators always can */
if (!strcasecmp(c->owner, who) ||
imc_hasname(c->operators, who))
return 1;
/* ICE locally can use any channel */
if (!strcasecmp(imc_nameof(who), "ICE") &&
!strcasecmp(imc_mudof(who), imc_name))
return 1;
if (c->policy == ICE_OPEN)
{
/* open policy. default yes. override with excludes, then invites */
if ((imc_hasname(c->excluded, who) ||
imc_hasname(c->excluded, imc_mudof(who))) &&
!imc_hasname(c->invited, who) &&
!imc_hasname(c->invited, imc_mudof(who)))
return 0;
else
return 1;
}
/* closed or private. default no, override with invites, then excludes */
if ((imc_hasname(c->invited, who) ||
imc_hasname(c->invited, imc_mudof(who))) &&
!imc_hasname(c->excluded, who) &&
!imc_hasname(c->excluded, imc_mudof(who)))
return 1;
else
return 0;
}
const char *ice_mudof(const char *fullname)
{
char *buf=imc_getsbuf(IMC_PNAME_LENGTH);
char *where=buf;
int count=0;
while (*fullname && *fullname != ':' && count < IMC_PNAME_LENGTH-1)
*where++=*fullname++, count++;
*where = 0;
imc_shrinksbuf(buf);
return buf;
}
const char *ice_nameof(const char *fullname)
{
char *buf=imc_getsbuf(IMC_MNAME_LENGTH);
char *where;
where=strchr(fullname, ':');
if (!where)
imc_sncpy(buf, fullname, IMC_MNAME_LENGTH);
else
imc_sncpy(buf, where+1, IMC_MNAME_LENGTH);
imc_shrinksbuf(buf);
return buf;
}