/*
.--------------.-----------------.
| SKEL-TD v1.2 | Top Downloaders |
`--------------^-----------------'

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

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

#include <string.h>
#include <skeleton/commas.h>
#include <Tempest/Headers.h>
#include <Tempest/Skel-Data.h>

VOID Sort(VOID);
VOID Print(VOID);

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

struct Downloads
 {
  char  Handle[31];
  long  BytesDL;
 };
struct Downloads DOWN[45];
struct User User;
struct SKEL SKEL;

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

char  string[200],OUTPATH[200],shit1[200];
int   RANK,Option;

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

void main(int argc,char *argv[])
{
 int stat,fd;
 sprintf(shit1,"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"");
 if(argc != 4)
  {
   PutStr("\n[m[1m    _______ _________\n");
   PutStr("   / ___/ [4m/[m[1m/ / ___/ /    [[32mSKEL-TD v3.29[m[1m] - [3mTop Downloaders[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-TD OutFile x BBS:\n");
   PutStr(" EXAMPLE: SKEL-TD RAM:TEST 1 BBS:\n\n");
   PutStr("[OutFile] Path & Name of created file\n");
   PutStr("      [x] Option [1]=Top 30 / [2]=Top 45\n");
   PutStr("   [BBS:] Path of Accounts.Data File\n\n");
   exit(0);
  }
 strcpy(OUTPATH,argv[1]);
 Option = atoi(argv[2]);
 if(Option == 1)
    RANK = 30;
 else
    RANK = 45;

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

 sprintf(string,"%sSetup/Skel-Data.Data",argv[3]);
 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);
  }

/********************************/
/*****  Load Accounts.Data  *****/
/********************************/

 sprintf(string,"%sAccounts.Data",argv[3]);
 fd=Open(string,MODE_OLDFILE);
 if(fd==0)
  {
   PutStr("\nAccounts.data not found.\n");
   exit(0);
  }
 NEXTFILE:
 stat=Read(fd,(char *)&User, sizeof(struct User));
 if(stat <=0 )
  {
   Close(fd);
   Print();
   PutStr("\nSKEL-TD Done!\n");
   exit(0);
  }
 Sort();
 goto NEXTFILE;
}

/***************************/
/*****  Download Sort  *****/
/***************************/

VOID Sort(VOID)
{
 register int x =0,y,HOLDER;
 do
  {
   if((User.Slot_Number==1)||(User.Status!=1))
    {
     break;
    }
   if(User.Total_DLBytes > DOWN[x].BytesDL)
    {
     HOLDER = x;
     y=0;
     while(x+1<RANK)
      {
       y++;
       CopyMem(&DOWN[RANK-(y+1)],&DOWN[RANK-y],sizeof(struct Downloads));
       x++;
      }
     x=HOLDER;
     strcpy(DOWN[x].Handle,User.Name);
     DOWN[x].BytesDL     = User.Total_DLBytes;
     return;
    }
   x++;
  }
 while(x<RANK);
}

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

VOID Print(VOID)
{
 register int x=0,y=15,z=30;
 FILE *out2;
 out2=fopen(OUTPATH,"w");
 if(out2==NULL)
  {
   PutStr("Error writing output file!\n");
   exit(0);
  }
 fprintf(out2,"\f~+[33m[[37mSKEL-TD[33m] [36mTop Downloaders By Michael Bockert\n");
 fprintf(out2,"[34m-------------------------------------------------------------------------------\n",shit1);
 if(Option == 1)
  {
   fprintf(out2,"  [0m#  Top Downloaders          DL Bytes    #  Top Downloaders          DL Bytes\n");
   fprintf(out2,"[34m---------------------------------------.---------------------------------------\n");
   do
    {
     fprintf(out2," [31m%2d. [36m%-19.19s [32m%13s",
         x+1,DOWN[x].Handle,commas(DOWN[x].BytesDL,buff));
     x++;
     fprintf(out2," [34m| [31m%2d. [36m%-19.19s [32m%13s\n",
         y+1,DOWN[y].Handle,commas(DOWN[y].BytesDL,buff));
     y++;
    }
   while(x<15);
  }
 else
  {
   fprintf(out2," [0mAmount  Top Downloaders     Amount  Top Downloaders     Amount  Top Downloaders\n");
   fprintf(out2,"[34m-------------------------..--------------------------..-------------------------\n");
   do
    {
     DOWN[x].BytesDL /= 1024L;
     fprintf(out2,"[32m%7s[31mk [36m%-15.15s",
         commas(DOWN[x].BytesDL,buff),DOWN[x].Handle);
     x++;
     DOWN[y].BytesDL /= 1024L;
     fprintf(out2," [34m|| [32m%7s[31mk [36m%-15.15s",
         commas(DOWN[y].BytesDL,buff),DOWN[y].Handle);
     y++;
     DOWN[z].BytesDL /= 1024L;
     fprintf(out2," [34m|| [32m%7s[31mk [36m%-15.15s\n",
         commas(DOWN[z].BytesDL,buff),DOWN[z].Handle);
     z++;
    }
   while(x<15);
  }
 strcpy(shit1,"-----------------------------");
 if(Option == 1)
  {
   fprintf(out2,"[34m.%s.-.------^------.-.%s.\n",shit1,shit1);
  }
 else
  {
   fprintf(out2,"[34m.------------------------^^---.-.--------------.-.---^^------------------------.\n");
  }
 fprintf(out2,"[34m| [32mULed Files   [33m[[0m%9s[33m]    [34m| [34m| [32mUsers [33m[[0m%3d[33m] [34m| [34m| [32mDLed Files   [33m[",
                               commas(SKEL.TotalUL,buff),SKEL.TotalUsers);
 fprintf(out2,"[0m%9s[33m]    [34m|\n",
              commas(SKEL.TotalDL,buff));
 fprintf(out2,"[34m| [32mULed Bytes [33m[[0m%11s[33m] [32mkb [34m| `-------------' | [32mDLed Bytes [33m[",
                            commas(SKEL.TotalULKB,buff));
 fprintf(out2,"[0m%11s[33m] [32mkb [34m|\n",
              commas(SKEL.TotalDLKB,buff));
 fprintf(out2,"[34m`%s'                 `%s'[0m~r\n",shit1,shit1);
 fclose(out2);
}
