/*
================================================================================
 PROGRAM: Conference Access Lister Module
 VERSION: v1.0
COMPILER: Lattice C v5.10b
    DATE: Oct 15 1992
================================================================================


[Conference Access Lister Module v1.0]            By The SkeletoN [__-__-__]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Handle                Location              1st On  LastOn  Calls   Msgs
====================--====================--======--======--=====--=====
User 1                Location User 1       May 31  Jun 32  1,209  1,484
User 2                Location User 2       Jun 22  Jul 23    323    131
====================--====================--======--======--=====--=====

[Q=Quit]-[Return=Continue]:

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

#include <proto/all.h>
#include <stdio.h>
#include <time.h>

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

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

//*********************
//*****  Structs  *****
//*********************

 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;
   struct SystemData *SystemData;
   struct NodeData   *NodeData;
   struct Today      *Today;
  };

struct User *User;
struct User User1;
struct MsgPort *MyPort = NULL;
struct MyMessage *msg;
struct MyMessage send;

int  DoorStart(TEXT *);
int  DOORIO(VOID);
VOID CloseStuff(VOID);

VOID GetPaths(TEXT *,int);
int  hotkey(TEXT *);
VOID pl(TEXT *);
int  CTRLC(VOID);

char MyName[60],st[60];

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

VOID main(int argc,char *argv[])
{
 char string1[200],shit1[200],Month[5],Day[4],Year[4];
 register int TotalUsers=0,Users=0,Lines=0;
 int stat,fd;
 if(!DoorStart(argv[1])) { PutStr("Tempest Door!\n"); exit(0); }

//******************
//*****  Code  *****
//******************

 strcpy(shit1,"[32m=========================-=========================--=========--====--====--====\r\n");
 pl("\f[33m[[mConference Access Lister Module v3.15[33m]             By Michael Bockert [33m[[m05-24-94[33m]\r\n");
 pl("[32m~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
 GetPaths(string1,1);
 strcat(string1,"Accounts.data");
 fd=Open(string1,MODE_OLDFILE);
 pl("[33mHandle                    Location                    Last On   Calls Msgs\r\n");
 pl(shit1);

 ACCOUNTS:

 stat=Read(fd,&User1, sizeof(struct User));
 if(stat<1)
  {
   Close(fd);
   pl(shit1);
   sprintf(shit1,"[33mTotal Users [34m[ [31m%3d[34m]        [33mUsers In Conference [34m[ [31m%d[34m]\r\n\r\n",TotalUsers,Users);
   pl(shit1);
   CloseStuff();
  }
 if(CTRLC())
  {
   Close(fd);
   pl("\r\n[31mAborting List![0m\r\n\r\n");
   CloseStuff();
  }
 TotalUsers++;
 if(User1.MsgBase[User->MB_J] != 'N')
  {
   Users++;
   strcpy(string1,ctime(&User1.Time_Last_Logoff));
   strmid(string1,Year,23,2);
   strmid(string1,Month,5,3);
   strmid(string1,Day,9,2);
   sprintf(string1,"[m[36m%-25.25s [m%-25.25s  [31m%s %s[33m/[31m%s  [35m%4.4d  [m%4.4d\r\n",
                    User1.Name,User1.City,Month,Day,Year,User1.Total_Calls,User1.Total_Posts);
   pl(string1);
   Lines++;
  }
 if(Lines+2 > User->Length)
  {
   pl("\r\n[34m[[32mQ[m=[32mQuit[34m]-[[32mReturn[m=[32mContinue[34m][m:");
   AGAIN:
   hotkey(string1);
   if((string1[0] == 'Q') || (string1[0] == 'q'))
    {
     pl("\r\n\r\n");
     Close(fd);
     CloseStuff();
    }
   if(string1[0] != 13)
       goto AGAIN;
   Lines=0;
   pl("\r\n\r\n");
  }
 goto ACCOUNTS;
}







//************************
//*****  Door Start  ***** // MUST BE INCLUDED IN ALL DOORS!
//************************

int DoorStart(TEXT *node)
{
 struct MsgPort *HisPort;
 send.carrier=0;
 sprintf(st,"%s:TEMPEST_DOOR",node);
 HisPort = FindPort(st);
 if(HisPort==NULL) return (FALSE);
 sprintf(MyName,"%s:DOOR_PORT",node);
 MyPort = CreatePort(MyName,0L);
 if(MyPort==NULL)
  {
   PutStr("Cant open port");
   return(int)FALSE;
  }
 DOORIO();
 User=*&send.User;
 return (int)TRUE;
}

//********************
//*****  DoorIO  ***** // MUST BE INCLUDED IN ALL DOORS!
//********************

int DOORIO(VOID)
{
 struct MsgPort *HisPort;
 if(send.carrier) return(0);
 HisPort = FindPort(st);
 if(HisPort!=NULL)
  {
   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 *)HisPort,(struct Message *)&send);
   Wait(1 << MyPort->mp_SigBit);
   GetMsg(MyPort);
   if(send.carrier) CloseStuff();
   return(1);
  }
 return(0);
}

//*************************
//*****  Close Stuff  ***** // MUST BE INCLUDED IN ALL DOORS!
//*************************

VOID CloseStuff(VOID)
{
 send.Command=999;
 DOORIO();
 while(msg=(struct MyMessage *)GetMsg(MyPort)) ReplyMsg((struct Message *)msg);
 if(MyPort) DeletePort(MyPort);
 exit(0);
}


//*********************
//*****  Hot Key  ***** // Command 16
//*********************

int hotkey(TEXT *character)
{
 send.Command=16;
 send.text1=character;
 DOORIO();
 return((int)character[0]);
}

//***********************
//*****  Get Paths  ***** // Command 30
//***********************

VOID GetPaths(TEXT *s,int opt)
{
 send.Command=30;
 send.Value1=opt;
 strcpy(s,NULL);
 send.text1=s;
 DOORIO();
}

//*****************************
//*****  PL (Print Line)  ***** // Command 1
//*****************************

VOID pl(TEXT *string)
{
 send.Command=1;
 send.text1=string;
 DOORIO();
}

//*************************
//*****  CTRLC CHECK  ***** // Command 10
//*************************

int CTRLC(VOID)
{
 send.Command=10;
 DOORIO();
 return(send.Value1);
}
