Advertisement
ipsBruno

(Pawn) expirefiles.inc

Dec 1st, 2012
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.83 KB | None | 0 0
  1.  /*
  2.  *  Copyright (c) 2012 [iPs]TeaM
  3.  *  Bruno da Silva (email@brunodasilva.com)
  4.  *  Função: Criar arquivos temporários
  5.  *
  6.  * www.brunodasilva.com
  7.  * www.ips-team.forumeiros.com
  8.  
  9. MODO DE USO:
  10.        CreateTempFile ( " nome do arquivo ", SEGUNDOSparaEXPIRAR );
  11.        
  12.        Exemplo:
  13.                 CreateTempFile("bruno.ini", 20); // é deletado 20 segundos depois
  14.  
  15.  
  16.  
  17.        SetTimeFile( " nome do arquivo ", NOVOtempoAPOSagora);
  18.  
  19.        Exemplo:
  20.             SetTimeFile("bruno.ini", 40); // faz o arquivo durar +40 segundos
  21.  
  22. _____________________________________________________________________________________
  23.  
  24. # FUNCIONA MESMO SE DESLIGAR O SERVIDOR
  25. # SUPORTE A MÚLTIPLOS ARQUIVOS
  26. # AO DESLIGAR O SERVIDOR FECHE COM "RCON EXIT"
  27.  
  28. A callback "OnExpireFile" é chamada com nome do arquivo que foi expirado e deletado !!!
  29.  
  30. _____________________________________________________________________________________*/
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37. // Redefina aqui em caso de for necessário
  38. #if !defined MAX_FILE_NAME
  39.  
  40.     #define MAX_FILE_NAME 32
  41.  
  42. #endif
  43.  
  44. #if !defined MAX_TEMP_FILES
  45.  
  46.     #define MAX_TEMP_FILES 100
  47.  
  48. #endif
  49.  
  50. // Não mexa no código caso não saiba xD
  51.  
  52. #if defined FILTERSCRIPT
  53.  
  54.     #if defined _ALS_OnFilterScriptInit
  55.    
  56.         #undef OnFilterScriptInit
  57.        
  58.     #else
  59.    
  60.         #define _ALS_OnFilterScriptInit
  61.        
  62.     #endif
  63.    
  64.     public OnFilterScriptInit()
  65.     {
  66.             ExpirarArquivosINIT();
  67.  
  68.             return CallLocalFunction("exOnFilterScriptInit", "");
  69.     }
  70.  
  71.     public OnFilterScriptInit()
  72.     {
  73.             ExpirarArquivosEXIT();
  74.  
  75.             return CallLocalFunction("exOnFilterScriptExit", "");
  76.     }
  77.  
  78.  
  79.     #define OnFilterScriptInit exOnFilterScriptInit
  80.     forward OnFilterScriptInit();
  81.    
  82.     #define OnFilterScriptExit exOnFilterScriptExit
  83.     forward OnFilterScriptExit();
  84.  
  85. #else
  86.  
  87.     #if defined _ALS_OnGameModeInit
  88.    
  89.         #undef OnGameModeInit
  90.        
  91.     #else
  92.    
  93.         #define _ALS_OnGameModeInit
  94.        
  95.     #endif
  96.    
  97.  
  98.     public OnGameModeInit()
  99.     {
  100.             ExpirarArquivosINIT();
  101.             return CallLocalFunction("exfileOnGameModeInit", "");
  102.     }
  103.    
  104.  
  105.     public OnGameModeExit()
  106.     {
  107.             ExpirarArquivosEXIT();
  108.             return CallLocalFunction("exfileOnGameModeExit", "");
  109.     }
  110.    
  111.     #define OnGameModeInit exfileOnGameModeInit
  112.     forward OnGameModeInit();
  113.    
  114.     #define OnGameModeExit exfileOnGameModeExit
  115.     forward OnGameModeExit();
  116.  
  117. #endif
  118.  
  119.  
  120.  
  121.  
  122. #define TempFile::  BSTemp_
  123.  
  124. #define BSTemp_fp%0(%1) forward %0(%1); public %0(%1)
  125.  
  126.  
  127. // Declarar variáveis novas
  128. enum bsInfo {
  129.     szFilename[MAX_FILE_NAME],
  130.     fileTime
  131. }
  132.  
  133.  
  134. new
  135.     TempFile::Info[MAX_TEMP_FILES][bsInfo],
  136.     TempFile::Total = -1;
  137.  
  138. // Ao iniciar script, chamar a pública para checar os arquivos
  139. // Carregar o arquivo nas arrays
  140.  
  141.  
  142.  
  143. TempFile::fp ExpirarArquivosINIT() {
  144.     if (fexist("filesrename.bs")) {
  145.  
  146.         new
  147.             File: file = fopen("filesrename.bs", io_read),
  148.             File: time = fopen("filestimers.bs", io_read),
  149.             stringRename[MAX_TEMP_FILES * MAX_FILE_NAME char],
  150.             stringTimers[MAX_TEMP_FILES * 13 char];
  151.  
  152.         fread(file, stringRename, (MAX_TEMP_FILES * MAX_FILE_NAME) >> 2, true); // >> 2 para adaptar a char
  153.         fread(time, stringTimers, (MAX_TEMP_FILES * 13) >> 2, true); // 13 pois pawn só aceita números com +- 13 algarismos
  154.  
  155.         fclose(file);
  156.         fclose(time);
  157.  
  158.         TempFile::Total++;
  159.  
  160.         // Carregar nomes arquivos
  161.         for (new x, j = -1; stringRename { x  }; x++) {
  162.             if (stringRename { x } == '>') {
  163.                 j = -1;
  164.                 TempFile::Total++;
  165.             } else {
  166.                 TempFile::Info[TempFile::Total][szFilename][++j] = stringRename { x };
  167.             }
  168.         }
  169.         TempFile::Total = 0;
  170.  
  171.         // Carregar tempos
  172.         for (new x, j = -1, stringTemp[13]; stringTimers { x }; x++) {
  173.             if (stringTimers { x} == '|') {
  174.                 j = -1;
  175.                 TempFile::Total++;
  176.                 TempFile::Info[TempFile::Total][fileTime] = strval(stringTemp);
  177.                 stringTemp[0] = EOS;
  178.             } else {
  179.                 stringTemp[++j] = stringTimers { x };
  180.             }
  181.         }
  182.  
  183.         fremove("filesrename.bs");
  184.         fremove("filestimers.bs");
  185.  
  186.         printf("Arquivos temporários carregados: %d", TempFile::Total);
  187.     }
  188.     //CallLocalFunction("OnFilterScriptInitEx", "\0");
  189.  
  190.     return SetTimer("checarArquivos", 998, true); // 998 ms. Para demorar em torno de 1 segundo (2 ms execução callback)
  191. }
  192.  
  193. // Exportar array para arquivo
  194. // Assim pode carregar os dados posteriormente
  195.  
  196. TempFile::fp ExpirarArquivosEXIT() {
  197.  
  198.     new
  199.         File: file = fopen("filesrename.bs", io_write),
  200.         File: time = fopen("filestimers.bs", io_write);
  201.  
  202.     for (new i; i <= TempFile::Total; ++i) {
  203.         if (gettime() <= TempFile::Info[i][fileTime]) {
  204.             if (fexist(TempFile::Info[i][szFilename])) {
  205.                 if (file && time) {
  206.                     fwrite(file, TempFile::Info[i][szFilename]);
  207.                     fwrite(time, intToStr(TempFile::Info[i][fileTime]));
  208.                     fwrite(file, ">");
  209.                     fwrite(time, "|");
  210.                 }
  211.             }
  212.         }
  213.     }
  214.     if (file && time) {
  215.         fclose(file);
  216.         fclose(time);
  217.     }
  218.    
  219.     // CallLocalFunction("OnFilterScriptExitEx", "\0")
  220.    
  221.     return true;
  222. }
  223. // Checar se o tempo do arquivo já passou do inválido
  224. // Aqui é deletado o arquivo após x tempo
  225.  
  226. TempFile::fp checarArquivos() {
  227.  
  228.     if (!TempFile::Total) {
  229.         return false;
  230.     }
  231.  
  232.     for (new i; i <= TempFile::Total; i++) {
  233.         if (gettime() >= TempFile::Info[i][fileTime]) {
  234.             if (fexist(TempFile::Info[i][szFilename])) {
  235.                 fremove(TempFile::Info[i][szFilename]);
  236.                 CallLocalFunction("OnExpireFile", "s", TempFile::Info[i][szFilename]);
  237.             }
  238.         }
  239.     }
  240.     return true;
  241. }
  242.  
  243. // Função para criar o arquivoTemporario
  244. // Bastando especificar os segundos e o arquivo
  245. // O parametro "dontexist" caso estiver TRUE colocará um novo tempo no arquivo caso ele existir
  246.  
  247. stock arquivoTemporario(arquivo[], segundos,  dontexist = _: true )
  248.     return arquivoTemporarioEX(arquivo, segundos,  dontexist );
  249.  
  250. TempFile::fp arquivoTemporarioEX(arquivo[], segundos, dontexist ) {
  251.  
  252.     // caso arquivo já existir editar tempo atual
  253.     if (fexist(arquivo) && dontexist) {
  254.         return alterarTempo(arquivo, segundos);
  255.         //return 1;
  256.     }
  257.  
  258.     static
  259.     File: file;
  260.     if ((file = fopen(arquivo, io_write))) {
  261.         strcat(TempFile::Info[++TempFile::Total][szFilename], arquivo, MAX_FILE_NAME);
  262.         return fclose(file), TempFile::Info[TempFile::Total][fileTime] = (gettime() + segundos);
  263.     }
  264.  
  265.     return false;
  266. }
  267. // Função para alterar o tempo de deletação do arquivo.
  268. // Partindo o tempo atual
  269.  
  270. TempFile::fp alterarTempo(arquivo[], segundos) {
  271.     new cmd = prev_strcmp(arquivo);
  272.     for (new i; i <= TempFile::Total; i++) {
  273.         if (cmd == prev_strcmp(TempFile::Info[i][szFilename])) {
  274.             if (!strcmp(arquivo, TempFile::Info[i][szFilename], true)) {
  275.                 return TempFile::Info[i][fileTime] = gettime() + segundos;
  276.             }
  277.         }
  278.     }
  279.     return false;
  280. }
  281. // Ajudar na velocidade de comparação de strings
  282. // Sistema simples de conta caracteres, compara dados números é mais veloz
  283.  
  284. TempFile::fp prev_strcmp(string[]) {
  285.     new
  286.         j;
  287.     for (new i; string[i]; i++) {
  288.         j += string[i];
  289.     }
  290.     return j;
  291. }
  292. // Transformar valor em string
  293. // Sem declarar strings chatas
  294.  
  295. intToStr(valor) {
  296.  
  297.     static
  298.         szString[13];
  299.     format(szString, 13, "%i", valor);
  300.  
  301.     return szString;
  302. }
  303.  
  304.  
  305. forward OnExpireFile(arquivo[]);
  306.  
  307. #define CreateTempFile\
  308.                     arquivoTemporario
  309.  
  310. #define SetTimeFile\
  311.                     alterarTempo
  312.  
  313.                                                                                                
  314. // =======================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement