[FilterScript] (Include) (Cуdigo) Criar arquivos temporбrios
#1

Arquivos Temporбrios

ATUALIZADO - ARMAZENA TEMPO MESMO AO FECHAR SERVIDOR

pawn Код:
#include <a_samp>

// Redefina aqui em caso de for necessбrio

#define fp%0(%1)    forward %0(%1); public %0(%1)
#if !defined MAX_FILE_NAME
#define MAX_FILE_NAME 32
#endif

#if !defined MAX_TEMP_FILES
#define MAX_TEMP_FILES 100
#endif

// Declarar variбveis novas
enum bsInfo {
    szFilename[MAX_FILE_NAME],
    fileTime
}

new
    bstempFile[MAX_TEMP_FILES][bsInfo],
    bsTotalfiles = -1;

// Ao iniciar script, chamar a pъblica para checar os arquivos
// Carregar o arquivo nas arrays
public OnFilterScriptInit() {
    if(fexist("filesrename.bs")) {

        new
            File:file = fopen("filesrename.bs", io_read),
            File:time = fopen("filestimers.bs", io_read),
            stringRename[MAX_TEMP_FILES * MAX_FILE_NAME char],
            stringTimers[MAX_TEMP_FILES * 13 char];
       
        fread(file, stringRename, (MAX_TEMP_FILES * MAX_FILE_NAME) >> 2, true); // >> 2 para adaptar a char
        fread(time, stringTimers, (MAX_TEMP_FILES * 13) >> 2, true); // 13 pois pawn sу aceita nъmeros com +- 13 algarismos

        fclose(file);
        fclose(time);
       
        bsTotalfiles++;
       
        // Carregar nomes arquivos
        for(new x, j = -1; stringRename{x}; x++) {
            if(stringRename{x} == '>') {
                j = -1;
                bsTotalfiles++;
            }
            else {
                bstempFile[bsTotalfiles][szFilename][++j] = stringRename{x};
            }
        }
        bsTotalfiles = 0;
       
        // Carregar tempos
        for(new x, j = -1, stringTemp[13]; stringTimers{x}; x++) {
            if(stringTimers{x} == '|') {
                j = -1;
                bsTotalfiles++;
                bstempFile[bsTotalfiles][fileTime] = strval(stringTemp);
                stringTemp[0] = EOS;
            }
            else {
                stringTemp[++j] = stringTimers{x};
            }
        }

        fremove("filesrename.bs");
        fremove("filestimers.bs");
       
        printf("Arquivos temporбrios carregados: %d", bsTotalfiles);
    }
    return SetTimer("checarArquivos", 998, true); // 998 ms. Para demorar em torno de 1 segundo (2 ms execuзгo callback)
}

// Exportar array para arquivo
// Assim pode carregar os dados posteriormente
public OnFilterScriptExit() {

    new
        File:file = fopen("filesrename.bs", io_write),
        File:time = fopen("filestimers.bs", io_write);
       
    for(new i; i <= bsTotalfiles; i++) {
        if(gettime() <= bstempFile[i][fileTime]) {
            if(fexist(bstempFile[i][szFilename])) {
                if(file) {
                    fwrite(file, bstempFile[i][szFilename]);
                    fwrite(time, intToStr(bstempFile[i][fileTime]));

                    fwrite(file, ">");
                    fwrite(time, "|");
                }
            }
        }
    }
    if(file) {
        fclose(file);
        fclose(time);
    }
    return true;
}

// Checar se o tempo do arquivo jб passou do invбlido
// Aqui й deletado o arquivo apуs x tempo
fp checarArquivos() {
    for(new i; i <= bsTotalfiles; i++) {
        if(gettime() >= bstempFile[i][fileTime]) {
            if(fexist(bstempFile[i][szFilename])) {
                fremove(bstempFile[i][szFilename]);
                CallRemoteFunction("OnTemporaryDeleteFile", "s", bstempFile[i][szFilename]);
            }
        }
    }
    return true;
}

// Funзгo para criar o arquivoTemporario
// Bastando especificar os segundos e o arquivo

