/* * The gopher object... */ #include "gopher.h" #include "globals.h" inherit "/inherit/object"; int pending; mixed *current_menu; mixed *path; string blue; object env; varargs void do_connect( int type, mixed *data, string search ); #define NOTIFY(STR) set_long(STR); if (environment()) {\ env = environment(); blue = "\n\n"+STR; \ move(VOID_OB); move(env); } void create() { ::create(); set_short( "Gopher object" ); set_name( "gopher" ); set_long( "Connecting to mackerel.gu.uwa.edu.au" ); GOPHERD->do_connect( MENU, "", MACHINE_NAME, GOPHER_PORT + "", "finish_func" ); pending = 1; current_menu = ({ }); path = ({ ({ "", "", MACHINE_NAME, GOPHER_PORT + "" }) }); } /* create() */ void init() { add_action( "do_pick", "pick" ); add_action( "do_pop", "pop" ); add_action( "do_gopher", "gopher" ); add_action( "do_show", "show" ); if( blue ) { write( "\n" ); this_player()->more_string( blue ); } } /* init() */ void finish_func( mixed arg ) { string str; int i; pending = 0; if( !arg ) { NOTIFY( "Connect failed for some reason.\ngopher <name> to connect to " + "annother site.\n" ) return; } if( stringp( arg ) ) { /* Text file... */ object env; env = environment(); blue = arg; move( VOID_OB ); move( env ); blue = 0; return; } /* Menu... */ current_menu = arg; str = ""; for( i = 0; i < sizeof( arg ); i++ ) switch( arg[ i ][ TYPE ] ) { case MENU: str += sprintf( "%2d %s/\n", i + 1, arg[ i ][ DATA ][ TEXT ] ); break; case SEARCH: str += sprintf( "%2d %s+\n", i + 1, arg[ i ][ DATA ][ TEXT ] ); break; default: str += sprintf( "%2d %s\n", i + 1, arg[ i ][ DATA ][ TEXT ] ); break; } str += "'pick <n>' to pick one of the options, 'pop' to go up a level.\n" + "'gopher <machine> [port]' to get to another gopher.\n"; NOTIFY( str ) } /* finish_func() */ int do_pick( string str ) { int num; if( pending ) { write( "Sorry, there is a pending transaction.\n" ); return 1; } if( !str ) str = ""; sscanf( str, "%d", num ); num--; if( num < 0 || num >= sizeof( current_menu ) ) { write( "Out of range, 1.." + sizeof( current_menu ) + ".\n" + "Syntax pick <number>\n" ); return 1; } /* Ok, do the selection... */ switch( current_menu[ num ][ TYPE ] ) { case MENU: path += ({ current_menu[ num ][ DATA ] }); break; case SEARCH: write( "What do you want to input to the menu item :\n" + current_menu[ num ][ DATA ][ TEXT ] + "? " ); input_to( "do_search", 0, num ); path += ({ current_menu[ num ][ DATA ] }); return 1; } write( "Please wait, transaction in progress.\n" ); do_connect( current_menu[ num ][ TYPE ], current_menu[ num ][ DATA ] ); return 1; } /* do_pick() */ void do_search( string str, int num ) { do_connect( SEARCH, current_menu[ num ][ DATA ], str ); } /* do_search() */ varargs void do_connect( int type, mixed *junk, string search ) { GOPHERD->do_connect( type, junk[ NAME ], junk[ MACHINE ], junk[ PORT ], "finish_func", search ); pending = 1; return; } /* do_connect() */ int do_pop() { if( sizeof( path ) == 1 ) { notify_fail( "Already at the top level.\n" ); return 0; } path = path[ 0..sizeof( path ) - 2 ]; write( "Please wait, transaction in progress.\n" ); do_connect( MENU, path[ sizeof( path ) - 1 ] ); return 1; } /* do_pop() */ int do_gopher( string str ) { string dest, port; int p; if( !str ) { notify_fail( "Syntax: gopher <machine> [port]\n" ); return 0; } if( sscanf( str, "%s %d", dest, p ) != 2 ) { dest = str; p = 70; } if( sizeof( explode( dest, " " ) ) > 1 ) { notify_fail( "No spaces allowed in destingation field.\n" ); return 0; } NOTIFY( "Connecting to " + dest + " " + p + "\n" ); path = ({ ({ "", "", dest, p + "" }) }); do_connect( MENU, path[ 0 ] ); return 1; } /* do_gopher() */ int do_show( string str ) { int num; if( !str ) str = ""; sscanf( str, "%d", num ); num--; if( num < 0 || num >= sizeof( current_menu ) ) { write( "Out of range, 1.." + sizeof( current_menu ) + ".\n" + "Syntax show <number>\n" ); return 1; } printf( "Path=%s\nHost=%s\nPort=%s\nType=%s\n", current_menu[ num ][ DATA ][ NAME ], current_menu[ num ][ DATA ][ MACHINE ], current_menu[ num ][ DATA ][ PORT ], ({ "file", "menu", "search/query" })[ current_menu[ num ][ TYPE ] ] ); return 1; } /* do_show() */