/*
    ษอออออออหอออออออออออออออออออออออออออหอออออออออออออออออออออออออออออออออออออป
    บ LoGoN บ HanDLe / LoCATioN         บ ACTiViTY/CPS/FiLENAME/POSiTiON/SiZE บ
ษอออบอออออออบอออออออออออออออออออออออออออบอออออออออออออออออออออออออออออออออออออน
บ 1 บ 19:44 บ The Skeleton              บ DownLoading          12345678.dms   บ
ศอออน  2400 บ Crystal And Indepdanant   บ CPS Rate: 1623      4588383 Bytes   บ
ษอออบอออออออบอออออออออออออออออออออออออออบอออออออออออออออออออออออออออออออออออออน
บ 2 บ 19:33 บ The Skeleton              บ DownLoading          12345678.dms   บ
ศอออน 19200 บ Crystal / Indepdanant     บ CPS Rate: 1222      4588383 Bytes   บ
ษอออบอออออออบอออออออออออออออออออออออออออบอออออออออออออออออออออออออออออออออออออน
บ 3 บ 11:33 บ The Skeleton              บ DownLoading          12345678.dms   บ
ศอออน 14400 บ Crystal / Indepdanant     บ CPS Rate: 1993      4588383 Bytes   บ
ษอออบอออออออบอออออออออออออออออออออออออออบอออออออออออออออออออออออออออออออออออออน
บ 4 บ   :   บ [ Hidden from display ]   บ Logging On          -------------   บ
ศอออน       บ                           บ                                     บ
    บอออออออสอออออออออออออออออออออออออออสอออออออออออออออออออออออออออออออออออออน
    บออออออออออออออออออหออออออออออออออออออหอออออออออออออออออหอออออออออออออออออน
    บ Active Lines: 11 บ Users Online: 11 บ Free Lines:  0  บ  Hydra is Cool  บ
    ศออออออออออออออออออสออออออออออออออออออสอออออออออออออออออสอออออออออออออออออผ


    .-------.-------------------------.---------------------------------------.
    | LoGoN | HanDLe / LoCATioN       |  ACTiViTY/CPS/FiLENAME/POSiTiON/SiZE  |
.---|-------|-------------------------|---------------------------------------|
| 1 | 19:44 | The Skeleton            | DownLoading                           |
`---|  2400 | United States           | DL: 1623     crap.dms     500/  88383 |
.---|-------|-------------------------|---------------------------------------|
| 2 | 19:33 | The Skeleton            | UpLoading                             |
`---| 19200 | United States           | UL: 1222     shit.dms       0/ 588383 |
.---|-------|-------------------------|---------------------------------------|
| 3 | 11:33 | The Skeleton            | UL: 1333 12345678.dms  100111/1488383 |
`---| 14400 | United States           | DL: 3333 abcdefgh.zip   20111/1488383 |
.---|-------|-------------------------|---------------------------------------|
| 4 |   :   | [ Hidden from display ] | Logging On                            |
`---|       |                         |                                       |
    |-------^-------------------------^---------------------------------------|
    |------------------.------------------.-----------------.-----------------|
    | Active Lines: 8  | Users Online:  4 | Free Lines:  4  |  Hydra is Cool  |
    `------------------^------------------^-----------------^-----------------'

*/
//**********************
//*****  Includes  *****
//**********************

#include <proto/all.h>
#include <stdio.h>
#include <stdlib.h>
#include <exec/memory.h>

#include <time.h>
#include <string.h>
#include <tempest/headers.h>
#include <tempest/defines.h>

//********************************
//*****  Structures/Defines  *****
//********************************

 struct MyMessage
  {
   struct Message Msg; // for Exec message routines
   ULONG  Command;     // Command to be executed.

   char   *text1,
          *text2,
          *text3;
   int    Value1,
          Value2;
   ULONG  LongValue;
   LONGBITS Flags;
   int    carrier;
   struct User       *User;             // Pointers!
   struct SystemData *SystemData;
   struct NodeData   *NodeData;
   struct Today      *Today;
  };