fp arquivoTemporario(arquivo[], segundos) {

    // caso arquivo jб existir editar tempo atual
    if(fexist(arquivo)) {
        alterarTempo(arquivo, segundos);
    }

    static
        File:file;

    if((file = fopen(arquivo, io_write))) {
        strcat(bstempFile[++bsTotalfiles][szFilename], arquivo, MAX_FILE_NAME);
        return fclose(file), bstempFile[bsTotalfiles][fileTime] = (gettime() + segundos);
    }
    return false;
}

// Funзгo para alterar o tempo de deletaзгo do arquivo.
// Partindo o tempo atual

fp alterarTempo(arquivo[], segundos) {
    new cmd = prev_strcmp(arquivo);
    for(new i; i <= bsTotalfiles; i++) {
        if(cmd == prev_strcmp(bstempFile[i][szFilename])) {
            if(!strcmp(arquivo, bstempFile[i][szFilename], true)) {
                return bstempFile[i][fileTime] = gettime() + segundos;
            }
        }
    }
    return false;
}

// Ajudar na velocidade de comparaзгo de strings
// Sistema simples de conta caracteres, compara dados nъmeros й mais veloz

fp prev_strcmp(string[]) {
    new
        j;
    for(new i; string[i]; i++) {
        j += string[i];
    }
    return j;
}

// Transformar valor em string
// Sem declarar strings chatas

intToStr(valor) {
    new szString[13];
    format(szString, 13, "%i", valor);
    return szString;
}
Cria um arquivo especificando os segundos para ele ser deletado.

Simples uso
pawn Код:
arquivoTemporario("bruno.txt",  10);
(com este cуdigo o arquivo serб deletado em 10 segundos) (caso usar a funзгo 2 vezes o arquivo serб atualizado com um novo tempo)


Modo de uso.
1 Primeiramente salve o cуdigo ali encima como filterscript e carregue-o no server.cfg ATENCAO. O cуdigo acima deve ser salvo como um filterscript e carregado.

2 Coloque isto no seu game mode . No GAME MODE o cуdigo abaixo
pawn Код:
#define alterarTempo(%0,%1)          CallRemoteFunction("alterarTempo", "si", %0,%1)
#define arquivoTemporario(%0,%1)   CallRemoteFunction("arquivoTemporario", "si", %0,%1)
forward OnDeleteTempFile(file[]);
3 Agora sу usar as funзхes definidas acima em seu gamemode

Exemplo - Funзхes para VIP
Umas funзхes vips:
pawn Код:
stock darVip(playerid, dias) {
    static
        namePlayer[MAX_PLAYER_NAME + 25]
    ;
    GetPlayerName(playerid, namePlayer, MAX_PLAYER_NAME);
    format(namePlayer, MAX_PLAYER_NAME + 25], "/pastaVips/%s.ini", namePlayer);

    arquivoTemporario(namePlayer, dias * 60 * 60 * 24);

// x * 60 = 1 minuto
// x * 60 * 60 = 1 hora
// x * 60 * 60 * 24 = 1 dia
}

stock remVip(playerid) {
    static
        namePlayer[MAX_PLAYER_NAME + 25]
    ;
    GetPlayerName(playerid, namePlayer, MAX_PLAYER_NAME);
    format(namePlayer, MAX_PLAYER_NAME + 25], "/pastaVips/%s.ini", namePlayer);

    alterarTempo(namePlayer, 0);

// 0 = deleta arquivo na hora
}

stock chkVip(playerid) {
    static
        namePlayer[MAX_PLAYER_NAME + 25]
    ;
    GetPlayerName(playerid, namePlayer, MAX_PLAYER_NAME);
    format(namePlayer, MAX_PLAYER_NAME + 25], "/pastaVips/%s.ini", namePlayer);
    return fexist(namePlayer);
}
Observaзхes
OnDeleteTempFile serб chamada com nome do arquivo cada vez que o arquivo й deletado apуs determinado tempo

Nгo ocorre lag no servidor. Jб coloquei um sistema de comparaзгo de strings similar ao do Bini e DOF2 usando dados nъmericos para diminuir caso tiver latкncia. Mesmo nгo tendo usando "string compare" direto

* Nenhum erro encontrado *

