{
From: S0730076@let.rug.nl (ill)

I wrote a chatbox with one of those ipx units. Pretty standard but funny
because you can send the other guy screentrashes and beeps and buzzes etc.

I dare not post it here cause Timo is gonna flame me with that standard
'don't post any binaries' file so mail me if you want it. I'll include
source from the main file here, but you can't compile it without some
other units I'm afraid.
}

{$R+}
uses ipx, crt,ill,win, novell, strings;


const
     receive_socket = $7713;
     send_socket = $6613;
     starty = 7;
     maxy = 9;
     maxlen = 77;
     versie = 'Nag 0.81';

procedure abort(message:string);
begin
     writeln(message);
     halt(1);
end;

var
   i                          : byte;
   x,y,xx                     : word;
   connection_number          : word;
   network_number             : networkNumber;
   network_node               : networkNode;
   receive_ecb,send_ecb       : ECB;
   receive_header,send_header : IPXHeader;
   send_message, receive_message : MessageSTR;
   done                        : boolean;
   message,naam                : string;
   code, station               : integer;
   InStrings                   : array[1..maxy] of string[maxlen];
   blinking          : boolean;


procedure info(txt : string);
begin
 txt := 'Ä'+txt +
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ'
 writeline(copy(txt,1,78), 1, 16, black, lightgray);
end;
procedure writeInStrings;
var q: integer;
    col : word;
begin
col := lightgray;
if blinking then col := col + blink;
for q := 1 to maxy do
     writeline(InStrings[q], 1, q + starty-1,col, black);
end;


procedure wipe;
var q : integer;
begin
blinking := false;
info('Your screen is being wiped');
for q := 1 to maxy do
begin
    inStrings[q] :=
'                                                                             
';
writeInstrings;
clrscr;
x := 0;
y := 1;
end;
end;

procedure shit(ki : keytype; var shitty : char);
begin
     shitty := #0;
     case ki of
          f1 : begin
                   info('Sending BUZZ to '+paramstr(1));
                   shitty := #201;
              end;
          f2 :   begin
                     info('Sending BEEP to '+paramstr(1));
                     shitty := #202;
                end;
          f3 : begin
                   info('Sending FLASH to '+paramstr(1));
                   shitty := #203;
              end;
          f4: begin
                  info('Calling '+paramstr(1)+' a sucker');
                  shitty := #204;
             end;
         f5: begin
                  info('Blinking your text on '+paramstr(1)+'''s screen');
                  shitty := #205;
             end;
         f6: begin
                  info('Trashing the other guy''s screen');
                  shitty := #206;
             end;
          f10: wipe;

     end;
end;

procedure flash;
var q : integer;
begin
     info('The other guy is making your screen flash!');
for q := 1 to 10 do
begin
     open_win(1,1,80,24, white, white);
     delay(10);
     close_win;
end;
end;

procedure init;
begin
  if paramcount < 1 then abort('Usage: Nag <username>');
  if not IPXinstalled then abort('IPX not loaded');
  connection_number := Get1stConnectionNumber(paramstr(1));
  if connection_number = 0 then abort(paramstr(1) + ' not found. ');
  if GetInternetAddress(connection_number,network_number,network_node)
    <> 0 then abort(paramstr(1) + 'network error.');
  IpxCloseSocket(send_socket);
  if IPXOpenSocket(send_socket) <> 0 then abort('Socket error.');
  IPXCloseSocket(receive_socket);
  if IPXOpenSocket(receive_socket) <> 0 then abort('Socket error.');
  done := false;
  zeroecb(receive_ecb);
  zeroecb(send_ecb);
  y := 1;
  xx := 1;
  getstation(station,code);
  getuser(station, naam, code);
  message := naam + ' wants to nag. Type Nag '+naam;
  send_message_to_username(paramstr(1), message, code);
  wipe;
end;

procedure funkysound;
var q : integer;
begin
     info('Receiving birdnoise');
     q := 3000;
     while q > 20 do
     begin
          sound(q);
          delay(1);
          dec(q,100);
     end;
     nosound;
end;

procedure trash;
var q,x,y : word;
begin
     randomize;
     for q := 1 to 50 do
     begin
         x := random(76)+2;
         y := random(25-starty) + starty;
         fastwrite(x,y,'#',x, y);
         sound(8000);
         delay(1);
         nosound;
     end;
end;


procedure receive_shit(i : integer);
begin
     case i - 200 of
          1 : begin info(paramstr(1)+' is buzzing');
              sound(50); delay(500); nosound; end;
          2 : funkysound;
          3 : flash;
          4 : info('SUCKER!');
          5 : blinking := true;
          6 : trash;
      end;
end;


procedure receive;
var q : integer;
begin
if (receive_ecb.completion_code = 0) and (receive_ecb.in_use = 0) then
begin
     IPXReceive(receive_ecb, receive_header, receive_socket,
            @receive_message, sizeof(receive_message));
      if (receive_message < #210) and (receive_message > #200) then
      begin
         receive_shit(ord(receive_message[1]));
         exit;
      end;

      if (receive_message = chr(8)) then
      begin
           InStrings[y][x] := ' ';
           if x > 0 then
              dec(x);
      end else
           begin
               inc(x);

              if receive_message <> chr(13)  then
                    InStrings[y][x] := receive_message[1];
              if (receive_message = chr(13)) or (x >= maxlen) then
               begin
                    inc(y);
                    x := 0;
               end;
               if y =  maxy then
               begin
                    y := maxy - 1;
                    x := 0;
                    for q := 1 to maxy - 1 do
                        instrings[q] := instrings[q+1]+
'                                                                            ';
               end;
          end;
          writeInStrings;
  end;
end;
 
procedure send;
var special : boolean;
    skey    : keytype;
    r, sr       : char;
begin
     inkey(special, skey,r);
     if ord(r) > 200 then
        exit;
     shit(skey, sr);
     if (sr = #0) and (special) and (skey <> cr) and (skey <> bksp)
        and (skey <> esc) then
            exit;
          if sr = #0 then
          begin
              send_message := r;
              write(send_message);
          end
          else
              send_message := sr;
          if send_message = #8 then
          begin
               write(' ');
               write(chr(8));
          end;
          if send_message = #13 then writeln;
          IPXSend(network_number, network_node, receive_socket, @send_message,
              length(send_message)+1, send_ecb,  send_header, send_socket);
          if (send_message = chr(27)) or (receive_message= chr(27)) then
          done := true;
end;


begin
 ini_win;
  open_win(1,1,80,24,black,black);
  init;
  receive;
  x := 0;
  clrscr;
 open_win(1,starty,80,24, lightgray, black);
 open_win(1,17,80,24, black, lightgray);
 info(versie+' 1995 Willem van de Vis   Esc to quit.');
 writeline('F1 buzz F2 bird F3 flash F4 sucker F5 blink F6 trash F10 clear',
               2, starty-1, black, lightgray);

 textcolor(black);
  repeat
    receive;
  IPXRelinquishControl;
  if keypressed then
   send;
 until done;
 IPXCloseSocket(send_socket);
 IPXCloseSocket(receive_socket);
 end_win;
 writeln('no more nagging.');
end.

