/* $Id: com.c,v 1.3 1993/08/22 04:53:48 nils Exp $ */
#include "config.h"
#include "externs.h"
static int is_on_channel P((dbref,char *));
static int is_on_channel(player,chan)
dbref player;
char *chan;
{
char *clist;
char *clbegin;
static char buf[1025];
sprintf(buf,"%s ",atr_get(player,A_CHANNEL));
clbegin=clist=buf;
while(*clist) {
if(strchr(clist,' '))
*strchr(clist,' ') ='\0';
if(!strcmp(clist,chan)) {
return (clist-clbegin);
}
clist+=strlen(clist)+1;
}
return -1;
}
extern void com_send (channel, message)
char *channel;
char *message;
{
struct descriptor_data *d;
for (d = descriptor_list; d; d=d->next)
if (d->state==CONNECTED && d->player>0 && is_on_channel(d->player, channel)>=0) {
queue_string(d, message);
queue_string(d, "\n");
}
}
static void com_who P((dbref, char *));
static void com_who (player, channel)
dbref player;
char *channel;
{
struct descriptor_data *d;
for (d = descriptor_list; d; d=d->next)
if (d->state==CONNECTED && d->player>0 && is_on_channel(d->player, channel)>=0) {
notify(player,tprintf("%s is on channel %s.",
unparse_object(player,d->player),channel));
}
notify(player,tprintf ("--- %s ---",channel));
}
void do_com(player, arg1, arg2)
dbref player;
char *arg1;
char *arg2;
{
if (!*arg1) {
static char buf[1024];
char *s;
strcpy(buf,atr_get(player,A_CHANNEL));
if ((s=strchr(buf,' ')))
*s = '\0';
arg1 = buf;
}
if (!*arg1) {
notify(player,"no channel.");
return;
}
if (strchr(arg1,' ')) {
notify(player,"you're spacey.");
return;
}
if (!string_compare(arg2,"who"))
com_who(player,arg1);
else {
char buf[2048];
if (Typeof(player) != TYPE_PLAYER && !power(player,POW_SPOOF)) {
notify(player,"non-players can not send +com messsages.");
return;
}
sprintf (buf, "[%s] %s%s %s",arg1,db[player].name,(*arg2 == ':')?"":":",
(*arg2 == ':')?(arg2+1):arg2);
com_send(arg1, buf);
if (is_on_channel(player,arg1)<0)
notify(player,"your +com has been sent! yay!");
}
}
void do_channel(player,arg1)
dbref player;
char *arg1;
{
ptype k;
char buf[1024];
if(*arg1 == '\0') {
if(*atr_get(player,A_CHANNEL))
notify(player,tprintf("You are currently on the following channels: %s",
atr_get(player,A_CHANNEL)));
else {
notify(player,"You aren't currently on any channels. For a general chatting channel, turn to");
notify(player,"channel 'public'");
}
} else if(*arg1 == '+') {
arg1++;
if(Typeof(player)!=TYPE_PLAYER) {
notify(player,"as of yet, non-players cannot talk on channels.");
return;
}
if (!db[player].pows) return;
k= *db[player].pows;
if(*arg1 == '*' &&
!(k==CLASS_ADMIN ||
k==CLASS_DIR)) {
notify(player,"Permission denied!");
return;
}
if(*arg1 == '.' &&
!(k==CLASS_DIR ||
k==CLASS_ADMIN ||
k==CLASS_BUILDER)) {
notify(player,"Permission denied!");
return;
}
if(*arg1 == '_' &&
!(k==CLASS_DIR ||
k==CLASS_ADMIN ||
k==CLASS_BUILDER ||
k==CLASS_OFFICIAL ||
k==CLASS_JUNOFF)) {
notify(player,"Permission denied!");
return;
}
if (strchr(arg1,' ')) {
notify(player,"Sorry, channel names can not have spaces in them.");
return;
}
if (!*arg1) {
notify(player,"what channel?");
return;
}
if (is_on_channel(player,arg1)>=0) {
notify(player,"You are already on that channel.");
return;
}
if(!*atr_get(player,A_CHANNEL))
atr_add(player,A_CHANNEL,arg1);
else
atr_add(player,A_CHANNEL,tprintf("%s %s",arg1,atr_get(player,A_CHANNEL)));
sprintf(buf,"[%s] %s has joined this channel.",arg1 , db[player].name);
com_send(arg1,buf);
notify(player,tprintf("%s added to your channel list.",arg1));
} else if(*arg1 == '-') {
int i;
char *end;
char buf2[1024];
arg1++;
if (strchr(arg1,' ') || !*arg1) {
notify(player,"sigh. such sillyness. try a less spacey channel name.");
return;
}
i = is_on_channel(player, arg1);
if (i<0) {
notify(player,"you aren't on that channel.");
return;
}
strcpy(buf,atr_get(player,A_CHANNEL));
end = strchr(buf+i,' ');
if (!end)
end=strchr(buf+i,'\0');
else
end++;
strcpy (buf2, atr_get(player,A_CHANNEL));
strcpy(buf2+i, end);
if ((end=strchr(buf2,'\0')) && *--end==' ') *end='\0';
notify(player,tprintf("%s has been deleted from your channel list.",
arg1));
sprintf(buf,"[%s] %s has left this channel.",arg1,db[player].name);
com_send(arg1,buf);
atr_add (player, A_CHANNEL, buf2);
} else {
notify(player,"Usage:");
notify(player," +channel +<channel> :adds a channel");
notify(player," +channel -<channel> :deletes a channel");
notify(player," +channel :lists your channels.");
notify(player,"For a general chatting channel, try channel 'public'.");
}
}