Abraзos!
Reply
#2

Muito bom, parabйns Drakins!
Vocк coda Squirrel ou lua? Porque seu comandos nгo comeзam com maiъsculos o.O (Exemplo: alterarTempo)
Reply
#3

Gostei
Reply
#4

Muito Bom , Explicando cada aprte do codigo , exelente .

Somente nгo entendi essa parte :

Quote:

Caso der GMX o arquivo jб nгo й deletado. Quando eu tiver tempo coloco um sistema para exportara array bstempFile para um arquivo e importa-la. Mas agora ando meio sem tempo

Reply
#5

Quer dizer o tнtulo diz tudo Ades Arquivos Temporбrios mais se vocк der GMX com o settimer correndo ele nгo ira deletar e quando o server voltar ele vai continuar novamente do comeзo

Espero ter explicado
Reply
#6

Enfim Gostei Muito Do Cуdigo, Muitas Pessoas irб utilizar tenho quase certeza.
Pois com ela da pra colocar Admin Por Tempo,Horas,Dias Sem se preocupar.
Muito Utilizavel.
Obrigado por compartilhar.
Reply
#7

Quote:
Originally Posted by CidadeNovaRP
Посмотреть сообщение
Muito bom, parabйns Drakins!
Vocк coda Squirrel ou lua? Porque seu comandos nгo comeзam com maiъsculos o.O (Exemplo: alterarTempo)
jabaScript (mexi um pouco com Squierrel e Lua. Nгo gostei muito da sintaxe, parece Cold Fusion, sу que pra jogo e mais chato)

Quote:

Muito Bom , Explicando cada aprte do codigo , exelente .

Somente nгo entendi essa parte :

Caso der GMX ele nгo deleta o arquivo, pois estou usando tudo arrays em tempo real mesmo, na memуria.. :/ Estou sem tempo de fazer fazer o sistema para exportar a array e importa-la. Enfim.

-
OFF Na verdade, tempo eu tenho, mas agora eu sinto a necessidade profunda de ir secar o Grкmio contra o Palmeiras. Fuuiiz
Reply
#8

Quote:
Originally Posted by Ades
Посмотреть сообщение
Muito Bom , Explicando cada aprte do codigo , exelente .

Somente nгo entendi essa parte :
GMX trava o Timer, entгo se tiver um arquivo temporбrio e vocк de GMX, nгo irб deleta-lу.
Reply
#9

Quote:
Originally Posted by CidadeNovaRP
Посмотреть сообщение
GMX trava o Timer, entгo se tiver um arquivo temporбrio e vocк de GMX, nгo irб deleta-lу.
Exatamente. Mas pra isto basta importar/exportar as variбveis na inicializaзгo/finalizaзгo do gamemode. A lуgica й bem bбsica mesmo, mas funciona, afinal as arrays teram os valores antes da finalizaзгo alocados na inicializaзгo. Como se nunca tivesse resetado o servidor.


terгo **

-

Atй amanha terei atualizado isto como include e tudo. Atй lб, estudem a funзгo. Й simples.

Como o amigo acima disse, й bom para sistemas temporizadores, temp-ban, temp-vip, temp-weapon .. etc
Reply
#10

Brigado por esclarecer minha duvida
Reply
#11

Quote:
Originally Posted by [FeK]DraKiNs
Посмотреть сообщение
jabaScript (mexi um pouco com Squierrel e Lua. Nгo gostei muito da sintaxe, parece Cold Fusion, sу que pra jogo e mais chato)



Caso der GMX ele nгo deleta o arquivo, pois estou usando tudo arrays em tempo real mesmo, na memуria.. :/ Estou sem tempo de fazer fazer o sistema para exportar a array e importa-la. Enfim.

-
OFF Na verdade, tempo eu tenho, mas agora eu sinto a necessidade profunda de ir secar o Grкmio contra o Palmeiras. Fuuiiz
Ah sim
Quote:
Originally Posted by [FeK]DraKiNs
Посмотреть сообщение
Exatamente. Mas pra isto basta importar/exportar as variбveis na inicializaзгo/finalizaзгo do gamemode. A lуgica й bem bбsica mesmo, mas funciona, afinal as arrays teram os valores antes da finalizaзгo alocados na inicializaзгo. Como se nunca tivesse resetado o servidor.


