Author Topic: MirLua  (Read 39163 times)

0 Members and 2 Guests are viewing this topic.

Offline unsane

Re: MirLua
« Reply #90 on: 24 10 2017, 18:47:56 »
Я не очень понял.  ::)

Если нужно запускать по одному протоколу через какой-то промежуток, то:
Spoiler
Code: [Select]
local protos = require('m_protocols')
local schedule = require('m_schedule')

local ID_STATUS_OFFLINE = 40071
local ID_STATUS_ONLINE = 40072

m.HookEvent('Miranda/System/ModulesLoaded', function()
    local accounts = {}
    for account in protos.Accounts() do
        if account.IsEnabled and not account.IsVirtual then
          local status = account:CallService('/GetStatus')
          if (status == ID_STATUS_OFFLINE) then
            accounts[#accounts + 1] = account
          end
        end
    end
    local i = 1
    schedule.Every(5).Seconds().Do(function()
        local account = accounts[i]
        print(account.AccountName)
        if account == nil then
            return schedule.STOP
        end
        account:CallService('/SetStatus', ID_STATUS_ONLINE)
        i = i + 1
    end)
end)
[close]


Если нужно запустить все через какое-то время, то:
Code: [Select]
m.ForkThread(function()
    sleep(5)
    -- перевести протоколы в онлайн
end)

Или дождаться следующего ночника и там будет:
Code: [Select]
local schedule = require('m_schedule')

schedule.Wait(5).Seconds().Do(function()
-- перевести протоколы в онлайн
end)
« Last Edit: 24 10 2017, 20:22:44 by unsane »
Si no estas con nosotros, estas contra nosotros.
 

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
Re: MirLua
« Reply #91 on: 25 10 2017, 22:48:33 »
Да, по одному через промежуток времени, код под спойлером подошел идеально :)
У меня просто 14 разных протоколов подключены, и если запускать их все сразу, то миранда виснет в 2х случаях из 3х.
 

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
Re: MirLua
« Reply #92 on: 27 09 2018, 18:33:45 »
Можно ли средствами MirLUA разрезать набранное сообщение на равные "кусочки" и отправить их с задержкой в две секунды? Некий аналог функции TabSRMM "разделять длинные сообщения", но, так сказать, вручную :)
 

Offline unsane

Re: MirLua
« Reply #93 on: 27 09 2018, 21:33:16 »
В данный момент нет. Надо сделать эвент, на который можно будет подписаться и фильтровать отправляемые сообщения. А оттуда уже управлять отправкой.
Попробую запилить на выходных.
Si no estas con nosotros, estas contra nosotros.
 

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
Re: MirLua
« Reply #94 on: 28 09 2018, 19:38:05 »
Замечательно, большое вам спасибо :)
Кнопки же создавать при помощи MirLUA можно? Встраиваемые в Scriver?
 

Offline unsane

Re: MirLua
« Reply #95 on: 01 10 2018, 21:55:50 »
Охх. Задачка оказалась нетривиальной. Недостающее в луа добавил.
Скрипт пока такой:
Code: [Select]
local proto = require('m_protocols')
local schedule = require('m_schedule')

local LIMIT = 10
local WAIT = 2

local function split(str, limit)
    local pos = 1
    return function()
        local res = str:sub(pos, pos + limit - 1)
        if #res > 0 then
            pos = pos + #res
            return res
        end
    end
end

m.HookEvent("MirLua/SendMsg", function(w, l)
    local ccs = CCSDATA(l);

    if #ccs.Message <= LIMIT then
        return 0
    end

    local n = 1
    local first = true
    local service = ccs.Service
    local hContact = ccs.hContact
    local wParam = ccs.wParam
    local message = ccs.Message

    for msg in split(message, LIMIT) do
        if first then
            proto.CallSendChain(hContact, service, wParam, msg)
            first = false
        else
            schedule.Wait(WAIT * n).Seconds().Do(function()
                proto.CallSendChain(hContact, service, wParam, msg)
            end)
            n = n + 1
        end
    end

    local hMessage = 100500
    local account = proto.GetAccount(hContact)
    local moduleName = account.ModuleName
    schedule.Wait(WAIT * n + 1).Seconds().Do(function()
        proto.BroadcastAck(moduleName, hContact, 0, 0, topointer(hMessage))
    end)

    return hMessage
end)

Должен стартануть уже в следующем ночнике.

Кнопки можно добавлять в скривер так же как и для tabSRMM. Код сейчас унифицирован для всех модулей.
Si no estas con nosotros, estas contra nosotros.
 

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
Re: MirLua
« Reply #96 on: 02 10 2018, 07:42:10 »
Спасибо большое! Завтра проверю :)
 

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
Re: MirLua
« Reply #97 on: 07 10 2018, 14:27:03 »
Здравствуйте! Спасибо большое, скрипт работает замечательно! :)

Хотел уточнить. Мне нужно сделать две кнопки на панель, одна будет отправлять вставленный текст кусками по 1000 символов, а другая - по 4000 символов, в то время как базовая функция отправки будет работать как и раньше.
Попытался создать кнопку, как написано в примере на первой странице (программировать я не умею, поэтому только собираю из примеров :( ), но он выдает ошибку "attempt to call a nil value (field 'OnMsgToolBarButtonPressed'). Как я понимаю, способ вызова изменился :(
 

Offline unsane

Re: MirLua
« Reply #98 on: 16 10 2018, 21:51:28 »
Извиняюсь за долгий ответ, пришлось изрядно покопаться в требухах и немного допилить:
Code: [Select]
local schedule = require('m_schedule')
local srmm = require('m_srmm')
local msgs  = require('m_message')
local icolib = require('m_icolib')
local winapi  = require('winapi')

local WAIT = 2
local IDC_MESSAGE = 3012

local function split(str, limit)
    local pos = 1
    return function()
        local res = str:sub(pos, pos + limit - 1)
        if #res > 0 then
            pos = pos + #res
            return res
        end
    end
end

function get_message_area(hwnd)
    local hEdit = winapi.GetDlgItem(hwnd, IDC_MESSAGE)
    if (hEdit == nil) then
        error("unable to find message area")
    end
    return hEdit
end

function get_log_message(hwnd)
    local hEdit = get_message_area(hwnd)
    return winapi.GetWindowText(hEdit);
end

function clear_log_message(hwnd)
    local hEdit = get_message_area(hwnd)
    winapi.SetWindowText(hEdit, '');
end

function send_message_by_parts(hContact, message, limit)
    if #message <= limit then
        msgs.Send(hContact, message)
        return
    end

    local n = 1
    local first = true
    for msg in split(message, limit) do
        if first then
            msgs.Send(hContact, msg)
            first = false
        else
            schedule.Wait(WAIT * n).Seconds().Do(function()
                msgs.Send(hContact, msg)
            end)
            n = n + 1
        end
    end
end

local module = 'sendInParts'
local BBBF_ISCHATBUTTON = 16
local BBBF_ISIMBUTTON = 32
local BBBF_ISRSIDEBUTTON = 128

srmm.AddButton{
    Module = module,
    ButtonId = 1000,
    Flags = BBBF_ISCHATBUTTON | BBBF_ISIMBUTTON | BBBF_ISRSIDEBUTTON,
    Tooltip = m.Translate('Send in parts of 1000 characters'),
    Icon = icolib.AddIcon(module, 'Send in parts of 1000 characters')
}

srmm.AddButton{
    Module = module,
    ButtonId = 4000,
    Flags = BBBF_ISCHATBUTTON | BBBF_ISIMBUTTON | BBBF_ISRSIDEBUTTON,
    Tooltip = m.Translate('Send in parts of 4000 characters'),
    Icon = icolib.AddIcon(module, 'Send in parts of 4000 characters')
}

m.HookEvent("SRMM/ButtonsBar/ButtonPressed", function(w, l)
    local bcd = CustomButtonClickData(l)
    if bcd.Module ~= module then
        return;
    end
    local message = get_log_message(bcd.hWnd)
    send_message_by_parts(bcd.hContact, message, bcd.ButtonId)
    clear_log_message(bcd.hWnd)
end)
Si no estas con nosotros, estas contra nosotros.
 
The following users thanked this post: Oneiron

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
Re: MirLua
« Reply #99 on: 17 10 2018, 17:09:27 »
Вау... просто вау. Огромное вам спасибо! :)

UPD: Не работает на больших текстах. Маленькие кусочки отправляет без проблем, при попытке отправить сообщение размеров в 20000 символов миранда молча крашится.
« Last Edit: 17 10 2018, 17:15:52 by Oneiron »
 

Offline unsane

Re: MirLua
« Reply #100 on: 17 10 2018, 19:32:36 »
Крешлог есть? если нет, я на выходных проверю на большом тексте
Si no estas con nosotros, estas contra nosotros.
 

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
Re: MirLua
« Reply #101 on: 17 10 2018, 21:08:59 »
Нет. Вылетает даже не создав крэшлога.
Miranda 32-bit, высылается с одного jabber-аккаунта на другой через TabSRMM.
 

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
Re: MirLua
« Reply #102 on: 04 01 2019, 19:30:49 »
        local res = str:sub(pos, pos + limit - 1)
Предположительно, проблема здесь. Вылетает при попытке обработать сообщение длиной более 2048 символов. В тех случаях когда надо их нарезать ломтиками - они гораздо больше. Доходит до десятков тысяч.


Вторая найденная проблема -
Spoiler
Miranda обычно шлет все сообщения в юникоде, а str:sub, видимо, работать с ним не умеет. Предполагаю я это, поскольку из такого вот тестового сообщения:

Spoiler
Интеpнет, как и смеpть, забиpает лyчших!
В России две беды — дypаки и коммyтиpyемые линии связи.
Сделал дело — пеpезагpyзись смело!
Кpаткость-сестpа dial-up'a.
Hикого pабота пpогpаммы не yдивляет так часто, как ее создателя!
Плохомy пpогpаммеpy дpайвеpы мешают!
Модем на 14400 наyчил меня теpпению.
Монохpомная тельняшка с последовательным двоичным пеpебоpом.
Коллекциям рефератов посвящается: IР есть — IQ не надо.
Каждый Windows-программист — хитрый садомазохист!
Интеpнет, как и смеpть, забиpает лyчших!
В России две беды — дypаки и коммyтиpyемые линии связи.
Сделал дело — пеpезагpyзись смело!
Кpаткость-сестpа dial-up'a.
Hикого pабота пpогpаммы не yдивляет так часто, как ее создателя!
Плохомy пpогpаммеpy дpайвеpы мешают!
Модем на 14400 наyчил меня теpпению.
Монохpомная тельняшка с последовательным двоичным пеpебоpом.
Коллекциям рефератов посвящается: IР есть — IQ не надо.
Каждый Windows-программист — хитрый садомазохист!Интеpнет, как и смеpть, забиpает лyчших!
В России две беды — дypаки и коммyтиpyемые линии связи.
Сделал дело — пеpезагpyзись смело!
Кpаткость-сестpа dial-up'a.
Hикого pабота пpогpаммы не yдивляет так часто, как ее создателя!
Плохомy пpогpаммеpy дpайвеpы мешают!
Модем на 14400 наyчил меня теpпению.
Монохpомная тельняшка с последовательным двоичным пеpебоpом.
Коллекциям рефератов посвящается: IР есть — IQ не надо.
Каждый Windows-программист — хитрый садомазохист!
Каждый Windows-программист — хитрый садомазохист!
[close]

Получателю приходит только

Spoiler
еля!
Плохомy пpогpаммеpy дpайвеpы мешают!
Модем на 14400 наyчил меня теpпению.
Монохpомная тельняшка с последовательным двоичным пеpебоpом.
Коллекциям рефератов посвящается: IР есть — IQ не надо.
Каждый Windows-программист — хитрый садомазохист!
Каждый Windows-программист — хитрый садомазохист!
[close]

А на стороне отправителя в историю падают вот такие штуки (на другую сторону они не отправляются)

Spoiler
Интеpнет, как и смеpть, забиpает лyчших!
В России две беды — дypаки и коммyтиpyемые линии связи.
Сделал дело — пеpезагpyзись смело!
Кpаткость-сестpа dial-up'a.
Hикого pабота пpогpаммы не yдивляет так часто, как ее создателя!
Плохомy пpогpаммеpy дpайвеpы мешают!
Модем на 14400 наyчил меня теpпению.
Монохpомная тельняшка с последовательным двоичным пеpебоpом.
Коллекциям рефератов посвящается: IР есть — IQ не надо.
Каждый Windows-программист — хитрый садомазохист!
Интеpнет, как и смеpть, забиpает лyчших!
В России две беды — дypаки и коммyтиpyемые линии связи.
Сделал делР
[close]
[close]

Решил. Дело было в том, что str:sub работает с байтовым представлением строки, а не с символьным.  После того как я сделал так:
Code: [Select]
local res = str:sub(pos, utf8.offset(str,pos + limit)) в функции split, кириллические строки начали отправляться адекватно.

Проблема вылета при работе со строками более 2048 символов остается. Это ограничение LUA?
« Last Edit: 05 01 2019, 08:16:13 by Oneiron »
 

Offline alexd

  • Newbie
  • *
  • Posts: 1
Re: MirLua
« Reply #103 on: 03 09 2019, 09:10:25 »
Добрый день. Хочу автоответчик в миранде, попробовал MirLua:
Miranda NG 0.95.10.3 #22074, Беседы плагин History++, контакт лист Modern contact list
Установил MirLua.dll 0.11.9.1
В настройках, в службах появилось Lua

На закладке Вычислить
Code: [Select]
winapi = require('winapi')
winapi.MessageBox(_, "Привет мир", "MirLua", 0, 10000)
работает

На закладке скрипты появился скрипт из
C:\Program Files\Miranda8\Scripts
типа
Code: [Select]
message = require('m_message')
winapi = require('winapi')
local hHook = m.HookEvent('MirLua/RecvMessage', function(w, l)
local ccd = CCSDATA(l)
local pre = PROTORECVEVENT(ccd.lParam)
print('Привет мир')
print(pre.Message)
message.Send(pre.hContact, 'Принято!')
winapi.MessageBox(_, "Привет мир", "MirLua", 0, 10000)
end)
взятый из вашей темы. И ни чего не происходит, когда я пишу самому себе или мне кто-то пишет.
Я ожидал от себя ответного сообщения message.Send(pre.hContact, 'Принято!'). Сообщений об ошибках нет.
Не работает с исходным скриптом и скомпилированным (собрать в списке скриптов), после Применить, перезапуске миранды и т.п.
Помогите пожалуйста чайнику советом, я что-то не правильно делаю?
 

Offline ghazan

Re: MirLua
« Reply #104 on: 03 09 2019, 19:40:46 »
alexd,
это как сервис надо регистрировать, а не хук вешать
m.CreateService