#include "bbs.h"
extern int ValidUser;

int CheckifNameAllowed(char *name)
{
 char *s;
 char **tooltypes;
 struct DiskObject *dobj;
 int num=1;
 if(!strnicmp(name,"ACS.",4)) 
 {
    AEPutStr("Username not allowed!!\r\n\r\n");
    return(1);
 }
 sprintf(GSTR1,"%sNamesNotAllowed",Cmds->BBSLoc);

 if(dobj=GetDiskObject(GSTR1))
 {
    tooltypes=dobj->do_ToolTypes;
    sprintf(GSTR1,"NAME.%d",num++);
    while(s=FindToolType(tooltypes,GSTR1))
    {
      if(!stricmp(name,s))
      {
        FreeDiskObject(dobj);
        AEPutStr("Username not allowed!!\r\n\r\n");
        return(1);
      }
      sprintf(GSTR1,"NAME.%d",num++);
    } 
    FreeDiskObject(dobj);
	} else {
 	sprintf(GSTR1,"ERROR! you are missing the %sNamesNotAllowed file\n",Cmds->BBSLoc);
	    CallersLog(GSTR1);
	    AEPutStr(GSTR1);
	    SendChar('\r');
	    sprintf(GSTR1,"No new users will be allowed to join!\n");
	    CallersLog(GSTR1);
	    AEPutStr(GSTR1);
	    SendChar('\r');
	    return(1);
	}
 return(0);
}

static int IsStrDigits(char *s)
{
 int loop;

 for(loop=0; loop<strlen(s); loop++)	{
	    if(!(s[loop]>='0'&&s[loop]<='9')) {
		    AEPutStr("\r\nNumbers only please!\r\n\r\n");
		    return(0);
		}
	}
 return(1);
}

int NumberOfLinesTest(void)
{
 int stat;
 char str[20];

 for(stat=70; stat>1; stat--) {
 	sprintf(str," %d\r\n",stat);
	    AEPutStr(str);
	}
 AEPutStr("\r\nEnter the number you see at the top of your screen: ");
 stat=LineInput("",str,3,KEYBOARD_TIMEOUT);
 if(stat<0)          return(stat);
 if(str[0]=='\0')	return(1);
 stat=IsStrDigits(str);
 if(!stat)           return(0);
 stat = (int)atol(str);
 if(stat < 1 || stat > 255)  return(0);
 User.LineLength=(UBYTE)stat;
 return(1);
}

int ChooseComputer(void)
{
 int stat;

 for(stat=0;stat<ComputerEntries;stat+=2) {
 	sprintf(GSTR1,"%2d> %-34s ",stat,ComputerTypes[stat]);
	    AEPutStr(GSTR1);
 	if((stat+1)<ComputerEntries) {
 		sprintf(GSTR1,"%2d> %-34s\r\n",stat+1,ComputerTypes[stat+1]);
	    	AEPutStr(GSTR1);
		}
 	else		AEPutStr("\r\n");
	}
 AEPutStr("\r\n");

JLoop5:
 AEPutStr("Enter computer type: ");
 stat=LineInput("",GSTR1,3,KEYBOARD_TIMEOUT);
 if(stat<0)  return(stat);
 if(strlen(GSTR1)==0)  return(1);
 if(!(stat=IsStrDigits(GSTR1)))	goto JLoop5;

 User.Sec_Bulletin=(USHORT)atol(GSTR1);
 if(User.Sec_Bulletin < 0 || User.Sec_Bulletin >= ComputerEntries)  goto JLoop5;
 return(0);
}

