diff --git a/src/sbbs3/bat_xfer.cpp b/src/sbbs3/bat_xfer.cpp index e12bc335432fe3eb89621138cf8dd1a8d4915366..bd52b1a394bd0afaed8cad9b9f1d3330e76efe99 100644 --- a/src/sbbs3/bat_xfer.cpp +++ b/src/sbbs3/bat_xfer.cpp @@ -101,9 +101,9 @@ void sbbs_t::batchmenu() break; } for(i=0,totalcdt=0;i<batdn_total;i++) + if(!is_download_free(&cfg,batdn_dir[i],&useron)) totalcdt+=batdn_cdt[i]; - if(!(useron.exempt&FLAG('D')) - && totalcdt>useron.cdt+useron.freecdt) { + if(totalcdt>useron.cdt+useron.freecdt) { bprintf(text[YouOnlyHaveNCredits] ,ultoac(useron.cdt+useron.freecdt,tmp)); break; @@ -353,9 +353,9 @@ BOOL sbbs_t::start_batch_download() return(FALSE); } for(i=0,totalcdt=0;i<batdn_total;i++) - totalcdt+=batdn_cdt[i]; - if(!(useron.exempt&FLAG('D')) - && totalcdt>useron.cdt+useron.freecdt) { + if(is_download_free(&cfg,batdn_dir[i],&useron)) + totalcdt+=batdn_cdt[i]; + if(totalcdt>useron.cdt+useron.freecdt) { bprintf(text[YouOnlyHaveNCredits] ,ultoac(useron.cdt+useron.freecdt,tmp)); return(FALSE); @@ -788,10 +788,12 @@ bool sbbs_t::addtobatdl(file_t* f) return(false); } for(i=0,totalcdt=0;i<batdn_total;i++) - totalcdt+=batdn_cdt[i]; + if(!is_download_free(&cfg,batdn_dir[i],&useron)) + totalcdt+=batdn_cdt[i]; if(cfg.dir[f->dir]->misc&DIR_FREE) f->cdt=0L; - totalcdt+=f->cdt; - if(!(useron.exempt&FLAG('D')) && totalcdt>useron.cdt+useron.freecdt) { + if(!is_download_free(&cfg,f->dir,&useron)) + totalcdt+=f->cdt; + if(totalcdt>useron.cdt+useron.freecdt) { bprintf(text[CantAddToQueue],f->name); bprintf(text[YouOnlyHaveNCredits],ultoac(useron.cdt+useron.freecdt,tmp)); return(false); diff --git a/src/sbbs3/download.cpp b/src/sbbs3/download.cpp index a7443ddb4871a79d956372ac174152eb48bc57f8..4b86d52297d02e8018d99a22301edb547a33ce84 100644 --- a/src/sbbs3/download.cpp +++ b/src/sbbs3/download.cpp @@ -67,7 +67,7 @@ void sbbs_t::downloadfile(file_t* f) /****************************/ useron.dls=(ushort)adjustuserrec(&cfg,useron.number,U_DLS,5,1); useron.dlb=adjustuserrec(&cfg,useron.number,U_DLB,10,length); - if(!(cfg.dir[f->dir]->misc&DIR_FREE) && !(useron.exempt&FLAG('D'))) + if(!is_download_free(&cfg,f->dir,&useron)) subtract_cdt(&cfg,&useron,f->cdt); /**************************/ /* Update Uploader's Info */ diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c index 5483d737f02038a3b9a82f6cea63ee3e48739237..d377bda74e8e5b576487cd966d501d7fe071cc65 100644 --- a/src/sbbs3/ftpsrvr.c +++ b/src/sbbs3/ftpsrvr.c @@ -1335,7 +1335,6 @@ static void send_thread(void* arg) ulong dur; ulong cps; ulong length; - BOOL exempt; BOOL error=FALSE; FILE* fp; file_t f; @@ -1553,13 +1552,7 @@ static void send_thread(void* arg) if(xfer.credits) { xfer.user->dls=(ushort)adjustuserrec(&scfg, xfer.user->number,U_DLS,5,1); xfer.user->dlb=adjustuserrec(&scfg, xfer.user->number,U_DLB,10,total); - exempt=FALSE; - if(xfer.user->exempt&FLAG('D')) - exempt=TRUE; - if(scfg.dir[xfer.dir]->ex_ar[0]!=0 - && chk_ar(&scfg, scfg.dir[xfer.dir]->ex_ar, xfer.user)) - exempt=TRUE; - if(xfer.dir>=0 && !(scfg.dir[xfer.dir]->misc&DIR_FREE) && !exempt) + if(xfer.dir>=0 && !is_download_free(&scfg,xfer.dir,xfer.user)) subtract_cdt(&scfg, xfer.user, xfer.credits); } if(!xfer.tmpfile && !xfer.delfile) @@ -3900,8 +3893,7 @@ static void ctrl_thread(void* arg) /* Verify credits */ if(!getsize && !getdate && !delecmd - && !(scfg.dir[dir]->misc&DIR_FREE) - && !(user.exempt&FLAG('D'))) { + && !is_download_free(&scfg,dir,&user)) { if(filedat) getfiledat(&scfg,&f); else diff --git a/src/sbbs3/listfile.cpp b/src/sbbs3/listfile.cpp index 8f0f941c0dbb8f4a92dd91cf4301da39169e614b..630899d7f10cec9a9665a64a76c794f0d9074ea2 100644 --- a/src/sbbs3/listfile.cpp +++ b/src/sbbs3/listfile.cpp @@ -1207,7 +1207,7 @@ int sbbs_t::listfileinfo(uint dirnum, char *filespec, long mode) found=-1; break; } continue; } - if(!(cfg.dir[f.dir]->misc&DIR_FREE) && !(useron.exempt&FLAG('D')) + if(!is_download_free(&cfg,f.dir,&useron) && f.cdt>(useron.cdt+useron.freecdt)) { SYNC; bprintf(text[YouOnlyHaveNCredits] diff --git a/src/sbbs3/pack_qwk.cpp b/src/sbbs3/pack_qwk.cpp index 4759065af77ccd44296390e749ce222abc6c1e8c..fc7fd21ab58c33755b113ee4c607fd277577d171 100644 --- a/src/sbbs3/pack_qwk.cpp +++ b/src/sbbs3/pack_qwk.cpp @@ -541,9 +541,9 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack) if(batdn_total) { for(i=0,totalcdt=0;i<batdn_total;i++) + if(!is_download_free(&cfg,batdn_dir[i],&useron)) totalcdt+=batdn_cdt[i]; - if(!(useron.exempt&FLAG('D')) - && totalcdt>useron.cdt+useron.freecdt) { + if(totalcdt>useron.cdt+useron.freecdt) { bprintf(text[YouOnlyHaveNCredits] ,ultoac(useron.cdt+useron.freecdt,tmp)); } diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c index dcd9e85cf2faf85ffc881f3bba471d733d9df290..37153e7b360c5e92004dd325d89035c7c7df47dc 100644 --- a/src/sbbs3/userdat.c +++ b/src/sbbs3/userdat.c @@ -2200,3 +2200,26 @@ int DLLCALL user_rec_len(int offset) return(-1); } + +BOOL DLLCALL is_download_free(scfg_t* cfg, uint dirnum, user_t* user) +{ + if(!VALID_CFG(cfg)) + return(FALSE); + + if(dirnum>=cfg->total_dirs) + return(FALSE); + + if(cfg->dir[dirnum]->misc&DIR_FREE) + return(TRUE); + + if(user==NULL) + return(FALSE); + + if(user->exempt&FLAG('D')) + return(TRUE); + + if(cfg->dir[dirnum]->ex_ar[0]==0) + return(FALSE); + + return(chk_ar(cfg,cfg->dir[dirnum]->ex_ar,user)); +} \ No newline at end of file diff --git a/src/sbbs3/userdat.h b/src/sbbs3/userdat.h index d831a6fdfcac64768663c3cdf8627a14d1c391ff..e081ea8e41ebc7e3bdd7aae13ab387a6207567a0 100644 --- a/src/sbbs3/userdat.h +++ b/src/sbbs3/userdat.h @@ -106,6 +106,7 @@ DLLEXPORT BOOL DLLCALL logoutuserdat(scfg_t*, user_t*, time_t now, time_t logont DLLEXPORT void DLLCALL resetdailyuserdat(scfg_t*, user_t*); DLLEXPORT void DLLCALL subtract_cdt(scfg_t*, user_t*, long amt); DLLEXPORT int DLLCALL user_rec_len(int offset); +DLLEXPORT BOOL DLLCALL is_download_free(scfg_t* cfg, uint dirnum, user_t* user); #ifdef __cplusplus }