Author Topic: MirLua  (Read 39162 times)

0 Members and 1 Guest are viewing this topic.

Offline zevnull

  • Newbie
  • *
  • Posts: 5
Re: MirLua
« Reply #75 on: 29 08 2017, 18:15:23 »
Приветствую всех, у меня есть задача, предоставить упрощенный интерфейс создания чат комнаты для пользователей. Хочется добавить кнопку на основную панель, по нажатию на которую отрисуется интерфейс по созданию чат комнаты, где автоматически будет использоваться сервер конференций в формате conference.domain.com, где domain.com - эта та часть, что возьмется от login@domain.com. Таким образом пользователю останется ввести только название для чат комнаты. И еще момент, есть потребность принимать дефолтные настройки чат комнаты сразу по ее созданию.

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

Offline unsane

Re: MirLua
« Reply #76 on: 31 08 2017, 20:06:38 »
zevnull,
"в первом приближении это выглядит так"
Code: [Select]
local ttb = require('m_toptoolbar')
local icolib = require('m_icolib')

m.HookEvent('TopToolBar/ModuleLoaded', function ()
    ttb.AddButton({
        Name = 'Join chat',
        Service = 'JABBER/*/Groupchat',
        lParamDown = topointer(u'room_name@conference.jabber.ru'),
        Icon = icolib.AddIcon('joinChat', 'Join chat')
    })
end)
[close]

Проблемы:
  • без доработки Jabber'a не получится сделать подстановку сервера
  • название аккаунта вколочено гвоздями (JABBER_1) и может отличаться
  • непонятно что делать, если аккаунтов jabber'a несколько

upd
сделал фикс для Jabber'a со следующего ночника можно будет передать параметр для заполнения полей:
Code: [Select]
local ttb = require('m_toptoolbar')
local icolib = require('m_icolib')

m.HookEvent('TopToolBar/ModuleLoaded', function ()
    ttb.AddButton({
        Name = 'Join chat',
        Service = 'JABBER/*/Groupchat',
        lParamDown = topointer(u'room_name@conference.jabber.ru'),
        Icon = icolib.AddIcon('joinChat', 'Join chat')
    })
end)
« Last Edit: 02 09 2017, 14:54:00 by unsane »
Si no estas con nosotros, estas contra nosotros.
 
The following users thanked this post: Magic

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
Re: MirLua
« Reply #77 on: 12 09 2017, 12:02:38 »
Здравствуйте. Пытаюсь запустить код
Code: [Select]
local message = require("m_message")
local winapi = require("winapi")

m.HookEvent("MirLua/RecvMessage", function(w, l)
  local ccd = CCSDATA(l)
  if ccd.Message == 'stopword' then
    winapi.ShellExecute('cmd.exe', 'file', 'args', 0)
    message.Send(ccd.hContact, ccd.Message)
    return 1;
  end
end)
При отправке сообщений выскакивает ошибка - attempt to call a nil value (global 'CCSDATA'), больше ничего не происходит.
Так же хотел бы узнать - как можно ограничить выполнение скрипта так, чтобы он выполнялся только при получении сообщения от конкретного отправителя?
 

Offline unsane

Re: MirLua
« Reply #78 on: 12 09 2017, 18:38:01 »
Oneiron,
Code: [Select]
local db = require("m_database")
local message = require("m_message")
local winapi = require("winapi")

m.HookEvent("MirLua/RecvMessage", function(w, l)
  local ccd = CCSDATA.new(l)
  if db.GetContactInfo(ccd.hContact, 'Uid') == '<uid_of_contact>' and ccd.Message == '<stopword>' then
    winapi.ShellExecute('cmd.exe', 'file', 'args', 0)
    message.Send(ccd.hContact, ccd.Message)
    print(111)
    return 1;
  end
end)
Si no estas con nosotros, estas contra nosotros.
 

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
Re: MirLua
« Reply #79 on: 13 09 2017, 08:57:44 »
Теперь - attempt to index a nil value (global 'CCSDATA')
 

Offline unsane