int JCom(void)
{
 int ch, stat;
 char string[200];
 struct User TUser;
 struct UserKeys TUserkeys;
 int i;

 if(User.Slot_Number>0)  return(FAILURE);

 Find_Open_Account(&User,&User_keys);


 /* show as new user */
 StatPrintUser(&User);

 AEPutStr("\r\n");
 sprintf(GSTR1,"%sJoin",Sopt->NodeScreen);
 if(!(stat=ChecktoDisplay(GSTR1,GSTR3,0,1)))
 	UnAvailNotice(GSTR3,GSTR1);

JLoop1:
 AEPutStr("\r\n");
 AEPutStr("Blank line to retreat\r\n");

 ch=0;
IJLoop:
                 // change to variable
 for(i = 0; i < 5; i++) {
     AEPutStr("\r\nEnter your Handle: ");
                                         /*** MAKE KEYBOARD_TIMEOUT A VARIABLE */
     stat=LineInput(User.Name,User.Name,30,KEYBOARD_TIMEOUT);
     if(stat<0)  return(stat);

     if(strlen(User.Name)==0) {
 	    ch++;
	        if(ch>5) {
 		    AEPutStr("Too Many Errors, Goodbye!\r\n");
	    	    return(FAILURE);
		    }
         continue;
 	  //  goto IJLoop;
	    }

     if(strlen(User.Name)==1) {
 	    AEPutStr("Get REAL!!  One Character???\r\n");
	        // goto IJLoop;
         continue;
	    }
     strcpy(string,User.Name);

     if(stat=CheckifNameAllowed(string)) {
 	    continue; // goto IJLoop;
     }

     strcpy(string,User.Name);

     AEPutStr("\r\nChecking for duplicate name...");
     stat=CheckForAst(string);

     if(stat) {
 	    AEPutStr("No wildcards allow in a name.\r\n");
	        continue;  // goto IJLoop;
	    }

     stat=Find_User_From_Name(1,string,&TUser,&TUserkeys);
     if(stat!=0)	{
 	    AEPutStr("Already in use!, try another.\r\n");
	        continue;              // goto IJLoop;
	    }
     AEPutStr("Ok!\r\n\r\n");
    goto JLoop2;
 }

 AEPutStr("Too Many Errors, Goodbye!\r\n");
 return(FAILURE);

//--- end new loop1



JLoop2:
 AEPutStr("City, State: ");
 stat=LineInput("",User.Location,29,KEYBOARD_TIMEOUT);
 if(stat<0)  return(stat);
 if(strlen(User.Location)==0)  goto IJLoop;

JLoop3:
 AEPutStr("Phone Number: ");
 stat=LineInput("",User.PhoneNumber,12,KEYBOARD_TIMEOUT);
 if(stat<0)  return(stat);
 if(strlen(User.PhoneNumber)==0)  goto JLoop2;

JLoop4:
 AEPutStr("Enter a PassWord: ");
 stat=LineInput("",User.Pass,8,KEYBOARD_TIMEOUT);
 if(stat<0)   return(stat);
 if(strlen(User.Pass)==0)  goto JLoop3;

JLoop41:
 stat=NumberOfLinesTest();
 if(stat<0)  return(stat);
 if(stat==0)  goto JLoop4;

 AEPutStr("\r\n");
 if(stat=ChooseComputer()) {
 	if(stat<0)  return(stat);
	    goto JLoop41;
	}

 AEPutStr("\r\n");

 /* (RTS) added */
 User_keys.baud_rate = Online_Baud;
 User_keys.Userflags = 0;
 User_keys.Userflags = (UWORD) (USER_NEWMSG);
 AEPutStr("You want Screen Clears after Messages ? ");
 ch=Check_Online_Status();
 if(ch<0) return(ch);
	ch=ReadChar(KEYBOARD_TIMEOUT);
	if(ch<0)  return(ch);
	if(ch=='Y' || ch=='y') {
       User_keys.Userflags |= USER_SCRNCLR;         /* screen clear code sent */
       AEPutStr("Yes..\r\n\r\n");
	}
 else  AEPutStr("No!\r\n\r\n");
//(RTS) was Full Name
 sprintf(string,"Handle: %s\r\n",User.Name);
 AEPutStr(string);
 sprintf(string,"City, St.: %s\r\n",User.Location);
 AEPutStr(string);
 sprintf(string,"Phone Num: %s\r\n",User.PhoneNumber);
 AEPutStr(string);
 sprintf(string,"Num Lines: %d\r\n",User.LineLength);
 AEPutStr(string);
 sprintf(string,"PassWord : %s\r\n",User.Pass);
 AEPutStr(string);
 sprintf(string,"Computer : %s\r\n",ComputerTypes[User.Sec_Bulletin]);
 AEPutStr(string);
 AEPutStr("Scrn Clr : ");
 if(User_keys.Userflags & USER_SCRNCLR)    AEPutStr("YES\r\n");
 else                                      AEPutStr("NO\r\n");
 AEPutStr("\r\n");
 PurgeLine();
 AEPutStr("Is the above Correct? ");

 FOREVER	{
 	ch=Check_Online_Status();
 	if(ch<0) return(ch);
	    ch=ReadChar(KEYBOARD_TIMEOUT);
	    if(ch<0)  return(ch);
	    if(ch=='N' || ch=='n' || ch=='Q' || ch=='q') {
 		AEPutStr("No!\r\n\r\n");
	    	goto JLoop1;
		}
	    if(ch=='Y' || ch=='y')  break;
	    else  continue;
	}
 AEPutStr("Yes..\r\n\r\n");
 InitUser(&User,&User_keys);
BytesADL = User.Daily_Bytes_Limit;
ConvertAccess();

 User_keys.Number=User.Slot_Number;

//(RTS)
 User_keys.baud_rate = Online_Baud;    /* hold last logged on baud rate */
 ValidUser=0;                          /* not a valid user yet */

 StatPrintUser(&User);

 PurgeLine();

 stat=Question();    /* fill out questioneer */
 if(stat < (-1))	return(stat);

//(RTS) dont save account until after questioneer is filled out
 ValidUser=1;                          /* ok script done */
 Save_Account(&User,&User_keys,0,0);
 StatPrintUser(&User);
 ClearMsgPointers();
 MasterSavePointers();
 sprintf(GSTR1,"%sJoined",Sopt->NodeScreen);
 if(!(stat=ChecktoDisplay(GSTR1,GSTR3,0,1)))
 	UnAvailNotice(GSTR3,GSTR1);

 ch=DoPause();
 if(ch<0) return(ch);
 return(SUCCESS);
}

