gurba-0.40/
gurba-0.40/bin/
gurba-0.40/lib/
gurba-0.40/lib/cmds/guild/fighter/
gurba-0.40/lib/cmds/monster/
gurba-0.40/lib/cmds/race/catfolk/
gurba-0.40/lib/cmds/race/dwarf/
gurba-0.40/lib/cmds/verb/
gurba-0.40/lib/daemons/data/
gurba-0.40/lib/data/boards/
gurba-0.40/lib/data/messages/
gurba-0.40/lib/data/players/
gurba-0.40/lib/design/
gurba-0.40/lib/domains/gurba/
gurba-0.40/lib/domains/gurba/guilds/fighter/
gurba-0.40/lib/domains/gurba/monsters/
gurba-0.40/lib/domains/gurba/objects/armor/
gurba-0.40/lib/domains/gurba/objects/clothing/
gurba-0.40/lib/domains/gurba/objects/weapons/
gurba-0.40/lib/domains/gurba/vendors/
gurba-0.40/lib/kernel/cmds/admin/
gurba-0.40/lib/kernel/daemons/
gurba-0.40/lib/kernel/include/
gurba-0.40/lib/kernel/lib/
gurba-0.40/lib/kernel/net/
gurba-0.40/lib/kernel/sys/
gurba-0.40/lib/logs/
gurba-0.40/lib/pub/
gurba-0.40/lib/std/modules/languages/
gurba-0.40/lib/std/races/
gurba-0.40/lib/std/races/monsters/
gurba-0.40/lib/wiz/fudge/
gurba-0.40/lib/wiz/spud/
gurba-0.40/src/host/beos/
gurba-0.40/src/host/pc/res/
gurba-0.40/src/kfun/
gurba-0.40/src/lpc/
gurba-0.40/src/parser/
gurba-0.40/tmp/
inherit M_MESSAGES;

mapping permanent;
mapping colors;
mapping imud;
mapping guilds;
static mapping channels;
static mapping listeners;

#include <channel.h>

void restore_me( void );
void save_me( void );
void chan_new( string name, int flags );
void chan_join( string chan, object ob );
void chan_leave( string chan, object ob );
void chan_say( string chan, string what );
void chan_emote( string chan, string what );
void chan_who( string chan );
int query_subscribed( string chan );
void chan_make_permanent( string name );
void chan_set_color( string chan, string col );
void chan_set_guild( string chan, string guild );
void chan_set_flag( string chan, int flag );
void chan_imud( string chan, string name );

void create( void ) {
  string *chans;
  int i;

  permanent = ([ ]);
  channels = ([ ]);
  listeners = ([ ]);
  colors = ([ ]);
  imud = ([ ]);
  guilds = ([ ]);
  restore_me();
  chans = map_indices( permanent );
  for( i = 0; i < sizeof( chans ); i++ ) {
    channels[chans[i]] = permanent[chans[i]];
  }

  EVENT_D->subscribe_event( "player_login" );
  EVENT_D->subscribe_event( "player_logout" );
  EVENT_D->subscribe_event( "new_player" );
}
void chan_cmd( string chan, string cmd ) {

  switch( cmd ) {
  case "/on":
  case "/join":
    chan_join( chan, this_player() );
    this_player()->add_channel( chan );
    break;
  case "/off":
  case "/leave":
  case "/quit":
    chan_leave( chan, this_player() );
    this_player()->remove_channel( chan );
    write( "Not subscribed to " + chan + ".\n" );
    break;
  case "/new":
    chan_new( chan, ALL );
    break;
  case "/admin":
    chan_set_flag( chan, ADMIN_ONLY );
    break;
  case "/wiz":
    chan_set_flag( chan, WIZ_ONLY );
    break;
  case "/readonly":
    chan_set_flag( chan, READ_ONLY );
    break;
  case "/permanent":
    chan_make_permanent( chan );
    break;
  case "":
  case "/who":
  case "/list":
    chan_who( chan );
    break;
  case "/delete":
    break;
  case "/info":
    break;
  default:
    if( strlen( cmd ) > 8 )
      if( cmd[..5] == "/color" ) {
	/* Let's change the color of the channel */
	chan_set_color( chan, cmd[7..] );
	break;
      } else if( cmd[..4] == "/imud" ) {
	chan_imud( chan, cmd[6..] );
	break;
      } else if( cmd[..5] == "/guild" ) {
	chan_set_guild( chan, cmd[7..] );
	break;
      }
    if( cmd[0] == ';' ) {
      chan_emote( chan, cmd[1..] );
      break;
    }
    chan_say( chan, cmd );
    return;
  }
}