Re: MirLua
« Reply #80 on: 13 09 2017, 10:32:22 »
хм. можно попробовать добавить
Code: [Select]
require('m_protocols') в начало.
Si no estas con nosotros, estas contra nosotros.
 

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
Re: MirLua
« Reply #81 on: 13 09 2017, 11:03:15 »
Добавил. Ошибок при отправке больше не выскакивает, но и не работает. Дебаг в консольке в виде:
Code: [Select]
  local ccd = CCSDATA.new(l)
  print(ccd.Message)
Показывает, что внутри ccd.Message всегда "nil", независимо от того что я отправляю.
 

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
Re: MirLua
« Reply #82 on: 13 09 2017, 15:06:09 »
В итоге заработал такой вариант:

Code: [Select]
local protocols = require('m_protocols')
local db = require("m_database")
local message = require("m_message")
local winapi = require("winapi")

m.HookEvent("MirLua/RecvMessage", function(w, l)
  local ccd = CCSDATA.new(l)
  local pre = PROTORECVEVENT(ccd.lParam)
  if pre.Message == "stopword" then
    winapi.CreateProcess(nil, 'cmd.exe /k', nil, nil, 0, 0, si, nil)
    message.Send(ccd.hContact, 'Принято!')
    return 1;
  end
end)
 

Offline unsane

Re: MirLua
« Reply #83 on: 13 09 2017, 20:19:38 »
Oneiron, да, все правильно.


p.s. сделал фикс (в ночнике), чтобы работало
Code: [Select]
local ccd = CCSDATA(l)
Si no estas con nosotros, estas contra nosotros.
 

Offline unsane

Re: MirLua
« Reply #84 on: 23 09 2017, 16:11:26 »
подскажите, с помощью какой настройки, ключа, плагина можно принудительно переводить миранду по всем(выбранным) протоколам в онлайн при запуске?

Перевести все протоколы в онлайн:
Code: [Select]
local protos = require('m_protocols')

local ID_STATUS_OFFLINE = 40071
local ID_STATUS_ONLINE = 40072

m.HookEvent('Miranda/System/ModulesLoaded', function()
  for acc in protos.Accounts() do
    if acc.IsEnabled and not acc.IsVirtual then
      local status = acc:CallService('/GetStatus')
      if (status == ID_STATUS_OFFLINE) then
        acc:CallService('/SetStatus', ID_STATUS_ONLINE)
      end
    end
  end
end)
Si no estas con nosotros, estas contra nosotros.
 

Offline Gynaecologist

  • Newbie
  • *
  • Posts: 5
Re: MirLua
« Reply #85 on: 27 09 2017, 14:44:30 »
Здравствуйте, можно ли скрыть от пользователя  или сделать "Read Only" отдельные элементы окна настроек?
например, сделать так, чтобы не было видно раздела idle:
Spoiler

[close]
 

Offline unsane

Re: MirLua
« Reply #86 on: 29 09 2017, 19:33:13 »
Gynaecologist, скорее всего нет.
Si no estas con nosotros, estas contra nosotros.
 

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
Re: MirLua
« Reply #87 on: 21 10 2017, 18:41:45 »
А в MirLua есть какая-нибудь встроенная функция ожидания?
 

Offline unsane

Re: MirLua
« Reply #88 on: 22 10 2017, 17:36:44 »
смотря что нужно. Можно попробовать модуль m_schedule.
Code: [Select]
local schedule = require('m_schedule')

local wait_period_in_secons = 5
local time = os.time() + wait_period_in_secons
schedule.At(time).Do(function()
   -- код здесь вызовется через 5 секунд
end)
Si no estas con nosotros, estas contra nosotros.
 

Offline Oneiron

  • Jr. Member
  • **
  • Posts: 62
Re: MirLua
« Reply #89 on: 24 10 2017, 14:18:45 »
Последовательно подключать аккаунты, но если при этом использовать
Code: [Select]
local clock = os.clock
function sleep(n)  -- seconds
  local t0 = clock()
  while clock() - t0 <= n do end
end
То миранда остается недоступной (не показывая ни значков, ни главного окна, ни всплывающих окон) до тех пор, пока все протоколы не загрузятся.