terгo **

-

Atй amanha terei atualizado isto como include e tudo. Atй lб, estudem a funзгo. Й simples.

Como o amigo acima disse, й bom para sistemas temporizadores, temp-ban, temp-vip, temp-weapon .. etc




Fiz indentaзгo para quem gosta:
pawn Код:
#include <a_samp>

// Redefina aqui em caso de for necessбrio

#if !defined MAX_FILE_NAME
#define MAX_FILE_NAME 32
#endif

#if !defined MAX_TEMP_FILES
#define MAX_TEMP_FILES 100
#endif

// Declarar variбveis novas
enum bsInfo
{
    szFilename[MAX_FILE_NAME],
    fileTime
}

new
    bstempFile[MAX_TEMP_FILES][bsInfo],
    bsTotalfiles = -1;

// Ao iniciar script, chamar a pъblica para checar os arquivos
public OnFilterScriptInit()
{
    return SetTimer("checarArquivos", 998, true); // 998 ms. Para demorar em torno de 1 segundo (2 ms execuзгo callback)
}

// Checar se o tempo do arquivo jб passou do invбlido
forward checarArquivos();
public checarArquivos()
{
    for(new i; i <= bsTotalfiles; i++)
    {
        if(gettime() >= bstempFile[i][fileTime])
        {
            if(fexist(bstempFile[i][szFilename]))
            {
                fremove(bstempFile[i][szFilename]);
            }
        }
    }
    return true;
}

// Funзгo para criar o arquivoTemporario
// Bastando especificar os segundos e o arquivo

stock arquivoTemporario(arquivo[], segundos = 1)
{
    // caso arquivo jб existir editar tempo atual
    if(fexist(arquivo))
    {
        alterarTempo(arquivo, segundos);
    }

    static
        File:file;

    if((file = fopen(arquivo, io_write)))
    {
        strcat(bstempFile[++bsTotalfiles][szFilename], arquivo, MAX_FILE_NAME);
        return fclose(file), bstempFile[bsTotalfiles][fileTime] = (gettime() + segundos);
    }
    return false;
}

// Funзгo para alterar o tempo de deletaзгo do arquivo.
// Partindo o tempo atual

