1

Тема: Нажатие клавиши по появлении определенной строки в файле

В общем:
Делаю скрипт, который в GTA SA делает прыжок, когда в чатлоге (ткст файл) появляется строка с текстом "Объявление".
Не могу понять своей ошибки. Прошу помочь найти её.

name = chatlog.txt
Loop
{
FileGetSize, old, %Name%
   new := old
   while old = new
 {
      sleep 500
      FileGetSize, new_s, %Name%
   }
StringCaseSense, Locale
FindWords := "Объявление" ; Var filter
Loop, Read, %A_ScriptDir%\chatlog.txt
   {
      If !A_LoopReadLine
         {
            EmptyString := % A_Index
            CountEmptyStringNum .= ", "EmptyString
            CountEmptyString++
         }
   }
Loop, Parse, FindWords, `, 
   {
      FileRead, OutPutVar, %A_ScriptDir%\chatlog.txt
      IfInString, OutPutVar, % A_LoopField
         {
            CurrentWord := % A_LoopField
            FoundWords .= ", "CurrentWord
            FoundWordsNum++
         }
   }
StringTrimLeft, FoundWords2, FoundWords, 1
StringTrimLeft, CountEmptyStringNum2, CountEmptyStringNum, 1 
If !CurrentWord
FileAppend, Not Detect (%A_Index%)`n, log.log
Else
send {shift down}
sleep 10
send {shift up}
}
return
F5::
ExitApp

PS. Не обращайте внимание на всякие подсчеты строк. Они мне нужны.

Skype: darya281293
(Не обращайте внимания на логин)

2

Re: Нажатие клавиши по появлении определенной строки в файле

...
FileGetSize, old, %Name%
   new := old
   while old = new ; этот цикл никогда не закончится
 {
      sleep 500
      FileGetSize, new_s, %Name% ; потому как переменная new никогда не измениться
   }
...

3

Re: Нажатие клавиши по появлении определенной строки в файле

Скрипт продолжает не работать. Независимо от строчки персонаж нажимает на шифт всегда.

Skype: darya281293
(Не обращайте внимания на логин)

4

Re: Нажатие клавиши по появлении определенной строки в файле

Нет предела совершенству, продемонстрируйте текущую версию своего скрипта.

5 (изменено: Apache, 2012-08-20 10:52:54)

Re: Нажатие клавиши по появлении определенной строки в файле

name = chatlog.txt
Loop
{
FileGetSize, old_s, %Name%
   new_s := old_s
   while old_s = new_s {
      sleep 500
      FileGetSize, new_s, %Name%
   }
StringCaseSense, Locale
FindWords := "Объявление" 
Loop, Parse, FindWords, `, 
   {
      FileRead, OutPutVar, %A_ScriptDir%\chatlog.txt
      IfInString, OutPutVar, % A_LoopField
         {
            CurrentWord := % A_LoopField
            FoundWords .= ", "CurrentWord
            FoundWordsNum++
         }
   }
StringTrimLeft, FoundWords2, FoundWords, 1
StringTrimLeft, CountEmptyStringNum2, CountEmptyStringNum, 1
If !CurrentWord
   FileAppend, Not Detect (%A_Index%)`n, log.log
   {
   Send, {Shift Down}
   Sleep, 10
   Send, {Shift Up}
   }
 
}
return
F5::
ExitApp

Задача скрипта:
Есть txt файл с неизвестным количеством строк. Строки практически все разные.
Из игры каждая строка записывается в этот txt файл.
При изменении размера файла должен происходить поиск слова со строки без повторений.
При нахождении слова или выражения должен нажимать на шифт.

Skype: darya281293
(Не обращайте внимания на логин)

6

Re: Нажатие клавиши по появлении определенной строки в файле

Не-не-не, не нужно прям так сразу «задачу ставить», мы же ошибки ищем