void restore_me( void ) {
  restore_object( "/daemons/data/channel_d.o" );
}

void save_me( void ) {
  save_object( "/daemons/data/channel_d.o" );
}

void chan_set_flag( string chan, int flag ) {

  channels[chan] = flag;
  if( permanent[chan] )
    permanent[chan] = channels[chan];
  
  save_me();
}

void chan_make_permanent( string name ) {
  if( SECURE_D->query_admin( this_player()->query_name() ) != 1 ) {
    write( "Access denied.\n" );
    return;
  }

  permanent[name] = channels[name];
  save_me();
  write( "Channel " + name + " is permanent.\n" );
}

void chan_imud( string chan, string name ) {

  if( SECURE_D->query_admin( this_player()->query_name() ) != 1 ) {
    write( "Access denied.\n" );
    return;
  }

  if( channels[chan] == 0 ) {
    write( "Channel doesn't exists.\n" );
    return;
  }

  if( imud == 0 ) 
    imud = ([ ]);
  imud[name] = chan;
  save_me();
}

void chan_new( string name, int flags ) {

  name = lowercase( name );

  if( SECURE_D->query_wiz( this_player()->query_name() ) != 1 ) {
    write( "Access denied.\n" );
    return;
  }

  if( channels[name] != 0 ) {
    write( "Channel already exists.\n" );
    return;
  }
  channels[name] = flags;
  write( "Channel created.\n" );
}

void chan_join( string chan, object ob ) {

  chan = lowercase( chan );

  if( channels[chan] == 0 ) {
    write( "No such channel." );
    return;
  }

  if( channels[chan] < READ_ONLY ) {
    if( SECURE_D->query_priv( ob->query_name() ) < channels[chan] - 1 ) {
      write( "No such channel.\n" );
      return;
    }
  }

  if( guilds == 0 )
    guilds = ([ ]);

  if( guilds[chan] != 0 ) {
    if( ob->guild_member( guilds[chan] ) == 0 ) {
      write( "No such channel.\n" );
      return;
    }
      
  }

  if( listeners[chan] == 0 ) {
    listeners[chan] = ({ });
  }
  listeners[chan] -= ({ ob });
  listeners[chan] += ({ ob });
  write( "Subscribed to " + chan + ".\n" );
  ob->save_me();
}

void chan_leave( string chan, object ob ) {

  chan = lowercase( chan );

  if( channels[chan] == 0 ) {
    write( "No such channel." );
    return;
  }

  if( channels[chan] != READ_ONLY )
    if( SECURE_D->query_priv( ob->query_name() ) < channels[chan] - 1 ) {
      write( "No such channel.\n" );
      return;
    }

  if( listeners[chan] == 0 ) {
    listeners[chan] = ({ });
  }
  listeners[chan] -= ({ ob });

  write( "No longer subscribed to " + chan + ".\n" );

}

void chan_who( string chan ) {
  object *users;
  int i;

  chan = lowercase( chan );

  if( listeners[chan] == 0 ) {
    write( "No subscribers." );
    return;
  }

  write( "Subscribed to " + chan + ":\n" );

  users = listeners[chan];
  for( i = 0; i < sizeof( users ); i ++ ) {
    write( "  " + capitalize( users[i]->query_name() ) + "\n" );
  }
}

