Ajuda FileRead em loop

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

Azarfy
Posts: 29
Joined: 25 Mar 2020, 20:21
Facebook: fb.com/azarfy

Ajuda FileRead em loop

11 Jul 2020, 13:15

Bom, estudando mais sobre o fileread cheguei a outra duvida que tentei de todas as formas e não deu certo.

:arrow: Mês passado aprendi a montar um fileread para lê o meu chatlog, aprendi a pegar mensagens obtidas nele, porem queria aprender agora, para o hotkey dar um valor de uma variavel toda vez que essa palavra aparecer. Usa suposição que eu fiz, cada vez que o fileread identificasse a seguinte palavra Quit v, ele se auto desligava.

:arrow: Ou toda vez que ouvisse a palavra vip, ele mudava uma variável de vip = 0 para vip = 1.

A maneira que tentei montar foi assim, porem sem sucesso.

Code: Select all

A = 0
FileRead, CONTEUDO_DO_ARQUIVO, C:\Users\Administrador\Documents\GTA San Andreas User Files\SAMP/chatlog.txt

        StringSplit, LINHA_, CONTEUDO_DO_ARQUIVO, `n

    Loop % LINHA_0
    {
	    If (InStr(LINHA_%A_Index%, ":quit v"))
	    {
        ULTIMA_LINHA_REPORT := LINHA_%A_index%
        A = 1
	    }
    }
 
 If (A = 1)
 {
     SendInput t/quit {enter}
     ExitApp
 }
Return
Se alguém poder me ajudar a ler palavras mais rápido fico grato.
User avatar
Gio
Posts: 1060
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Ajuda FileRead em loop

13 Jul 2020, 07:54

Bom dia Azarfy.

Preciso que poste o conteúdo do arquivo (com a palavra-chave procurada) para saber onde a rotina de leitura e condicional está falhando.
Azarfy
Posts: 29
Joined: 25 Mar 2020, 20:21
Facebook: fb.com/azarfy

Re: Ajuda FileRead em loop

13 Jul 2020, 10:52

Gio, aqui está o arquivo

https://www.mediafire.com/file/fmz8exbat45wc3b/chatlog.txt/file

No caso é bem semelhante ao outro post, porem esse ao identificar essa ultima palavra no ChatLog ele iria mudar o valor de uma variável, e ao mudar essa variável, ela enviaria tal mensagem.
User avatar
Gio
Posts: 1060
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Ajuda FileRead em loop

14 Jul 2020, 10:47

Bom, analisando o conteúdo do arquivo, vemos que sua condicionais If está buscando a expressão literal :quit v. Esta espressão NÃO EXISTE no arquivo. Vejamos a linha do arquivo onde provavelmente se tentou invocar a expressão:

[12:49:54] (PC) [OT]Azarfy.RGTT[GM](83): {FFFFFF}quit v

:arrow: Veja que nesta linha existe uma expresão um pouco diferente (: {FFFFFF}quit v), no entanto, o comando IfInString precisa sempre que a correspondência seja exata.

Você tem várias formas de solucionar a questão. Uma delas é abandonar os dois pontos e pesquisar somente quit v. Mas é claro que essa hipótese pode trazer um problema: os dois pontos são a âncora de início de texto, de modo que não usar eles significa que uma frase maior pode acabar ocasionando a ação (por exemplo, a frase em inglês: during the research, we found that the quit value of X is 30 contém a expressão quit v).

Para melhorar isso você pode usar a função RegExMatch() seguida de uma condicional If comum. No caso você procuraria dois pontos seguido de 0 a 9 caracteres quaisquer, seguido de "quit v". Dessa forma você diminuiria bastante a chance de um falso-positivo. Depois, se quiser melhorar ainda mais a precisão, pode também testar se o resultado extraído contém os símbolos { e }, e executar a rotina somente se contiver.

Exemplo:

Code: Select all

chat =
(
[12:49:49] ** [CMA]ReivePRES[2BTL] veio ate [OT]Azarfy.RGTT[GM].

[12:49:49] [ADMIN]: [CMA]ReivePRES[2BTL] (Vida 100.0) foi spawnado pelo Policial [CMA]ReivePRES[2BTL], motivo: a

[12:49:49] [ReportSystem]: Denuncia de [TJF]Dybala.DRT[ORG] (id: 132) contra [TOG]ian.SUP[ (id: 150) | esse doente do ian mandando floodar meu pm e me spa

[12:49:49] ** Chat Global: FJY]GALODOPINAZS.RLQ(143):  e o gta po as rodas sao quadradas kkkkkkkkkk

[12:49:49] [NOTICIAS]: A {3737FF}Torcida Esquadrao Atleticano {50b6bb}dominou a sede da {FF0000}Torcida Uniformizada Os Imbativeis .

[12:49:49] [ATENDIMENTO]: {FFFFFF}O jogador {AA3333}[TJS]felord.ZN[UPC]{FFFFFF}(91) cadastrou-se no jogo e precisa de ajuda.

[12:49:49] [ATENDIMENTO]: {FFFFFF}O jogador {AFAFAF}[EDF]JI.79[TVP]{FFFFFF}(76) cadastrou-se no jogo e precisa de ajuda.

[12:49:49] [ReportSystem]: Denuncia de [TJS]LDD.95[UPC] (id: 146) contra TOIC]LcSUP.slBTR[PUX (id: 122) | ant

[12:49:50] ** Chat Global: FJY]GALODOPINAZS.RLQ(143):  tem advogado ae nao e

[12:49:54] (PC) [OT]Azarfy.RGTT[GM](83): {FFFFFF}quit v

[12:49:55] [DICA]: Aperte a tecla "N" em seu teclado para abrir o seu inventario.

[12:49:55] [NOTICIAS]: {50b6bb}A {AA3333}Torcida Jovem do Sport {50b6bb}e a maior do momento com 14 membros online. (/toptorcidas)
)

POSICAO_ENCONTRADA := RegExMatch(chat, ":.{0,9}quit v", TEXTO_ISOLADO)
If (POSICAO_ENCONTRADA > 0)
{
	IfInString, TEXTO_ISOLADO, `{
	{
		IfInString, TEXTO_ISOLADO, `}
		{
			msgbox, 0, Aviso, O texto contém a expressão procurada em: `n`n %TEXTO_ISOLADO%
		}
	}
}
Return
Azarfy
Posts: 29
Joined: 25 Mar 2020, 20:21
Facebook: fb.com/azarfy

Re: Ajuda FileRead em loop

14 Jul 2020, 12:04

Muito interessante a maneira abordada, mais uma vez grato pelo o conhecimento.

:arrow: Pegando a sua ideia de dar um falso positivo, tentei montar conforme um exemplo dado por você anteriormente, pegando a ultima linha com o meu nick, e na ultima linha pesquisas as palavras chaves, na teoria o meu codigo era para dar certo, porem não deu o Ahk não deixou executar ele.

Pode revisar para min e tentar identificar o que esta errado, e o porque do ahk não deixar executar.

Code: Select all

Ativ = 0

FileDelete, C:\Users\Administrador\Documents\GTA San Andreas User Files\SAMP/chatlog.txt
FileRead, CONTEUDO_DO_ARQUIVO, C:\Users\Administrador\Documents\GTA San Andreas User Files\SAMP/chatlog.txt

        StringSplit, LINHA_, CONTEUDO_DO_ARQUIVO, `n

    Loop % LINHA_0
    {
	    If (InStr(LINHA_%A_Index%, "[OT]Azarfy.RGTT[GM](144):"))
	    {
		ULTIMA_LINHA_REPORT := LINHA_%A_index%
	    }
    }

chat := ULTIMA_LINHA_REPORT

POSICAO_ENCONTRADA := RegExMatch(chat, ":.{0,9}usa dinamico", TEXTO_ISOLADO)
If (POSICAO_ENCONTRADA > 0)
{
	IfInString, TEXTO_ISOLADO, `{
	{
		IfInString, TEXTO_ISOLADO, `}
		{
			Ativ = 1
			SendInput tVariavel Ativ = %Ativ% {enter}
		}
	}
}
Return


POSICAO_ENCONTRADA := RegExMatch(chat, ":.{0,9}quit v", TEXTO_ISOLADO)
If (POSICAO_ENCONTRADA > 0)
{
	IfInString, TEXTO_ISOLADO, `{
	{
		IfInString, TEXTO_ISOLADO, `}
		{
			Ativ = 1
			SendInput tPrograma forçado a desligar. {enter}
		}
	}
}
Return

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 4 guests