stock alterarTempo(arquivo[], segundos = 1)
{
    new cmd = prev_strcmp(arquivo);
    for(new i; i <= bsTotalfiles; i++)
    {
        if(cmd == prev_strcmp(bstempFile[i][szFilename])
        {
            if(!strcmp(arquivo, bstempFile[i][szFilename], true))
            {
                return bstempFile[i][fileTime] = gettime() + segundos;
            }
        }
    }
    return false;
}

// Ajudar na velocidade de comparaзгo de strings
// Sistema simples de conta caracteres, compara dados nъmeros й mais veloz

stock prev_strcmp(string[])
{
    new
        j;
    for(new i; string[i]; i++)
    {
        j += string[i];
    }
    return j;
}
Drakins, poderia criar um arquivo com o tempo que os ficheiros devem ser deletados, ai quando abrir o server denovo verifica o arquivo e se passou do tempo, deleta Jб vi um Plugin que continua rolando os Timer apуs finalizar o server, se achar posto aqui.
Reply
#12

muito bom drak
Reply
#13

vocк poderia adicionar (ou nгo), uma callback para ser chamada quando o arquivos fosse deletado.


pawn Code:
public OnFileExpire(arquivo[])
Reply
#14

Mas o cуdigo nгo estava tabulado?

Quote:

Drakins, poderia criar um arquivo com o tempo que os ficheiros devem ser deletados, ai quando abrir o server denovo verifica o arquivo e se passou do tempo, deleta Jб vi um Plugin que continua rolando os Timer apуs finalizar o server, se achar posto aqui.
_________

O plugin continua apуs finalizar o servidor? Sei sei (isto й impossнvel, nгo fala merda) .. O cara desliga o computador e o sistema vai continuar rodando? Ah, nгo fala merda.

Enquanto a poder dar gmx, jб disse. Daqui a pouco editor e faзo isto. Й questгo de 30 min para fazer isto, se der 30 minutos, porque o filterscript todo nгo demorou 15 minutos.


Quote:
Originally Posted by [Y]Falcon
View Post
vocк poderia adicionar (ou nгo), uma callback para ser chamada quando o arquivos fosse deletado.


pawn Code:
public OnFileExpire(arquivo[])
Boa idйia. Adicionarei daqui a pouco. Junto com o sistema de contar atй quando o servidor estб off.
Reply
#15

Quote:
Originally Posted by [FeK]DraKiNs
View Post
Mas o cуdigo nгo estava tabulado?



O plugin continua apуs finalizar o servidor? Sei sei (isto й impossнvel, nгo fala merda) .. O cara desliga o computador e o sistema vai continuar rodando? Ah, nгo fala merda.

Enquanto a poder dar gmx, jб disse. Daqui a pouco editor e faзo isto. Й questгo de 30 min para fazer isto, se der 30 minutos, porque o filterscript todo nгo demorou 15 minutos.





Boa idйia. Adicionarei daqui a pouco. Junto com o sistema de contar atй quando o servidor estб off.
Nгo me intendeu...
GMX nгo desliga PC nenhum, apenas fecha o samp server --'
E existe sim um Plugin como esse, de 2007/08 mas nгo estou a achar -q

@EDIT Ops, realmente nгo tem como, pois ao fechar o samp server o Plugin й descarregado -q
Reply
#16

Vocк sabe a estrutura de um plugin? Fechou servidor, fechou plugin. Nгo fala merda. Nгo tem como executar algo no servidor depois de ele ter "fechado" .. Alias, plugin tambйm recarrega quando dб GMX. Impossнvel.

O mбximo que se pode fazer, й manipular os arquivos, como estou dizendo desde o inicio da conversa. Anyway, no more.
Reply
#17

Quote:
Originally Posted by [FeK]DraKiNs
View Post
Vocк sabe a estrutura de um plugin? Fechou servidor, fechou plugin. Nгo fala merda. Nгo tem como executar algo no servidor depois de ele ter "fechado" .. Alias, plugin tambйm recarrega quando dб GMX. Impossнvel.

O mбximo que se pode fazer, й manipular os arquivos, como estou dizendo desde o inicio da conversa. Anyway, no more.
Eu dei EDIT...
Reply
#18

Ai Bruno, somente criar fica simples neh, faz uma funзгo pra escrever tambйm neh!
Poderia usar fputchar para escrever, ficando melhor que fwrite! Se tu fazer isso, dai sim ficaria Dahora!

@Off

Vou terminar de assistir TIMГO!
Reply
#19

Quote:
Originally Posted by CidadeNovaRP
View Post
Eu dei EDIT...
Depois que viu meu post. Ri. Enfim.

Quote:

Ai Bruno, somente criar fica simples neh, faz uma funзгo pra escrever tambйm neh!
Poderia usar fputchar para escrever, ficando melhor que fwrite! Se tu fazer isso, dai sim ficaria Dahora!

@Off

Vou terminar de assistir TIMГO!

Pra quem char by char? Windows nem aceita caracteres especiais em arquivos. Eu posso usar atй > para dividir os arquivos, nгo tem muito segredo nгo.

Em Russo, Бrabe, Japonкs e afins, ainda nгo sei se os arquivos tem a mesma codificaзгo. Alйm do mais, duvido muito que um estrangeiro de tгo longe use isto.
Reply
#20

Quote:
Originally Posted by paulor
View Post
Ai Bruno, somente criar fica simples neh, faz uma funзгo pra escrever tambйm neh!
Poderia usar fputchar para escrever, ficando melhor que fwrite! Se tu fazer isso, dai sim ficaria Dahora!

@Off

Vou terminar de assistir TIMГO!
Funзгo pra escrever use DOF2 ou Y_INI ^^
A funзгo desta Inc/FS й apenas criar o arquivo temporбrio, ao invйs do DOF2_CreateFile, sу usar a funзгo tempo desta INC ^^

#OFF
Comente minha INC lб, foi a primeira, quero ver os coments ^^
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)