void chan_send_string( string chan, string str ) {
  object *users;
  string line;
  int i;

  if( colors == 0 ) {
    colors = ([ ]);
  }

  if( colors[chan] != 0 ) {
    line = colors[chan] + "[" + lowercase(chan) + "]%^RESET%^ " + str;
  } else {
    line = "[" + lowercase(chan) + "] " + str; 
  }
  users = listeners[chan];

  if( users != 0 )
    for( i = 0; i < sizeof( users ); i++ ) {
      users[i]->message( line );
    }
}

void chan_imud_rcv_targetted( string chan, string who, string where, 
			      string target, string targetmud, string what ) {
  if( imud[chan] == 0 ) {
    return;
  }

  what = replace_string( what, "$O", target + "@" + targetmud );
  what = replace_string( what, "$N", who + "@" + where );
  chan_send_string( imud[chan], what );
}

void chan_imud_rcv_emote( string chan, string who, string where, 
			  string what ) {

  if( imud[chan] == 0 ) {
    return;
  }
  what = replace_string( what, "$N", who + "@" + where );
  chan_send_string( imud[chan], what );
}

void chan_imud_rcv_say( string chan, string who, string where, string what ) {

  if( imud[chan] == 0 ) {
     chan_send_string( "wiz", "[" + chan + "] " + who + "@" + where + ": " + what );
    return;
  }

  chan_send_string( imud[chan], who + "@" + where
		    + ": " + what );
}

void chan_emote( string chan, string what ) {
  string *ichans;
  string *result;
  int i;
  string cmd;
  string arg;
  
  if( query_subscribed( chan ) == 0 ) {
    write( "Not subscribed to channel " + chan + ".\n" );
    return;
  }

  if( channels[chan] == READ_ONLY ) {
    write( chan+ " is read only." );
    return;
  }

  if( what == "" )
    return;

  if( sscanf( what, "%s %s", cmd, arg ) != 2 ) 
    cmd = what;
  
  if( EMOTE_D->is_emote( cmd ) ) {
    string *rules;
    string rule;
    object target;

    rules = EMOTE_D->query_rules( cmd );
    
    /* Targetted emote? Find the target */
    if( arg != 0 && arg != "" ) {
      target = this_environment()->find_object( arg );
      if( target == 0 ) {
	target = USER_D->find_player( arg );
      }

    } else {
      target = 0;
    }
    if( target != 0 ) {
      /* We've found our target, check for the correct rule */

      if( target->is_living() ) {
	/* We're looking for a LIV rule */
	if( member_array( "LIV", rules ) != -1 ) {
	  rule = "LIV";
	} else {
	  rule = "";
	}
      } else {
	/* We're looking for a OBJ rule */
	if( member_array( "OBJ", rules ) != -1 ) {
	  rule = "OBJ";
	} else {
	  rule = "";
	}
      }
    } else {
      /* Or are we just looking for a string? */
      if( member_array( "STR", rules ) != -1  && arg != "" ) {
	rule = "STR";
      } else {
	rule = "";
      }
    }
    
    if( rule == "LIV" ) {
      result = compose_message( this_player(), EMOTE_D->query_emote( cmd, rule ), target, 0 );
      what = result[2];
    } else if( rule == "OBJ" ) {
      result = compose_message( this_player(), EMOTE_D->query_emote( cmd, rule), 0, ({ target }) );
      what = result[2];
    } else if( rule == "STR" ) {
      result = compose_message( this_player(), EMOTE_D->query_emote( cmd, rule), 0, ({ arg }) );
      what = result[2];
    } else  {
      if( member_array( "", rules ) != -1 ) {
	result = compose_message( this_player(), EMOTE_D->query_emote( cmd, rule),0, 0 );
	what = result[2];
    } else
	write( "No such emote.\n" );
    }
  } else {
    if( arg != 0 && arg != "" )
      what = capitalize( this_player()->query_name() ) + " " + cmd + " " + arg;
    else
      what = capitalize( this_player()->query_name() ) + " " + cmd;
  }


  ichans = map_indices( imud );
  for( i = 0; i < sizeof( ichans ); i++ ) {
    if( imud[ichans[i]] == chan ) {

       what = replace_string( what, capitalize( this_player()->query_name() ), "$N" );
    
      /* Found an intermud channel */
      IMUD_D->do_channel_e( ichans[i], what );
      return;
    }
  }

  chan_send_string( chan, what );
}

