/*                          UserStatus.mod

.----------------------------------------.------------------------------------.
| Handle:                                |   Slot Number: 1,222               |
|   From: 123456789012345678901234567890 | Computer Type:                     |
|  Phone:                                |     Last Call: 06/06/93 @ 22:22:22 |
|-------------------------.--------------^----------.-------------------------|
| Security Level: 233     | Daily Time: 1,000       | Bulletins Access: Yes   |
|     Byte Ratio:         |  Time Left: 1,000       |      Door Access:       |
|     File Ratio: Off     |  Time Bank: 1,000       |      File Access:       |
`-------------------------^-------------------------^-------------------------'

         Totals                   Today's Stats               Limits
.-------------------------.-------------------------.-------------------------.
|    Calls: 11,000        |    Calls: 11,000        |    Calls: 11,000        |
| Messages: 11,000        | Messages: 11,000        | Messages: 22,099        |
|-------------------------|-------------------------|-------------------------|
| UL Files: 1,000         | UL Files: 1,000         |                         |
| UL Bytes: 1,000,000,000 | UL Bytes: 1,000,000,000 |                         |
|-------------------------|-------------------------|-------------------------|
| DL Files: 1,000         | DL Files: 1,000         | DL Files: 1,000         |
| DL Bytes: 1,000,000,000 | DL Bytes: 1,000,000,000 | DL Bytes: 1,000,000,000 |
`-------------------------^-------------------------^-------------------------'
*/
//**********************
//*****  Includes  *****
//**********************

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

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

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

struct MyMessage
 {
  struct Message Msg;
  struct User User;
  char text[255];
  char text1[255];
  int car,Value,Data;
  long LongValue;
  int  IntValue;
 };

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

void GetStr(char s[],int opt);
int  DOORIO();

int  EXIT_FLAG, DOOR_DATA, DOOR_CAR, DOOR_VALUE, DOOR_VALUE1 = 0,first = 0;
char DOOR_MSG [255],DOOR_MSG1[255],MyName[255],st[100];

//*****************************
//*****  PL (Print Line)  *****
//*****************************

void pl(fmt,a1,a2,a3,a4,a5,a6,a7)
char *fmt;
{ char s[255]; sprintf(s,fmt,a1,a2,a3,a4,a5,a6,a7); DOOR_DATA=1; strcpy(DOOR_MSG,s); DOORIO(); }

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

