Author Topic: MirLua  (Read 39169 times)

0 Members and 1 Guest are viewing this topic.

Offline unsane

Re: MirLua
« Reply #60 on: 21 09 2016, 15:43:23 »
Да, не будет работать. Как выриант бд или глобальная переменная.
А в чем вообще суть эксперимента? может как-то по-другому можно?
Si no estas con nosotros, estas contra nosotros.
 

Offline donald

Re: MirLua
« Reply #61 on: 21 09 2016, 16:29:09 »
Да задача такая, из внешней программы показать список пользователей Миранда, по определенному фильтру. Единственно что я придумал, это вызвать службу QuickSearch_PLUGIN.
MimCmd.exe callservice  QuickSearch_PLUGIN/Show  stest d0, да только она не работает, и завешивает Миранду. Я подумал, что создам через lua службу, которая будет вызывать. QuickSearch_PLUGIN/Show
------------------------------------------
local hService = m.CreateServiceFunction('CreateFunctionSearch', function(w)
    result = m.CallService(QuickSearch_PLUGIN/Show,  w, 0)
    return
end)
-------------------------------------------
Через ж. это конечно.


 

Offline unsane

Re: MirLua
« Reply #62 on: 24 09 2016, 23:19:24 »
donald, а вот в этом случае проблем со строкой не будет.
а не работает потому, что сервис вызывается слишком рано.
Code: [Select]
local hService = m.CreateServiceFunction('CreateFunctionSearch', function(w)
    result = m.CallService('QuickSearch_PLUGIN/Show', w)
    return
end)

m.HookEvent('Miranda/System/ModulesLoaded', function()
  m.CallService('CreateFunctionSearch', u'[b]test[/b]')
end)

Si no estas con nosotros, estas contra nosotros.
 

Offline kasim

  • Newbie
  • *
  • Posts: 5
  • Country: ru
Odp: MirLua
« Reply #63 on: 29 09 2016, 14:36:10 »
Здравствуйте!
В связи с проблемами кодировки кириллицы в плагине Command Line (команда message), хотелось бы узнать возможно ли, используя MirLua, из стороннего приложения отправить сообщение контакту?

Ещё вопрос: где взять описание модуля winapi?
 

Offline unsane

Re: MirLua
« Reply #64 on: 29 09 2016, 19:19:39 »
kasim, В данный момент нет возможности взаимодействовать с MirLua извне.
Описания winapi нет, но есть список функций + я могу подсказать по параметрам интересующих функций.
Si no estas con nosotros, estas contra nosotros.
 

Offline kasim

  • Newbie
  • *
  • Posts: 5
  • Country: ru
Re: MirLua
« Reply #65 on: 30 09 2016, 08:33:48 »
unsane, спасибо, по вашей ссылке смог разобраться с параметрами функции CreateProcess, но не понял как получить структуру pi (PROCESS_INFORMATION) для дальнейшего использования (закрытия хендла).
CreateProcess использую так:
Code: [Select]
local NORMAL_PRIORITY_CLASS = 0x20
local STARTF_USESHOWWINDOW = 0x1
local si =

   dwFlags = STARTF_USESHOWWINDOW,
   wShowWindow = 0
}
si.wShowWindow = 1
local r = winapi.CreateProcess(nil, 'cmd.exe /k', nil, nil, 0, NORMAL_PRIORITY_CLASS, si, '')
--winapi.CloseHandle (pi.hThread)

А скажите стоит ли в дальнейшем ожидать "возможности взаимодействовать с MirLua извне" и как я смогу узнать о появлении такой возможности?

P.S. я ранее с Lua знаком не был. Сейчас только пытаюсь разобраться для своих задач. Возможно поэтому сложно понять как функционирует плагин, и как использовать те или иные его возможности.
« Last Edit: 30 09 2016, 09:20:59 by kasim »
 

Offline kasim

  • Newbie
  • *
  • Posts: 5
  • Country: ru
