/*
[SKEL-LT v1.2] User List

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

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

#include <string.h>
#include <skeleton/commas.h>
#include <tempest/headers.h>
#include <tempest/Skel-Data.h>

/************************/
/*****  Structures  *****/
/************************/

struct User User;
struct SKEL SKEL;

/**************************/
/*****  Main Program  *****/
/**************************/

int main(int argc,char *argv[])
{
 int  stat,fd;
 long ULKB,DLKB,Ratio;
 char Ratio2[255],shit1[255],string[255],
      Month[50],Day[50],Year[50],fshit1[255];
 FILE *out;
 sprintf(shit1,"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"");
 if(argc != 3)
  {
   PutStr("\n[m[1m    _______ _________\n");
   PutStr("   / ___/ [4m/[m[1m/ / ___/ /    [[32mSKEL-LT v3.29[m[1m] - [3mUser List[m\n");
   PutStr("[1m  [4m/[m[1m__  /   _/ ___/ [4m/[m[1m__\n");
   PutStr("[1m [4m/[m[1m____[4m/[m[1m_/\\_[4m)[m[1m____[4m/[m[1m____/   For Tempest BBS - [Programmer: Michael Bockert]\n");
   PutStr(shit1);
   PutStr("\n[m   USAGE: SKEL-LT OutFile PATH\n");
   PutStr(" EXAMPLE: SKEL-LT RAM:TEST BBS:\n\n");
   PutStr("[OutFile] Path & Name of created file\n");
   PutStr("   [PATH] Accounts.Data Path\n\n");
   exit(0);
  }

/*********************************/
/*****  Load Skel-Data.Data  *****/
/*********************************/

 sprintf(string,"%sSetup/Skel-Data.Data",argv[2]);
 fd=Open(string,MODE_OLDFILE);
 if(fd==0)
  {
   PutStr("Skel-Data.Data not found!\n");
   setmem(&SKEL,sizeof(struct SKEL),NULL);
  }
 else
  {
   Read(fd,(char *)&SKEL, sizeof(struct SKEL));
   Close(fd);
  }

/********************/
/*****  Output  *****/
/********************/

 out=fopen(argv[1],"w");
 if(out==NULL)
  {
   PutStr("Error writing output file!\n");
   exit(0);
  }
 fprintf(out,"\f[33m[[31mSKEL-LT[33m] [36mUser List\n");
 fprintf(out,"[34m%s\"\"\"\"\"\"\"\n",shit1);
 fprintf(out,"[0m User# Alias/Handle      Last On   Calls  Msgs      Uploads    Downloads Ratio\n");
 fprintf(out,"[34m-=====-=================-=========-=====-=====-============-============-=====-\n");
 strcpy(shit1,"-----------------------------");

/*****************************/
/*****  Figure The List  *****/
/*****************************/

 sprintf(string,"%sAccounts.data",argv[2]);
 fd=Open(string,MODE_OLDFILE);
 if(fd==0)
  {
   PutStr("\nAccounts.Data not found.\n");
   exit(0);
  }
 Seek(fd,sizeof(struct User),OFFSET_BEGINING);

 NEXTFILE:
 stat=Read(fd,(char *)&User, sizeof(struct User));
 if(stat<1)
  {
   Close(fd);
/*********************************/
/*****  Print Ending Totals  *****/
/*********************************/
   fprintf(out,"[34m.%s.-.-------------.-.%s.\n",shit1,shit1);
   fprintf(out,"[34m| [32mTotal Calls     [33m[[0m%9s[33m] [34m|[33m=[34m| [32mUsers [33m[[0m%3d[33m] [34m|[33m=[34m| [32mTotal UL's [33m[",
                    commas(SKEL.TotalCalls,buff),SKEL.TotalUsers);
   fprintf(out,"[0m%11s[33m] [32mkb [34m|\n",
                    commas(SKEL.TotalULKB,buff));
   fprintf(out,"[34m| [32mTotal Messages  [33m[[0m%9s[33m] [34m| `-------------' | [32mTotal DL's [33m[",
                    commas(SKEL.TotalMessages,buff));
   fprintf(out,"[0m%11s[33m] [32mkb [34m|\n",
                    commas(SKEL.TotalDLKB,buff));
   fprintf(out,"[34m`%s'                 `%s'[0m~r\n",shit1,shit1);
   fclose(out);
   PutStr("\nSKEL-LT Done!\n");
   exit(0);
  }
 if((User.Slot_Number!=1)&&(User.Status==1))
  {
   ULKB = (User.Total_ULBytes+1L) / 1024L;
   DLKB = (User.Total_DLBytes+1L) / 1024L;
   if(!(User.UserBitsA & 0x00000200L))
    {
     if((User.Total_ULBytes < 1000000L) && (User.Total_DLBytes < 1000000L))
         strcpy(Ratio2,"[34m -.--");
     else
      {
       Ratio = (DLKB+1L) / ((ULKB+1L) / 100L + 1L);
       if(Ratio>300)
          strcpy(Ratio2,"[34mLEECH");
       else
        {
         if((Ratio < 16L) && (Ratio >= 0L) && (User.Total_ULBytes >= 5000000L))
             strcpy(Ratio2,"[33mELITE");
         else
          {
           if(Ratio > 99L)
            {
             sprintf(fshit1,"%ld",Ratio);
             sprintf(Ratio2,"%c.%c%c",fshit1[0],fshit1[1],fshit1[2]);
            }
           else
            {
             if(Ratio > 9L) sprintf(Ratio2,"0.%ld",Ratio);
             else           sprintf(Ratio2,"0.0%ld",Ratio);
            }
          }
        }
      }
     strcpy(string,ctime(&User.Time_Last_Logoff));
     strmid(string,Month,5,3);
     strmid(string,Day,9,2);
     strmid(string,Year,23,2);
     fprintf(out," [33m[[0m%3d[33m] [36m%-17.17s [31m%s %s,%s [33m%5s ",
                   User.Slot_Number,User.Name,Month,Day,Year,commas(User.Total_Calls,buff));
     fprintf(out,"[35m%5s ",commas(User.Total_Posts,buff));
     fprintf(out,"[33m%9s kb ",commas(ULKB,buff));
     fprintf(out,"[35m%9s kb [32m%5s\n",commas(DLKB,buff),Ratio2);
    }
  }
 goto NEXTFILE;
}