main(int argc,char *argv[])
{
 char string[255],string1[255];
 char Day[5],Month[5],Year[5];
 register int x=1;
 if(!DoorStart(argv[1])) { PutStr("UserStatus.mod v1.0\n"); exit(0); }
//********************************************************************

 pl("\f[34m.----------------------------------------.------------------------------------.\r\n");
 pl("| [36mHandle[0m: [33m%-30s [34m|   [36mSlot Number[0m: %-5s               [34m|\r\n",
     User.Name,commas(User.Slot_Number,buff));
 pl("|   [36mFrom[0m: %-30s [34m| [36mComputer Type[0m: %11s         [34m|\r\n",
     User.City,User.ComputerType);
 pl("|  [36mPhone[0m: %-12s                   [34m|     [36mLast Call[0m:                     [34m|\r\n",
     User.VoicePhone);
 pl("|-------------------------.--------------^----------.-------------------------|\r\n");
 pl("| [36mSecurity Level[0m: %3d     [34m| [36mDaily Time[0m: %-5s       [34m| [36mBulletins Access[0m:       [34m|\r\n",
     User.Security,commas((User.Limit_Time),buff));
 pl("|     [36mByte Ratio[0m: %-2d      [34m|  [36mTime Left[0m: %-5s       [34m|      [36mDoor Access[0m:       [34m|\r\n",
     User.F_Ratio,commas(User.Left_Time,buff));

 pl("|     [36mFile Ratio[0m: %-2d      [34m|  [36mTime Bank[0m: %-5s       [34m|      [36mFile Access[0m:       [34m|\r\n",
     User.B_Ratio,commas((User.Total_TimeBank),buff));
 pl("`-------------------------^-------------------------^-------------------------'\r\n\r\n");

 pl("         [35mTotals                   Today's Stats               Limits[34m\r\n");
 pl(".-------------------------.-------------------------.-------------------------.\r\n");
 pl("|    [36mCalls[0m: %-6s        [34m|    [36mCalls[0m: ",
     commas(User.Total_Calls,buff));
 pl("%-6s        [34m|    [36mCalls[0m: ",
     commas(User.Period_Calls,buff));
 pl("%-6s        [34m|\r\n",commas(User.Limit_Calls,buff));


 pl("| [36mMessages[0m: %-6s        [34m| [36mMessages[0m: ",
     commas(User.Total_Posts,buff));
 pl("%-6s        [34m| [36mMessages[0m: ",
     commas(User.Period_Posts,buff));
 pl("%-6s        [34m|\r\n",commas(User.Limit_Posts,buff));

 pl("|-------------------------|-------------------------|-------------------------|\r\n");
 pl("| [36mUL Files[0m: %-6s        [34m| [36mUL Files[0m: ",
     commas(User.Total_ULFiles,buff));
 pl("%-6s        [34m|                         |\r\n",commas(User.Period_ULFiles,buff));


 pl("| [36mUL Bytes[0m: %-13s [34m| [36mUL Bytes[0m: ",
     commas(User.Total_ULBytes,buff));
 pl("%-13s [34m|                         |\r\n",commas(User.Period_ULBytes,buff));

 pl("|-------------------------|-------------------------|-------------------------|\r\n");
 pl("| [36mDL Files[0m: %-6s        [34m| [36mDL Files[0m: ",
     commas(User.Total_DLFiles,buff));
 pl("%-5s         [34m| [36mDL Files[0m: ",
     commas(User.Period_DLFiles,buff));
 pl("%-5s         [34m|\r\n",commas(User.Limit_DLFiles,buff));

 pl("| [36mDL Bytes[0m: %-13s [34m| [36mDL Bytes[0m: ",
     commas(User.Total_DLBytes,buff));
 pl("%-13s [34m| [36mDL Bytes[0m: ",
     commas(User.Period_DLBytes,buff));
 pl("%-13s [34m|\r\n",commas(User.Limit_DLBytes,buff));
 pl("`-------------------------^-------------------------^-------------------------'[0m\r\n");


// strcpy(string,ctime(&User.Time_Last_Logoff));
// strmid(string,Month,5,3);
// strmid(string,Day,9,2);
// strmid(string,Year,23,2);
// pl("[36mLst Date On : [0m%2s %s %s\r\n",Day,Month,Year);
//********************************************************************
// pl("[36mSecurity Lv : [0m%d\r\n",User.Security);
//********************************************************************
// pl("[36m# Times On  : [0m%-5d       [36mToday : [0m%d\r\n",User.Total_Calls,User.Period_Calls);
//********************************************************************
// pl("[36mMsgs Posted : [0m%-5d       [36mToday : [0m%d\r\n",User.Total_Posts,User.Period_Posts);
//********************************************************************
// if(User.F_Ratio==0) strcpy(string1,"Disabled");
// else                sprintf(string1,"%d/1",User.B_Ratio);
// pl("[36mFile Ratio  : [0m%s\r\n",string1);
//********************************************************************
// if(User.B_Ratio==0) strcpy(string1,"Disabled");
// else                sprintf(string1,"%d/1",User.B_Ratio);
// pl("[36mByte Ratio  : [0m%s\r\n",string1);
//********************************************************************
// pl("[36m# Downloads : [0m%-4d        [36mToday : [0m%d\r\n",User.Total_DLFiles,User.Period_DLFiles);
//********************************************************************
// pl("[36m# Uploads   : [0m%-4d        [36mToday : [0m%d\r\n",User.Total_ULFiles,User.Period_ULFiles);
//********************************************************************
// pl("[36mBytes DL'd  : [0m%-10ld  [36mToday : [0m%ld \r\n",User.Total_DLBytes,User.Period_DLBytes);
//********************************************************************
// pl("[36mBytes UL'd  : [0m%-10ld  [36mToday : [0m%ld\r\n",User.Total_ULBytes,User.Period_ULBytes);
//********************************************************************
// GetStr(string1,19);
// pl("[36mOnline Baud : [0m%s\r\n",string1);
//********************************************************************
// pl("[36mBytes Avail : [0m%ld\r\n\r\n",User.Limit_DLBytes);
//********************************************************************

//*************************
//*****  Close Stuff  *****
//*************************
 DOOR_DATA=99;
 strcpy(DOOR_MSG,'\0');
 DOORIO();
 while(msg=(struct MyMessage *)GetMsg(MyPort)) ReplyMsg((struct Message *)msg);
 if(MyPort) DeletePort(MyPort);
 exit(0);
}











//********************
//*****  DoorIO  *****
//********************

int DOORIO()
{
 struct MsgPort *HisPort;
 struct MyMessage message;
 int UPDATE;
 if(EXIT_FLAG) return 0;
 UPDATE=0;
 HisPort = FindPort(st);
 if(HisPort!=NULL)
  {
   message.Msg.mn_Node.ln_Type = NT_MESSAGE;
   message.Msg.mn_Length = sizeof(message);
   message.Msg.mn_ReplyPort = MyPort;
   if(first)CopyMem(&User,&message.User,sizeof(struct User));
   message.car   = 0;
   message.Data  = DOOR_DATA;
   message.Value = DOOR_VALUE;
   message.IntValue = DOOR_VALUE1;
   strcpy(message.text,DOOR_MSG);
   strcpy(message.text1,DOOR_MSG1);
   PutMsg((struct MsgPort *)HisPort,(struct Message *)&message);
   Wait(1 << MyPort->mp_SigBit);
   GetMsg(MyPort);
   DOOR_DATA  = message.Data;
   DOOR_VALUE = message.Value;
   DOOR_VALUE1 = message.IntValue;
   strcpy(DOOR_MSG,message.text);
   strcpy(DOOR_MSG1,message.text1);
   CopyMem(&message.User,&User,sizeof(struct User));
   first=1;
   UPDATE=0;
   if(message.car) EXIT_FLAG=1;
  }
 return 0;
}

//************************
//*****  Door Start  *****
//************************

DoorStart(char node[])
{
 struct MsgPort *HisPort;
 EXIT_FLAG = 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();
 return (int)TRUE;
}

//*********************************
//*****  GetStr (Get String)  *****
//*********************************

void GetStr(char s[],int opt)
{ DOOR_DATA=15; DOOR_VALUE=opt; strcpy(s,'\0'); DOORIO(); strcpy(s,DOOR_MSG); }