Re: MirLua
« Reply #66 on: 30 09 2016, 09:16:15 »
 :( Похоже рано я решил, что разобрался с CreateProcess - никакого процесса она у меня не создаёт.
Уважаемый unsane, подскажите что не так.
« Last Edit: 30 09 2016, 09:24:11 by kasim »
 

Offline unsane

Re: MirLua
« Reply #67 on: 30 09 2016, 18:48:41 »
Проблема в последнем параметре:
Code: [Select]
winapi.CreateProcess(nil, 'cmd.exe /k', nil, nil, 0, 0, si, nil)
Функция CreateProcess возвращает 5 параметров:
Code: [Select]
local r, hProcess, hThread, dwProcessId, dwThreadId = winapi.CreateProcess(nil, 'cmd.exe /k', nil, nil, 0, 0, si, nil)
if r > 0 then
  --...
  winapi.CloseHandle(hProcess)
  winapi.CloseHandle(hThread)
end

Насчет взаимодействия, я пока не вижу вариантов как это можно сделать.
Si no estas con nosotros, estas contra nosotros.
 
The following users thanked this post: kasim

Offline Mikalair

Re: MirLua
« Reply #68 on: 01 10 2016, 16:08:36 »
Насчет взаимодействия, я пока не вижу вариантов как это можно сделать.
Я думаю, можно сделать небольшую обертку над Named Pipes.
If you like my work, you can donate to me via Bitcoin: 1CHAseNjVFfLQViLWAhh1fe6fGTiR6p1UM
 

Offline kasim

  • Newbie
  • *
  • Posts: 5
  • Country: ru
Re: MirLua
« Reply #69 on: 02 10 2016, 08:08:55 »
local r, hProcess, hThread, dwProcessId, dwThreadId = winapi.CreateProcess(nil, 'cmd.exe /k', nil, nil, 0, 0, si, nil)
Гениально :THUMBS UP:, я забыл о возможности присваивания списком в Lua, а я ему структуру совал: получил ошибку "таблице присваивается число".
Проверить смогу только завтра.

На счёт взаимодействия извне:
Конечно, не знаю, на сколько это реализуемо в плагине, но я хотел предложить взаимодействие через сокет по любому протоколу (TCP, UDP) и обрабатывать событие получения данных.
Также поддерживаю вариант, предложенный Mikalair с именованными каналами.
 

Offline kasim

  • Newbie
  • *
  • Posts: 5
  • Country: ru
Re: MirLua
« Reply #70 on: 03 10 2016, 14:51:23 »
Теперь CreateProcess работает.
 

Offline donald

Re: MirLua
« Reply #71 on: 11 10 2016, 09:45:46 »
Здравствуйте, скажите, можно ли через lua сделать две функции:
1. Открыть все непрочитанные сообщения.
Причина в следующем: после перезагрузки Миранды, она только мигает в трее, что есть непрочитанные сообщения, и приходится щелкать на иконку, до тех пор пока не откроешь все непрочитанные.
2. Пометить все непрочитанные сообщения как прочитанные.
Причина в следующем: после длительного перерыва (например отпуска), висит много новых сообщений, которые нет смысла уже читать.
 

Offline unsane

Re: MirLua
« Reply #72 on: 13 10 2016, 19:35:12 »
donald, на вскидку как-то так:
Code: [Select]
local db = require('m_database')
local message = require('m_message')

m.CreateServiceFunction('Lua/OpenContactWindow', function(w, l)
  for hContact in db.Contacts() do
    local hDbEvent = db.GetFirstUnreadEvent(hContact)
    if hDbEvent > 0 then
      message.Send(hContact, m.NULL)
    end
  end
end)

m.CreateServiceFunction('Lua/ReadContactEvents', function(w, l)
  for hContact in db.Contacts() do
    for hDbEvent in db.UnreadEvents(hContact) do
      db.MarkReadEvent(hDbEvent)
    end
  end
end)
Si no estas con nosotros, estas contra nosotros.
 

Offline donald

Re: MirLua
« Reply #73 on: 14 10 2016, 14:54:15 »
Спасибо, получилось, только пришлось немного поменять.
--      message.Send(hContact, m.NULL)
    m.CallService('SRMsg/SendCommand', hContact)
Поскольку вываливалась ошибка на параметр m.NULL . Пришлось взять сторонний сервис. Мне нужно, чтоб открывалось окно контакта, а message.Send, если задавать во втором операнде текст, сразу отправляет сообщение. Может можно как-то иначе?
И
--      db.MarkReadEvent(hDbEvent)
      db.MarkReadEvent(hContact, hDbEvent)


Code: [Select]
local db = require('m_database')
local message = require('m_message')

m.CreateServiceFunction('Lua/OpenContactWindow', function(w, l)
  for hContact in db.Contacts() do
    local hDbEvent = db.GetFirstUnreadEvent(hContact)
    if hDbEvent > 0 then
--     message.Send(hContact, m.NULL)
  m.CallService('SRMsg/SendCommand', hContact)
    end
  end
end)

m.CreateServiceFunction('Lua/ReadContactEvents', function(w, l)
  for hContact in db.Contacts() do
    for hDbEvent in db.UnreadEvents(hContact) do
--     db.MarkReadEvent(hDbEvent)
      db.MarkReadEvent(hContact, hDbEvent)
    end
  end
end)
« Last Edit: 14 10 2016, 15:06:02 by donald »
 

Offline unsane

Re: MirLua
« Reply #74 on: 15 10 2016, 20:26:01 »
donald, m.CallService('SRMsg/SendCommand', hContact) - это не сторонний сервис. если бы я это реализовывал, то вызывал бы именно его. Есть ли смысл делать обертку на него в луа?
Si no estas con nosotros, estas contra nosotros.