void chan_say( string chan, string what ) {

  string *ichans;
  int i;

  if( query_subscribed( chan ) == 0 ) {
    write( "Not subscribed to channel " + chan + ".\n" );
    return;
  }

  if( channels[chan] == READ_ONLY ) {
    write( chan+ " is read only." );
    return;
  }

  if( what == "" )
    return;

  ichans = map_indices( imud );
  for( i = 0; i < sizeof( ichans ); i++ ) {
    if( imud[ichans[i]] == chan ) {
      /* Found an intermud channel */
      IMUD_D->do_channel_m( ichans[i], what );
      return;
    }
  }
  
  chan_send_string( chan, capitalize( this_player()->query_name() ) + ": " + capitalize( what ) );
}

void chan_set_color( string chan, string col ) {

  if( SECURE_D->query_admin( this_player()->query_name() ) != 1 ) {
    write( "Access denied.\n" );
    return;
  }
  if( colors == 0 )
    colors = ([ ]);
  colors[chan] = "%^" + uppercase( col ) + "%^";
  write( chan + " is now " + col + "\n" );
  save_me();
}

void chan_set_guild( string chan, string guild ) {

  if( SECURE_D->query_admin( this_player()->query_name() ) != 1 ) {
    write( "Access denied.\n" );
    return;
  }

  if( guilds == 0 ) 
    guilds = ([ ]);

  guilds[chan] = guild;
  write( chan + " is now a " + guild + " only channel." );
  save_me();
}

int query_priv( string chan ) {
  return( channels[chan]-1 );
}

int query_channel( string chan ) {

  if( guilds == 0 )
    guilds = ([ ]);

  if( channels[chan] != 0 ) {
    if( channels[chan] == READ_ONLY )
      return( 1 );
    if( guilds[chan] != 0 ) {
      /* Guild channel */
      if( SECURE_D->query_priv( this_player()->query_name() ) > 0 ) {
	/* A wiz can subscribe to all channels */
	return( 1 );
      } else {
	return( this_player()->guild_member( guilds[chan] ) );
      }
    }
    if( SECURE_D->query_priv( this_player()->query_name() ) >= channels[chan] - 1 )
      return( 1 );
    else 
      return( 0 );
  } else
    return( 0 );
}

string *query_channels( void ) {
   return map_indices(channels);
}

int query_subscribed( string chan ) {

  chan = lowercase( chan );
  if( listeners[chan] != 0 ) {
    if( member_array( this_player(), listeners[chan] ) != -1 ) {
      return( 1 );
    }
  }
  return( 0 );
}

void event_new_player( string *args ) {
  if( channels["announce"] != 0 ) {
    chan_send_string( "announce", "Trumpets sound as " + capitalize( args[0] ) + " joins the realm." );
  }
}

void event_player_login( string *args ) {
  if( channels["announce"] != 0 ) {
    chan_send_string( "announce", capitalize(args[0]) + " logs in." );
  }
}

void event_player_logout( string *args ) {
  if( channels["announce"] != 0 ) {
    chan_send_string( "announce", capitalize(args[0]) + " logs out." );
  }
}
 
void event_player_join( string *args ) {
  if( channels["announce"] != 0 ) {
    chan_send_string( "announce", "Trumpets blast a fanfare as " + capitalize(args[0]) + " joins " + args[1] + "!" );
  }
}