muse1.7b4/
muse1.7b4/config/
muse1.7b4/doc/
muse1.7b4/run/
muse1.7b4/run/db/
muse1.7b4/src/
muse1.7b4/src/db/
muse1.7b4/src/files/
muse1.7b4/src/io/
muse1.7b4/src/prog/
muse1.7b4/src/util/
/* $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'.");
  }
}