...
If !CurrentWord
   FileAppend, Not Detect (%A_Index%)`n, log.log
Else
   {
   Send, {Shift Down}
   Sleep, 10
   Send, {Shift Up}
   }
...

7

Re: Нажатие клавиши по появлении определенной строки в файле

Все то же самое.
Сделал скрипт по другому и многофункциональней. Через час протестирую.

StringCaseSense, Locale
name = chatlog.txt
loop
{
   FileGetSize, old, %Name%
   new := old
   while old = new
   {
      sleep 500
      FileGetSize, new, %Name%
   }
   Loop, read, chatlog.txt

       last_line := A_LoopReadLine

   IfInString, %last_line%, Следуйте к красному маячку на радаре
   {
      Fileappend, %last_line%`n`r, debug.txt
      Send {z down}
      sleep 10
      send {z up}
   }
   IfInString, %Last_line%, Осталось точек
   {
      fileappend, %last_line%`n`r, debug.txt
      sleep 100
      Send {z down}
      sleep 10
      send {z up}
   }
   IfInString, %last_line%, стоянку и получите
   {
      fileappend, %Last_line%, debug.txt
      Sleep 100
      send {z down}
      sleep 10
      send {z up}
   }
   ifinstring, %last_line%, следующий рейс
   {
    fileappend, %last_line%, debug.txt
    sleep 1000
    send {f6}/duty{enter}
    sleep 1000
    send {z down}
    sleep 10
    send {z up}
}
Skype: darya281293
(Не обращайте внимания на логин)

8

Re: Нажатие клавиши по появлении определенной строки в файле

Прошу помочь. В файле чатлога через некоторое время появляется пустая строка (А мой скрипт читает по последней строке) из-за этого он работать не может. Прошу подсказать как можно удалить последнюю пустую строку из файла

Skype: darya281293
(Не обращайте внимания на логин)

9 (изменено: Irbis, 2012-08-22 13:20:44)

Re: Нажатие клавиши по появлении определенной строки в файле

Для начала, в скрипте из поста #7 количество "{" не равно "}"
(Обрати внимание на последний IfInString)

Во-вторых, если не обращать внимания, что скрипт сам по себе ужасен, сугубо узкую задачу пропуска пустых строк можно решить так:

...
Loop, read, chatlog.txt
   if A_LoopReadLine
      last_line := A_LoopReadLine
...

И, кстати, в

IfInString, %last_line%, строка которую нужно найти

% % - не нужны, потому что в таком случае совпадение ищется не в last_line, а в переменной, чье имя содержится в last_line (динамическая переменная)

10

Re: Нажатие клавиши по появлении определенной строки в файле

Исправил. Проблема остается не решенной.

Skype: darya281293
(Не обращайте внимания на логин)

11

Re: Нажатие клавиши по появлении определенной строки в файле

Покажи исправленный скрипт и часть файла chatlog.txt с пустыми строками (В моем понимании пустая строка состоит из перевода строки, с чем if A_LoopReadLine прекрасно справляется)
И конечно же, у тебя установлен AHK_L последней версии?

12 (изменено: Apache, 2012-08-22 14:28:29)

Re: Нажатие клавиши по появлении определенной строки в файле

Gui, Add, Text, x2 y-1 w260 h20 , AntiAFK v0.8 build 17 by Apache52 aka Colin_McRae
Gui, Add, Button, x2 y19 w80 h30 , Инструкция
Gui, Add, Button, x82 y19 w80 h30 , Start
Gui, Add, Button, x162 y19 w100 h30 , Exit
Gui, Show, x390 y196 h53 w266, ANTI-AFK v0.8 build 17 by Apache52 aka Colin_McRae
Return
ButtonИнструкция:
run, readme.txt
return
ButtonExit:
GuiClose:
ExitApp


ButtonStart:
StringCaseSense, Locale
name = chatlog.txt
loop
{
FileGetSize, old, %Name%
   new := old
   while old = new
   {
      sleep 500
      FileGetSize, new, %Name%
   }
FileRead, chat, chatlog.txt ; Пробовал так
FileDelete, chat.log
FileAppend, %chat%, chat.log
Loop, read, chat.log
{

    lastline := A_LoopReadLine
}
FileReadLine, lastline, chat.log, %Number%
IfInString, lastline, Следуйте к красному маячку на радаре
{
Fileappend, %lastline%`n`r, debug.txt
Sendplay z
}
IfInString, Lastline, Осталось точек
{
fileappend, %lastline%`n`r, debug.txt
sleep 1500
;Sendplay {z down}
;sleep 100
Sendplay z 
}
IfInString, lastline, стоянку и получите
{
fileappend, %Lastline%`n, debug.txt
Sleep 1500
Sendplay z
}
ifinstring, lastline, следующий рейс
{
fileappend, %lastline%`n, debug.txt
sleep 1500
Sendplay {f6}/duty{enter}
sleep 1200
Sendplay z
}
}

Сюда чатлог не получается нормально выложить:
http://rghost.ru/private/39932216/45b0c … 0ee97f7a1c

Skype: darya281293
(Не обращайте внимания на логин)

13

Re: Нажатие клавиши по появлении определенной строки в файле

В файле лога пустые строки - обычные символы перевода строки. Предложенный мной вариант:

Loop, read, chatlog.txt
   if A_LoopReadLine
      last_line := A_LoopReadLine

- работает, но я его в исправленном скрипте не обнаружил

Ниже часть скрипта, где внесены необходимые изменения, функция получения новой непустой строки вынесена отдельно:

ButtonStart:
StringCaseSense, Locale
name = chatlog.txt
loop
{
lastline := GetNewLine(name)
IfInString, lastline, Следуйте к красному маячку на радаре
{
Fileappend, %lastline%`n`r, debug.txt
Sendplay z
}
IfInString, Lastline, Осталось точек
{
fileappend, %lastline%`n`r, debug.txt
sleep 1500
;Sendplay {z down}
;sleep 100
Sendplay z 
}
IfInString, lastline, стоянку и получите
{
fileappend, %Lastline%`n, debug.txt
Sleep 1500
Sendplay z
}
ifinstring, lastline, следующий рейс
{
fileappend, %lastline%`n, debug.txt
sleep 1500
Sendplay {f6}/duty{enter}
sleep 1200
Sendplay z
}
}

GetNewLine(filename)
{
   static old
   static new
   if !old
   {
      FileGetSize, old, %filename%
	  new := old
   }
   while old = new
   {
      sleep 500
      FileGetSize, new, %filename%
   }
   old := new
   Loop, read, %filename%
      if A_LoopReadLine
         last := A_LoopReadLine
   return last
}

14

Re: Нажатие клавиши по появлении определенной строки в файле

Огромное спасибо за весьма стойкий скрипт, Irbis!

Skype: darya281293
(Не обращайте внимания на логин)

15

Re: Нажатие клавиши по появлении определенной строки в файле

Пожалуйста

16

Re: Нажатие клавиши по появлении определенной строки в файле

Можно пожалуйста, полный скрипт, рабочий и доделанный? )) И скажите, для чего в скрипте файл debug.txt. ??

17 (изменено: Palah, 2016-08-09 10:36:31)

Re: Нажатие клавиши по появлении определенной строки в файле

Можете дать готовый скрипт который. при появлении заданного вопроса в txt файле отвечает на него заданным ответом.
Вот пример из чатлога:

[07:02:13] Ivan_Ivanov[228]: Как дела?

И чтобы примерно через секунду был дан ответ на это (/sms 228 Хорошо.). ИД и Ник разные, но такого формата чтобы скрипт читал текст только.