Author Topic: MirLua  (Read 12967 times)

0 Members and 1 Guest are viewing this topic.

Offline unsaneTopic starter

  • Developer
  • *****
  • Posts: 155
  • Country: ru
  • Karma: 10
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)


Если нужно запустить все через какое-то время, то:
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
  • Karma: 0
Re: MirLua
« Reply #91 on: 25 10 2017, 22:48:33 »
Да, по одному через промежуток времени, код под спойлером подошел идеально :)
У меня просто 14 разных протоколов подключены, и если запускать их все сразу, то миранда виснет в 2х случаях из 3х.
 

Offline Oneiron

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

Offline unsaneTopic starter

  • Developer
  • *****
  • Posts: 155
  • Country: ru
  • Karma: 10
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
  • Karma: 0
Re: MirLua
« Reply #94 on: 28 09 2018, 19:38:05 »
Замечательно, большое вам спасибо :)
Кнопки же создавать при помощи MirLUA можно? Встраиваемые в Scriver?
 

Offline unsaneTopic starter

  • Developer
  • *****
  • Posts: 155
  • Country: ru
  • Karma: 10
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
  • Karma: 0
Re: MirLua
« Reply #96 on: 02 10 2018, 07:42:10 »
Спасибо большое! Завтра проверю :)
 

Offline Oneiron

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

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

Offline unsaneTopic starter

  • Developer
  • *****
  • Posts: 155
  • Country: ru
  • Karma: 10
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.
 

Offline Oneiron

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

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

Offline unsaneTopic starter

  • Developer
  • *****
  • Posts: 155
  • Country: ru
  • Karma: 10
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
  • Karma: 0
Re: MirLua
« Reply #101 on: 17 10 2018, 21:08:59 »
Нет. Вылетает даже не создав крэшлога.
Miranda 32-bit, высылается с одного jabber-аккаунта на другой через TabSRMM.
 

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
  • Karma: 0
Re: MirLua
« Reply #102 on: 04 12 2018, 21:10:02 »
По прежнему вылетает. Помоги-и-ите :)