1 (изменено: danteduval, 2021-12-12 13:54:07)

Тема: AHK: Вывод информации из лог файла.

Добрый день, помогите пожалуйста с решением следующей задачи:

Имеется сессионная игра, во время загрузки матча игра в лог файл пишет информацию(рейтинг, лвл и тд), тем не менее на экране загрузки данную информацию посмотреть нельзя.

Задача - вывести информацию из лог файла.
С считыванием информации из лог файла помогла вот эта тема http://forum.script-coding.com/viewtopi … 324#p95324

А вот основной проблема заключается в том, как вычленить из полученного текста нужную информацию.
Здесь приведено начало лога и для более краткой версии скопировал лог только на одного игрока далее лог продолжается с той же самой инфой только по другом игроку
https://pastebin.com/Ha5e6vnA

Далее, насколько я понимаю, нам необходимо сделать поиск с конца текста до определенной контрольной точки, допустим это будет слово players и уже в полученном тексте, т.е. который от слова players до конца текста, мы должны получить информацию после слов "nick_name":    , "level": , "rating":
И от в этом основной затык, подскажите как сделать поиск с конца до определенного момента и как в найденном тексте вычленить нужную мне информацию.

2

Re: AHK: Вывод информации из лог файла.

Насколько я вижу, лог файл в формате JSON. Такой формат можно перевести в AHK-объект и получать ключи/значения, используя цикл for.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Вывод информации из лог файла.

teadrinker
Спасибо за попытку направить, но к сожалению, мой уровень(monkey see monkey do) не позволяет мне решить эту проблему, если был бы какой-нибудь образец, хотя бы для пары ключей - был бы очень признателен.

4

Re: AHK: Вывод информации из лог файла.

Для этого лучше загрузить файл целиком.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Вывод информации из лог файла.

teadrinker
https://disk.yandex.ru/d/Hob6TFPeDXfS_Q
Получается в строке, которая начинается с keepalive, содержит https://login.playcaliber.com/ka/v1/keepalive и имеет более 1000 символов(может есть способ лучше найти необходимую строку, но я его не знаю), в ветке [match][players] нужны значения ключей {player['user_id']} и {player['nickname']}.

6

Re: AHK: Вывод информации из лог файла.

Как я понял, нужно самое последнее вхождение такой строки. Тогда так:

FileRead, text, D:\Downloads\Player.log
if ErrorLevel {
   MsgBox, Failed to read the file
   ExitApp
}
m := ""
needle := "Keepalive request https://login.playcaliber.com/ka/v1/keepalive response changed: "
while RegExMatch(text, "O)\Q" . needle . "\E\K\V+", m, m ? m.Pos + m.Len : 1)
   ( InStr(m[0], "user_id") && json := m[0] )

try AhkObj := JsonToAHK(json)
catch {
   MsgBox, Invalid JSON string
   ExitApp
}

for k, v in AhkObj.match.players
   MsgBox, % "user_id: "  . v.user_id . "`n"
           . "nickname: " . v.nickname

JsonToAHK(json, rec := false) {
   static doc := ComObjCreate("htmlfile")
        , __ := doc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">")
        , JS := doc.parentWindow
   if !rec
      obj := %A_ThisFunc%(JS.JSON.parse(json), true)
   else if !IsObject(json)
      obj := json
   else if JS.Object.prototype.toString.call(json) == "[object Array]" {
      obj := []
      Loop % json.length
         obj.Push( %A_ThisFunc%(json[A_Index - 1], true) )
   }
   else {
      obj := {}
      keys := JS.Object.keys(json)
      Loop % keys.length {
         k := keys[A_Index - 1]
         obj[k] := %A_ThisFunc%(json[k], true)
      }
   }
   Return obj
}

Но в первом посте вы писали

danteduval пишет:

мы должны получить информацию после слов "nick_name":    , "level": , "rating":

В файле ключей nick_name нет.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Вывод информации из лог файла.

Спасибо, буду ковырять код.
Я только после вашего совета начал читать про JSON и сначала думал о более сложном способе реализации...