#include < amxmodx >
#define LOG_PATH "addons/amxmodx/logs/" //Укажите путь до папки в которую будет писать LOG_FILE
#define LOG_FILE "cc_logs.log" //Файл, логирования очистки [перезаписывается автоматически каждую очистку папок]
#define DAYS 14 //раз в сколько дней производить очистку
#define KEY "cc_logs" //ключ куда записывается, когда очищать логи
#define MAX_MASK 5 //В принципе должно хватить деф значения, но если прилетит warning в лог, то увеличьте ;)
//#define ONLY_ALL //Если не будете использовать маски файлов, то раскоментируйте. (будет удалять ВСЕ файлы в указанной Вами папке, в подпапки также заходить НЕ будет) [уберёт лишние прверки]
//============= dont touch
#define NOT_MAGIC_MASK 32
#define NOT_MAGIC MAX_MASK * NOT_MAGIC_MASK
#define NOT_MAGIC_FILE 128
// dont touch =============
enum EFILES {
PATH[NOT_MAGIC_FILE],
FILES[NOT_MAGIC]
}
//Плагин будет чистить только папки указанные Вами ЗДЕСЬ. Вложенные папки не трогает.
new sFiles[][EFILES] = {
{"logs", "*"}, //Будет чистить cstrike/logs, удалять все файлы
{"addons/amxmodx/logs/chatmanager", "?*.html"}, //Будет чистить addons/amxmodx/logs/chatmanager, удалять будет все файлы с расширением .html
{"addons/amxmodx/logs", "error_*.log;L*.log"} //Будет чистить addons/amxmodx/logs, удалять будет только error_*.log файлы, т.е все error логи и все обычные логи начинающиеся на букву L.
}
public plugin_cfg(){
register_plugin("Clear Logs", "17.01.2020", "PAffAEJIkA :3");
new day, dt[4];
get_time("%j", dt, charsmax(dt));
day = str_to_num(dt);
if(!vaultdata_exists(KEY))
set_vaultdata(KEY, dt);
get_vaultdata(KEY, dt, charsmax(dt));
if(str_to_num(dt) > day)
return;
new sLog[NOT_MAGIC_FILE];
format(sLog, charsmax(sLog), "%s%s", LOG_PATH, LOG_FILE);
mkdir(LOG_PATH);
unlink(sLog);
for(new i, dir, file[NOT_MAGIC_FILE]
#if !defined ONLY_ALL
, k, files[MAX_MASK][2][NOT_MAGIC_MASK], cnt, bool:del
#endif
; i < sizeof sFiles; i ++){
log_to_file(sLog, "======= START CLEARED %s =======", sFiles[i][PATH]);
if(!(dir = open_dir(sFiles[i][PATH], file, charsmax(file)))){
log_to_file(sLog, "Dir open ERROR!");
log_to_file(sLog, "======= END CLEARED %s =======", sFiles[i][PATH]);
continue;
}
#if !defined ONLY_ALL
cnt = 0;
if(sFiles[i][FILES][0] != '*'){
do{
strtok(sFiles[i][FILES], file, charsmax(file), sFiles[i][FILES], charsmax(sFiles[][FILES]), ';');
strtok(file, files[cnt][0], charsmax(files[][]), files[cnt][1], charsmax(files[][]), '*');
if(++ cnt == MAX_MASK){
log_to_file(sLog, "^n================- [WARNING] -================^n\
Please, increase the #define MAX_MASK^n\
================- [WARNING] -================"
);
break;
}
}while(sFiles[i][FILES][0] != EOS);
}
#endif
while(next_file(dir, file, charsmax(file))){
if(file[0] == '.' || contain(file, ".") == -1 || strcmp(LOG_FILE, file) == 0) //Папки и файлы без расширения не тронет
continue;
#if !defined ONLY_ALL
if(cnt){
del = false;
for(k = 0; k < cnt; k ++){
if((files[k][0][0] == '?' || equal(file, files[k][0], strlen(files[k][0])))
&& strcmp(file[strlen(file) - strlen(files[k][1])], files[k][1]) == 0)
{
del = true;
break;
}
}
if(!del)
continue;
}
#endif
format(file, charsmax(file), "%s/%s", sFiles[i][PATH], file);
log_to_file(sLog, "File ^"%s^" - %s removed", file, delete_file(file) ? "has been" : "was not");
}
close_dir(dir);
log_to_file(sLog, "======= END CLEARED %s =======", sFiles[i][PATH]);
}
day += DAYS;
if(day > 365)
day -= 365;
num_to_str(day, dt, charsmax(dt));
set_vaultdata(KEY, dt);
}