struct User *User;
struct SystemData *SystemData;
struct NodeData *NodeData;
struct Today *Today;
struct MsgPort *MyPort = NULL;
struct MyMessage *msg;
struct MyMessage send;
struct Down_Load Down_Load;
struct DownLoad_Status DownLoad_Status;

struct node_info nody;

int  DoorStart(TEXT *);
int  DOORIO(WORD);
VOID CloseStuff(VOID);
char *Myctime(long *);
VOID Act(BYTE,TEXT *);

VOID pl(TEXT *);
int  hotkey(char character[]);
int  KEY(VOID);
int  Loadnody(int);
int  CTRLC(VOID);

//******************************
//*****  Global Variables  *****
//******************************

int  Result,Error;
struct MsgPort *TempestPort;

//******************
//*****  Main  *****
//******************

int main(int argc,char *argv[])
{
 char string[200],string2[200],atype[10];
 char Handle[40],Location[40],Activity[30],Time[15],ULFilename[15],DLFilename[15],Baud[15],
      ULFilesize[15],DLFilesize[15];
 int  file,Position,stat,count=0,NODES,NODE,line;
 int online=0;
 register int i;
 if(!DoorStart(argv[1])) { PutStr("TempesT Door\n"); exit(0); }

 if(!(User->NFlags1 & NF1_ViewNodeLists))
  {
   pl("\r\n[31mAccess Denied![0m\r\n");
   CloseStuff();
  }

 SetTaskPri(FindTask(0),SystemData->DoorsPriority);

//********************************
//*****  Load Internal.Data  *****
//********************************

 NODE = atoi(argv[1]);
 stat=Loadnody(NODE);
 if(stat==0)
  {
   pl("NodeInfo File Not Found!\r\n");
   CloseStuff();
  }
 Act(99,"Online Who Display");
 NODES = nody.SystemDataInfo->NumberOfLines + 1;
 line=0; // Line Counter

//***************************************
//*****  Beginning oF Massive Loop  *****
//***************************************

 if(User->AnsiType<=1)
  {
   pl("\f    [34m.-------.-------------------------.---------------------------------------.\r\n");
   pl("    | [33mLoGoN [34m| [33mHanDLe / LoCATioN       [34m|  [33mACTiViTY CPS FiLENAME POSiTiON SiZE  [34m|\r\n");
  }
 else
  {
   pl("\f    [34mษอออออออหอออออออออออออออออออออออออหอออออออออออออออออออออออออออออออออออออออป\r\n");
   pl("    บ [33mLoGoN [34mบ [33mHanDLe / LoCATioN       [34mบ  [33mACTiViTY CPS FiLENAME POSiTiON SiZE  [34mบ\r\n");
  }

 i=0;
 do
  {
   if(CTRLC())
    {
     pl("[31mAborting Who Display![0m\r\n");
     CloseStuff();
    }
   stat=Loadnody(i);
   if(stat==0) goto EXIT;

   if(nody.GLOB->AN==62) goto EXIT;
   if((nody.GLOB->hide==1)&&(nody.UserInfo->Slot_Number==1)&&(!(User->SFlags1 & SF1_SysopWho))) goto EXIT;

   //**************************
   //*****  Final Output  *****
   //**************************

   strcpy(Handle,nody.UserInfo->Name);
   strcpy(Location,nody.UserInfo->City);
   strcpy(ULFilename,nody.GLOB->ULFileName);
   strcpy(DLFilename,nody.GLOB->DLFileName);

   if((nody.GLOB->hide==1)&&(!(User->SFlags1 & SF1_SysopWho)))
    {
     strcpy(Handle,"(Hidden from display)");
     strcpy(Location," ");
     strcpy(ULFilename," ");
     strcpy(DLFilename," ");
    }
   if(nody.UserInfo->Name[0 ]==NULL)
    {
     strcpy(Handle," ");
     strcpy(Location," ");
    }
   if((i!=(NODES-1))) online++;
   sprintf(string,"%s",Myctime(&nody.UserInfo->Time_Last_Connect));
   strmid(string,Time,12,5);
   strcpy(Activity,nody.GLOB->activity);
   line+=3;
   if(nody.NodeDataInfo->LocalMode==0) sprintf(string2,"%2d",i);
   else                                strcpy(string2," L");
   if(User->AnsiType<=1)
    {
     pl("[34m.---|-------|-------------------------|---------------------------------------|\r\n");
     sprintf(string,"[34m|[33m%2s [34m| [0m%5s [34m| [36m%-23.23s [34m| [31m",string2,Time,Handle);
     strcpy(atype,"|");
    }
   else
    {
     pl("[34mษอออบอออออออบอออออออออออออออออออออออออบอออออออออออออออออออออออออออออออออออออออน\r\n");
     sprintf(string,"[34mบ[33m%2s [34mบ [0m%5s [34mบ [36m%-23.23s [34mบ [31m",string2,Time,Handle);
     strcpy(atype,"บ");
    }
   pl(string);

   switch(nody.GLOB->AN)
    {
     case 35: sprintf(string,"[32mUL[0m:[36m%5d [35m%-12.12s [0m%7d/%7d [34m%s\r\n",nody.GLOB->ULCPS,ULFilename,nody.GLOB->ULPosition,nody.GLOB->ULFileSize,atype);
              pl(string);
              break;
     default: sprintf(string,"%-38.38s[34m%s\r\n",Activity,atype);
              pl(string);
    }
   sprintf(Baud,"%5d ",nody.GLOB->CurrentBaudRate);
   if(nody.NodeDataInfo->Telnet==1)
      strcpy(Baud,"TelNet");

   if(User->AnsiType<=1)
        sprintf(string,"[34m`---| [32m%s[34m| [35m%-23.23s [34m| [31m",Baud,Location);
   else sprintf(string,"[34mศอออน [32m%s[34mบ [35m%-23.23s [34mบ [31m",Baud,Location);
   pl(string);
   switch(nody.GLOB->AN)
    {
     case 29: sprintf(string,"[32mUL[0m:[36m%5d [35m%-12.12s [0m%7d/%7d [34m%s\r\n",nody.GLOB->ULCPS,ULFilename,nody.GLOB->ULPosition,nody.GLOB->ULFileSize,atype);
              break;
     case 35: sprintf(string,"[32mDL[0m:[36m%5d [35m%-12.12s [0m%7d/%7d [34m%s\r\n",nody.GLOB->DLCPS,DLFilename,nody.GLOB->DLPosition,nody.GLOB->DLFileSize,atype);
              break;
     case 58: sprintf(string,"[32mUL[0m:[36m%5d [35m%-12.12s [0m%7d/%7d [34m%s\r\n",nody.GLOB->ULCPS,ULFilename,nody.GLOB->ULPosition,nody.GLOB->ULFileSize,atype);
              break;
     case 18: sprintf(string,"[32mDL[0m:[36m%5d [35m%-12.12s [0m%7d/%7d [34m%s\r\n",nody.GLOB->DLCPS,DLFilename,nody.GLOB->DLPosition,nody.GLOB->DLFileSize,atype);
              break;
     default: sprintf(string,"                                      [34m%s\r\n",atype);
    }
   pl(string);
   if( ((line+5)>User->Length)&&((i+1)<NODES))
    {
     if(User->AnsiType<=1)
          pl("    [34m|-------|-------------------------|---------------------------------------|[0m\r\n");
     else pl("    [34mบอออออออบอออออออออออออออออออออออออบอออออออออออออออออออออออออออออออออออออออน[0m\r\n");
     KEY();
     line=0;
    }
   EXIT:
   i++;
  }
 while(i<NODES);

 if(User->AnsiType<=1)
  {
   pl("    [34m|-------^-------------------------^---------------------------------------|\r\n");
   pl("    [34m|------------------.------------------.-----------------.-----------------|\r\n");
   sprintf(string,"    [34m| [36mActive Lines[0m: [31m%2d [34m| [36mUsers Online[0m: [31m%2d [34m| [36mFree Lines[0m: [31m%2d  [34m|  [35mHydra is Cool  [34m|\r\n",(NODES-2),online,(NODES-2-online));
   pl(string);
   pl("    [34m`------------------^------------------^-----------------^-----------------'[0m\r\n");
  }
 else
  {
   pl("    [34mบอออออออสอออออออออออออออออออออออออสอออออออออออออออออออออออออออออออออออออออน\r\n");
   pl("    [34mบออออออออออออออออออหออออออออออออออออออหอออออออออออออออออหอออออออออออออออออน\r\n");
   sprintf(string,"    [34mบ [36mActive Lines[0m: [31m%2d [34mบ [36mUsers Online[0m: [31m%2d [34mบ [36mFree Lines[0m: [31m%2d  [34mบ  [35mHydra is Cool  [34mบ\r\n",(NODES-2),online,(NODES-2-online));
   pl(string);
   pl("    [34mศออออออออออออออออออสออออออออออออออออออสอออออออออออออออออสอออออออออออออออออผ[0m\r\n");
  }
 CloseStuff();
}







