1 (изменено: Pr1mera, 2013-05-26 10:24:31)

Тема: Ошибка при перезапуске программы

Имеется вот такой скрипт:


Start:
    IfWinExist, GTA:SA:MP
    {
        If SelectedFile != 
        {
            Pattern1 := "S).*(\[\d+:\d+:\d+]) Connected to.*(\R|$)" , sPos1 := 1
            Pattern2 := "S).*(\[\d+:\d+:\d+]) Server closed.*(\R|$)" , sPos2 := 1
            Pattern3 := "S).*(\[\d+:\d+:\d+]) You are banned from.*(\R|$)" , sPos3 := 1
        MsgBox, 64, Started, Скрипт Активен `nДля остановки используйте "STOP", 3
        WinActivate GTA:SA:MP 
        Sleep, 2000
        Goto, Started
        }
        else
        {
        MsgBox, 16, WARNING, ERROR! You must specify the path to samp.exe!, 3
        return
        }
    }
    else
    {
        MsgBox, 16, WARNING, GTA SAMP Не запущен!, 3
        return
    }

Started:
    IfWinExist, GTA:SA:MP
    {
        Sleep, 2000
            Gui, Submit, NoHide
            If Check2 = 1
            {
                IfWinActive, GTA:SA:MP
                {
                    LogFile = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
                    FileRead, Log1, *t %LogFile%
                    If RegExMatch(Log1, Pattern1, Match1, sPos1)
                    {
                        Sleep, 5000
                        SetKeyDelay, 5, 5
                        Send {Enter}
                        Sleep, 1000
                        SetKeyDelay, 5, 5
                        Send %password1%{Enter}
                        Sleep, 1000
                        SetKeyDelay, 5, 5
                        Send %password2%{Enter}
                        Sleep, 1000
                    }
                    sPos1 := StrLen(Log1), (sPos1 = 0) ? sPos1 := 1 
                    Sleep 10
                }
                else
                {
                
                }
            }
            else
            {
            
            }
        Goto, Check3
    }
    else
    {
    Goto, Check3
    }

Check3:
    IfWinExist, GTA:SA:MP
    {
        Sleep, 2000
            Gui, Submit, NoHide
            If Check3 = 1
            {
                LogFile = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
                FileRead, Log2, *t %LogFile%
                If RegExMatch(Log2, Pattern2, Match2, sPos2)
                {
                    Sleep, 5000
                    WinClose, GTA:SA:MP, ,10000
                    Sleep, 3000
                    Run, %SelectedFile% 176.32.39.199
                    Sleep, 5000
                    IfWinExist, Application Error
                        {
                        WinActivate Application Error
                        Sleep, 500
                        Send {Enter}
                        Sleep, 500
                        }
                    Sleep, 55000
                }
                sPos2 := StrLen(Log2), (sPos2 = 0) ? sPos2 := 1 
                Sleep 10
            }
            else
            {
            
            }
        Goto, Check1
    }
    else
    {
    Goto, Check1
    }


Check1:
    IfWinExist, GTA:SA:MP
    {
        Sleep, 2000
            Gui, Submit, NoHide
            If Check1 = 1
            {
                LogFile = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
                FileRead, Log3, *t %LogFile%
                If RegExMatch(Log3, Pattern3, Match3, sPos3)
                {
                    Sleep, 5000
                    WinClose, GTA:SA:MP, ,10000
                    Sleep, 3000
                    Run, %SelectedFile% 176.32.39.199
                    Sleep, 5000
                    IfWinExist, Application Error
                        {
                        WinActivate Application Error
                        Sleep, 500
                        Send {Enter}
                        Sleep, 500
                        }
                    Sleep, 55000
                }
                sPos3 := StrLen(Log3), (sPos3 = 0) ? sPos3 := 1 
                Sleep 10
            }
            else
            {
            
            }
        Goto, Check4
    }
    else
    {
    Goto, Check4
    }
        
Check4:
    IfWinExist, GTA:SA:MP
    {
        Sleep, 2000
        Gui, Submit, NoHide
        If Check4 = 1
        {
            SetTitleMatchMode 2
            If WinExist("SA:MP An exception occured") or WinExist("GTA:SA:MP: gta_sa.exe")
            {
                Sleep, 3000
                SetTitleMatchMode 2
                WinClose, SA:MP An exception occured, ,5000
                WinClose, GTA:SA:MP: gta_sa.exe, ,5000
                Sleep, 2000
                WinClose, GTA:SA:MP, ,10000
                Sleep, 3000
                Run, %SelectedFile% 176.32.39.199
                Sleep, 5000
                IfWinExist, Application Error
                {
                    WinActivate Application Error
                    Sleep, 500
                    Send {Enter}
                    Sleep, 500
                }
                Sleep, 55000
            }
        }
        else
        {
        
        }
        Goto, Started
    }
    else
    {
    Goto, Started
    }

Смысл в том, чтобы при нахождение опр. строки в файле, он выполнял нужные действия. Простыми словами - переподключался к серверу. При запуске он работает отлично, всё идет по циклу при нахождении строки "Connected to..." вводит комбинации, при появлении новой строки тоже. Но стоит ему найти другие указанные строки и перезапустить игру, как начинается "магия". Всё так же работает, но полностью игнорируется метка "Started", хотя цикл продолжается. И если появляется (напр.) "Server closed the connection" он все так же выполняет свои действия.
Так вот. Почему при перезапуске перестает действовать начало скрипта?
====Добавлено, спустя минут 10
Так же, надо заметить, что при перезапуске файл chatlog.txt очищается.
Весь этот скрипт работает правильно, если реализовать его через "физический" запуск samp.exe (имитировать нажатия), а вот при Run, происходит вышеизложенное.

2

Re: Ошибка при перезапуске программы

Врядли кто будет копать большой код по непонятному вопросу. Выделите только необходимые функции, и приложите пример лога с которым глючит.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

3 (изменено: Pr1mera, 2013-05-26 10:22:33)

Re: Ошибка при перезапуске программы

serzh82saratov пишет:

Врядли кто будет копать большой код по непонятному вопросу. Выделите только необходимые функции, и приложите пример лога с которым глючит.

Указанные строки в логе не изменяются, они пишутся игрой. Вот лог после перезапуска. Как видно, 10 минут он не производил никаких действий со строкой "Connected to" (если бы произвел, то войдя на сервер лог начал бы писать сообщения от игроков в чате), а потом сервер просто отключил клиент за превышение времени ожидания. Но как только появилась строка "Server closed the connection" он перезапустил игру.

[02:17:30] {FFFFFF}SA-MP {B9C9BF}0.3x-R1-2 {FFFFFF}Started

[02:17:33] Connecting to 176.32.39.199:7777...

[02:17:33] Connected. Joining the game...

[02:17:36] Connected to 176.32.39.199:7777...

[02:26:42] Server closed the connection.

Первый пост обновил. Теперь только код цикла.

4

Re: Ошибка при перезапуске программы

Перечитал ваш топик, но что - то не доходит.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

5

Re: Ошибка при перезапуске программы

Ещё раз. Скрипт должен находить эти строки в файле и выполнять действия. Запускаю, всё работает только в первом случае (когда он находит строку, содержащую Connected to...), в остальных случаях при выполнении Run перестает работать этот самый первый случай. Он просто не видит в файле строку (Connected to...), однако все остальные по прежнему ищет.

6

Re: Ошибка при перезапуске программы

Какой Run кого запускает я так и не понял.
Вам нужно смоделировать именно ту ситуацию. И когда у вас это получится, скорее всего вы сами поймете где ошибка, ну или хотя - бы другие поймут.

Я предлагал вам сократить код. А у вас там попрежнему Sleep, Send, IfWinExist, MsgBox и.т.п. занимают большую часть.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

7

Re: Ошибка при перезапуске программы

И так,
Есть процесс - GTA:SA:MP
Он пишет логи чата по адресу: %A_MyDocuments%/........../chatlog.txt
Скрипт сделан для того, чтобы найдя строку в этом файле, отвечающую за разрыв подключения к серверу, подключиться обратно.
В первом случае найдя "Connected to" он вписывает пароль.
Во втором найдя "Server closed" выключает процесс GTA:SA:MP и запускает его командой Run (процесс запускается при помощи samp.exe ip, путь до которого пользователь указывает кнопкой)
В третьем случае найдя "You are banned" выполняет всё то же, что и во втором случае.
В четвертом найдя окно ошибки запуска игры он выполняет действия 3 или 2.
Если один из пунктов не найден, то скрипт идет дальше по циклу.
И так, весь этот скрипт работает как нужно, НО. После выполнения команды Run (не зависимо от того, во втором, третьем, или четвертом случае) не работает поиск строки "Connected to", а скрипт переходит сразу к следующему пункту (проверке на наличие "Server closed"), после последнего (4) пункта, он снова начинает его с "Server closed".

8

Re: Ошибка при перезапуске программы

Pattern1 используется только в Started. Started запускается только при страте скрипта или если не

If WinExist("SA:MP An exception occured") or WinExist("GTA:SA:MP: gta_sa.exe")

Хотя не знаю, что там за 2 штуки else непонятно.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

9

Re: Ошибка при перезапуске программы

serzh82saratov пишет:

Pattern1 используется только в Started. Started запускается только при страте скрипта или если не

If WinExist("SA:MP An exception occured") or WinExist("GTA:SA:MP: gta_sa.exe")

Хотя не знаю, что там за 2 штуки else непонятно.

В самом конце идет переход к Started.

10

Re: Ошибка при перезапуске программы

Если условие WinExist("SA:MP An exception occured") or WinExist("GTA:SA:MP: gta_sa.exe")
выполняется, вы проверяли что переход происходит?

        else
        {
        
        }
        Goto, Started

что это за кусок? Что в пустом блоке, большая тайна?

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

11

Re: Ошибка при перезапуске программы

Оу, это в правду огрызок. Там раньше была табличка о том, что ничего не найдена, но потом я её удалил. Надо бы и это удалить.
Да, если оно выполняется, он перезапускает GTA:SA:MP и переходит в начало (к Started), но не читает его, а начинает с Check3.

12

Re: Ошибка при перезапуске программы

Pr1mera пишет:

Да, если оно выполняется, он перезапускает GTA:SA:MP и переходит в начало (к Started), но не читает его, а начинает с Check3.

Ну, тогда выясняйте, какое из условий внутри Started не выполняется.

13 (изменено: creature.ws, 2013-05-27 21:44:29)

Re: Ошибка при перезапуске программы

logPath := A_MyDocuments . "\GTA San Andreas User Files\SAMP\chatlog.txt"
KeyWords := {"Connected to"   : Func("EnterPassord")
            ,"Server closed"  : Func("RestartProcess")
            ,"You are banned" : Func("RestartProcess")}

log := FileOpen(logPath, "r")
log.pos := log.length ; перемещаем указатель в конец файла. Что происходило до запуска скрипта нас не интересует.

loop {
    if (log.pos = log.length) {
        Sleep 100
        continue
    }

    newLogLine := log.ReadLine() ; ReadLine перемещает указатель в файле, если мы обрабатываем последнюю строку, то при следующей итерации цикла log.pos = log.length

    for keyWord, proc in KeyWords
        if InStr(newLogLine, keyWord)
            %proc%()
}

EnterPassword() {
    MsgBox вводим пароль
}

RestartProcess() {
    MsgBox перезапускаем
}

Оказывается, можно не использовать goto без необходимости.

14

Re: Ошибка при перезапуске программы

creature.ws пишет:

Оказывается, можно не использовать goto без необходимости.

А если строка должна выглядеть как [xx:yy:zz] Connected to.*
Как это сделать при помощи KeyWords ?

15 (изменено: creature.ws, 2013-05-27 18:52:38)

Re: Ошибка при перезапуске программы

Подстроку ищет функция InStr и ей абсолютно безразлично в каком месте строки находится подстрока.

16

Re: Ошибка при перезапуске программы

Увы, тогда любое сообщение в чате содержащее "Connected to" приведет к перезапуску.

17 (изменено: creature.ws, 2013-05-27 21:44:20)

Re: Ошибка при перезапуске программы

А что, часто в чате пишут «Connected to»?

приведет к перезапуску

К вызову процедуры EnterPassword, а не перезапуску.

В использовании regexmatch не вижу необходимости, если [xx:yy:zz] всегда в подобном формате, то достаточно изменить

if InStr(newLogLine, keyWord)

на

if InStr(newLogLine, keyWord) <= 12

12 — число символов в  "[xx:yy:zz] " + 1