void InitUser(struct User *u,struct UserKeys *k)
{
 
sprintf(GSTR1,"%sACCESS/Preset.1",Cmds->BBSLoc);
 u->Sec_Status = IntFromIcon(GSTR1,"PRESET.ACCESS");
  u->Sec_Board  = IntFromIcon(GSTR1,"PRESET.RATIO_TYPE");
 u->Sec_Library= IntFromIcon(GSTR1,"PRESET.RATIO");
 u->Time_Limit = IntFromIcon(GSTR1,"PRESET.TIME_LIMIT");
 u->Time_Used  = 0L;
 u->Time_Total = u->Time_Limit;
 u->Messages_Posted=0;
 u->New_User   = 1;
 u->NewSinceDate=0;
 u->Uploads   = 0;
 u->Downloads = 0;
 u->ConfRJoin = IntFromIcon(GSTR1,"PRESET.CONFRJOIN");
 if(u->ConfRJoin==NULL) u->ConfRJoin=1;
 u->Times_Called   = 0;
 u->Bytes_Download = 0L;
 u->Bytes_Upload   = 1L;
 u->Daily_Bytes_Limit = IntFromIcon(GSTR1,"PRESET.DAILY_BYTE_LIMIT");
 
 u->Daily_Bytes_Dld = 0L;
 u->ConfYM1 = 0L; u->ConfYM2 = 0L; u->ConfYM3 = 0L;
 u->ConfYM4 = 0L; u->ConfYM5 = 0L; u->ConfYM6 = 0L;
 u->ConfYM7 = 0L; u->ConfYM8 = 0L; u->ConfYM9 = 0L; 

u->AccountDate=time(NULL); u->ScreenType=u->EditorType=0;

 u->ConfRead1 = 0L; u->ConfRead2 = 0L; u->ConfRead3 = 0L;
 u->ConfRead4 = 0L; u->ConfRead5 = 0L; u->XferProtocol = 0; u->Filler2=0;
 u->Lcfiles=0; u->BadFiles=0; 
 u->Expert    ='N';
 //u->NoScan  = 0;
 GetFromIconStr(GSTR1,"PRESET.AREA",u->Conference_Access);
 strcpy(k->UserName,u->Name); strupr(k->UserName);
 k->Number=u->Slot_Number;

//(RTS)
 k->DNcps = 0;
 k->UPcps = 0;
 k->baud_rate = 0L;    /* hold last logged on baud rate */

}