//************************
//*****  Load Nody  ******
//************************

int Loadnody(int node)
{
 char string[50];
 register int y;
 int file;
 sprintf(string,"Node:NodeInfo_%d",node);
 for(y=1;y<3;y++)
  {
   file=Open(string,MODE_OLDFILE);
   if(file!=0)
    {
     Read(file,(char *)&nody,sizeof(struct node_info));
     Close(file);
     return(1);
    }
  }
 return(0);
}
//===========================* Beginning of Module *===========================
char *Myctime(long *secs)
{
 struct tm *tm;
 tm=gmtime(secs);
 return(asctime(tm));
}

//************************
//*****  Door Start  ***** // MUST BE INCLUDED IN ALL DOORS!
//************************
int DoorStart(TEXT *node)
{
 char string[60];
 send.carrier=0;
 sprintf(string,"%s:TEMPEST_DOOR",node);
 TempestPort=FindPort(string);
 if(TempestPort==NULL) return(int)FALSE;
 MyPort=CreateMsgPort();
 if(MyPort==NULL) return(int)FALSE;
 DOORIO(0);
 User=*&send.User;
 SystemData=*&send.SystemData;
 NodeData=*&send.NodeData;
 Today=*&send.Today;
 return(int)TRUE;
}
//********************
//*****  DoorIO  ***** // MUST BE INCLUDED IN ALL DOORS!
//********************
int DOORIO(WORD Command)
{
 if(send.carrier) return(0);
 send.Command=Command;
 send.Msg.mn_Node.ln_Type = NT_MESSAGE;
 send.Msg.mn_Length = sizeof(send);
 send.Msg.mn_ReplyPort = MyPort;
 send.carrier=0;
 PutMsg((struct MsgPort *)TempestPort,(struct Message *)&send);
 Wait(1 << MyPort->mp_SigBit);
 GetMsg(MyPort);
 if((send.carrier)&&(send.Command!=999)) CloseStuff();
 return(1);
}
//*************************
//*****  Close Stuff  ***** // MUST BE INCLUDED IN ALL DOORS!
//*************************
VOID CloseStuff(VOID)
{
 DOORIO(999);
 while(msg=(struct MyMessage *)GetMsg(MyPort)) ReplyMsg((struct Message *)msg);
 if(MyPort) DeleteMsgPort(MyPort);
 exit(0);
}
VOID pl(TEXT *string)
{
 send.text1=string;
 DOORIO(1);
}
//*****************
//*****  KEY  *****
//*****************
int KEY(VOID)
{
 DOORIO(71);
 return(send.Value1);
}
//*************************
//*****  CTRLC CHECK  *****
//*************************
int CTRLC(VOID)
{
 DOORIO(10);
 return(send.Value1);
}
//**********************
//*****  Activity  ***** // Command 44
//**********************
VOID Act(BYTE act,TEXT *s)
{
 send.Value1=act;
 send.text1=s;
 DOORIO(44);
}
