Гайд [AHK] Чтение чата

Статус
В этой теме нельзя размещать новые ответы.

Revalto

Известный
Автор темы
531
225
Всем привет!
Частенько новички и не новички задаются вопросом 'Как же читать чат?' в теме "Вопросы по AHK-скриптингу".
Не буду томить, перейдем сразу к сути.

Вот сама функция чтения чата (CHATLOG):​
Код:
global file_chat := A_MyDocuments "/GTA San Andreas User Files/SAMP/chatlog.txt"
SetTimer, Chat, 50

Chat() {
    FileRead, chatlog, % file_chat

    if (RegExMatch(chatlog, ".* Отправил .{3,24}\[\d+\] \(тел\. (\d+)\)", chattext))
    {
        save(chatlog)
        addChatMessage(chattext1)
    }
}
Теперь перейдем к разъяснениям!
Код:
global file_chat := A_MyDocuments "/GTA San Andreas User Files/SAMP/chatlog.txt"
Это глобальная переменная содержащая в себе путь к нашему chatlog, через который и идет само чтение чата.

Код:
SetTimer, Chat, 50
Таймер, который мы активируем на функцию Chat() каждые 50 мл.сек.
Управление таймером:​
Код:
SetTimer, Chat, on ; включить
SetTimer, Chat, off ; выключить

check := !check
SetTimer, Chat, % (check ? "350":off) ; активация от перменной, где 350 - мл.сек

Теперь разберем внутренность самой функции Chat()
Код:
FileRead, chatlog, % file_chat
Чтение Chatlog...

Код:
if (RegExMatch(chatlog, ".* Отправил .{3,24}\[\d+\] \(тел\. (\d+)\)", chattext))
Проверка за счет регулярки. В случае если он находит нужный нам текст происходит действие, в нашем случае это save - сохранение chatlog и addChatMessage - вывод локального сообщения в чат.

Кто то может сказать, чтобы использовать данный пример, нужно знать базово регулярку. Вообще это не правда. Если искать обычный текст, то можно и без неё обойтись. В случае если мы хотим найти текст и так же нужные куски вывести в переменные, то да.
К примеру:
В грузовике: 5000 мл.​
Код:
if (RegExMatch(chatlog, "В грузовике:\s+(\d{1,3})\s+мл", chattext))
{
    save(chatlog)
    addChatMessage(chattext1)
}

Чтение чата с памяти

Есть второй вариант чтения чата, это с помощью функции GetChatLine в UDF, давайте рассмотрим этот вариант.

Сам код:
Код:
#include SAMPUDF.ahk

SetTimer, Chat, 50

Chat() {
    GetChatLine(0, chatlog)

    if (RegExMatch(chatlog, "Вы надели бронежилет", chattext))
        SendChat("/do Бронежилет одет")
}

Думаю тут все просто, код почти не отличается от прошлого, только чтение идет сразу с памяти.

Код:
GetChatLine(0, chatlog) ;GetChatLine(Line, Output)
0 - последняя строка.
chatlog - переменная в которую идет вывод строки.

Если у вас остались какие либо вопросы, здавайте в комментарий. Сильно долбиться на меня не надо. Если допустил ошибку, прежде чем орать, лучше адекватно сообщить)​
 
Последнее редактирование:

Revalto

Известный
Автор темы
531
225
Функция save:
Код:
save(chatlog) {
    static logschat:=A_MyDocuments "\GTA San Andreas User Files\SAMP\ChatLogs\"
    static chat:=A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"
    FileCreateDir, % logschat A_MM "-" A_YYYY
    FileAppend, % chatlog, % logschat A_MM "-" A_YYYY "\" A_DD "." A_MM "." A_YYYY ".txt"
    FileDelete, % chat
    return
}
Функция addChatMessage - в UDF
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,771
5,376
Лично я больше предпочитаю читать с чат лога, ибо помню раньше с памяти читал все время какие то косяки были...
всегда призерал чтение с файла. руки ровнее и чат читает более менее
 

#Rin

Известный
Всефорумный модератор
1,214
1,043
Создаешь sf/asi с установленным хуком на ScriptRPCEnumeration::RPC_ScrClientMessage.
Читаешь данные:
C++:
DWORD color, length; char text[256];
params->bitStream->ResetReadPointer();
params->bitStream->Read(color);
params->bitStream->Read(length);
params->bitStream->Read(text, length);
params->bitStream->ResetReadPointer();
В AHK пишешь класс и RegisterCallback на функцию обработчик.
SF/ASI передает эти данные (color, text) в ахк.
Можно сделать точно также как и в lua потом, типо return false или return [color, text].
AHK компилируешь в ASI.
 
  • Нравится
Реакции: fedorsorkin и Revalto

Phoenixxx_CZAR

Известный
61
31
всегда призерал чтение с файла. руки ровнее и чат читает более менее
Сделать класс который будет выдавать только новые строки, которые появились с последнего вызова функции - легко.
Намного проще работать с чат логом, чем через память обращаться к чату.
 

Smer4

Известный
425
51
Чет как-то трудно не проще цыклом?
Код:
CL = "Путь к чат логу"
Loop
{
FileRead, rd, %CL%
IfInString, rd, "Что ищете"
    goto, start
}
start:
/* Тут типо код
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,771
5,376
Чет как-то трудно не проще цыклом?
Код:
CL = "Путь к чат логу"
Loop
{
FileRead, rd, %CL%
IfInString, rd, "Что ищете"
    goto, start
}
start:
/* Тут типо код
сидишь такой в сампе уже часа 4 и поиск строки занимает пол года. это же гениально читать файл целиком вместо последней строки.
 

Phoenixxx_CZAR

Известный
61
31
сидишь такой в сампе уже часа 4 и поиск строки занимает пол года. это же гениально читать файл целиком вместо последней строки.
Последнюю строку тоже не удобно. Строк может быть 3 за раз и шо ты делать будешь? Лучший вариант - чтение только последних строк с момента вызова функции.
 
Статус
В этой теме нельзя размещать новые ответы.