static int Questionaire(char *filename,char *Afilename)
{
 int ch,stat;
 char c[200],string[200],date[20],Dtime[30];
 char *p;
 FILE *fp2,*fp1;

QAgain:
 
 sprintf(string,"%sNode%u/TempAns",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);

 if(!(fp1=fopen(string,"w"))) {
     return(GOODBYE);
 }

 time(&Time_system);

 strcpy(c,ctime(&Time_system));
 c[strlen(c)-1]='\0';

 Convert_CTime_To_Date(c,date,Dtime);

 fprintf(fp1,"**************************************************************\n");
 fprintf(fp1,"%s (%s) [%hu] %s (%s) %s\n",date,Dtime,User.Slot_Number,User.Name,ConnectString,User.Location);

 fclose(fp1);
 sprintf(GSTR1,"%sCommands/SysCmd/",Cmds->BBSLoc);
 strcpy(GSTR2,"SCRIPT");
 if(!CustomCommand(GSTR1,GSTR2,1))
 {
    fp2=fopen(filename,"r");
    if(fp2==NULL) return(SUCCESS);
    if(!(fp1=fopen(string,"a"))) return(GOODBYE);
 
// read & verify Questionaire
 while(fgets(c,120,fp2)!=NULL)	{
 	if(c[strlen(c)-2]!='~')	{
 		AEPutStr(c);
	    	AEPutStr("\r");
		    fprintf(fp1,"%s",c);
		} else {
 		c[strlen(c)-2]='\0';
	    	AEPutStr(c);
 		fputs(c,fp1);
		    stat=LineInput("",string,70,KEYBOARD_TIMEOUT);
	    	if(stat<0) {
 			fclose(fp1);
	    		fclose(fp2);
                 return(stat);            //(RTS)
//		    	return(0);
			}
 		fprintf(fp1,"%s\n",string);
		}
	}

 fclose(fp1);
 fclose(fp2);
 }
 
 AEPutStr("\r\n");

 AEPutStr("Is the above Correct? ");

 FOREVER	{
 	ch=Check_Online_Status();
	    if(ch<0) return(ch);
 	ch=ReadChar(KEYBOARD_TIMEOUT);
	    if(ch<0)  return(ch);
 	if(ch=='N' || ch=='n' || ch=='Q' || ch=='q') {
 		AEPutStr("No!\r\n\r\n");
	    	goto QAgain;
		}
 	if(ch=='Y' || ch=='y')  break;
	    else  continue;
	}
 AEPutStr("Yes..\r\n\r\n");

 if(!(fp1=fopen(Afilename,"r")))
   	fp1=fopen(Afilename,"w");
 else {
 	fclose(fp1);
	    fp1=fopen(Afilename,"a");
	}

 sprintf(string,"%sNode%u/TempAns",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);
 if((fp2=fopen(string,"r"))) {
 	for(;;)	{
 		if(!(p=fgets(c,120,fp2))) 			break;
 		fputs(c,fp1);
		}
	    fclose(fp1);
	    fclose(fp2);
	}
 return(SUCCESS);
}

int Question(void)
{
 char str1[200], str2[200];

 sprintf(str1,"%sNode%u/Script%d",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER],Online_Baud);
 sprintf(str2,"%sNode%u/Answers",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);

 return(Questionaire(str1,str2));
}

